2基于fpga实现5.0英寸的TFT显示屏的控制

摘要:
LCD的显示与VGA的显示时序基本一致。不过他们与fpga的引脚不一样,并且相对VGA,LCD与fpga多连接一个引脚,tft_de。使用的是5.0英寸显示屏:800*480。代码实现从左向右、从上向下扫描,如果计数值在有效数据的矩阵区域,那么rgb的数值就会传送过来。背光控制信号让他一直为高电平。sys_rst_n),//这里注意是复位的取反,不然产生不了33M时钟驱动不了tft屏.c0);rgb_genu_rgb_gen;tft_driveu_tft_drive;endmodule驱动tft屏幕的模块tft_drive.vmoduletft_drive;assigntft_blank=1'b1;//RGBLCD显示模块背光控制信号,也有写成tft_blank=sys_rst_n;assigntft_vclk=clk_33M;parameterTFT_HS_end=12'd1,hdat_begin=12'd46,hdat_end=12'd846,hpixel_end=12'd1056,TFT_VS_end=12'd1,vdat_begin=12'd24,vdat_end=12'd504,vline_end=12'd524;reg[11:0]h_cnt;reg[11:0]v_cnt;assigntft_hs=?

实战描述:通过按键来切换TFT屏上的八种不同的颜色。

LCD的显示与VGA的显示时序基本一致。不过他们与fpga的引脚不一样,并且相对VGA,LCD与fpga多连接一个引脚,tft_de。VGA时序:

一行或一场(又称一帧)有四部分:低电平同步脉冲、显示后沿、有效数据、显示前沿。800*480是有效数据的区域。

行同步:

2基于fpga实现5.0英寸的TFT显示屏的控制第1张

场同步:

2基于fpga实现5.0英寸的TFT显示屏的控制第2张

2基于fpga实现5.0英寸的TFT显示屏的控制第3张

输入数据的行时序参数:这个红框是正点原子的。这里参考了部分数据,选择的低电平同步脉冲、显示后沿、有效数据、显示前沿分别是1、46、846、210。

2基于fpga实现5.0英寸的TFT显示屏的控制第4张

输入数据的场时序参数:这个红框是正点原子的。这里参考了部分数据,选择的低电平同步脉冲、显示后沿、有效数据、显示前沿分别是1、24、504、20。

2基于fpga实现5.0英寸的TFT显示屏的控制第5张

当MODE引脚拉高时,选择DE同步模式,此时行场同步信号VS和HS必须为高电平;当MODE引脚拉低时,选择HV同步模式,此时数据使能信号DE必须为低电平。

使用的是5.0英寸显示屏:800*480。这个分辨率表示屏幕有480行,800列,即屏幕有480条水平线,每一条水平线上有800个像素点。显示屏输入数据的时序图(DE模式):

2基于fpga实现5.0英寸的TFT显示屏的控制第6张

RGB格式即一个像素由R、G、B三基色构成,例如 RGB565 格式的像素排列为R[4:0]、G[5:0]、B[4:0],RGB三个分量的数值不同,最后合成的像素颜色则不同。

代码实现从左向右、从上向下扫描,如果计数值在有效数据的矩阵区域,那么rgb的数值就会传送过来。第一行的TFT行扫描计数器计算到有效数据区域,数据就会装进这一行中就不会动,然后TFT行扫描计数器扫描第二行,计算到有效数据区域,数据也会装到这一行中,以此类推在人眼没有反应过来时,所有行都已经装入这个数据,然后屏幕就会显示这个颜色:

2基于fpga实现5.0英寸的TFT显示屏的控制第7张

扫描完这里算一帧。

具体代码实现:

LCD屏幕与fpga芯片的连接有六个引脚:

outputtft_vclk //采样时钟

outputtft_blank //背光控制信号

outputtft_hs //行同步信号

outputtft_vs //场同步信号

outputtft_de //数据使能

output [15:0]tft_rgb //RGB565颜色数据

2基于fpga实现5.0英寸的TFT显示屏的控制第8张

其中采样时钟是33.3M,设置成33M也可以。背光控制信号让他一直为高电平。由时序图可以看出行同步信号和场同步信号需要经过同步之后才拉高。后面还有一小节拉低不管他,就让他们一直拉高。数据使能之后才把电平传输给LCD屏幕。


顶层模块tft.v

