TFT_LCD屏幕显示设计验证

前言

        液晶显示器,简称LCD(Liquid Crystal Display),相对于上一代CRT显示器(阴极射线管显示器),LCD显示器具有功耗低、体积小、承载的信息量大及不伤眼的优点,因而它成为了现在的主流电子显示设备,其中包括电视、电脑显示器、手机屏幕及各种嵌入式设备的显示器。

正文

一、TFT_LCD屏幕显示设计验证

        1.项目需求

        实验目标:完成该规格的TFT_LCD屏幕驱动(rgb数据格式为332)

        2.技术介绍

        液晶显示(LCD,Liquid Crystal Display)技术是一种常见的显示技术,其工作原理主要涉及液晶材料的光学特性和电场控制。以下是液晶显示的基本原理:液晶材料是一种介于固体和液体之间的物质,它们的分子排列在不同的电场作用下会发生变化。液晶显示器常用的液晶材料有两类:向列型(Nematic)和光束型(Smectic)。液晶显示器通常由两个偏振片(一个在前面,一个在后面)组成。偏振片能够只允许特定方向的光通过,从而控制光线的传播方向。在两个偏振片之间,液晶层是显示器的核心部分。液晶分子在没有电场作用时,会按照一定的规律排列,并影响光线的传播方向。在液晶层的两侧,通常会有透明电极(如ITO电极),这些电极可以施加电场。电场的强度和方向会改变液晶分子的排列,从而控制光线的透过情况。
显示过程:无电场状态:液晶分子按照自然状态排列,光线通过第一个偏振片后经过液晶层,液晶层的排列状态会使光线旋转一定角度,最终光线能够通过第二个偏振片。有电场状态:施加电场时,液晶分子的排列会改变,光线在通过液晶层时的旋转角度也会变化。如果电场的强度和方向使得光线的旋转角度与第二个偏振片的偏振方向不匹配,那么光线就会被阻挡,从而显示出不同的图像或信息。背光源:由于液晶本身不发光,LCD显示器需要一个背光源来照亮显示内容。背光源一般是冷阴极荧光灯(CCFL)或发光二极管(LED)。

        HV同步模式:(小尺寸屏幕)(Horizontal-Vertical Synchronization Mode,简称HV同步模式)是显示器和图形系统之间同步信号的一种方式,用于确保图像的稳定显示。它主要涉及到水平同步信号(Horizontal Sync,HSYNC)和垂直同步信号(Vertical Sync,VSYNC)。水平同步信号是用于指示显示器开始新一行扫描的信号。它确保每一行图像在显示器上按照正确的时间顺序进行刷新。垂直同步信号是用于指示显示器开始新一帧图像扫描的信号。它确保整个图像帧在显示器上以正确的时间顺序进行刷新。

        DE同步模式(大尺寸屏幕)通常指的是显示信号的Data Enable(数据使能)信号。在显示器和图形系统之间进行信号传输时,DE信号用于指示显示器数据显示的有效期。在这种模式下,显示器的视频输入电路在DE信号为高电平的时候会从视频数据线读取数据,而在DE信号为低电平时则不会读取数据。DE同步模式是数字显示系统中的一个常见概念。DE(Data Enable)信号可以根据需求进行设置,可以是一个或多个时钟周期的高电平信号。它通常与行同步(HSYNC,Horizontal Synchronization)和场同步(VSYNC,Vertical Synchronization)信号一起工作,以同步显示器和图形卡。
        例如,在字符显示系统中,DE信号可能会被设置为在字符像素数据的前面有几个低电平周期,在这个时间段内,显示器不会读取数据。然后,在高电平的DE信号周期内,显示器会从视频数据线读取一条完整的像素数据。再然后,DE信号会再次变低,表示数据读取结束。

        3.顶层架构

        4.端口描述

clk时钟输入(50Mhz)
rst_n复位信号(低电平有效)
[7:0]    rgb输出颜色数据
tft_clk时钟驱动(9Mhz)
tft_ed模块使能信号
tft_bl背光有效信号
tft_hs场同步信号
tft_vs行同步信号

二、代码验证

显示驱动模块

module tft_ctrl(

	input    		clk		,
	input    		rst_n		,
	input[7:0]		in_rgb	,
				
	output   		tft_hs	,
	output   		tft_vs	,
	output[9:0]   	tft_h		,//坐标
	output[9:0]   	tft_v		,//坐标
	output[7:0]  	tft_rgb	,
	output			tft_de	,//使能信号
	output 			tft_clk	,//时钟
	output			tft_bl	 //背光信号	
);

reg [9:0] cnt_hs;//列计数器
reg [9:0] cnt_vs;//行计数器
wire hs_en;//列有效显示区域
wire vs_en;//行有效显示区域
wire volid_en;//有效显示区域

parameter 	hs_sync = 10'd41	,//同步
				hs_bask = 10'd2	,//后沿
				hs_vali = 10'd480	,//有效
				hs_fpon = 10'd2	,//前沿
				hs_tota = 10'd525	;//总共
				                   
