TFT显示屏驱动

news2025/1/21 11:24:51

REVIEW

        已经学习过VGA 时序与实现-CSDN博客

                          VGA 多分辨率-CSDN博客

        今天就来让TFT屏显示一下

        小梅哥视频:24 RGB TFT显示屏原理与驱动实现_哔哩哔哩_bilibili

1.  设置显示屏参数与时钟

        注意到VGA_parameter.v中,不懂得分辨率对应于不同的频率,这里结合IP核,学习clk

        现有时钟频率为50MHz ,5寸 TFT屏对应800*480为33MHz

        采用PLL锁相环设置时钟频率

        由于 ACZ702 的按键按下是低电平, PLL 复位设置成低电平有效。

        具体设置方法如下:

        本次实验只生成一个时钟频率,但在本页设置中,可以增加多个输出时钟:

        同频率不同相位、不同频率等, 在后续实验中,可以进行设置进行比较

        本次未设置reset 、locked

 2.  VGA_CTRL.v

        本程序中未对RGB888/RGB565进行设置

        在xdc文件中进行说明

module VGA_CTRL(
                input clk ,
                input reset_n ,
                input [23:0]data ,
                output reg data_req ,
                output reg [11:0]H_addr , //当前扫描点的H坐标
                output reg [11:0]V_addr , //当前扫描点的V坐标
                output reg VGA_HS ,
                output reg VGA_VS , 
                output reg VGA_BLK , //BLK表示的是data时间段
                output reg [23:0]VGA_RGB  //{R[7:0]、G[7:0]、B[7:0]}
            );
    
    
    `include "vga_parameter.v"
     localparam VGA_HS_end = `H_Sync_Time - 1'b1 ;
     localparam Hdat_begin = `H_Sync_Time + `H_Back_Porch + `H_Left_Border - 1'b1 ;
     localparam Hdat_end = `H_Total_Time - `H_Right_Border - `H_Front_Porch - 1'b1 ;
     localparam Hpixel_end = `H_Total_Time - 1'b1 ;
     localparam VGA_VS_end = `V_Sync_Time - 1'b1 ;
     localparam Vdat_begin = `V_Sync_Time + `V_Back_Porch + `V_Top_Border - 1'b1 ;
     localparam Vdat_end = `V_Total_Time - `V_Bottom_Border - `V_Front_Porch - 1'b1 ;
     localparam Vline_end = `V_Total_Time - 1'b1 ;
    
   //行计数器
    reg[11:0]H_cnt;
    always@(posedge clk or negedge reset_n)
    if(!reset_n)    H_cnt <= 0 ;
    else if(H_cnt == Hpixel_end)
        H_cnt <= 0 ;
    else 
        H_cnt <= H_cnt + 1'b1 ;
    
    // 场计数器
    reg[11:0]V_cnt;
    always@(posedge clk or negedge reset_n)
    if(!reset_n)    V_cnt <= 0 ;
    else if(H_cnt == Hpixel_end)
        if(V_cnt == Vline_end)
            V_cnt <= 0 ;
        else 
            V_cnt <= V_cnt + 1'b1 ;
    else 
        V_cnt <= V_cnt ;
        
      //     VGA_HS
    always@(posedge clk or negedge reset_n)
    if(!reset_n)  VGA_HS <= 1;
    else if(H_cnt == 0) VGA_HS <= 0;
    else if(H_cnt > VGA_HS_end) VGA_HS <= 1;
    
    //     VGA_VS
    always@(posedge clk or negedge reset_n)
    if(!reset_n)  VGA_VS <= 1;
    else if(V_cnt == 0) VGA_VS <= 0;
    else if(V_cnt > VGA_VS_end) VGA_VS <= 1;  
        
    
 

   //     data_req
    always@(posedge clk or negedge reset_n)
    if(!reset_n)    data_req <= 0 ;
    else data_req <= ((H_cnt >= Hdat_begin)&&(H_cnt < Hdat_end)&&(V_cnt >= Vdat_begin)&&(V_cnt <= Vdat_end)) ? 1 : 0;
    
     //     VGA_BLK
    always@(posedge clk or negedge reset_n)
    if(!reset_n)    VGA_BLK <= 0 ;
    else VGA_BLK <= data_req ;
            
//    assign VGA_RGB = VGA_BLK? Data:0;
      //     VGA_RGB
    always@(posedge clk )
    if(data_req) 
       VGA_RGB <= data;
    else
        VGA_RGB <= 0;
        
   //address
    always@(posedge clk )
    if(data_req)
     begin
        H_addr <= H_cnt - Hdat_begin;
        V_addr <= V_cnt - Vdat_begin;
     end
     else
       begin
        H_addr <= 0;
        V_addr <= 0;
     end 
endmodule

3.  VGA_CTRL_test.v

显示彩条:

TFT_BL表示背光,拉高即可

module VGA_CTRL_test(
  
    input clk , //50MHZ时钟
    input reset_n ,
    output VGA_CLK,
    output VGA_HS, //TFT行同步信号
    output VGA_VS, //TFT场同步信号
    output VGA_BLK,        //VGA 场消隐信号
    output [23:0] VGA_RGB ,//TFT数据输出
    output TFT_BL  //背光
);


    assign TFT_BL = 1;
        
    reg [23:0]disp_data;
    wire [11:0]hcount;
    wire [11:0]vcount;
    wire Clk25M; 
	wire Data_Req;
	
	
	assign VGA_CLK= Clk25M;
	
//	vga_pll vga_pll(
//        .clk_out1(Clk25M),
//        .clk_in1(Clk)
//    );      
clk_vga vga_clk(
        .clk_out1(Clk25M),
        .clk_in1(clk)
    );      
    VGA_CTRL VGA_CTRL(
        .clk(Clk25M),    //系统输入时钟25MHZ
        .reset_n(reset_n),
        .data(disp_data),    //待显示数据
		.data_req(Data_Req),
        .H_addr(hcount),        //VGA行扫描计数器
        .V_addr(vcount),        //VGA场扫描计数器
        .VGA_HS(VGA_HS),        //VGA行同步信号
        .VGA_VS(VGA_VS),        //VGA场同步信号
        .VGA_BLK(VGA_BLK) ,     //VGA 场消隐信号
        .VGA_RGB(VGA_RGB)  //VGA数据输出
    );
         
//定义颜色编码
localparam 
    BLACK       = 24'h000000, //黑色
    BLUE        = 24'h0000FF, //蓝色
    RED     = 24'hFF0000, //红色
    PURPPLE = 24'hFF00FF, //紫色
    GREEN       = 24'h00FF00, //绿色
    CYAN        = 24'h00FFFF, //青色
    YELLOW  = 24'hFFFF00, //黄色
    WHITE       = 24'hFFFFFF; //白色
    
//定义每个像素块的默认显示颜色值
localparam 
    R0_C0 = BLACK,  //第0行0列像素块
    R0_C1 = BLUE,   //第0行1列像素块
    R1_C0 = RED,    //第1行0列像素块
    R1_C1 = PURPPLE,//第1行1列像素块
    R2_C0 = GREEN,  //第2行0列像素块
    R2_C1 = CYAN,   //第2行1列像素块
    R3_C0 = YELLOW, //第3行0列像素块
    R3_C1 = WHITE;  //第3行1列像素块

    wire R0_act = vcount >= 0 && vcount < 120;  //正在扫描第0行
    wire R1_act = vcount >= 120 && vcount < 240;//正在扫描第1行
    wire R2_act = vcount >= 240 && vcount < 360;//正在扫描第2行
    wire R3_act = vcount >= 360 && vcount < 480;//正在扫描第3行
    
    wire C0_act = hcount >= 0 && hcount < 400; //正在扫描第0列
    wire C1_act = hcount >= 400 && hcount < 800;//正在扫描第1列 
    
    wire R0_C0_act=R0_act & C0_act;//第0行0列像素块处于被扫描中标志信号
    wire R0_C1_act=R0_act & C1_act;//第0行1列像素块处于被扫描中标志信号
    wire R1_C0_act=R1_act & C0_act;//第1行0列像素块处于被扫描中标志信号
    wire R1_C1_act=R1_act & C1_act;//第1行1列像素块处于被扫描中标志信号
    wire R2_C0_act=R2_act & C0_act;//第2行0列像素块处于被扫描中标志信号
    wire R2_C1_act=R2_act & C1_act;//第2行1列像素块处于被扫描中标志信号
    wire R3_C0_act=R3_act & C0_act;//第3行0列像素块处于被扫描中标志信号
    wire R3_C1_act=R3_act & C1_act;//第3行1列像素块处于被扫描中标志信号
    
    always@(*)
        case({R3_C1_act,R3_C0_act,R2_C1_act,R2_C0_act,
                R1_C1_act,R1_C0_act,R0_C1_act,R0_C0_act})
            8'b0000_0001:disp_data = R0_C0;
            8'b0000_0010:disp_data = R0_C1;
            8'b0000_0100:disp_data = R1_C0;
            8'b0000_1000:disp_data = R1_C1;
            8'b0001_0000:disp_data = R2_C0;
            8'b0010_0000:disp_data = R2_C1;
            8'b0100_0000:disp_data = R3_C0;
            8'b1000_0000:disp_data = R3_C1;
            default:disp_data = R0_C0;
        endcase
        
endmodule

4.  VGA_CTRL_test.xdc

        由于使用的是RGB565格式

        设置中data 与 VGA_RGB 都为24位

        此时在I/O中有几位是无需链接的,会出现[DRC NSTD-1] 

【Vivado常见问题】【DRC NSTD-1 DRC UCIO-1】无法生成bitstream(部分管脚位置或电平未指定) - Vivado软件使用和设置 - 芯路恒电子技术论坛 - Powered by Discuz! (corecourse.cn)

xdc文件添加:

set_property SEVERITY {Warning} [get_drc_checks NSTD-1]
set_property SEVERITY {Warning} [get_drc_checks RTSTAT-1]
set_property SEVERITY {Warning} [get_drc_checks UCIO-1]
set_property SEVERITY {Warning} [get_drc_checks NSTD-1]
set_property SEVERITY {Warning} [get_drc_checks RTSTAT-1]
set_property SEVERITY {Warning} [get_drc_checks UCIO-1]

set_property IOSTANDARD LVCMOS33 [get_ports {VGA_RGB[23]}]
set_property IOSTANDARD LVCMOS33 [get_ports {VGA_RGB[22]}]
set_property IOSTANDARD LVCMOS33 [get_ports {VGA_RGB[21]}]
set_property IOSTANDARD LVCMOS33 [get_ports {VGA_RGB[20]}]
set_property IOSTANDARD LVCMOS33 [get_ports {VGA_RGB[19]}]
set_property IOSTANDARD LVCMOS33 [get_ports {VGA_RGB[18]}]
set_property IOSTANDARD LVCMOS33 [get_ports {VGA_RGB[17]}]
set_property IOSTANDARD LVCMOS33 [get_ports {VGA_RGB[16]}]
set_property IOSTANDARD LVCMOS33 [get_ports {VGA_RGB[15]}]
set_property IOSTANDARD LVCMOS33 [get_ports {VGA_RGB[14]}]
set_property IOSTANDARD LVCMOS33 [get_ports {VGA_RGB[13]}]
set_property IOSTANDARD LVCMOS33 [get_ports {VGA_RGB[12]}]
set_property IOSTANDARD LVCMOS33 [get_ports {VGA_RGB[11]}]
set_property IOSTANDARD LVCMOS33 [get_ports {VGA_RGB[10]}]
set_property IOSTANDARD LVCMOS33 [get_ports {VGA_RGB[9]}]
set_property IOSTANDARD LVCMOS33 [get_ports {VGA_RGB[8]}]
set_property IOSTANDARD LVCMOS33 [get_ports {VGA_RGB[7]}]
set_property IOSTANDARD LVCMOS33 [get_ports {VGA_RGB[6]}]
set_property IOSTANDARD LVCMOS33 [get_ports {VGA_RGB[5]}]
set_property IOSTANDARD LVCMOS33 [get_ports {VGA_RGB[4]}]
set_property IOSTANDARD LVCMOS33 [get_ports {VGA_RGB[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {VGA_RGB[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {VGA_RGB[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {VGA_RGB[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports clk]
set_property IOSTANDARD LVCMOS33 [get_ports reset_n]
set_property IOSTANDARD LVCMOS33 [get_ports VGA_BLK]
set_property IOSTANDARD LVCMOS33 [get_ports TFT_BL]
set_property IOSTANDARD LVCMOS33 [get_ports VGA_CLK]
set_property IOSTANDARD LVCMOS33 [get_ports VGA_HS]
set_property IOSTANDARD LVCMOS33 [get_ports VGA_VS]
set_property PACKAGE_PIN W20 [get_ports {VGA_RGB[23]}]
set_property PACKAGE_PIN W19 [get_ports {VGA_RGB[22]}]
set_property PACKAGE_PIN V17 [get_ports {VGA_RGB[21]}]
set_property PACKAGE_PIN V16 [get_ports {VGA_RGB[20]}]
set_property PACKAGE_PIN T15 [get_ports {VGA_RGB[19]}]
set_property PACKAGE_PIN V20 [get_ports {VGA_RGB[15]}]
set_property PACKAGE_PIN U17 [get_ports {VGA_RGB[14]}]
set_property PACKAGE_PIN V18 [get_ports {VGA_RGB[13]}]
set_property PACKAGE_PIN T16 [get_ports {VGA_RGB[12]}]
set_property PACKAGE_PIN R16 [get_ports {VGA_RGB[11]}]
set_property PACKAGE_PIN U19 [get_ports {VGA_RGB[10]}]
set_property PACKAGE_PIN Y19 [get_ports {VGA_RGB[7]}]
set_property PACKAGE_PIN Y18 [get_ports {VGA_RGB[5]}]
set_property PACKAGE_PIN W16 [get_ports {VGA_RGB[4]}]
set_property PACKAGE_PIN Y17 [get_ports {VGA_RGB[3]}]
set_property PACKAGE_PIN W14 [get_ports VGA_VS]
set_property PACKAGE_PIN U14 [get_ports VGA_HS]
set_property PACKAGE_PIN U15 [get_ports VGA_CLK]
set_property PACKAGE_PIN R17 [get_ports TFT_BL ]
set_property PACKAGE_PIN U18 [get_ports clk]
set_property PACKAGE_PIN H18 [get_ports reset_n]


set_property PACKAGE_PIN W15 [get_ports VGA_BLK]

5.  显示

        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1587422.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue3学习04 组件通信

Vue3学习04 组件通信 组件通信props 父 ↔ 子自定义事件 子 > 父mitt 任意组件间通信v-model 父↔子$attrs 祖↔孙$refs、$parent案例的完整代码ref注意点 provide、inject 祖↔孙piniaslot① 默认插槽② 具名插槽③ 作用域插槽 组件通信 Vue3组件通信和Vue2的区别&#xf…

K8S之Controller

我们在回顾下pod的启动流程&#xff1a; 用户通过kubectl&#xff0c;向api-server 发起请求api-server接受请求&#xff0c;并将数据写入etcdkube-scheduler通过watch检测到未绑定node 的pod&#xff0c;调度pod到某一node上&#xff0c;并通知给api-server&#xff0c;api-se…

Centos7 k8s 集群 - Rook Ceph 安装

环境准备 基础环境 系统名称操作系统CPU内存硬盘Kubernete 版本Docker版本IPmasterCentos74c4gsdb 20G1.17.023.0.1192.168.1.128node01Centos74c4gsdb 20G1.17.023.0.1192.168.1.129node02Centos74c4gsdb 20G1.17.023.0.1192.168.1.130node03Centos74c4gsdb 20G1.17.023.0.1…

计算两个时间段的差值

计算两个时间段的差值 运行效果&#xff1a; 代码实现&#xff1a; #include<stdio.h>typedef struct {int h; // 时int m; // 分int s; // 秒 }Time;void fun(Time T[2], Time& diff) {int sum_s[2] { 0 }; for (int i 0; i < 1; i) { // 统一为秒数sum_s[…

NI-LabView的DAQ缺少或丢失的解决办法(亲测有效)

DAQmx在Labview中不显示或缺失 问题&#xff1a;在NI Packasge Manager安装完DAQ后在labview中不显示控件解决办法 问题&#xff1a;在NI Packasge Manager安装完DAQ后在labview中不显示控件 在打开测量I/O时&#xff0c;见不到 DAQmx&#xff0c;或者在Express中见不到DAQ助手…

绝地求生:PUBG×杜卡迪联名上线!参与投稿评论赢取精美好礼

PUBG杜卡迪联名活动游戏内现已正式上线&#xff01;我们诚邀与您一起在开拓未知战场和书写新历史的过程中&#xff0c;与杜卡迪一同实现您的极速梦想&#xff01; 在本次的杜卡迪工坊中&#xff0c;更是包含了具备标志性红色在内的6种颜色供您自由选择&#xff0c;一起自由驰骋…

微软电子密码账户严重漏洞???

微软电子密码严重漏洞&#xff1f;&#xff1f;&#xff1f; 如图有网络安全的大佬知道这是怎么回事吗&#xff1f;&#xff1f;&#xff1f;我的猜想 如图 当我登录bilibili网页的时候&#xff0c;我发现微软账号电子钱包保存的密码突然出现了许多我没有拥有的账号&#xff0…

【vue】ref 和 reactive 对比

ref&#xff1a;存储单个数据&#xff0c;如数值&#xff0c;字符串reactive&#xff1a;存储复杂数据&#xff0c;如对象&#xff0c;数组 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"vie…

前端开发攻略---根据音频节奏实时绘制不断变化的波形图。深入剖析如何通过代码实现音频数据的可视化。

1、演示 2、代码分析 逐行解析 JavaScript 代码块&#xff1a; const audioEle document.querySelector(audio) const cvs document.querySelector(canvas) const ctx cvs.getContext(2d)这几行代码首先获取了 <audio> 和 <canvas> 元素的引用&#xff0c;并使用…

Android Studio开发学习(七)———RelativeLayout(相对布局)

在上期中我们对LinearLayout进行了详细的解析&#xff0c;LinearLayout也是我们用的比较多的一个布局,更多的时候更钟情于它的 weight(权重) 属性&#xff0c;等比例划分&#xff0c;对屏幕适配还是 帮助蛮大的;但是使用LinearLayout的时候也有一个问题&#xff0c;就是当界面比…

keepalived2.2.8+drbd9+nfs高可用存储部署

目录 一.本文基于上一篇文章keepalived环境来做的&#xff0c;主机信息如下 二.为两台虚拟机准备添加一块新硬盘设备 三.安装drbd9 1.使用扩展源的rpm包来下载 2.创建资源并挂载到新增的硬盘 3.主设备升级身份 4.主备两个设备手动切换身份演示 四.安装配置nfs 五.安装…

从 SQLite 3.4.2 迁移到 3.5.0(二十)

返回&#xff1a;SQLite—系列文章目录 上一篇:SQLite---调试提示&#xff08;十九&#xff09; 下一篇&#xff1a;SQLite—系列文章目录 ​ SQLite 版本 3.5.0 &#xff08;2007-09-04&#xff09; 引入了一个新的操作系统接口层&#xff0c; 与所有先前版本的 SQLi…

IDEA2023 开发环境配置

目录 1. 关闭IDEA自动更新1.2 IDEA 新版样式切换 2. Maven配置2.1本地仓库优先加载2.2 maven.config配置文件中 3. 全局配置JDK4. 配置文件编码:UTF-85. 开启自动编译&#xff08;全局配置&#xff09;6. 开启自动导包7. 开启鼠标悬浮&#xff08;提示文档信息&#xff09;8. 设…

jenkins 启动linux节点时 控制台中文显示问号乱码

新增一个jenkins节点时&#xff0c;遇到了控制台中文输出问号的问题。 网上各种配置jenkins的全局变量&#xff0c;都不行。 最终是 节点列表 ->对应节点 -> 启动方式 -> 高级 添加JVM选项 -Dfile.encodingUTF-8

HarmonyOS实战开发-WebSocket的使用。

介绍 本示例展示了WebSocket的使用&#xff0c;包括客户端与服务端的连接和断开以及客户端数据的接收和发送。 WebSocket连接&#xff1a;使用WebSocket建立服务器与客户端的双向连接&#xff0c;需要先通过createWebSocket方法创建WebSocket对象&#xff0c;然后通过connect…

2、JVM内存模型深度解析

JVM整体结构及内存模型 根据 JVM 规范&#xff0c;JVM 内存共分为虚拟机栈、堆、方法区、程序计数器、本地方法栈五个部分。 JVM分为五大模块&#xff1a; 类装载器子系统 、 运行时数据区 、 执行引擎 、 本地方法接口 和 垃圾收集模块 。 方法区Java8之后的变化 移除了 Pe…

每日一题---OJ题: 链表的回文结构

片头 嗨! 小伙伴们,大家好! 今天我们来一起学习这道OJ题--- 链表的回文结构 嗯...这道题好像不是很难,我们来分析分析 举个例子: 我们可以看到,上图中的两个链表都是回文结构: 即链表的回文结构是指一个链表中的结点值从前往后读和从后往前读都是一样的结构。也就是说&#xf…

蓝桥杯 — —灵能传输

灵能传输 友情链接&#xff1a;灵能传输 题目&#xff1a; 输入样例&#xff1a; 3 3 5 -2 3 4 0 0 0 0 3 1 2 3输出样例&#xff1a; 3 0 3思路&#xff1a; 题目大意&#xff1a;给出一个数组&#xff0c;每次选择数组中的一个数&#xff08;要求不能是第一个数与最后一个…

Rust语言入门第二篇-Cargo教程

文章目录 Rust语言入门第二篇-Cargo教程一&#xff0c;Cargo 是什么二&#xff0c;Cargo教程Cargo.toml文件src/main.rs 文件构建并运行Cargo项目 Rust语言入门第二篇-Cargo教程 本节提供对cargo命令行工具的快速了解。我们演示了它为我们生成新包的能力&#xff0c;它在包内编…

数据分类分级概念、方法

数据分类分级概念&#xff1a; 根据《GB/T 38667-2020 信息技术-大数据-数据分类指南》的定义&#xff0c;数据分类是根据数据的属性或特征&#xff0c;按照一定的原则和方法进行区分和归类&#xff0c;以便更好地管理和使用数据。数据分类不存在唯一的分类方式&#xff0c;会…