查看: 1074|回复: 3

【案例】LCD显示图片

[复制链接]
  • TA的每日心情
    开心
    2023-1-4 10:25
  • 签到天数: 6 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2022-7-4 06:59:31 | 显示全部楼层 |阅读模式
    分享到:
    本文为明德扬原创及录用文章,转载请注明出处!
    1.1 总体设计1.1.1 概述
    液晶显示器是一种通过液晶和色彩过滤器过滤光源,在平面面板上产生图像的数字显示器。LCD 的构造是在两片平行的玻璃基板当中放置液晶盒,下基板玻璃上设置薄膜晶体管,.上基板玻璃上设置彩色滤光片,通过薄膜晶体管上的信号与电压改变来控制液晶分子的转动方向,从而达到控制每个像素点偏振光出射与否而达到显示目的。与传统的阴极射线管相比,LCD具有占用空间小,低功耗,低辐射,无闪烁,降低视觉疲劳等优点。现在LCD已渐替代CRT成为主流,价格也已经下降了很多,并已充分的普及。
    1.1.2 设计目标
    在7寸LCD显示屏上实现图片的居中显示。
    1.1.3 系统结构框图
    系统结构框图如下所示:

    1.1.4 模块功能Ø PLL模块实现功能
    1. 将输入的50MHz时钟分频输出40MHz时钟。
    Ø ROM模块实现功能
    2. 存储图像数据。
    Ø LCD驱动模块实现功能
    1、 产生驱动LCD屏显示的时序
    2、 读取ROM里存储的数据并输出显示
    1.1.5 顶层信号1.1.6 参考代码

    1. module top_mdyLcdPic( 2.  clk , 3.  rst_n , 4.  hys , 5.  vys , 6.  lcd_de , 7.  lcd_rgb , 8.  lcd_dclk 9.  ); 10.   11.  parameter PICTURE_W = 24 ; 12.   13.  input clk ; 14.  input rst_n ; 15.  output hys ; 16.  output vys ; 17.  output lcd_de ; 18.  output  [PICTURE_W-1:0] lcd_rgb ; 19.  output lcd_dclk ; 20.   21.   22.  wire clk_0 ; 23.   24.  wire hys ; 25.  wire vys ; 26.  wire lcd_de ; 27.  wire [PICTURE_W-1:0] lcd_rgb ; 28.  wire lcd_dclk ; 29.   30.   31. //40MHz 32. pll_40m u_pll_40m( 33.   .areset (~rst_n ), 34.  .inclk0 (clk ), 35.   .c0 (clk_0 ) 36.  ); 37.   38.   39. lcd_driver u2( 40.  .clk (clk_0 ),//40MHz 41.  .rst_n (rst_n ), 42.   43.  .hys (hys ), 44.  .vys (vys ), 45.  .lcd_de (lcd_de ), 46.  .lcd_rgb (lcd_rgb ), 47.  .lcd_dclk (lcd_dclk ) 48.  ); 49.   50. endmodule

    1.2 PLL模块设计1.2.1 接口信号
    下面为使用矩阵键盘时的接口信号:


    1.2.2 设计思路
    本模块主要用于产生LCD驱动时序所需要的时钟,关于PLL的使用详细介绍请看下方链接:
    http://www.fpgabbs.cn/forum.php?mod=viewthread&tid=322&fromuid=100105
    1.3 ROM模块设计1.3.1 接口信号
    1.3.2 设计思路
    本模块主要用于存储需要显示的图像数据,关于ROM的使用详细介绍请看下方数据手册:

    1.4 LCD驱动模块设计1.4.1 接口信号1.4.2 设计思路
    产生驱动LCD显示的行场时序信号,其计数器架构如下图所示:
    行计数器h_cnt:该计数器用来计算行同步信号的帧长。加一条件为1,表示一直在计数。结束条件为数1056个,也就是一行有1056个像素。
    场计数器v_cnt:该计数器用来计算场同步信号的帧长。加一条件为end_h_cnt,即行计数器的计数器的结束条件,表示每计数完一行像素就加一。结束条件为数525个,也就是一共有525行像素。

    1.4.3 参考代码
    1. module lcd_driver( 2.  clk ,//40MHz 3.  rst_n , 4.   5.  hys , 6.  vys , 7.  lcd_de , 8.  lcd_rgb , 9.  lcd_dclk 10. ); 11.   12.  input clk ; 13.  input rst_n ; 14.   15.  output hys ; 16.  output vys ; 17.  output lcd_de ; 18.  output [23:0]  lcd_rgb ; 19.  output lcd_dclk ; 20.   21.  reg hys ; 22.  reg vys ; 23.  reg lcd_de ; 24.  reg [23:0] lcd_rgb ; 25.  wire lcd_dclk ; 26.   27.  //1056 28.  parameter THPW = 20 ; 29.  parameter THB = 46 ; 30.  parameter THD = 800 ; 31.  parameter THFP = 210 ; 32.   33.  //525 34.  parameter TVPW = 10 ; 35.  parameter TVB = 23 ; 36.  parameter TVD = 480 ; 37.  parameter TVFP = 22 ; 38.   39.  parameter HDE_CENTRE = THD/2 ;//400 40.  parameter VDE_CENTRE = TVD/2 ;//240 41.   42.  reg [ 10:0] h_cnt ; 43.  wire add_h_cnt ; 44.  wire end_h_cnt ; 45.  reg [ 9:0] v_cnt ; 46.  wire  add_v_cnt ; 47.  wire end_v_cnt ; 48.   49.   50.  wire active_area ; 51.  reg rom_area ; 52.  reg [15:0] rom_addr ; 53.  wire [7:0] rom_data ; 54.   55.   56. always @(posedge clk or negedge rst_n) begin 57.  if (rst_n==0) begin 58.  h_cnt <= 0; 59.  end 60.  else if(add_h_cnt) begin 61.  if(end_h_cnt) 62.  h_cnt <= 0; 63.  else 64.  h_cnt <= h_cnt+1 ; 65.  end 66. end 67. assign add_h_cnt = 1; 68. assign end_h_cnt = add_h_cnt && h_cnt == (THB + THD + THFP)-1 ; 69.   70.   71.   72. always @(posedge clk or negedge rst_n) begin 73.  if (rst_n==0) begin 74.  v_cnt <= 0; 75.  end 76.  else if(add_v_cnt) begin 77.  if(end_v_cnt) 78.  v_cnt <= 0; 79.  else 80.  v_cnt <= v_cnt+1 ; 81.  end 82. end 83. assign add_v_cnt = end_h_cnt; 84. assign end_v_cnt = add_v_cnt && v_cnt == (TVB + TVD + TVFP)-1 ; 85.   86. /*******************************************************/ 87.  //dclk 88.  assign lcd_dclk = clk; 89.   90.  //hsync 91.  always @(posedge clk or negedge rst_n)begin 92.  if(rst_n==1'b0)begin 93.  hys <= 0; 94.  end 95.  else if(add_h_cnt && h_cnt==THPW-1)begin 96.  hys <= 1; 97.  end 98.  else if(end_h_cnt)begin 99.  hys <= 0; 100.  end 101.  end 102.   103.   104.  //vsync 105.  always @(posedge clk or negedge rst_n)begin 106.  if(rst_n==1'b0)begin 107.   vys <= 0; 108.  end 109.  else if(add_v_cnt && v_cnt==TVPW-1)begin 110.  vys <= 1; 111.  end 112.  else if(end_v_cnt)begin 113.  vys <= 0; 114.  end 115.  end 116.   117.   118.  //lcd_de 119.  always @(posedge clk or negedge rst_n)begin 120.  if(rst_n==1'b0)begin 121.  lcd_de <= 0; 122.  end 123.  else if(active_area)begin 124.  lcd_de <= 1; 125.  end 126.  else begin 127.  lcd_de <= 0; 128.  end 129.  end 130.   131.   132. /********************************************************************/ 133.   134.   135.   136. assign active_area = h_cnt>=(THB-1) && h_cnt<(THB+THD-1) && v_cnt>=(TVB-1) && v_cnt<(TVB+TVD-1); 137.   138.   139. always @(*)begin 140.  rom_area = h_cnt >=((HDE_CENTRE-60) + (THB-1)) && h_cnt < ((HDE_CENTRE+60) + (THB-1)) && v_cnt >= ((VDE_CENTRE-27)+(TVB-1)) && v_cnt < ((VDE_CENTRE+28) +(TVB-1)); 141. end 142.   143.   144. always @(posedge clk or negedge rst_n)begin 145.  if(rst_n==1'b0)begin 146.  lcd_rgb <= 0; 147.  end 148.  else if(active_area)begin 149.  if(rom_area) 150.  lcd_rgb <= {rom_data[7:5],5'b11111,rom_data[4:2],5'b11111,rom_data[1:0],6'b111111}; 151.  else 152.  lcd_rgb <= {24{1'b1}}; 153.  end 154.  else begin 155.  lcd_rgb <=0; 156.  end 157. end 158.   159.   160. always @(*)begin 161.  if(active_area && rom_area)begin 162.  rom_addr = (h_cnt-((HDE_CENTRE-60)+(THB-1))) + 120*(v_cnt-((VDE_CENTRE-27)+(TVB-1))); 163.  end 164. end 165.   166.   167.   168.   169. fpga_rom u_fpga_rom( 170.   .address (rom_addr), 171.   .clock (clk ), 172.   .q (rom_data)); 173.   174.   175.  endmodule
    1.5 效果和总结
    以下为工程上板后的现象效果图:
    Ø mp801开发板
    Ø ms980试验箱
    感兴趣的朋友也可以访问明德扬论坛(http://www.fpgabbs.cn/)进行FPGA相关工程设计学习,也可以看一下我们往期的文章:
    源工程和设计教学视频请到论坛下载学习:FPGA至简设计案例200例【分享贴】
    http://www.fpgabbs.cn/forum.php? ... 34&fromuid=9437
    (出处: 明德扬论坛)

    公司简介
    明德扬是一家专注于FPGA领域的专业性公司,公司主要业务包括开发板、教育培训、项目承接、人才服务等多个方向。
    点拨开发板——学习FPGA的入门之选。
    MP801开发板——千兆网、ADDA、大容量SDRAM等,学习和项目需求一步到位。
    **培训班——不管时间和空间,明德扬随时在你身边,助你快速学习FPGA。
    周末培训班——明天的你会感激现在的努力进取,升职加薪明德扬来助你。
    就业培训班——七大企业级项目实训,获得丰富的项目经验,高薪就业。
    专题课程——高手修炼课:提升设计能力;实用调试技巧课:提升定位和解决问题能力;FIFO架构设计课:助你快速成为架构设计师;时序约束、数字信号处理、PCIE、综合项目实践课等你来选。
    项目承接——承接企业FPGA研发项目。
    人才服务——提供人才推荐、人才代培、人才派遣等服务。

    需要更多案例请联系易老师:
    明德扬科技教育

    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2022-9-20 09:51
  • 签到天数: 35 天

    连续签到: 2 天

    [LV.5]常住居民I

    发表于 2022-8-3 16:06:15 | 显示全部楼层
    不错不错,感谢分享
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2022-9-20 09:51
  • 签到天数: 35 天

    连续签到: 2 天

    [LV.5]常住居民I

    发表于 2022-8-12 17:32:08 | 显示全部楼层
    非常不错,值得欣赏
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-4-25 16:25 , Processed in 0.139847 second(s), 21 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.