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

【案例】 LCD顯示疊加圖片

  發布時間:2023-10-18  |    作者:管理員  |  瀏覽量:986

本文為明德揚原創文章,轉載請注明出處!

 

1.1 總體設計

1.1.1 概述

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

1.1.2 設計目標

7寸LCD顯示屏上實現圖片顯示。

其中,在顯示屏左上角顯示明德揚的LOGO圖標,在顯示屏的中間居中顯示字母“E”。

 

1.1.3 系統結構框圖

系統結構框圖如下所示:

 image.png


圖一

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參考代碼

a. 

module top_mdyLcdPicOverlay(

b. 

c. 

    clk       ,

d. 

e. 

    rst_n     ,

f. 

g. 

    hys       ,

h. 

i. 

    vys       ,

j. 

k. 

    lcd_de    ,

l. 

m. 

    lcd_rgb   ,

n. 

o. 

    lcd_dclk

p. 

q. 

    );

r. 

s. 

 

t. 

u. 

    parameter   PICTURE_W = 24  ;

v. 

w. 

 

x. 

y. 

    input                   clk         ;

z. 

aa. 

    input                   rst_n       ;

ab. 

ac. 

    output                  hys         ;

ad. 

ae. 

    output                  vys         ;

af. 

ag. 

    output                  lcd_de      ;

ah. 

ai. 

    output  [PICTURE_W-1:0] lcd_rgb     ;

aj. 

ak. 

    output                  lcd_dclk    ;

al. 

am. 

   

an. 

ao. 

 

ap. 

aq. 

    wire                     clk_0      ;

ar. 

as. 

   

at. 

au. 

    wire                     hys        ;

av. 

aw. 

    wire                     vys        ;

ax. 

ay. 

    wire                     lcd_de     ;

az. 

ba. 

    wire   [PICTURE_W-1:0]   lcd_rgb    ;

bb. 

bc. 

    wire                     lcd_dclk   ;

bd. 

be. 

 

bf. 

bg. 

 

bh. 

bi. 

//40MHz

bj. 

bk. 

pll_40m u_pll_40m(

bl. 

bm. 

            .areset     (~rst_n ),

bn. 

bo. 

        .inclk0     (clk    ),

bp. 

bq. 

            .c0         (clk_0  )

br. 

bs. 

    );

bt. 

bu. 

 

bv. 

bw. 

 

bx. 

by. 

lcd_driver  u2(

bz. 

ca. 

   .clk          (clk_0       ),//40MHz

cb. 

cc. 

   .rst_n        (rst_n       ),

cd. 

ce. 

                          

cf. 

cg. 

   .hys          (hys         ),  

ch. 

ci. 

   .vys          (vys         ),  

cj. 

ck. 

   .lcd_de       (lcd_de      ),                  

cl. 

cm. 

   .lcd_rgb      (lcd_rgb     ),

cn. 

co. 

   .lcd_dclk     (lcd_dclk    )

cp. 

cq. 

    );

cr. 

cs. 

 

ct. 

cu. 

endmodule

cv. 

復制代碼


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的使用詳細介紹請看下方鏈接:

http://www.fpgabbs.cn/forum.php?mod=viewthread&tid=322&fromuid=100105


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參考代碼

a. 

module lcd_driver(

b. 

c. 

    clk          ,//40MHz

d. 

e. 

    rst_n        ,

f. 

g. 

 

h. 

i. 

    hys          ,

j. 

k. 

    vys          ,

l. 

m. 

    lcd_de       ,  

n. 

o. 

    lcd_rgb      ,

p. 

q. 

    lcd_dclk   

r. 

s. 

);

t. 

u. 

 

v. 

w. 

   input                    clk             ;

x. 

y. 

   input                    rst_n           ;

z. 

aa. 

 

ab. 

ac. 

   output                   hys             ;

ad. 

ae. 

   output                   vys             ;

af. 

ag. 

   output                   lcd_de          ;

ah. 

ai. 

   output [23:0]            lcd_rgb         ;

aj. 

ak. 

   output                   lcd_dclk        ;

al. 

am. 

 

an. 

ao. 

   reg                      hys             ;

ap. 

aq. 

   reg                      vys             ;

ar. 

as. 

   reg                      lcd_de          ;

at. 

