实验任务
本节的实验任务是使用正点原子ZYNQ开发板上的RGB TFT-LCD接口,驱动RGB LCD液晶屏(支持目前推出的所有RGB LCD屏),并显示出彩条。
模块示意图:
RGBTFT-LCD输入时序包含三个要素:像素时钟、同步信号、以及图像数据,由此我们可以大致规划出系统结构如下图所示。其中,读取ID模块用于获取LCD屏的ID;由于不同分辨率的屏幕需要不同的驱动时钟,因此时钟分频模块根据LCD ID来输出不同频率的像素时钟;LCD显示模块负责产生液晶屏上显示的数据,即彩条数据;LCD驱动模块根据LCD屏的ID,输出不同参数的时序,来驱动LCD屏,并将输入的彩条数据显示到LCD屏上。
由系统框图可知,FPGA部分包括五个模块,顶层模块(lcd_rgb_colorbar)、读取ID模块(rd_id)、时钟分频模块(clk_div)、LCD显示模块(lcd_display)以及LCD驱动模块(lcd_driver)。其中在顶层模块中完成对其余模块的例化。
各模块端口及信号连接如下图所示:
读取ID模块(rd_id)在上电时将RGB双向数据总线设置为输入,来读取LCD屏的ID;时钟分频模块(clk_div)根据读取的ID来配置LCD的像素时钟;LCD驱动模块(lcd_driver)在像素时钟的驱动下输出数据使能信号用于数据同步,同时还输出像素点的纵横坐标,供LCD显示模块(lcd_display)调用,以绘制彩条图案。
顶层模块代码实现:
modulelcd_rgb_colorbar(
input sys_clk,//系统时钟
input sys_rst_n,//系统复位
//RGB LCD接口
output lcd_de,//LCD数据使能信号
output lcd_hs,//LCD行同步信号
output lcd_vs,//LCD场同步信号
output lcd_bl,//LCD背光控制信号
output lcd_clk,//LCD像素时钟
inout [23:0] lcd_rgb//LCD RGB888颜色数据
);
//wire define
wire [15:0] lcd_id;//LCD屏ID
wire lcd_pclk;//LCD像素时钟
wire [10:0] pixel_xpos;//当前像素点横坐标
wire [10:0] pixel_ypos;//当前像素点纵坐标
wire [10:0] h_disp;//LCD屏水平分辨率
wire [10:0] v_disp;//LCD屏垂直分辨率
wire [23:0] pixel_data;//像素数据
wire [23:0] lcd_rgb_o;//输出的像素数据
wire [23:0] lcd_rgb_i;//输入的像素数据
//像素数据方向切换
assign lcd_rgb=lcd_de?lcd_rgb_o:{24{1'bz}};
assign lcd_rgb_i=lcd_rgb;
//读LCD ID模块
rd_id u_rd_id(
.clk(sys_clk),
.rst_n(sys_rst_n),
.lcd_rgb(lcd_rgb_i),