实验任务
本节的实验任务是使用正点原子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彩条显示实验相关推荐

  1. 【正点原子MP157连载】第十八章 RGB LCD彩条显示实验-摘自【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7

    1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...

  2. 【正点原子FPGA连载】第十五章 RGB LCD彩条显示实验摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0

    1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670 3)全套实验源码+手册+视频下载地址: h ...

  3. 韦东山 IMX6ULL和正点原子_「正点原子FPGA连载」第十一章RGB LCD彩条显示(一)

    1)实验平台:正点原子达芬奇FPGA开发板 2) 摘自[正点原子]达芬奇之Microblaze 开发指南 3)购买链接:https://detail.tmall.com/item.htm?id=624 ...

  4. 【正点原子FPGA连载】第二十四章HDMI彩条显示实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1

    1)实验平台:正点原子新起点V2开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609758951113 2)全套实验源码+手册+视频下载地址:ht ...

  5. 【正点原子FPGA连载】第二十一章 HDMI彩条显示实验 -摘自【正点原子】领航者ZYNQ之FPGA开发指南_V2.0

    1)实验平台:正点原子领航者ZYNQ开发板 2)平台购买地址:https://item.taobao.com/item.htm?&id=606160108761 3)全套实验源码+手册+视频下 ...

  6. 【正点原子FPGA连载】 第十七章 HDMI彩条显示实验摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0

    1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670 3)全套实验源码+手册+视频下载地址: h ...

  7. FPGA学习--RGB-LCD屏彩条显示实验

    FPGA学习--RGB-LCD屏彩条显示实验 RGB-LCD屏原理 程序设计 参考正点原子视频 RGB-LCD屏原理 LCD 是一种液晶显示屏,它采用薄膜晶体管(TFT)技术提升图像质量,如提高图像亮 ...

  8. DDR200T TFT - LCD 显示屏 显示图片 NucleiStudio 蜂鸟E203 详细教程 RISC-V

    DDR200T TFT - LCD 显示屏 显示图片 NucleiStudio 蜂鸟E203 详细教程 RISC-V 前言 IMG2LCD软件生成RGB565格式图片 使用取模软件对图片取模 实验结果 ...

  9. 初试树莓派在2.2寸QVGA SPI TFT LCD上显示图片

    春节前整理抽屉翻出来一块2.2寸的240x320 SPI的TFT LCD.想起来这是当初做完Arduino搭配176x220的实验(http://blog.csdn.net/ki1381/articl ...

  10. 【接口协议】基于 FPGA 的 HMDI 彩条显示实验

    目录 HDMI 介绍 HDMI 引脚定义 TMDS 介绍 编码模块 代码实现 并转串模块 视频时序标准 传输通道顶层 顶层模块 工程搭建 HDMI 介绍 HDMI,高清晰度多媒体接口(High Def ...

最新文章

  1. 词法,语法,句法,语义
  2. 网页中嵌入地图位置方法
  3. ASP.NET MVC TagBuilder使用
  4. python字典实现原理-哈希函数-解决哈希冲突方法
  5. class构造函数实现接口数据整合
  6. Excel 2016双击文件打开为空白的解决办法-亲测解决。
  7. 创业篇——小老板的日常管理
  8. 对一个前端使用AngularJS后端使用ASP.NET Web API项目的理解(3)
  9. 视频消除人声,适用于配音比赛等场合
  10. boost电路输出电流公式_boost升压电路参数计算
  11. java word jar包_处理word的poi的jar包
  12. C# 创建桌面快捷方式
  13. android rgb接口,Android RGB颜色查询对照表
  14. geforce rtx3090显卡安装cuda11.0
  15. 48盘位 云存储服务器_搭建云存储NAS服务器的3个技巧
  16. 蓝桥云算法题之火柴棒等式——Python满分解答
  17. 简单易用的APP专项测试工具iTest4.7.0发布啦
  18. nsis升级包_NSIS:制作软件升级安装包
  19. 最新友价T5商城系统源码/21个模板+新媒域名任务服务包
  20. 【多校训练】2021牛客多校第一场

热门文章

  1. PS无法拖拽置入图片解决办法
  2. 从官网下载mod_jk.so
  3. Java工具-根据出生年月日计算出年龄
  4. 华为scp快充协议详解_华为SCP快充技术曝光:支持“电荷泵”技术,最高可达20W...
  5. 非常漂亮的一款html引导页导航网站旋转头像变幻背景单页源码
  6. 计算机技术在建模中的作用,谈计算机在数学建模中的作用
  7. with在python中啥意思_python中with的用法
  8. thinkphp5 关联预载入怎么用
  9. 刘津:职业生涯的前一半是靠努力,后一半是靠创新
  10. 利用阿里云ECS制作个人简历网站