au. 

   reg    [23:0]            lcd_rgb         ;

av. 

aw. 

   wire                     lcd_dclk        ;

ax. 

ay. 

 

az. 

ba. 

   //1056

bb. 

bc. 

   parameter         THPW      = 20         ;   

bd. 

be. 

   parameter         THB       = 46         ;   

bf. 

bg. 

   parameter         THD       = 800        ;   

bh. 

bi. 

   parameter         THFP      = 210        ;   

bj. 

bk. 

   

bl. 

bm. 

   //525

bn. 

bo. 

   parameter         TVPW      = 10         ;   

bp. 

bq. 

   parameter         TVB       = 23         ;   

br. 

bs. 

   parameter         TVD       = 480        ;   

bt. 

bu. 

   parameter         TVFP      = 22         ;   

bv. 

bw. 

 

bx. 

by. 

   parameter       HDE_CENTRE  = THD/2      ;//400

bz. 

ca. 

   parameter       VDE_CENTRE  = TVD/2      ;//240

cb. 

cc. 

 

cd. 

ce. 

   parameter       LOGO_X0     = (0   + (THB-1))         ;   

cf. 

cg. 

   parameter       LOGO_X1     = (120 + (THB-1))         ;   

ch. 

ci. 

   parameter       LOGO_Y0     = (0   + (TVB-1))         ;   

cj. 

ck. 

   parameter       LOGO_Y1     = (55  + (TVB-1))         ;  

cl. 

cm. 

 

cn. 

co. 

   parameter         E_X0      = ((HDE_CENTRE-200) + (THB-1))        ;   

cp. 

cq. 

   parameter         E_X1      = ((HDE_CENTRE+200) + (THB-1))        ;   

cr. 

cs. 

   parameter         E_Y0      = ((VDE_CENTRE-150) + (TVB-1))        ;   

ct. 

cu. 

   parameter         E_Y1      = ((VDE_CENTRE+150) + (TVB-1))        ;   

cv. 

cw. 

 

cx. 

cy. 

   reg   [ 10:0]            h_cnt           ;

cz. 

da. 

   wire                     add_h_cnt       ;

db. 

dc. 

   wire                     end_h_cnt       ;

dd. 

de. 

   reg   [ 9:0]             v_cnt           ;

df. 

dg. 

   wire                     add_v_cnt       ;

dh. 

di. 

   wire                     end_v_cnt       ;

dj. 

dk. 

 

dl. 

dm. 

 

dn. 

do. 

   wire                     active_area     ;

dp. 

dq. 

   reg                      logo_rom_area        ;

dr. 

ds. 

   reg      [15:0]          logo_rom_addr        ;

dt. 

du. 

   wire     [7:0]           logo_rom_data        ;

dv. 

dw. 

   reg                      e_rom_area        ;

dx. 

dy. 

   reg      [17:0]          e_rom_addr        ;

dz. 

ea. 

   wire     [7:0]           e_rom_data        ;

eb. 

ec. 

   reg      [2:0]           e_rom_addr_low    ;

ed. 

ee. 

   reg                      e_sel             ;

ef. 

eg. 

   

eh. 

ei. 

 

ej. 

ek. 

 

el. 

em. 

always @(posedge clk or negedge rst_n) begin

en. 

eo. 

    if (rst_n==0) begin

ep. 

eq. 

        h_cnt <= 0;

er. 

es. 

    end

et. 

eu. 

    else if(add_h_cnt) begin

ev. 

ew. 

        if(end_h_cnt)

ex. 

ey. 

            h_cnt <= 0;

ez. 

fa. 

        else

fb. 

fc. 

            h_cnt <= h_cnt+1 ;

fd. 

fe. 

   end

ff. 

fg. 

end

fh. 

fi. 

assign add_h_cnt = 1;

fj. 

fk. 

assign end_h_cnt = add_h_cnt  && h_cnt == (THB + THD + THFP)-1 ;

fl. 

fm. 

 

fn. 

fo. 

 

fp. 

fq. 

 

fr. 

fs. 

always @(posedge clk or negedge rst_n) begin

ft. 

fu. 

    if (rst_n==0) begin

fv. 

fw. 

        v_cnt <= 0;

fx. 

fy. 

    end

fz. 

ga. 

    else if(add_v_cnt) begin

gb. 

