前言
液晶显示器,简称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,满足场同步信号要求
由上图可看出,数据输出正常,实验成功