基于fpga的lcd显示
目录
一.lcd介绍
1.lcd显示原理
LCD,即液晶显示器(Liquid Crystal Display),是一种广泛使用的平面显示器技术。LCD显示原理主要基于液晶材料的光学特性,通过控制液晶分子的排列来调节光线的透过率,从而实现图像的显示。以下是LCD显示原理的基本步骤:
背光系统:LCD显示器的背光系统通常由LED或冷阴极荧光灯(CCFL)组成,提供均匀的光线。
偏振片:背光上方和下方各有一个偏振片,它们只允许特定方向的光通过。
彩色滤光片:在偏振片上方,有一层彩色滤光片,它包含红、绿、蓝三种颜色的像素点,用于生成彩色图像。
液晶层:液晶层位于彩色滤光片和偏振片之间。液晶分子在没有电场作用时,自然排列,允许光线通过。当施加电压时,液晶分子会重新排列,从而改变光线的偏振方向。
电极:每个像素点都有一个或多个电极,用于施加电压控制液晶分子的排列。
控制电路:控制电路负责根据图像信号向电极施加适当的电压,以控制液晶分子的排列。
图像显示:当液晶分子排列改变时,它们会改变通过它们的光线的偏振方向。如果光线的偏振方向与第二个偏振片的偏振方向一致,光线就会通过;如果不一致,则光线被阻挡。通过这种方式,LCD显示器可以控制每个像素点的亮度,从而显示图像。
刷新率:LCD显示器通过不断刷新像素点来保持图像的稳定显示。
LCD显示器的优点包括低功耗、薄型设计、高分辨率和色彩表现。然而,它们也有缺点,如视角限制、响应时间较慢以及在极端温度下性能下降。随着技术的发展,新型LCD技术如IPS(In-Plane Switching)和VA(Vertical Alignment)等,已经改善了这些缺点,提供了更好的显示性能。
lcd通信协议
LCD显示器的通信协议是指用于控制LCD显示内容的一系列指令和数据传输规则。不同的LCD模块可能使用不同的通信协议,但以下是一些常见的LCD通信协议:
8080接口:这是一种并行通信协议,通常用于与微控制器或处理器连接。它包括多个控制引脚,如读信号RD、写信号WR、片选信号CS、数据/命令选择信号DC(RS),以及数据总线DB[x:0]。8080接口通过这些引脚来传输数据和命令。
RGB接口:这是LCD控制器和LCD屏幕之间的接口,通常用于彩色LCD。它使用点时钟信号DCLK、水平方向同步信号HSYNC、垂直方向同步信号VSYNC、RGB数据线,以及数据使能信号DE来控制像素的显示。
SPI接口:SPI(串行外设接口)是一种串行通信协议,广泛用于LCD和其他类型的显示设备。它使用少量的引脚来传输数据和命令,包括一个时钟线(CLK)、一个数据线(SDI/SDO)、一个片选线(CS)等。
I2C接口:I2C(Inter-Integrated Circuit)也是一种串行通信协议,用于连接低速外围设备。它使用两条线:串行数据线(SDA)和串行时钟线(SCL)。
自定义通信协议:某些智能液晶显示模块可能实现自定义通信协议,以维护企业的数据隐秘性,提升产品功能的多样性,并解决通信协议不兼容问题。
每种通信协议都有其特定的时序要求和引脚配置,开发者需要根据LCD模块的数据手册来正确配置和使用这些协议
二.lcd初始化
1.识别lcd的分辨率
module rd_id(
input clk , //时钟
input rst_n , //复位,低电平有效
input [15:0] lcd_rgb, //RGB LCD像素数据,用于读取ID
output reg [15:0] lcd_id //LCD屏ID
);
//reg define
reg rd_flag; //读ID标志
//获取LCD ID M2:B4 M1:G5 M0:R4
always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
rd_flag <= 1'b0;
lcd_id <= 16'd0;
end
else begin
if(rd_flag == 1'b0) begin
rd_flag <= 1'b1;
case({lcd_rgb[4],lcd_rgb[10],lcd_rgb[15]})
3'b000 : lcd_id <= 16'h4342; //4.3' RGB LCD RES:480x272
3'b001 : lcd_id <= 16'h7084; //7' RGB LCD RES:800x480
3'b010 : lcd_id <= 16'h7016; //7' RGB LCD RES:1024x600
3'b100 : lcd_id <= 16'h4384; //4.3' RGB LCD RES:800x480
3'b101 : lcd_id <= 16'h1018; //10' RGB LCD RES:1280x800
default : lcd_id <=16'h0;
endcase
end
end
end
endmodule
2.通过分辨率得到lcd自己的时钟周期
module clk_div(
input clk, //50Mhz
input rst_n,
input [15:0] lcd_id,
output reg lcd_pclk
);
reg clk_25m;
reg clk_12_5m;
reg div_4_cnt;
//时钟2分频 输出25MHz时钟
always @(posedge clk or negedge rst_n) begin
if(!rst_n)
clk_25m <= 1'b0;
else
clk_25m <= ~clk_25m;
end
//时钟4分频 输出12.5MHz时钟
always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
div_4_cnt <= 1'b0;
clk_12_5m <= 1'b0;
end
else begin
div_4_cnt <= div_4_cnt + 1'b1;
if(div_4_cnt == 1'b1)
clk_12_5m <= ~clk_12_5m;
end
end
always @(*) begin
case(lcd_id)
16'h4342 : lcd_pclk = clk_12_5m;
16'h7084 : lcd_pclk = clk_25m;
16'h7016 : lcd_pclk = clk;
16'h4384 : lcd_pclk = clk_25m;
16'h1018 : lcd_pclk = clk;
default : lcd_pclk = 0;
endcase
end
endmodule
3.lcd驱动模块
module lcd_driver(
input lcd_pclk, //时钟
input rst_n, //复位,低电平有效
input [15:0] lcd_id, //LCD屏ID
input [15:0] pixel_data, //像素数据
output [10:0] pixel_xpos, //当前像素点横坐标
output [10:0] pixel_ypos, //当前像素点纵坐标
output reg [10:0] h_disp, //LCD屏水平分辨率
output reg [10:0] v_disp, //LCD屏垂直分辨率
//RGB LCD接口
output lcd_de, //LCD 数据使能信号
output lcd_hs, //LCD 行同步信号
output lcd_vs, //LCD 场同步信号
output reg lcd_bl, //LCD 背光控制信号
output lcd_clk, //LCD 像素时钟
output [15:0] lcd_rgb, //LCD RGB565颜色数据
output reg lcd_rst //LCD 复位,低电平有效
);
//parameter define
// 4.3' 480*272
parameter H_SYNC_4342 = 11'd41; //行同步
parameter H_BACK_4342 = 11'd2; //行显示后沿
parameter H_DISP_4342 = 11'd480; //行有效数据
parameter H_FRONT_4342 = 11'd2; //行显示前沿
parameter H_TOTAL_4342 = 11'd525; //行扫描周期
parameter V_SYNC_4342 = 11'd10; //场同步
parameter V_BACK_4342 = 11'd2; //场显示后沿
parameter V_DISP_4342 = 11'd272; //场有效数据
parameter V_FRONT_4342 = 11'd2; //场显示前沿
parameter V_TOTAL_4342 = 11'd286; //场扫描周期
// 7' 800*480
parameter H_SYNC_7084 = 11'd128; //行同步
parameter H_BACK_7084 = 11'd88; //行显示后沿
parameter H_DISP_7084 = 11'd800; //行有效数据
parameter H_FRONT_7084 = 11'd40; //行显示前沿
parameter H_TOTAL_7084 = 11'd1056; //行扫描周期
parameter V_SYNC_7084 = 11'd2; //场同步
parameter V_BACK_7084 = 11'd33; //场显示后沿
parameter V_DISP_7084 = 11'd480; //场有效数据
parameter V_FRONT_7084 = 11'd10; //场显示前沿
parameter V_TOTAL_7084 = 11'd525; //场扫描周期
// 7' 1024*600
parameter H_SYNC_7016 = 11'd20; //行同步
parameter H_BACK_7016 = 11'd140; //行显示后沿
parameter H_DISP_7016 = 11'd1024; //行有效数据
parameter H_FRONT_7016 = 11'd160; //行显示前沿
parameter H_TOTAL_7016 = 11'd1344; //行扫描周期
parameter V_SYNC_7016 = 11'd3; //场同步
parameter V_BACK_7016 = 11'd20; //场显示后沿
parameter V_DISP_7016 = 11'd600; //场有效数据
parameter V_FRONT_7016 = 11'd12; //场显示前沿
parameter V_TOTAL_7016 = 11'd635; //场扫描周期
// 10.1' 1280*800
parameter H_SYNC_1018 = 11'd10; //行同步
parameter H_BACK_1018 = 11'd80; //行显示后沿
parameter H_DISP_1018 = 11'd1280; //行有效数据
parameter H_FRONT_1018 = 11'd70; //行显示前沿
parameter H_TOTAL_1018 = 11'd1440; //行扫描周期
parameter V_SYNC_1018 = 11'd3; //场同步
parameter V_BACK_1018 = 11'd10; //场显示后沿
parameter V_DISP_1018 = 11'd800; //场有效数据
parameter V_FRONT_1018 = 11'd10; //场显示前沿
parameter V_TOTAL_1018 = 11'd823; //场扫描周期
// 4.3' 800*480
parameter H_SYNC_4384 = 11'd128; //行同步
parameter H_BACK_4384 = 11'd88; //行显示后沿
parameter H_DISP_4384 = 11'd800; //行有效数据
parameter H_FRONT_4384 = 11'd40; //行显示前沿
parameter H_TOTAL_4384 = 11'd1056; //行扫描周期
parameter V_SYNC_4384 = 11'd2; //场同步
parameter V_BACK_4384 = 11'd33; //场显示后沿
parameter V_DISP_4384


789

被折叠的 条评论
为什么被折叠?



