明德扬吴老师 发表于 2020-9-11 15:27:23

【每周FPGA案例】至简设计系列_LCD入门案例_边框显示

至简设计系列_LCD入门案例_边框显示--作者:喝喝
本文为明德扬原创及录用文章,转载请注明出处!

1.1 总体设计
1.1.1 概述液晶显示器是一-种通过液晶和色彩过滤器过滤光源,在平面面板上产生图像的数字显示器。LCD 的构造是在两片平行的玻璃基板当中放置液晶盒,下基板玻璃上设置薄膜晶体管,.上基板玻璃上设置彩色滤光片,通过薄膜晶体管上的信号与电压改变来控制液晶分子的转动方向,从而达到控制每个像素点偏振光出射与否而达到显示目的。与传统的阴极射线管相比,LCD具有占用空间小,低功耗,低辐射,无闪烁,降低视觉疲劳等优点。现在LCD已渐替代CRT成为主流,价格也已经下降了很多,并已充分的普及。本设计的主要任务是基于FPGA的LCD显示控制器设计,兼顾程序的易用性,方便此后模块的移植和应用。采用VHDL硬件描述语言在QUARTUS II软件平台上实现FPGA对LCD的控制,在LCD模块上实现任意彩色图片的显示,与此同时还须实现实时刷新数据的功能。这将有助于采用FPGA的系列产品的开发,特别是需要用到LCD而采用FPGA的产品的开发。不但缩短了FPGA的开发周期,也使更多采用FPGA设计的产品上出现LCD,增加了人机之间的交互性。
1.1.2 设计目标此设计通过fpga给lcd发送图片信息,然后直接在LCD显示出图片
1.1.3信号列表

信号名接口方向定义
clk_50m输入系统时钟
rst_n输入低电平复位信号
lcd_hsync输出行同步信号
lcd_vsync 输出场同步信号
lcd_de输出行和场同时显示时序段有效显示数据段信号
lcd_rgb输出显示颜色RGB:表示的是R:表示的是G:表示的是B
lcd_dclk输出像素时钟信号


1.1.4 设计思路设计行显示时序段和场显示时序段,来确定矩形边框的宽度,根据各种颜色的数值来确定lcd显示屏显示出的边框颜色行时钟计数器cnt_hys:用来计算行同步信号的帧长,加一条件是1,结束条件为数到1056个像素就结束场时钟计数器cnt_vys:用来计算场同步信号的帧长,加一条件是场信号每数到1056个像素(即为一行结束的时刻),结束条件为数到525行就结束
1.1.5参考代码module mdyLcdDispRect(
    clk_50m   ,
    rst_n       ,

    lcd_hsync   ,
    lcd_vsync   ,
    lcd_de      ,


    lcd_rgb   ,
    lcd_dclk   
      
);

    input               clk_50m   ;
    input               rst_n       ;
    output            lcd_hsync   ;
    output            lcd_vsync   ;
    output            lcd_de      ;

    output      lcd_rgb   ;
    output            lcd_dclk    ;
      


    reg               lcd_hsync   ;
    reg               lcd_vsync   ;

    reg         lcd_rgb   ;


    parameter   LINE_PR   =1056 ;      
    parameter   FRAME_PER =   525 ;         


    parameter   H_SYNC    =    20 ;      
    parameter   V_SYNC    =    10 ;            

    parameter   HDE_START =    46 ;
    parameter   HDE_END   =   846 ;
    parameter   VDE_START =    23 ;
    parameter   VDE_END   =   503 ;

   

    reg       cnt_hsy       ;
    reg       cnt_vsy       ;
    reg               hsync_de      ;
    reg               vsync_de      ;

    wire            display_area;
    wire            e_area      ;
    wire            add_cnt_hsy   ;
    wire            end_cnt_hsy   ;
    wire            add_cnt_vsy   ;
    wire            end_cnt_vsy   ;
    reg [ 7:0]      cnt0          ;
    wire            add_cnt0      ;
    wire            end_cnt0      ;
    reg       cnt1          ;
    wire            add_cnt1      ;
    wire            end_cnt1      ;


    assign clk       = clk_50m            ;
    assign lcd_dclk= ~ clk_50m            ;
    assign lcd_de    = hsync_de & vsync_de;
   
   


    always @ (posedge clk or negedge rst_n)begin
            if(!rst_n)begin
                cnt_hsy <= 0;
            end
            else if(add_cnt_hsy)begin
                if(end_cnt_hsy)
                  cnt_hsy <= 0;
                else
                  cnt_hsy <= cnt_hsy + 1;
            end
      end
   
    assign add_cnt_hsy = 1;
    assign end_cnt_hsy = add_cnt_hsy && cnt_hsy == LINE_PR -1;
   

    always @ (posedge clk or negedge rst_n)begin
      if(!rst_n)begin
            cnt_vsy <= 0;
      end
      else if(add_cnt_vsy)begin
            if(end_cnt_vsy)
                cnt_vsy <= 0;
            else
                cnt_vsy <= cnt_vsy + 1;
      end
    end
   
    assign add_cnt_vsy = end_cnt_hsy;
    assign end_cnt_vsy = add_cnt_vsy && cnt_vsy == FRAME_PER - 1;
         

    always @ (posedge clk or negedge rst_n)begin
      if(!rst_n)begin
            lcd_hsync <= 1'b0 ;
      end
      else if(end_cnt_hsy)begin
            lcd_hsync <= 1'b0;
      end
      else if(add_cnt_hsy && cnt_hsy == H_SYNC-1 )begin
            lcd_hsync <= 1'b1;
      end
    end

    always @ (posedge clk or negedge rst_n)begin
      if(!rst_n)begin
            hsync_de <= 1'b0;
      end
      else if(add_cnt_hsy && cnt_hsy == HDE_START-1)begin
            hsync_de <= 1'b1;
      end
      else if(add_cnt_hsy && cnt_hsy == HDE_END-1)begin
            hsync_de <= 1'b0;
      end
    end

         
    always @ (posedge clk or negedge rst_n)begin
      if(!rst_n)begin
            lcd_vsync <= 1'b0 ;
      end
                  else if(add_cnt_vsy && cnt_vsy == V_SYNC-1 )begin
            lcd_vsync <= 1'b1;
      end
      else if(end_cnt_vsy)begin
            lcd_vsync <= 1'b0;
      end

    end

         
    always @ (posedge clk or negedge rst_n)begin
      if(!rst_n)begin
            vsync_de <= 1'b0;
      end
      else if(add_cnt_vsy && cnt_vsy == VDE_START-1)begin
            vsync_de <= 1'b1;
      end
      else if(add_cnt_vsy && cnt_vsy ==VDE_END-1)begin
            vsync_de <= 1'b0;
      end
    end


    assign   display_area = hsync_de && vsync_de;


    assign   blue_area = (cnt_hsy >= HDE_START + 400-125) && (cnt_hsy<HDE_START+400+125) &&
                         (cnt_vsy >= VDE_START + 240-80) && (cnt_vsy<VDE_START+240+80) ;

                     
    assign   reb_area= (cnt_hsy >= HDE_START + 400-250) && (cnt_hsy<HDE_START+400+250) &&
                         (cnt_vsy >= VDE_START + 240-160) && (cnt_vsy<VDE_START+240+160) ;


    always @ (posedge clk or negedge rst_n)begin
      if(!rst_n)begin
            lcd_rgb <= 0;
      end
      else if(display_area)begin
            if(blue_area)begin
                lcd_rgb <= 24'h00_00_ff ;
            end
            else if(reb_area)begin
                lcd_rgb <= 24'hff_00_00 ;
            end
            else begin
                lcd_rgb <= 24'h00_ff_00 ;
            end
      end
      else begin
            lcd_rgb <= 0;
      end
    end



