RGB TFT-LCD彩条显示实验
实验任务
本节的实验任务是使用正点原子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),
.lcd_id(lcd_id)
);
//时钟分频模块
clk_div u_clk_div(
.clk(sys_clk),
.rst_n(sys_rst_n),
.lcd_id(lcd_id),
.lcd_pclk(lcd_pclk)
);
//LCD显示模块
lcd_display u_lcd_display(
.lcd_pclk(lcd_pclk),
.rst_n(sys_rst_n),
.pixel_xpos(pixel_xpos),
.pixel_ypos(pixel_ypos),
.h_disp(h_disp),
.v_disp(v_disp),
.pixel_data(pixel_data)
);
//LCD驱动模块
lcd_driver u_lcd_driver(
.lcd_pclk(lcd_pclk),
.rst_n(sys_rst_n),
.lcd_id(lcd_id),
.pixel_data(pixel_data),
.pixel_xpos(pixel_xpos),
.pixel_ypos(pixel_ypos),
.h_disp(h_disp),
.v_disp(v_disp),
.lcd_de(lcd_de),
.lcd_hs(lcd_hs),
.lcd_vs(lcd_vs),
.lcd_bl(lcd_bl),
.lcd_clk(lcd_clk),
.lcd_rgb(lcd_rgb_o)
);
endmodule
读取ID模块代码实现
modulerd_id(
input clk,//时钟
input rst_n,//复位,低电平有效
input [23:0] lcd_rgb,//RGB LCD像素数据,用于读取ID
output reg [15:0] lcd_id//LCD屏ID
);
//reg define
regrd_flag;//读ID标志10
//*****************************************************
//** main code
//*****************************************************14
//获取LCD IDM2:B7 M1:G7 M0:R7
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[7],lcd_rgb[15],lcd_rgb[23]})
3'b000:lcd_id<=16'h4342;//4.3' RGB LCD RES:480x272
3'b001:lcd_id<=16'h7084;//7' RGB LCDRES: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'd0;
endcase
end
end
end
endmodule
分频模块代码实现:
moduleclk_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=1'b0;
endcase
end
endmodule
LCD驱动模块代码实现:
module lcd_driver(
input lcd_pclk,//时钟
input rst_n,//复位,低电平有效
input [15:0] lcd_id,//LCD屏ID
input [23:0] pixel_data,//像素数据
output [10:0] pixel_xpos,//当前像素点横坐标
output [10:0] pixel_ypos,//当前像素点纵坐标
output reg [10:0] h_disp,//LCD屏水平分辨率
outputreg [10:0] v_disp,//LCD屏垂直分辨率
//RGB LCD接口
output lcd_de,//LCD数据使能信号
output lcd_hs,//LCD行同步信号
output lcd_vs,//LCD场同步信号
output lcd_bl,//LCD背光控制信号
output lcd_clk,//LCD像素时钟
output [23:0] lcd_rgb//LCD RGB888颜色数据
);
//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;//行扫描周期26
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;//场扫描周期
代码较长,省略部分源代码……
//reg define
reg [10:0] h_sync;
reg [10:0] h_back;
reg [10:0] h_total;
reg [10:0] v_sync;
reg [10:0] v_back;
reg [10:0] v_total;
reg [10:0] h_cnt;
reg [10:0] v_cnt;
//wire define
wire lcd_en;
wire data_req;
//RGB LCD采用DE模式时,行场同步信号需要拉高
assign lcd_hs=1'b1;//LCD行同步信号
assign lcd_vs=1'b1;//LCD场同步信号106
assign lcd_bl=1'b1;//LCD背光控制信号
assign lcd_clk=lcd_pclk;//LCD像素时钟
assign lcd_de=lcd_en;//LCD数据有效信号110
//使能RGB888数据输出
assign lcd_en=((h_cnt>=h_sync+h_back)&&(h_cnt<h_sync+h_back+h_disp)
&&(v_cnt>=v_sync+v_back)&&(v_cnt<v_sync+v_back+v_disp))
?1'b1:1'b0;
//请求像素点颜色数据输入
assign data_req=((h_cnt>=h_sync+h_back-1'b1)&&(h_cnt<h_sync+h_back+h_disp-1'b1)
&&(v_cnt>=v_sync+v_back)&&(v_cnt<v_sync+v_back+v_disp))
?1'b1:1'b0;
//像素点坐标
assign pixel_xpos=data_req?(h_cnt-(h_sync+h_back-1'b1)):11'd0;
assign pixel_ypos=data_req?(v_cnt-(v_sync+v_back-1'b1)):11'd0;
//RGB888数据输出
assign lcd_rgb=lcd_en?pixel_data:24'd0;
//行场时序参数
always@(*)begin
case(lcd_id)
16'h4342:begin
h_sync=H_SYNC_4342;
h_back=H_BACK_4342;
h_disp=H_DISP_4342;
h_total=H_TOTAL_4342;
v_sync=V_SYNC_4342;
v_back=V_BACK_4342;
v_disp=V_DISP_4342;
v_total=V_TOTAL_4342;
end
代码较长,省略部分源代码……
endcase
end
//行计数器对像素时钟计数
always@(posedgelcd_pclkornegedgerst_n)begin
if(!rst_n)
h_cnt<=11'd0;
else begin
if(h_cnt==h_total-1'b1)
h_cnt<=11'd0;
else
h_cnt<=h_cnt+1'b1;
end
end
//场计数器对行计数
always@(posedgelcd_pclkornegedgerst_n)begin
if(!rst_n)
v_cnt<=11'd0;
else begin
if(h_cnt==h_total-1'b1)begin
if(v_cnt==v_total-1'b1)
v_cnt<=11'd0;
else
v_cnt<=v_cnt+1'b1;
end
end
end
endmodule
LCD显示模块代码实现:
modulelcd_display(
input lcd_pclk,//时钟
input rst_n,//复位,低电平有效
input [10:0] pixel_xpos,//当前像素点横坐标
input [10:0] pixel_ypos,//当前像素点纵坐标
input [10:0] h_disp,//LCD屏水平分辨率
input [10:0] v_disp,//LCD屏垂直分辨率
output reg [23:0] pixel_data//像素数据
);
//parameter define
parameter WHITE=24'hFFFFFF;//白色
parameter BLACK=24'h000000;//黑色
parameter RED=24'hFF0000;//红色
parameter GREEN=24'h00FF00;//绿色
parameter BLUE=24'h0000FF;//蓝色
//根据当前像素点坐标指定当前像素点颜色数据,在屏幕上显示彩条
always@(posedgelcd_pclkornegedgerst_n)begin
if(!rst_n)
pixel_data<=BLACK;
else begin
if((pixel_xpos>=11'd0)&&(pixel_xpos<h_disp/5*1))
pixel_data<=WHITE;
elseif((pixel_xpos>=h_disp/5*1)&&(pixel_xpos<h_disp/5*2))
pixel_data<=BLACK;
elseif((pixel_xpos>=h_disp/5*2)&&(pixel_xpos<h_disp/5*3))
pixel_data<=RED;
elseif((pixel_xpos>=h_disp/5*3)&&(pixel_xpos<h_disp/5*4))
pixel_data<=GREEN;
else
pixel_data<=BLUE;
end
end
endmodule
RGB TFT-LCD彩条显示实验相关推荐
- 【正点原子MP157连载】第十八章 RGB LCD彩条显示实验-摘自【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7
1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...
- 【正点原子FPGA连载】第十五章 RGB LCD彩条显示实验摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0
1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670 3)全套实验源码+手册+视频下载地址: h ...
- 韦东山 IMX6ULL和正点原子_「正点原子FPGA连载」第十一章RGB LCD彩条显示(一)
1)实验平台:正点原子达芬奇FPGA开发板 2) 摘自[正点原子]达芬奇之Microblaze 开发指南 3)购买链接:https://detail.tmall.com/item.htm?id=624 ...
- 【正点原子FPGA连载】第二十四章HDMI彩条显示实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1
1)实验平台:正点原子新起点V2开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609758951113 2)全套实验源码+手册+视频下载地址:ht ...
- 【正点原子FPGA连载】第二十一章 HDMI彩条显示实验 -摘自【正点原子】领航者ZYNQ之FPGA开发指南_V2.0
1)实验平台:正点原子领航者ZYNQ开发板 2)平台购买地址:https://item.taobao.com/item.htm?&id=606160108761 3)全套实验源码+手册+视频下 ...
- 【正点原子FPGA连载】 第十七章 HDMI彩条显示实验摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0
1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670 3)全套实验源码+手册+视频下载地址: h ...
- FPGA学习--RGB-LCD屏彩条显示实验
FPGA学习--RGB-LCD屏彩条显示实验 RGB-LCD屏原理 程序设计 参考正点原子视频 RGB-LCD屏原理 LCD 是一种液晶显示屏,它采用薄膜晶体管(TFT)技术提升图像质量,如提高图像亮 ...
- DDR200T TFT - LCD 显示屏 显示图片 NucleiStudio 蜂鸟E203 详细教程 RISC-V
DDR200T TFT - LCD 显示屏 显示图片 NucleiStudio 蜂鸟E203 详细教程 RISC-V 前言 IMG2LCD软件生成RGB565格式图片 使用取模软件对图片取模 实验结果 ...
- 初试树莓派在2.2寸QVGA SPI TFT LCD上显示图片
春节前整理抽屉翻出来一块2.2寸的240x320 SPI的TFT LCD.想起来这是当初做完Arduino搭配176x220的实验(http://blog.csdn.net/ki1381/articl ...
- 【接口协议】基于 FPGA 的 HMDI 彩条显示实验
目录 HDMI 介绍 HDMI 引脚定义 TMDS 介绍 编码模块 代码实现 并转串模块 视频时序标准 传输通道顶层 顶层模块 工程搭建 HDMI 介绍 HDMI,高清晰度多媒体接口(High Def ...
最新文章
- 词法,语法,句法,语义
- 网页中嵌入地图位置方法
- ASP.NET MVC TagBuilder使用
- python字典实现原理-哈希函数-解决哈希冲突方法
- class构造函数实现接口数据整合
- Excel 2016双击文件打开为空白的解决办法-亲测解决。
- 创业篇——小老板的日常管理
- 对一个前端使用AngularJS后端使用ASP.NET Web API项目的理解(3)
- 视频消除人声,适用于配音比赛等场合
- boost电路输出电流公式_boost升压电路参数计算
- java word jar包_处理word的poi的jar包
- C# 创建桌面快捷方式
- android rgb接口,Android RGB颜色查询对照表
- geforce rtx3090显卡安装cuda11.0
- 48盘位 云存储服务器_搭建云存储NAS服务器的3个技巧
- 蓝桥云算法题之火柴棒等式——Python满分解答
- 简单易用的APP专项测试工具iTest4.7.0发布啦
- nsis升级包_NSIS:制作软件升级安装包
- 最新友价T5商城系统源码/21个模板+新媒域名任务服务包
- 【多校训练】2021牛客多校第一场
热门文章
- PS无法拖拽置入图片解决办法
- 从官网下载mod_jk.so
- Java工具-根据出生年月日计算出年龄
- 华为scp快充协议详解_华为SCP快充技术曝光:支持“电荷泵”技术,最高可达20W...
- 非常漂亮的一款html引导页导航网站旋转头像变幻背景单页源码
- 计算机技术在建模中的作用,谈计算机在数学建模中的作用
- with在python中啥意思_python中with的用法
- thinkphp5 关联预载入怎么用
- 刘津:职业生涯的前一半是靠努力,后一半是靠创新
- 利用阿里云ECS制作个人简历网站