(FPGA)verilog驱动RGB接口TFT液晶屏
verilog驱动RGB接口TFT液晶屏
1.驱动原理
驱动TFT屏幕与驱动VGA显示器的原理很相似。
行、场同步模式
DE同步模式
在正点原子的教程中有如下说明:
液晶屏有两种驱动模式,分别为行场驱动模式(HV MODE)和数据使能同步模式(DE MODE)
HV MODE:数据使能信号(DE)必须为低电平
DE MODE:行同步和场同步信号必须为高电平
但是在我实际实验的过程中,当在HV模式中,DE信号也必须正确工作,如果DE为低电平,显示的图像会错位。但是只要DE信号是正确的,行同步和场同步信号一直保持高电平或者低电平都可以正常工作。
2.模块框图
3.时钟模块
时钟使用锁相环IP核生成,时钟频率如框图所示。
3.TFT驱动模块
module tft_ctrl (input wire tft_clk,input wire rst_n,input wire [15:0] pic_data,output wire [9:0] pic_y,output wire [9:0] pic_x,output wire [15:0] rgb_data,output wire hsync,output wire vsync,output wire tft_de,output wire tft_clk_out, output wire tft_bl
);
//parameter define
parameter H_SYNC = 10'd128 , //行同步H_BACK = 10'd88 , //行时序后沿H_VALID = 10'd800 , //行有效数据H_FRONT = 10'd40 , //行时序前沿H_TOTAL = 11'd1056 ; //行扫描周期parameter V_SYNC = 10'd2 , //场同步V_BACK = 10'd33 , //场时序后沿V_VALID = 10'd480 , //场有效数据V_FRONT = 10'd10 , //场时序前沿V_TOTAL = 10'd525 ; //场扫描周期wire rgb_valid;//计数到有效图像时拉高
wire rgb_request;//请求RGB像素信息reg [10:0] count_h;//行同步计数
reg [10:0] count_v;//场同步计数assign tft_clk_out = tft_clk;
assign tft_de = rgb_valid;
assign tft_bl = rst_n; //行同步计数
always @(posedge tft_clk or negedge rst_n) beginif (!rst_n) begincount_h <= 11'b0;endelse if (count_h == H_TOTAL - 1'b1) begincount_h <= 11'b0;endelsecount_h <= count_h + 1'b1;
end
assign hsync =/* (count_h <= H_SYNC - 1'b1) ? 1'b1 : 1'b0*/ 1'b0 ;//场同步计数
always @(posedge tft_clk or negedge rst_n) beginif (!rst_n) begincount_v <= 11'b0; endelse if ((count_v == V_TOTAL - 1'b1) && (count_h == H_TOTAL - 1'b1)) begincount_v <= 11'b0;endelse if (count_h == H_TOTAL - 1'b1) begincount_v <= count_v + 1'b1;endelsecount_v <= count_v;
end
assign vsync = /*(count_v <= V_SYNC - 1'b1) ? 1'b1 : 1'b0 */ 1'b0 ;//rgb信号有效rgb_valid
assign rgb_valid = (((count_h >= H_SYNC + H_BACK)&& (count_h < H_SYNC + H_BACK + H_VALID))&&((count_v >= V_SYNC + V_BACK)&& (count_v < V_SYNC + V_BACK + V_VALID))) ? 1'b1 : 1'b0;
//请求RGB像素信息rgb_request
assign rgb_request = (((count_h >= H_SYNC + H_BACK - 1'b1)&& (count_h < H_SYNC + H_BACK + H_VALID - 1'b1))&&((count_v >= V_SYNC + V_BACK)&& (count_v < V_SYNC + V_BACK + V_VALID))) ? 1'b1 : 1'b0;assign pic_x = (rgb_request == 1'b1)? (count_h - (H_SYNC + H_BACK - 1'b1)) : 10'h3ff;
assign pic_y = (rgb_request == 1'b1)? (count_v - (V_SYNC + V_BACK )) : 10'h3ff;//rgb_tft:输出像素点色彩信息
assign rgb_data = (rgb_valid == 1'b1) ? pic_data : 16'b0 ;
endmodule //tft_ctrl
代码中控制行同步和场同步的信号被注释掉了,只有de信号,因此工作在DE同步模式。
4.图像控制模块
module tft_pic (input wire tft_clk,input wire rst_n,output reg [15:0] pic_data,input wire [9:0] pic_y,input wire [9:0] pic_x
);
parameter H_VALID = 10'd800 , //行有效数据V_VALID = 10'd480 ; //场有效数据parameter RED = 16'hF800, //红色ORANGE = 16'hFC00, //橙色YELLOW = 16'hFFE0, //黄色GREEN = 16'h07E0, //绿色CYAN = 16'h07FF, //青色BLUE = 16'h001F, //蓝色PURPPLE = 16'hF81F, //紫色BLACK = 16'h0000, //黑色WHITE = 16'hFFFF, //白色GRAY = 16'hD69A; //灰色
//pic_data:输出像素点色彩信息,根据当前像素点坐标指定当前像素点颜色数据
always@(posedge tft_clk or negedge rst_n)if(rst_n == 1'b0)pic_data <= 16'd0;else if((pic_x >= 0) && (pic_x < (H_VALID/10)*1))pic_data <= RED;else if((pic_x >= (H_VALID/10)*1) && (pic_x < (H_VALID/10)*2))pic_data <= ORANGE;else if((pic_x >= (H_VALID/10)*2) && (pic_x < (H_VALID/10)*3))pic_data <= YELLOW;else if((pic_x >= (H_VALID/10)*3) && (pic_x < (H_VALID/10)*4))pic_data <= GREEN;else if((pic_x >= (H_VALID/10)*4) && (pic_x < (H_VALID/10)*5))pic_data <= CYAN;else if((pic_x >= (H_VALID/10)*5) && (pic_x < (H_VALID/10)*6))pic_data <= BLUE;else if((pic_x >= (H_VALID/10)*6) && (pic_x < (H_VALID/10)*7))pic_data <= PURPPLE;else if((pic_x >= (H_VALID/10)*7) && (pic_x < (H_VALID/10)*8))pic_data <= BLACK;else if((pic_x >= (H_VALID/10)*8) && (pic_x < (H_VALID/10)*9))pic_data <= WHITE;else if((pic_x >= (H_VALID/10)*9) && (pic_x < H_VALID))pic_data <= GRAY;elsepic_data <= BLACK;endmodule //tft_pic
5.顶层模块
module tft_rgb_colorbar (input wire sys_clk,input wire sys_rst_n,output wire hsync,output wire vsync,output wire tft_de,output wire tft_clk_out,output wire tft_bl,output wire [15:0] rgb_data
);wire tft_clk;
wire locked;
wire [9:0] pic_y;
wire [9:0] pic_x;
wire [15:0] pic_data;
assign rst_n = (locked & sys_rst_n);
clk_gen u_clk_gen(.areset (~sys_rst_n),.inclk0 (sys_clk),.c0 (tft_clk),.locked (locked )
);tft_ctrl u_tft_ctrl(.tft_clk (tft_clk ),.rst_n (rst_n ),.pic_data (pic_data ),.pic_y (pic_y ),.pic_x (pic_x ),.rgb_data (rgb_data ),.hsync (hsync ),.vsync (vsync ),.tft_de (tft_de ),.tft_clk_out (tft_clk_out ),.tft_bl (tft_bl )
);tft_pic u_tft_pic(.tft_clk (tft_clk ),.rst_n (rst_n ),.pic_data (pic_data ),.pic_y (pic_y ),.pic_x (pic_x )
);endmodule //tft_rgb_colorbar
实验结果
(FPGA)verilog驱动RGB接口TFT液晶屏相关推荐
- ZYNQ7020(黑金)纯verilog驱动4.3寸RGB接口TFT液晶屏(AN430)显示彩条
ZYNQ7020(黑金)纯verilog驱动4.3寸RGB接口TFT液晶屏(AN430)显示彩条 简介 像素(Pixel):像素是指由图像的小方格组成的,这些小方快都有一个明确的位置和被分配的色彩数值 ...
- S3C2440A驱动RGB接口TFT LCD的研究(转载)
S3C2440A驱动RGB接口TFT LCD的研究 时间: 2009-02-25 11:29:50 来源:嵌入式在线 作者:纪宁宁,孙灵燕 1 引言 随着科技的进步,TFT LCD作为显示器件 ...
- 利用 STC32G12K128 的 LCM 驱动 8080 接口的液晶屏
零.目录 零.目录 一.硬件和参考对象 二.STC32G 的 LCM 三.简要的初始化流程 四.代码的移植和修改 五.引脚接线 六.运行结果 七.总结和注意事项 一.硬件和参考对象 本次将使用 STC ...
- 树莓派GPIO驱动ST7735S主控TFT液晶屏显示图片和文字
本文使用1.8''128*160RGB_TFT ST7735S主控的液晶屏来操作 参考blog:http://blog.mangolovecarrot.net/2017/03/05/raspi-stu ...
- stm32驱动rgb屏电路图_STM32直接驱动RGB接口的TFT数字彩屏设计
STM32 直接驱动 RGB 接口的 TFT 数字彩屏设计 本文提出了一种由 STM32 的 FSMC 总线直接挂载 RGB 接口屏的方案,直接由一片 CPU(STM32F103VC) 来完成 TFT ...
- 【嵌入式】MCU(HC32F460)+SPI接口LCD液晶屏ILI9341 移植emWin记录1----点亮LCD屏
目录 一 SPI屏的接线 二 SPI屏驱动初始化 三 SPI屏点亮 四 附录 一 SPI屏的接线 SPI屏的特点在于接线简单,只需要四根SPI线以及几个GPIO口即可驱动工作,但是由于非并口的,所以当 ...
- 全志H616开发板Orange Pi Zero2连接香橙派5寸TFT液晶屏的测试说明
香橙派Zero2开发板采用全志H616 四核 64位处理器,拥有512MB/1GB 内存可选,集成千兆以太网卡.蓝牙5.0+双频WiFi(2.4GHz和5GHz).USB2.0.Micro-HDMI( ...
- 联盛德 HLK-W806 (六): I2C驱动SSD1306 128x64 OLED液晶屏
目录 联盛德 HLK-W806 (一): Ubuntu20.04下的开发环境配置, 编译和烧录说明 联盛德 HLK-W806 (二): Win10下的开发环境配置, 编译和烧录说明 联盛德 HLK-W ...
- fpga硬件驱动TFT液晶屏-小结
最近折腾了一下fpga,发现还真是不好搞,硬件描述语言和顺序代码的真的是天差地别,还好电路的底子还在一些.通过发挥不怕效率低,只要能运行的精神,终于把ili9320的初始化和写操作调通了.最后跑了下时 ...
- 基于STM32F103ZET6主控平台实现(SPI接口)OLED液晶屏驱动
一个热爱代码的工程师,唯有凭借双手不断敲打,才可以快速提升实力! 本文谨以记录,日后相忘时再作复习,代码没有贵贱,既来之则安之. OLED液晶屏产品图和效果图 由上图我们知道:OLED液晶屏分别有GN ...
最新文章
- 爬虫入门到精通-HTTP协议的讲解
- html如何让边框变圆,CSS怎样做出自适应圆形边框?
- jquery之empty()与remove([expr])区别
- 怎么判断程序运行的当前目录在哪?关键词:根目录
- 关于 Boost.PropertyTree
- java.lang.ClassCastException: cannot assign instance of java.lang.invoke.SerializedLambda to field
- java怎么输入数据_java怎么键盘输入数据啊?
- linux 图片编辑 java_Java在Linux下 不能处理图形的解决办法 分享
- 1159 最大全0子矩阵
- 一个解析XML的VB类
- 计算机效果图线稿的制作方法,如何只用PS将线稿图变成高大上的效果图?
- 从零开始用 Windows C++ 桌面程序制作方舟同人游戏(五)
- easyUI——easyUI(入门)
- docker服务及镜像开机自动启动
- 遥控器控制项目(拷贝型遥控器+灵R1A)
- 蒂姆-库克于2010年5月14日在奥本大学毕业典礼上发表的演讲全文
- STM32下载程序至SRAM——基于正点原子精英STM32F103ZET6开发板
- 中国前10名的休闲服品牌企业信息化漫谈--S公司
- iPhone14也将支持拍月亮了,然而这可能是技术工程师的功劳
- python监控文件或目录大小_python监控文件或目录的变化(实例代码)