endmodule




1.2 效果和总结



本案例我们设计了蓝色、红色和绿色的矩形框,蓝色和红色的矩形框的场信号是160行、行信号是250个像素;绿色的矩形框的场信号是160行、行信号是300个像素,所以我们后面就得到一个160*250的蓝色矩形框、500*320-250*160的红色矩形边框和一个800*480-500*320的绿色矩形边框在这个设计案例中,至简设计法和明德扬计数器模板发挥了至关重要的作用,使我能够快速准确完成设计。希望有兴趣的同学可以运用至简设计法和明德扬模板尝试一下拓展设计哦。
感兴趣的朋友也可以访问明德扬论坛(http://www.fpgabbs.cn/)进行FPGA相关工程设计学习,也可以看一下我们往期的文章:《基于FPGA的密码锁设计》《波形相位频率可调DDS信号发生器》《基于FPGA的曼彻斯特编码解码设计》《基于FPGA的出租车计费系统》《数电基础与Verilog设计》《基于FPGA的频率、电压测量》《基于FPGA的汉明码编码解码设计》《关于锁存器问题的讨论》《阻塞赋值与非阻塞赋值》《参数例化时自动计算位宽的解决办法》
1.3 公司简介明德扬是一家专注于FPGA领域的专业性公司,公司主要业务包括开发板、教育培训、项目承接、人才服务等多个方向。点拨开发板——学习FPGA的入门之选。
MP801开发板——千兆网、ADDA、大容量SDRAM等,学习和项目需求一步到位。网络培训班——不管时间和空间,明德扬随时在你身边,助你快速学习FPGA。周末培训班——明天的你会感激现在的努力进取,升职加薪明德扬来助你。就业培训班——七大企业级项目实训,获得丰富的项目经验,高薪就业。专题课程——高手修炼课:提升设计能力;实用调试技巧课:提升定位和解决问题能力;FIFO架构设计课:助你快速成为架构设计师;时序约束、数字信号处理、PCIE、综合项目实践课等你来选。项目承接——承接企业FPGA研发项目。人才服务——提供人才推荐、人才代培、人才派遣等服务。
【设计教程下载】

【设计视频教程】
https://www.bilibili.com/video/BV1Af4y117H4?p=34


【设计代码下载】



明德扬娄老师 发表于 2020-10-20 11:00:46

引脚配置界面中的lcd_back、lcd_int、lcd_rst引脚为多余的引脚配置,直接删除即可

明德扬吴老师 发表于 2020-11-25 16:46:32

【问题1】关于代码参数看不明白。
答:这些参数,是根据时序手册过来的,另外视频里也有说明这些参数的意义,关于这些意义,请看LCD的第一个案例说明,http://www.fpgabbs.cn/forum.php?mod=viewthread&tid=1130&extra=page%3D1
页: [1]
查看完整版本: 【每周FPGA案例】至简设计系列_LCD入门案例_边框显示