parameter 	vs_sync = 10'd10	,//同步   
				vs_bask = 10'd2	,//后沿	   
				vs_vali = 10'd272	,//有效  
				vs_fpon = 10'd2	,//前沿   
				vs_tota = 10'd286	;//总共				

always @(posedge clk,negedge rst_n)//行同步计数器
begin
	if(rst_n == 0)
		cnt_hs <= 10'd0;
	else
		if(cnt_hs < hs_tota - 10'd1)
			cnt_hs <= cnt_hs + 10'd1;
		else
			cnt_hs <= 10'd0;
end 

always @(posedge clk,negedge rst_n)//场同步计数器
begin
	if(rst_n == 0)
		cnt_vs <= 10'd0;
	else
		if(cnt_hs ==  hs_tota - 10'd1)
			if(cnt_vs < vs_tota - 10'd1)
				cnt_vs <= cnt_vs + 10'd1;
			else 
				cnt_vs <= 10'd0;
		else
			cnt_vs <= cnt_vs;
end 

assign tft_hs = (cnt_hs < hs_sync)?1'b0:1'b1;//行同步信号赋值

assign tft_h  = (volid_en == 1'b1)?(cnt_hs - (hs_sync + hs_bask)):10'd0;//行坐标(Y)

assign tft_vs = (cnt_vs < vs_sync)?1'b0:1'b1;//场同步信号赋值

assign tft_v  = (volid_en == 1'b1)?(cnt_vs - (vs_sync + vs_bask )):10'd0;//列坐标(X)

assign hs_en = ((cnt_hs >= hs_sync + hs_bask  )&&(cnt_hs < hs_sync + hs_bask  + hs_vali))?1'b1:1'b0;

assign vs_en = ((cnt_vs >= vs_sync + vs_bask  )&&(cnt_vs < vs_sync + vs_bask  + vs_vali))?1'b1:1'b0;

assign volid_en = hs_en & vs_en;//显示区域

assign tft_rgb = (volid_en == 1'b1)?in_rgb:8'd0;

assign tft_de = volid_en;

assign tft_clk = clk;

assign tft_bl = rst_n;

endmodule 

显示数据生成模块

module tft_data(

    input               clk     	,
    input               rst_n   	,
	 input[9:0]				pix_x		,
	 input[9:0]				pix_y		,
	 
	 output reg[7:0]		tft_rgb

);

parameter 	show_h = 10'd110,//定位点X坐标
				show_v = 10'd100;//定位点Y坐标
				
parameter 	show_chan = 10'd256,//图片长度
				show_kuan = 10'd32;//图片宽度

parameter 	show_1_rgb = 8'b000_000_00,//背景
				show_0_rgb = 8'b111_100_00;//图片颜色

reg [255:0]	char	[31:0];
wire[9:0]	char_x;
wire[9:0]	char_y;
				
assign char_x =((pix_x >= show_h)&&(pix_x < (show_h + show_chan)))&&((pix_y >= show_v)&&(pix_y <(show_v + show_kuan)))?(pix_x - show_h):10'h3ff;
assign char_y =((pix_x >= show_h)&&(pix_x < (show_h + show_chan)))&&((pix_y >= show_v)&&(pix_y <(show_v + show_kuan)))?(pix_y - show_v):10'h3ff;

always@(posedge clk)
begin
	char[0  ] <= 256'h0000000000000000000000000001000000200000000100000020000000010000; 
	char[1  ] <= 256'h0020000000010000003FFFFFFFFF0000003FFFFFFFFF0000003FFFFFFFFF0000;
	char[2  ] <= 256'h003FFFFFFFFF0000003000180001000000300018000100000030001800010000;
	char[3  ] <= 256'h0030001800010000003000180000000000300018000000000030001800000000;
	char[4  ] <= 256'h003000180000000000300018000000000030003C000000000030007E00000000;
	char[5  ] <= 256'h003803FFE00000000038000000000000003C000000000000003E000000000000;
	char[6  ] <= 256'h003F8000000000000003C0000000000000006000000000000000000000000000;
	char[7  ] <= 256'h0000000000000000000000000000000000000000000000000000000000000000;
	char[8  ] <= 256'h0000000000000000000000000001000000200000000100000020000000010000;
	char[9  ] <= 256'h0020000000010000003FFFFFFFFF0000003FFFFFFFFF0000003FFFFFFFFF0000;
	char[10 ] <= 256'h003FFFFFFFFF0000003000060001000000300006000100000030000600010000;
	char[11 ] <= 256'h0030000600010000003000060000000000300006000000000030000600000000;
	char[12 ] <= 256'h00300006000000000038000E000000000038000E00000000001C001C00000000;
	char[13 ] <= 256'h001E003C00000000000F80F800000000000FFFF8000000000007FFF000000000;
	char[14 ] <= 256'h0001FFC00000000000007F000000000000000000000000000000000000000000;
	char[15 ] <= 256'h0000000000000000000000000000000000000000000000000000000000000000;
	char[16 ] <= 256'h00000000000000000000000000000000000000FFE000000000000FFFFE000000;
	char[17 ] <= 256'h00007FFFFF8000000000FFFFFFE000000003FE001FF800000007E00000FC0000;
	char[18 ] <= 256'h000F0000003C0000001E0000000E0000001C0000000600000038000000070000;
	char[19 ] <= 256'h0030000000030000003000000003000000300000000300000030000100030000;
	char[20 ] <= 256'h00300001000300000018000100060000001C0001800E0000001E0001FFFC0000;
	char[21 ] <= 256'h001F8001FFF80000001FF001FFF8000000003801FFF800000000000180000000;
	char[22 ] <= 256'h0000000100000000000000010000000000000001000000000000000000000000;
	char[23 ] <= 256'h0000000000000000000000000000000000000000000000000000000000000000;
	char[24 ] <= 256'h00000000000100000000000000010000000000000003000000000000001F0000;
	char[25 ] <= 256'h0000000001FF0000000000001FE3000000000001FC0100000000001FC0010000;
	char[26 ] <= 256'h000001FCC000000000001FC0C00000000001FC00C0000000001FC000C0000000;
	char[27 ] <= 256'h003E0000C0000000007F0000C0000000007FF000C0000000003FFF00C0000000;
	char[28 ] <= 256'h0001FFF0C000000000001FFFC0000000000001FFFC0100000000001FFFC10000;
	char[29 ] <= 256'h00000001FFFF0000000000000FFF00000000000000FF000000000000000F0000;
	char[30 ] <= 256'h0000000000030000000000000001000000000000000100000000000000000000;
	char[31 ] <= 256'h0000000000000000000000000000000000000000000000000000000000000000;
end

always @(posedge clk,negedge rst_n)
begin
	if(rst_n == 0)
		tft_rgb <= show_1_rgb;
	else
		if(	((pix_x >= show_h - 1'b1)&&(pix_x < (show_h + show_chan - 1'b1)))
			&&	((pix_y >= show_v )&&(pix_y <(show_v + show_kuan)))
			&&	(char[char_y][10'd255 - char_x] == 1'b1))
			tft_rgb  <= show_0_rgb;
		else
			tft_rgb <= show_1_rgb;
end

endmodule 

顶层连线

module tft_lcd_ctrl(

	input 		clk  		,
	input			rst_n		,
	
	output[7:0]	rgb		,
	output		tft_clk	,
	output		tft_ed	,
	output		tft_bl	,
	output		tft_hs	,
	output		tft_vs		
);

wire[7:0]tft_rgb;
wire[9:0]tft_h;
wire[9:0]tft_v;
wire clk_9;
wire rst_en;

my_pll	my_pll_inst (
	.areset 	( ~rst_n),
	.inclk0 	( clk   ),
	.c0 		( clk_9 ),
	.locked 	( rst_en)
	);


tft_ctrl tft_ctrl(

	.clk		(clk_9	)	,
	.rst_n	(rst_en	)	,
	.in_rgb	(tft_rgb	)	,

	.tft_hs	(tft_hs	)	,
	.tft_vs	(tft_vs	)	,
	.tft_h	(tft_h	)	,//坐标
	.tft_v	(tft_v	)	,//坐标
	.tft_rgb	(rgb		)	,
	.tft_de	(tft_ed	)	,//使能信号
	.tft_clk	(tft_clk	)	,//时钟
	.tft_bl	(tft_bl	)	 //背光信号	
);

tft_data tft_data(

   .clk     (clk_9   )	,
   .rst_n   (rst_en  )	,
	.pix_x	(tft_h	)	,
	.pix_y	(tft_v	)	,
    
	.tft_rgb (tft_rgb )		 

);



endmodule

仿真文件

`timescale 1ns/1ps
module tft_lcd_ctrl_tb();

reg  clk		;
reg  rst_n	;
            
wire tft_clk	;
wire tft_ed		;
wire tft_bl		;
wire tft_hs		;
wire tft_vs		;
wire[7:0] rgb	;

tft_lcd_ctrl tft_lcd_ctrl(

	.clk  	(clk  	),
	.rst_n	(rst_n	),
      
	.rgb		(rgb		),
	.tft_clk	(tft_clk	),
	.tft_ed	(tft_ed	),
	.tft_bl	(tft_bl	),
	.tft_hs	(tft_hs	),
	.tft_vs	(tft_vs	)	
);

initial clk = 1'b1;
always #10 clk = ~clk;

initial begin
	rst_n = 0;
	#20
	rst_n =1;
	#2000000000
	$stop;
end

endmodule

三、仿真验证

行同步信号0-524,满足场同步信号要求

场同步信号0-285,满足场同步信号要求

由上图可看出,数据输出正常,实验成功

参考资料

薄膜晶体管液晶显示器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张明阳.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值