明德扬论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信扫一扫,快捷登录!

查看: 212|回复: 0

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

[复制链接]
发表于 2020-10-7 20:57:52 | 显示全部楼层 |阅读模式

马上注册,看完整文章,学更多FPGA知识。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
至简设计系列_LCD入门案例_显示圆
--作者:喝喝



【设计教程】

本文为明德扬原创及录用文章,转载请注明出处

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

1.1.2 设计目标
此设计通过fpgalcd发送图片信息,然后直接在LCD显示出图片

1.1.3顶层列表
  
信号名
  
接口方向
定义
clk_50m
输入
系统时钟
rst_n
输入
低电平复位信号
lcd_hsync
输出
行同冲信号
lcd_vsync
输出
场同步信号
lcd_de
输出
行和场同时显示时序段
  
有效显示数据通信号
lcd_rgb
输出
显示颜色RGB
  
[23:16]:表示的是R[7:0]
  
[15:8]:表示的是G[7:0]
  
[7:0]:表示的是B[7:0]
lcd_dclk
输出
像素时钟信号



1.1.4 设计思路
设计行显示时序段和场显示时序段,来确定圆的半径大小,然后再利用圆上一点到圆心的距离等于半径(即(x-x0)^2+(y-y0)^2=r^2),确定一个圆;根据各种颜色的数值来确定lcd显示屏显示出的图形的颜色
行时钟计数器cnt_hys:用来计算行同步信号的帧长,加一条件是1,结束条件为数到1056个像素就结束
场时钟计数器cnt_vys:用来计算场同步信号的帧长,加一条件是场信号每数到1056个像素(即为一行结束的时刻),结束条件为数到525行就结束

1.1.5参考代码



1.2 效果和总结


