99在线精品免费视频九九视-99在线精品视频-99在线精品视频免费观里-99在线精品视频在线观看-99在线免费播放



官方論壇
官方淘寶
官方博客
微信公眾號
點擊聯系吳工 點擊聯系周老師

【案例】 LCD顯示疊加圖片

發布時間:2023-04-13   作者:admin 瀏覽量:
本文為明德揚原創文章,轉載請注明出處

1.1 總體設計

1.1.1 概述

液晶顯示器是一-種通過液晶和色彩過濾器過濾光源,在平面面板上產生圖像的數字顯示器。LCD 的構造是在兩片平行的玻璃基板當中放置液晶盒,下基板玻璃上設置薄膜晶體管,.上基板玻璃上設置彩色濾光片,通過薄膜晶體管上的信號與電壓改變來控制液晶分子的轉動方向,從而達到控制每個像素點偏振光出射與否而達到顯示目的。與傳統的陰極射線管相比,LCD具有占用空間小,低功耗,低輻射,無閃爍,降低視覺疲勞等優點。現在LCD已漸替代CRT成為主流,價格也已經下降了很多,并已充分的普及。
1.1.2 設計目標
7LCD顯示屏上實現圖片顯示。
其中,在顯示屏左上角顯示明德揚的LOGO圖標,在顯示屏的中間居中顯示字母“E”。

1.1.3 系統結構框圖
系統結構框圖如下所示:


圖一
1.1.4模塊功能
PLL模塊實現功能
1.       將輸入的50MHz時鐘分頻輸出40MHz時鐘。

ROM模塊實現功能
1.       FPGA_rom存儲明德揚LOGO的圖像數據;

2.       e_rom存儲字母“E”的圖像數據。

LCD驅動模塊實現功能
1、  產生驅動LCD屏顯示的時序
2、  讀取ROM里存儲的數據并輸出顯示

1.1.5頂層信號
  
信號名
  
I/O
位寬
定義
clk
I
1
系統工作時鐘 50M
rst_n
I
1
系統復位信號,低電平有效
hys
O
1
LCD 行時序信號
vys
O
1
LCD 場時序信號
lcd_de
O
1
LCD 數據輸入使能信號
lcd_rgb
O
24
LCD RGB信號,RGB格式為使用24位來表示一個像素,RGB分量都用8位表示,取值范圍為0-255。
lcd_dclk
O
1
LCD 數據采樣時鐘



1.1.6參考代碼
    1. module top_mdyLcdPicOverlay(
    2.     clk       ,
    3.     rst_n     ,
    4.     hys       ,
    5.     vys       ,
    6.     lcd_de    ,
    7.     lcd_rgb   ,
    8.     lcd_dclk
    9.     );

    10.     parameter   PICTURE_W = 24  ;

    11.     input                   clk         ;
    12.     input                   rst_n       ;
    13.     output                  hys         ;
    14.     output                  vys         ;
    15.     output                  lcd_de      ;
    16.     output  [PICTURE_W-1:0] lcd_rgb     ;
    17.     output                  lcd_dclk    ;
    18.    

    19.     wire                     clk_0      ;
    20.    
    21.     wire                     hys        ;
    22.     wire                     vys        ;
    23.     wire                     lcd_de     ;
    24.     wire   [PICTURE_W-1:0]   lcd_rgb    ;
    25.     wire                     lcd_dclk   ;


    26. //40MHz
    27. pll_40m u_pll_40m(
    28.             .areset     (~rst_n ),
    29.         .inclk0     (clk    ),
    30.             .c0         (clk_0  )
    31.     );


    32. lcd_driver  u2(
    33.    .clk          (clk_0       ),//40MHz
    34.    .rst_n        (rst_n       ),
    35.                           
    36.    .hys          (hys         ),  
    37.    .vys          (vys         ),  
    38.    .lcd_de       (lcd_de      ),                  
    39.    .lcd_rgb      (lcd_rgb     ),
    40.    .lcd_dclk     (lcd_dclk    )
    41.     );

    42. endmodule
復制代碼


1.2 PLL模塊設計
1.2.1接口信號
下面為PLL的接口信號:

  
信號名
  
I/O
位寬
定義
areset
I
1
PLL復位信號,高電平有效
inclk0
I
1
PLL輸入時鐘 50MHz
c0
O
1
PLL輸出時鐘 40MHz

1.2.2 設計思路
本模塊主要用于產生LCD驅動時序所需要的時鐘,關于PLL的使用詳細介紹請看下方鏈接:

1.3 ROM模塊設計
1.3.1接口信號
  
信號名
  
I/O
位寬
定義
address
I
16
ROM數據存放地址
clock
I
1
ROM工作時鐘40MHz
q
O
8
ROM輸出數據

1.3.2設計思路
本模塊主要用于存儲需要顯示的圖像數據,關于ROM的使用詳細介紹請查看IP核右上角數據手冊“Documentation”。

1.4 LCD驅動模塊設計
1.4.1接口信號
  
信號名
  