module tft(
input sys_clk,
input sys_rst_n,
input key,
output [15:0]tft_rgb,
output tft_hs,
output tft_vs,
output tft_blank,
output tft_de,
output tft_vclk
);

reg [2:0]key_cnt;
wire clk_33M;
wire [15:0]rgb;

wire key_flag;
wire key_value;
always @(posedge sys_clk or negedge sys_rst_n)begin
if(!sys_rst_n)
key_cnt<=3'd0;
else if(key_flag && (!key_value))
key_cnt<=key_cnt+3'd1;
else if(key_cnt>3'd7)
key_cnt<=3'd0;
else
key_cnt<=key_cnt;
end

key_filter u_key_filter(
.sys_clk (sys_clk),
.sys_rst_n (sys_rst_n),
.key (key),
.key_flag (key_flag),
.key_value (key_value)
);

pll u_pll(
.inclk0 (sys_clk),
.areset (!sys_rst_n), //这里注意是复位的取反,不然产生不了33M时钟驱动不了tft屏
.c0 (clk_33M)
);

rgb_gen u_rgb_gen(
.clk_33M (clk_33M),
.sys_rst_n (sys_rst_n),
.key_cnt (key_cnt),
.rgb (rgb)
);

tft_drive u_tft_drive(
.clk_33M (clk_33M),
.sys_rst_n (sys_rst_n),
.data_in (rgb),
.tft_rgb (tft_rgb),
.tft_hs (tft_hs),
.tft_vs (tft_vs),
.tft_blank (tft_blank),
.tft_de (tft_de),
.tft_vclk (tft_vclk)
);
endmodule

驱动tft屏幕的模块tft_drive.v

module tft_drive(
input clk_33M,
input sys_rst_n,
input [15:0]data_in,//准备好显示的颜色
output [15:0]tft_rgb,//输出颜色
output tft_hs,//行同步信号
output tft_vs,//场同步信号
output tft_blank,
output tft_de,
output tft_vclk
);

assign tft_blank=1'b1; //RGB LCD显示模块背光控制信号,也有写成tft_blank=sys_rst_n;
assign tft_vclk=clk_33M;

parameter
TFT_HS_end=12'd1,
hdat_begin=12'd46,
hdat_end=12'd846,
hpixel_end=12'd1056,
TFT_VS_end=12'd1,
vdat_begin=12'd24,
vdat_end=12'd504,
vline_end=12'd524;

reg [11:0]h_cnt;
reg [11:0]v_cnt;

assign tft_hs=(h_cnt>TFT_HS_end)?1'b1:1'b0;
assign tft_vs=(v_cnt>TFT_VS_end)?1'b1:1'b0;

always @(posedge clk_33M or negedge sys_rst_n)begin
if(!sys_rst_n)
h_cnt<=12'd0;
else if(h_cnt == hpixel_end)
h_cnt<=12'd0;
else
h_cnt<=h_cnt+1'b1;
end

always @(posedge clk_33M or negedge sys_rst_n)begin
if(!sys_rst_n)
v_cnt<=12'd0;
else if(h_cnt == hpixel_end)begin
if(v_cnt == vline_end)
v_cnt<=12'd0;
else
v_cnt<=v_cnt+1'b1;
end
end

wire lcd_en;
assign tft_de=lcd_en;
assign lcd_en=((h_cnt >= hdat_begin) && (h_cnt < hdat_end) && (v_cnt >= vdat_begin) && (v_cnt < vdat_end))?1'b1:1'b0;

assign tft_rgb=(lcd_en)?data_in:16'd0;
endmodule

产生颜色的模块rgb_gen.v

modulergb_gen(
inputclk_33M,
inputsys_rst_n,
input [2:0]key_cnt,  //这里如果没有位宽[2:0]那么key_cnt默认是0和1的变化,导致不能case到其他颜色
output reg[15:0]rgb
);

always @(posedge clk_33M or negedge sys_rst_n)begin
if(!sys_rst_n)
rgb<=16'd0;
else begin
case(key_cnt)
3'd0:rgb <= 16'hf800;//red
3'd1:rgb <= 16'h07e0;//green
3'd2:rgb <= 16'h001f;//blue
3'd3:rgb <= 16'hf81f;//purple紫色
3'd4:rgb <= 16'hffe0;//yellow
3'd5:rgb <= 16'h07ff;//cyan青色
3'd6:rgb <= 16'hfc00;//orange
3'd7:rgb <= 16'hffff;//white
endcase
end
end

endmodule 

按键切换key_filter.v

modulekey_filter(
inputsys_clk,
inputsys_rst_n,
inputkey,
output regkey_flag,
output regkey_value
);

regkey_reg;
reg [19:0]delay_cnt;

always @(posedge sys_clk or negedge sys_rst_n)begin
if(!sys_rst_n)beginkey_reg<=1'b1;
delay_cnt<=20'd0;
end
else beginkey_reg<=key;
if(key_reg !=key)
delay_cnt<=20'd1000_000;
else if(key_reg == key)begin
if(delay_cnt > 20'd0)
delay_cnt<=delay_cnt-1'b1;
elsedelay_cnt<=delay_cnt;
end
end
end

always @(posedge sys_clk or negedge sys_rst_n)begin
if(!sys_rst_n)beginkey_value<=1'b1;
key_flag<=1'b0;
end
else begin
if(delay_cnt == 20'd1)begin
key_flag<=1'b1;
key_value<=key;
end
else beginkey_flag<=1'b0;
key_value<=key_value;
end
end
end

endmodule 

免责声明:文章转载自《2基于fpga实现5.0英寸的TFT显示屏的控制》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇五角场之殇。曾与张江、漕河泾、紫竹齐名。如今,上海四大IT科技园是否还在?RobotFramework 切换窗口控制的用法小结下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

FPGA 移交代码学习——Map错误 ODDR2 使用问题

这段时间一直忙贴片生产相关事情,又是搬家,都没有什么时间好好整整。 前人移交过来的记录仪代码,发现一个BUG , 1 wire [8:0] fchk_shift_r1 = fenergy_chk<<1; 2 wire [9:0] fchk_shift_r2 = fenergy_chk<<2; 3 wire [10:0]fchk_sh...

FPGA综合工具--Synplify Pro的常用选项及命令

最近要用到Synplify,但以前没使用过,无基础,找到一篇帖子,隧保存下来。 本文转自:http://blog.sina.com.cn/s/blog_65fe490d0100v8ax.html Synplify 使用过程中最常用的选项及命令的介绍。一、 状态机相关(1)FSM Compiler Option  FSM Compiler是一个全局选项。勾选...

FPGA中的INOUT接口和高阻态

除了输入输出端口,FPGA中还有另一种端口叫做inout端口。如果需要进行全双工通信,是需要两条信道的,也就是说需要使用两个FPGA管脚和外部器件连接。但是,有时候半双工通信就能满足我们的要求,理论上来说只需要一条信道就足够了,而FPGA上实现这一功能的管脚就是inout端口。管脚相连时,input对应output,因此inout只能和inout连接(否则...

FPGA下载电路设置 AS 和JATG

altera FPGA 芯片支持JTAG在线下载方式和AS下载方式。JTAG下载方式,程序之际烧写到FPGA芯片,JTAG下载完成后直接运行。AS下载方式,可以执行代码直接烧写到FPGA配置芯片。在上电初始后,FPGA芯片直接从配置芯片读写可以执行代码配置FPGA芯片,然后运行。    在实际应用下载电路时,经常碰到下面的问题。JTAG下载后程序不运行。或...

用FPGA实现视频中物体边缘二值化

       对于高速视频图像中的物体轮廓提取中,图像的二值化,采用软件方式,速度无法满足需要,因此要采用FPGA方案,这样可以实现二值化速度和帧率一样,完全和视频同步。 一、算法原理:  边缘二值化的算法很多,象sobel法,roberts法,拉普拉斯法,导数法。为了简单化,采用导数法。        视频图像每帧扫描顺序如下图的黑色箭头所示     ...

xilinx FPGA课程学习总结

    一时冲动,跑步进入了FPGA的大门,尤老师是教练,我之前一直做嵌入式软件,数字电路也是十年前大学课堂学过,早已经还给老师了。FPGA对于我来说完全是小白,所以。老师的课程,对于我来说至关重要!因为见过太多从入门到放弃的案例了! 什么样的教程和视频,可以不至于让小白从入门到放弃呢?我总结了几点:1.由浅入深,循序渐进,不急躁,不跃进,符合人的认知规律...