21.jpg
  1. module mdyLcdDispCircle(
  2.     clk_50m     ,  
  3.     rst_n       ,

  4.     lcd_hsync   ,
  5.     lcd_vsync   ,
  6.     lcd_de      ,


  7.     lcd_rgb     ,
  8.     lcd_dclk   
  9.       
  10. );

  11.     input               clk_50m     ;  
  12.     input               rst_n       ;
  13.     output              lcd_hsync   ;
  14.     output              lcd_vsync   ;
  15.     output              lcd_de      ;
  16.     output  [23:0]      lcd_rgb     ;
  17.     output              lcd_dclk    ;

  18.     reg                 lcd_hsync   ;
  19.     reg                 lcd_vsync   ;
  20.     reg    [19:0]        distance   ;
  21.     reg     [23:0]      lcd_rgb     ;



  22.     parameter     LINE_PR   =  1056 ;      
  23.     parameter     FRAME_PER =   525 ;           

  24.     parameter     H_SYNC    =    20 ;      
  25.     parameter     V_SYNC    =    10 ;              

  26.     parameter     HDE_START =    46 ;
  27.     parameter     HDE_END   =   846 ;
  28.     parameter     VDE_START =    23 ;
  29.     parameter     VDE_END   =   503 ;
  30.    

  31.     reg    [12:0]     cnt_hys       ;
  32.     reg    [12:0]     cnt_vys       ;
  33.     reg               hsync_de      ;
  34.     reg               vsync_de      ;
  35.    

  36.     wire              display_area  ;
  37.     wire              e_area        ;
  38.     wire              add_cnt_hys   ;
  39.     wire              end_cnt_hys   ;
  40.     wire              add_cnt_vys   ;
  41.     wire              end_cnt_vys   ;
  42.     reg    [ 7:0]        cnt0       ;
  43.     wire              add_cnt0      ;
  44.     wire              end_cnt0      ;
  45.     reg    [15:0]       cnt1        ;
  46.     wire              add_cnt1      ;
  47.     wire              end_cnt1      ;


  48.     assign clk       = clk_50m              ;
  49.     assign lcd_dclk  = ~ clk_50m            ;
  50.     assign lcd_de    = hsync_de & vsync_de  ;
  51.    


  52.     always @ (posedge clk or negedge rst_n)begin
  53.             if(!rst_n)begin
  54.                 cnt_hys <= 0;
  55.             end
  56.             else if(add_cnt_hys)begin
  57.                 if(end_cnt_hys)
  58.                     cnt_hys <= 0;
  59.                 else
  60.                     cnt_hys <= cnt_hys + 1;
  61.             end
  62.         end
  63.    
  64.     assign add_cnt_hys = 1;
  65.     assign end_cnt_hys = add_cnt_hys && cnt_hys == LINE_PR -1;
  66.    

  67.     always @ (posedge clk or negedge rst_n)begin
  68.         if(!rst_n)begin
  69.             cnt_vys <= 0;
  70.         end
  71.         else if(add_cnt_vys)begin
  72.             if(end_cnt_vys)
  73.                 cnt_vys <= 0;
  74.             else
  75.                 cnt_vys <= cnt_vys + 1;
  76.         end
  77.     end
  78.    
  79.     assign add_cnt_vys = end_cnt_hys;
  80.     assign end_cnt_vys = add_cnt_vys && cnt_vys == FRAME_PER - 1;
  81.          


  82.     always @ (posedge clk or negedge rst_n)begin
  83.         if(!rst_n)begin
  84.             lcd_hsync <= 1'b0 ;
  85.         end
  86.         else if(end_cnt_hys)begin
  87.             lcd_hsync <= 1'b0;
  88.         end
  89.         else if(add_cnt_hys && cnt_hys == H_SYNC-1 )begin
  90.             lcd_hsync <= 1'b1;
  91.         end
  92.     end


  93.     always @ (posedge clk or negedge rst_n)begin
  94.         if(!rst_n)begin
  95.             hsync_de <= 1'b0;
  96.         end
  97.         else if(add_cnt_hys && cnt_hys == HDE_START-1)begin
  98.             hsync_de <= 1'b1;
  99.         end
  100.         else if(add_cnt_hys && cnt_hys == HDE_END-1)begin
  101.             hsync_de <= 1'b0;
  102.         end
  103.     end


  104.          
  105.     always @ (posedge clk or negedge rst_n)begin
  106.         if(!rst_n)begin
  107.             lcd_vsync <= 1'b0 ;
  108.         end
  109.                   else if(add_cnt_vys && cnt_vys == V_SYNC-1 )begin
  110.             lcd_vsync <= 1'b1;
  111.         end
  112.         else if(end_cnt_vys)begin
  113.             lcd_vsync <= 1'b0;
  114.         end

  115.     end

  116.          
  117.          
  118.     always @ (posedge clk or negedge rst_n)begin
  119.         if(!rst_n)begin
  120.             vsync_de <= 1'b0;
  121.         end
  122.         else if(add_cnt_vys && cnt_vys == VDE_START-1)begin
  123.             vsync_de <= 1'b1;
  124.         end
  125.         else if(add_cnt_vys && cnt_vys ==VDE_END-1)begin
  126.             vsync_de <= 1'b0;
  127.         end
  128.     end

  129.         
  130.     assign   display_area = hsync_de && vsync_de;

  131.     always  @(*)begin
  132.         distance= (cnt_hys-( HDE_START + 400)) *(cnt_hys-( HDE_START + 400))+(cnt_vys-( VDE_START +240)) *(cnt_vys-( VDE_START + 240));
  133.     end

  134.     always @ (posedge clk or negedge rst_n)begin
  135.         if(!rst_n)begin
  136.                                 lcd_rgb <= 0;
  137.         end
  138.         else if(display_area)begin
  139.             if(distance<19600)begin
  140.                 lcd_rgb <= 24'h00_00_ff ;
  141.             end
  142.             else begin
  143.                 lcd_rgb <= 24'hff_ff_ff ;
  144.             end
  145.         end
  146.         else begin
  147.             lcd_rgb <= 0;
  148.         end
  149.     end



  150. endmodlue

复制代码


本案例我们设计一个中间是直径为 280 圆形,圆形为蓝色,其他部分为白色的图像。
在这个设计案例中,至简设计法和明德扬计数器模板发挥了至关重要的作用,使我能够快速准确完成设计。希望有兴趣的同学可以运用至简设计法和明德扬模板尝试一下拓展设计哦。

感兴趣的朋友也可以访问明德扬论坛(http://www.fpgabbs.cn/)进行FPGA相关工程设计学习,也可以看一下我们往期的文章:


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

【设计教程下载】

至简设计系列_LCD入门案例_显示圆.pdf (736.23 KB, 下载次数: 2)
FPGA视频课程  培训班 FPGA学习资料
吴老师 18022857217(微信同号) Q1241003385
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


QQ|手机版|小黑屋|MDYBBS ( 粤ICP备16061416号-1

GMT+8, 2020-10-29 04:12 , Processed in 0.557658 second(s), 13 queries , File On.

Powered by Discuz! X3.4

本论坛由广州健飞通信有限公司所有

© 2001-2019 Comsenz Inc.

快速回复 返回顶部 返回列表