I/O
位寬
定義
clk
I
1
模塊工作時鐘 40MHz
rst_n
I
1
系統復位信號,低電平有效
hys
O
1
LCD 行時序信號
vys
O
1
LCD 場時序信號
lcd_de
O
1
LCD 數據輸入使能信號
lcd_rgb
O
24
LCD RGB信號,RGB格式為使用24位來表示一個像素,RGB分量都用8位表示,取值范圍為0-255。
lcd_dclk
O
1
LCD 數據采樣時鐘

1.4.2設計思路
產生驅動LCD顯示的行場時序信號,其計數器架構如下圖所示:


行計數器h_cnt:該計數器用來計算行同步信號的幀長。加一條件為1,表示一直在計數。結束條件為數1056個,也就是一行有1056個像素。
場計數器v_cnt:該計數器用來計算場同步信號的幀長。加一條件為end_h_cnt,即行計數器的計數器的結束條件,表示每計數完一行像素就加一。結束條件為數525個,也就是一共有525行像素。
其中,在從存儲圖像“E”的ROM里讀取數據的時候,有一個操作就是讀取的地址從第8位開始,也就是說18位數據地址,低三位不讀,讀取的是e_rom_addr[16:3]。有這樣一個操作的話就能實現對存儲的圖像進行8倍的放大顯示。