gc. 

        if(end_v_cnt)

gd. 

ge. 

            v_cnt <= 0;

gf. 

gg. 

        else

gh. 

gi. 

            v_cnt <= v_cnt+1 ;

gj. 

gk. 

   end

gl. 

gm. 

end

gn. 

go. 

assign add_v_cnt = end_h_cnt;

gp. 

gq. 

assign end_v_cnt = add_v_cnt  && v_cnt == (TVB + TVD + TVFP)-1 ;

gr. 

gs. 

 

gt. 

gu. 

/*******************************************************/

gv. 

gw. 

    //dclk

gx. 

gy. 

    assign lcd_dclk = clk;

gz. 

ha. 

 

hb. 

hc. 

    //hsync

hd. 

he. 

    always  @(posedge clk or negedge rst_n)begin

hf. 

hg. 

        if(rst_n==1'b0)begin

hh. 

hi. 

            hys <= 0;

hj. 

hk. 

        end

hl. 

hm. 

        else if(add_h_cnt && h_cnt==THPW-1)begin

hn. 

ho. 

            hys <= 1;

hp. 

hq. 

        end

hr. 

hs. 

        else if(end_h_cnt)begin

ht. 

hu. 

            hys <= 0;

hv. 

hw. 

        end

hx. 

hy. 

    end

hz. 

ia. 

 

ib. 

ic. 

 

id. 

ie. 

    //vsync

if. 

ig. 

    always  @(posedge clk or negedge rst_n)begin

ih. 

ii. 

        if(rst_n==1'b0)begin

ij. 

ik. 

            vys <= 0;

il. 

im. 

        end

in. 

io. 

        else if(add_v_cnt && v_cnt==TVPW-1)begin

ip. 

iq. 

            vys <= 1;

ir. 

is. 

        end

it. 

iu. 

        else if(end_v_cnt)begin

iv. 

iw. 

            vys <= 0;

ix. 

iy. 

        end

iz. 

ja. 

    end

jb. 

jc. 

   

jd. 

je. 

 

jf. 

jg. 

    //lcd_de

jh. 

ji. 

    always  @(posedge clk or negedge rst_n)begin

jj. 

jk. 

        if(rst_n==1'b0)begin

jl. 

jm. 

            lcd_de <= 0;

jn. 

jo. 

        end

jp. 

jq. 

        else if(active_area)begin

jr. 

js. 

            lcd_de <= 1;

jt. 

ju. 

        end

jv. 

jw. 

        else begin

jx. 

jy. 

            lcd_de <= 0;

jz. 

ka. 

        end

kb. 

kc. 

    end

kd. 

ke. 

   

kf. 

kg. 

 

kh. 

ki. 

/********************************************************************/   

kj. 

kk. 

 

kl. 

km. 

 

kn. 

ko. 

 

kp. 

kq. 

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

kr. 

ks. 

 

kt. 

ku. 

 

kv. 

kw. 

always  @(*)begin

kx. 

ky. 

    logo_rom_area = h_cnt >=LOGO_X0 && h_cnt < LOGO_X1 && v_cnt >= LOGO_Y0 && v_cnt < LOGO_Y1;

kz. 

la. 

end

lb. 

lc. 

 

ld. 

le. 

always  @(*)begin

lf. 

lg. 

    e_rom_area = h_cnt >=E_X0 && h_cnt < E_X1 && v_cnt >= E_Y0 && v_cnt < E_Y1;

lh. 

li. 

end

lj. 

lk. 

 

ll. 

lm. 

 

ln. 

lo. 

 

lp. 

lq. 

always  @(posedge clk or negedge rst_n)begin

lr. 

ls. 

    if(rst_n==1'b0)begin

lt. 

lu. 

        lcd_rgb <= 0;

lv. 

lw. 

    end

lx. 

ly. 

    else if(active_area)begin

lz. 

ma. 

        if(logo_rom_area)

mb. 

mc. 

            lcd_rgb <= {logo_rom_data[7:5],5'b11111,logo_rom_data[4:2],5'b11111,logo_rom_data[1:0],6'b111111};

md. 

me. 

        else if(e_rom_area)

mf. 

mg. 

            lcd_rgb <= {24{e_sel}};

mh. 

mi. 

        else

mj. 

mk. 

            lcd_rgb <= {24{1'b1}};

ml. 

mm. 

    end

mn. 

mo. 

    else begin

mp. 

mq. 

        lcd_rgb <=0;

mr. 

ms. 

    end

mt. 

mu. 

end

mv. 

mw. 

 

mx. 

my. 

 

mz. 

na. 

 

nb. 

nc. 

 

nd. 

ne. 

always  @(*)begin

nf. 

ng. 

    logo_rom_addr = (h_cnt-LOGO_X0) + 120*(v_cnt-LOGO_Y0);

nh. 

ni. 

end

nj. 

nk. 

 

nl. 

nm. 

always  @(*)begin

nn. 

no. 

    e_rom_addr = (h_cnt-E_X0) + 400*(v_cnt-E_Y0);

np. 

nq. 

end

nr. 

ns. 

 

nt. 

nu. 

 

nv. 

nw. 

 

nx. 

ny. 

always  @(posedge clk or negedge rst_n)begin

nz. 

oa. 

    if(rst_n==1'b0)begin

ob. 

oc. 

        e_rom_addr_low <= 0;

od. 

oe. 

    end

of. 

og. 

    else begin

oh. 

oi. 

        e_rom_addr_low <= e_rom_addr[2:0];

oj. 

ok. 

    end

ol. 

om. 

end

on. 

oo. 

 

op. 

oq. 

 

or. 

os. 

always  @(*)begin

ot. 

ou. 

    e_sel = ~e_rom_data[7-e_rom_addr_low];

ov. 

ow. 

end

ox. 

oy. 

 

oz. 

pa. 

 

pb. 

pc. 

fpga_rom u_fpga_rom(

pd. 

pe. 

                   .address (logo_rom_addr),

pf. 

pg. 

                   .clock   (clk     ),

ph. 

pi. 

                   .q       (logo_rom_data));

pj. 

pk. 

 

pl. 

pm. 

e_rom u_e_rom(

pn. 

po. 

    .address   (e_rom_addr[16:3]  ),

pp. 

pq. 

    .clock     (clk  ),

pr. 

ps. 

    .q         (e_rom_data  ));

pt. 

pu. 

 

pv. 

pw. 

 

px. 

py. 

    endmodule

pz. 

復制代碼


1.5 效果和總結

以下為工程上板后的現象效果圖:


mp801開發板

image.png

ms980試驗箱

image.png

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

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



溫馨提示:明德揚2023推出了全新課程——邏輯設計基本功修煉課,降低學習FPGA門檻的同時,增加了學習的趣味性,并組織了考試贏積分活動

http://www.cqqtmy.cn/ffkc/415.html

(點擊→了解課程詳情?)感興趣請聯系易老師:13112063618(微信同步)



本文TAG:

Copyright ? 2012-2023 版權所有:深圳明德揚科技教育有限公司

主站蜘蛛池模板: 特级无码a级毛片特黄 | 91精品国产综合久久精品 | 亚洲 欧美 另类 综合 日韩 | 综合在线视频精品专区 | 欧美精品国产一区二区三区 | 成人做爰全过程免费看视频 | 请看一下欧美一级毛片 | 日韩精品一区在线 | 久久精品免费一区二区三区 | 新国产视频 | 免费日本黄色网址 | 国产日产欧产麻豆精品精品推荐 | www.久久精品视频 | 国产成人午夜精品免费视频 | 日本tv欧美tv天堂 | 国产区精品高清在线观看 | 在线免费观看a级片 | 大人和孩做爰h视频在线观看 | 亚洲春色综合另类网蜜桃 | 精品亚洲一区二区 | 亚洲国产欧美在线观看 | 亚洲国产成人精品91久久久 | 国内自拍网 | 黄色在线免费观看视频 | 精品成人免费一区二区在线播放 | 国产乱码在线精品可播放 | 亚洲国内 | 亚洲人成综合网站在线 | 97国产视频 | 亚洲第一毛片 | 逼逼毛片 | 亚洲精品区在线播放一区二区 | 久久精品成人一区二区三区 | 久久久四虎成人永久免费网站 | 91入口免费网站大全 | 久久涩精品 | 天天拍天天色 | fc2成人免费人成在线观看播放 | 国产精品思瑞在线观看 | 亚洲一区二区三区免费在线观看 | 91国在线国内在线播放 |