1.4.3參考代碼
    1. module lcd_driver(
    2.     clk          ,//40MHz
    3.     rst_n        ,

    4.     hys          ,
    5.     vys          ,
    6.     lcd_de       ,  
    7.     lcd_rgb      ,
    8.     lcd_dclk   
    9. );

    10.    input                    clk             ;
    11.    input                    rst_n           ;

    12.    output                   hys             ;
    13.    output                   vys             ;
    14.    output                   lcd_de          ;
    15.    output [23:0]            lcd_rgb         ;
    16.    output                   lcd_dclk        ;

    17.    reg                      hys             ;
    18.    reg                      vys             ;
    19.    reg                      lcd_de          ;
    20.    reg    [23:0]            lcd_rgb         ;
    21.    wire                     lcd_dclk        ;

    22.    //1056
    23.    parameter         THPW      = 20         ;   
    24.    parameter         THB       = 46         ;   
    25.    parameter         THD       = 800        ;   
    26.    parameter         THFP      = 210        ;   
    27.    
    28.    //525
    29.    parameter         TVPW      = 10         ;   
    30.    parameter         TVB       = 23         ;   
    31.    parameter         TVD       = 480        ;   
    32.    parameter         TVFP      = 22         ;   

    33.    parameter       HDE_CENTRE  = THD/2      ;//400
    34.    parameter       VDE_CENTRE  = TVD/2      ;//240

    35.    parameter       LOGO_X0     = (0   + (THB-1))         ;   
    36.    parameter       LOGO_X1     = (120 + (THB-1))         ;   
    37.    parameter       LOGO_Y0     = (0   + (TVB-1))         ;   
    38.    parameter       LOGO_Y1     = (55  + (TVB-1))         ;  

    39.    parameter         E_X0      = ((HDE_CENTRE-200) + (THB-1))        ;   
    40.    parameter         E_X1      = ((HDE_CENTRE+200) + (THB-1))        ;   
    41.    parameter         E_Y0      = ((VDE_CENTRE-150) + (TVB-1))        ;   
    42.    parameter         E_Y1      = ((VDE_CENTRE+150) + (TVB-1))        ;   

    43.    reg   [ 10:0]            h_cnt           ;
    44.    wire                     add_h_cnt       ;
    45.    wire                     end_h_cnt       ;
    46.    reg   [ 9:0]             v_cnt           ;
    47.    wire                     add_v_cnt       ;
    48.    wire                     end_v_cnt       ;


    49.    wire                     active_area     ;
    50.    reg                      logo_rom_area        ;
    51.    reg      [15:0]          logo_rom_addr        ;
    52.    wire     [7:0]           logo_rom_data        ;
    53.    reg                      e_rom_area        ;
    54.    reg      [17:0]          e_rom_addr        ;
    55.    wire     [7:0]           e_rom_data        ;
    56.    reg      [2:0]           e_rom_addr_low    ;
    57.    reg                      e_sel             ;
    58.    


    59. always @(posedge clk or negedge rst_n) begin
    60.     if (rst_n==0) begin
    61.         h_cnt <= 0;
    62.     end
    63.     else if(add_h_cnt) begin
    64.         if(end_h_cnt)
    65.             h_cnt <= 0;
    66.         else
    67.             h_cnt <= h_cnt+1 ;
    68.    end
    69. end
    70. assign add_h_cnt = 1;
    71. assign end_h_cnt = add_h_cnt  && h_cnt == (THB + THD + THFP)-1 ;



    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.     //dclk
    87.     assign lcd_dclk = clk;

    88.     //hsync
    89.     always  @(posedge clk or negedge rst_n)begin
    90.         if(rst_n==1'b0)begin
    91.             hys <= 0;
    92.         end
    93.         else if(add_h_cnt && h_cnt==THPW-1)begin
    94.             hys <= 1;
    95.         end
    96.         else if(end_h_cnt)begin
    97.             hys <= 0;
    98.         end
    99.     end


    100.     //vsync
    101.     always  @(posedge clk or negedge rst_n)begin
    102.         if(rst_n==1'b0)begin
    103.             vys <= 0;
    104.         end
    105.         else if(add_v_cnt && v_cnt==TVPW-1)begin
    106.             vys <= 1;
    107.         end
    108.         else if(end_v_cnt)begin
    109.             vys <= 0;
    110.         end
    111.     end
    112.    

    113.     //lcd_de
    114.     always  @(posedge clk or negedge rst_n)begin
    115.         if(rst_n==1'b0)begin
    116.             lcd_de <= 0;
    117.         end
    118.         else if(active_area)begin
    119.             lcd_de <= 1;
    120.         end
    121.         else begin
    122.             lcd_de <= 0;
    123.         end
    124.     end
    125.    

    126. /********************************************************************/   



    127. assign active_area = h_cnt>=(THB-1) && h_cnt<(THB+THD-1) && v_cnt>=(TVB-1) && v_cnt<(TVB+TVD-1);


    128. always  @(*)begin
    129.     logo_rom_area = h_cnt >=LOGO_X0 && h_cnt < LOGO_X1 && v_cnt >= LOGO_Y0 && v_cnt < LOGO_Y1;
    130. end

    131. always  @(*)begin
    132.     e_rom_area = h_cnt >=E_X0 && h_cnt < E_X1 && v_cnt >= E_Y0 && v_cnt < E_Y1;
    133. end



    134. always  @(posedge clk or negedge rst_n)begin
    135.     if(rst_n==1'b0)begin
    136.         lcd_rgb <= 0;
    137.     end
    138.     else if(active_area)begin
    139.         if(logo_rom_area)
    140.             lcd_rgb <= {logo_rom_data[7:5],5'b11111,logo_rom_data[4:2],5'b11111,logo_rom_data[1:0],6'b111111};
    141.         else if(e_rom_area)
    142.             lcd_rgb <= {24{e_sel}};
    143.         else
    144.             lcd_rgb <= {24{1'b1}};
    145.     end
    146.     else begin
    147.         lcd_rgb <=0;
    148.     end
    149. end




    150. always  @(*)begin
    151.     logo_rom_addr = (h_cnt-LOGO_X0) + 120*(v_cnt-LOGO_Y0);
    152. end

    153. always  @(*)begin
    154.     e_rom_addr = (h_cnt-E_X0) + 400*(v_cnt-E_Y0);
    155. end



    156. always  @(posedge clk or negedge rst_n)begin
    157.     if(rst_n==1'b0)begin
    158.         e_rom_addr_low <= 0;
    159.     end
    160.     else begin
    161.         e_rom_addr_low <= e_rom_addr[2:0];
    162.     end
    163. end


    164. always  @(*)begin
    165.     e_sel = ~e_rom_data[7-e_rom_addr_low];
    166. end


    167. fpga_rom u_fpga_rom(
    168.                    .address (logo_rom_addr),
    169.                    .clock   (clk     ),
    170.                    .q       (logo_rom_data));

    171. e_rom u_e_rom(
    172.     .address   (e_rom_addr[16:3]  ),
    173.     .clock     (clk  ),
    174.     .q         (e_rom_data  ));


    175.     endmodule
復制代碼


1.5 效果和總結
以下為工程上板后的現象效果圖:

mp801開發板


ms980試驗箱



設計視頻源工程代碼請到論壇下載學習:http://www.fpgabbs.cn/thread-1162-1-1.html

訪問明德揚論壇(http://www.fpgabbs.cn/)進行更多FPGA相關工程設計學習。


   拓展閱讀
主站蜘蛛池模板: 在线播放黄| 国产在线不卡 | 国产日韩精品一区在线不卡 | 亚洲国产剧情在线 | 成人三级黄色片 | 99视频有精品视频免费观看 | 午夜亚洲国产 | 一区二区三区免费精品视频 | 在线人成精品免费视频 | 亚洲免费人成 | 风流慈禧一级毛片在线播放 | 污污视频在线观看黄 | 亚洲欧洲精品国产二码 | 日韩乱视频 | 香蕉一区二区 | 免费一级国产大片 | 久久91精品久久91综合 | 久久精品成人国产午夜 | 中文字幕第13亚洲另类 | 精品国产91久久久久久久 | 亚洲永久精品免费www52zcm男男 | 免费在线观看黄色毛片 | 久热操 | 精品视频久久久 | 天干天干夜天干天天爽 | 国产亚洲人成网站在线观看 | 亚洲人人爱 | 最新黄色地址 | 日韩不卡视频在线观看 | 哪里可以看免费毛片 | 欧美黄色免费大片 | 免费观看很黄很色的大片 | 日本一区二区不卡久久入口 | 亚洲欧美久久婷婷爱综合一区天堂 | 日本人一级毛片免费完整视频 | 日韩欧美亚洲视频 | 91啦在线观看 | 精品国产91在线网 | 亚洲精品一区二区三区人妖 | 手机免费黄色网址 | 日韩一区二区超清视频 |