本文為明德?lián)P原創(chuàng)文章,轉(zhuǎn)載請注明出處!
1.1 總體設(shè)計(jì)
1.1.1 概述
液晶顯示器是一-種通過液晶和色彩過濾器過濾光源,在平面面板上產(chǎn)生圖像的數(shù)字顯示器。LCD 的構(gòu)造是在兩片平行的玻璃基板當(dāng)中放置液晶盒,下基板玻璃上設(shè)置薄膜晶體管,.上基板玻璃上設(shè)置彩色濾光片,通過薄膜晶體管上的信號與電壓改變來控制液晶分子的轉(zhuǎn)動方向,從而達(dá)到控制每個(gè)像素點(diǎn)偏振光出射與否而達(dá)到顯示目的。與傳統(tǒng)的陰極射線管相比,LCD具有占用空間小,低功耗,低輻射,無閃爍,降低視覺疲勞等優(yōu)點(diǎn)。現(xiàn)在LCD已漸替代CRT成為主流,價(jià)格也已經(jīng)下降了很多,并已充分的普及。
本設(shè)計(jì)的主要任務(wù)是基于FPGA的LCD顯示控制器設(shè)計(jì),兼顧程序的易用性,方便此后模塊的移植和應(yīng)用。采用VHDL硬件描述語言在QUARTUS II軟件平臺上實(shí)現(xiàn)FPGA對LCD的控制,在LCD模塊上實(shí)現(xiàn)任意彩色圖片的顯示,與此同時(shí)還須實(shí)現(xiàn)實(shí)時(shí)刷新數(shù)據(jù)的功能。這將有助于采用FPGA的系列產(chǎn)品的開發(fā),特別是需要用到LCD而采用FPGA的產(chǎn)品的開發(fā)。不但縮短了FPGA的開發(fā)周期,也使更多采用FPGA設(shè)計(jì)的產(chǎn)品上出現(xiàn)LCD,增加了人機(jī)之間的交互性。
1.1.2 設(shè)計(jì)目標(biāo)
此設(shè)計(jì)通過fpga給lcd發(fā)送圖片信息,然后直接在LCD顯示矩形動畫,矩形的寬從2變化到600,矩形的高從2變化到400
1.1.3信號列表
信號名
| 接口方向 | 定義 |
clk_50m | 輸入 | 系統(tǒng)時(shí)鐘 |
rst_n | 輸入 | 低電平復(fù)位信號 |
lcd_hsync | 輸出 | 行同步信號 |
lcd_vsync | 輸出 | 場同步信號 |
lcd_de | 輸出 | 行和場同時(shí)顯示時(shí)序段
有效顯示數(shù)據(jù)段信號 |
lcd_rgb | 輸出 | 顯示顏色RGB
[23:16]:表示的是R[7:0]
[15:8]:表示的是G[7:0]
[7:0]:表示的是B[7:0] |
lcd_dclk | 輸出 | 像素時(shí)鐘信號 |
1.1.4 設(shè)計(jì)思路
設(shè)計(jì)行顯示時(shí)序段和場顯示時(shí)序段,來確定矩形邊框的寬度,根據(jù)各種顏色的數(shù)值來確定lcd顯示屏顯示出的邊框顏色
行時(shí)鐘計(jì)數(shù)器cnt_hys:用來計(jì)算行同步信號的幀長,加一條件是1,結(jié)束條件為數(shù)到1056個(gè)像素就結(jié)束
場時(shí)鐘計(jì)數(shù)器cnt_vys:用來計(jì)算場同步信號的幀長,加一條件是場信號每數(shù)到1056個(gè)像素(即為一行結(jié)束的時(shí)刻),結(jié)束條件為數(shù)到525行就結(jié)束
1.1.5參考代碼
a.
module mdyLcdDispDynaRect(
b.
c.
clk_50m ,
d.
e.
rst_n ,
f.
g.
h.
i.
lcd_hsync ,
j.
k.
lcd_vsync ,
l.
m.
lcd_de ,
n.
o.
p.
q.
r.
s.
lcd_rgb ,
t.
u.
lcd_dclk
v.
w.
x.
y.
);
z.
aa.
ab.
ac.
input clk_50m ;
ad.
ae.
input rst_n ;
af.
ag.
output lcd_hsync ;
ah.
ai.
output lcd_vsync ;
aj.
ak.
output lcd_de ;
al.
am.
an.
ao.
output [23:0] lcd_rgb ;
ap.
aq.
output lcd_dclk ;
ar.
as.
at.
au.
av.
aw.
reg [30:0] h ;
ax.
ay.
reg [30:0] v ;
az.
ba.
bb.
bc.
reg lcd_hsync ;
bd.
be.
reg lcd_vsync ;
bf.
bg.
bh.
bi.
reg [23:0] lcd_rgb ;
bj.
bk.
bl.
bm.
bn.
bo.
parameter LINE_PR = 1056 ;
bp.
bq.
parameter FRAME_PER = 525 ;
br.
bs.
bt.
bu.
bv.
bw.
parameter H_SYNC = 20 ;
bx.
by.
parameter V_SYNC = 10 ;
bz.
ca.
cb.
cc.
parameter HDE_START = 46 ;
cd.
ce.
parameter HDE_END = 846 ;
cf.
cg.
parameter VDE_START = 23 ;
ch.
ci.
parameter VDE_END = 503 ;
cj.
ck.
cl.
cm.
cn.
co.
cp.
cq.
reg [12:0] cnt_hsy ;
cr.
cs.
reg [12:0] cnt_vsy ;
ct.
cu.
reg hsync_de ;
cv.
cw.
reg vsync_de ;
cx.
cy.
cz.
da.
wire display_area ;
db.
dc.
wire e_area ;
dd.
de.
wire add_cnt_hsy ;
df.
dg.
wire end_cnt_hsy ;
dh.
di.
wire add_cnt_vsy ;
dj.
dk.
wire end_cnt_vsy ;
dl.
dm.
reg [ 7:0] cnt0 ;
dn.
do.
wire add_cnt0 ;
dp.
dq.
wire end_cnt0 ;
dr.
ds.
reg [15:0] cnt1 ;
dt.
du.
wire add_cnt1 ;
dv.
dw.
wire end_cnt1 ;
dx.
dy.
dz.
ea.
eb.
ec.
assign clk = clk_50m ;
ed.
ee.
assign lcd_dclk = ~ clk_50m ;
ef.
eg.
assign lcd_de = hsync_de & vsync_de ;
eh.
ei.
ej.
ek.
el.
em.
en.
eo.
ep.
eq.
always @ (posedge clk or negedge rst_n)begin
er.
es.
if(!rst_n)begin
et.
eu.
cnt_hsy <= 0;
ev.
ew.
end
ex.
ey.
else if(add_cnt_hsy)begin
ez.
fa.
if(end_cnt_hsy)
fb.
fc.
cnt_hsy <= 0;
fd.
fe.
else
ff.
fg.
cnt_hsy <= cnt_hsy + 1;
fh.
fi.
end
fj.
fk.
end
fl.
fm.
fn.
fo.
assign add_cnt_hsy = 1;
fp.
fq.
assign end_cnt_hsy = add_cnt_hsy && cnt_hsy == LINE_PR -1;
fr.
fs.
ft.
fu.
fv.
fw.
always @ (posedge clk or negedge rst_n)begin
fx.
fy.
if(!rst_n)begin
fz.
ga.
cnt_vsy <= 0;
gb.
gc.
end
gd.
ge.
else if(add_cnt_vsy)begin
gf.
gg.
if(end_cnt_vsy)
gh.
gi.
cnt_vsy <= 0;
gj.
gk.
else
gl.
gm.
cnt_vsy <= cnt_vsy + 1;
gn.
go.
end
gp.
gq.
end
gr.
gs.
gt.
gu.
assign add_cnt_vsy = end_cnt_hsy;
gv.
gw.
assign end_cnt_vsy = add_cnt_vsy && cnt_vsy == FRAME_PER - 1;
gx.
gy.
gz.
ha.
hb.
hc.
always @ (posedge clk or negedge rst_n)begin
hd.
he.
if(!rst_n)begin
hf.
hg.
lcd_hsync <= 1'b0 ;
hh.
hi.
end
hj.
hk.
else if(end_cnt_hsy)begin
hl.
hm.
lcd_hsync <= 1'b0;
hn.
ho.
end
hp.
hq.
else if(add_cnt_hsy && cnt_hsy == H_SYNC-1 )begin
hr.
hs.
lcd_hsync <= 1'b1;
ht.
hu.
end
hv.
hw.
end
hx.
hy.
hz.
ia.
always @ (posedge clk or negedge rst_n)begin
ib.
ic.
if(!rst_n)begin
id.
ie.
hsync_de <= 1'b0;
if.
ig.
end
ih.
ii.
else if(add_cnt_hsy && cnt_hsy == HDE_START-1)begin
ij.
ik.
hsync_de <= 1'b1;
il.
im.
end
in.
io.
else if(add_cnt_hsy && cnt_hsy == HDE_END-1)begin
ip.
iq.
hsync_de <= 1'b0;
ir.
is.
end
it.
iu.
end
iv.
iw.
ix.
iy.
iz.
ja.
always @ (posedge clk or negedge rst_n)begin
jb.
jc.
if(!rst_n)begin
jd.
je.
lcd_vsync <= 1'b0 ;
jf.
jg.
end
jh.
ji.
else if(add_cnt_vsy && cnt_vsy == V_SYNC-1 )begin
jj.
jk.
lcd_vsync <= 1'b1;
jl.
jm.
end
jn.
jo.
else if(end_cnt_vsy)begin
jp.
jq.
lcd_vsync <= 1'b0;
jr.
js.
end
jt.
ju.
jv.
jw.
end
jx.
jy.
jz.
ka.
kb.
kc.
always @ (posedge clk or negedge rst_n)begin
kd.
ke.
if(!rst_n)begin
kf.
kg.
vsync_de <= 1'b0;
kh.
ki.
end
kj.
kk.
else if(add_cnt_vsy && cnt_vsy == VDE_START-1)begin
kl.
km.
vsync_de <= 1'b1;
kn.
ko.
end
kp.
kq.
else if(add_cnt_vsy && cnt_vsy ==VDE_END-1)begin
kr.
ks.
vsync_de <= 1'b0;
kt.
ku.
end
kv.
kw.
end
kx.
ky.
kz.
la.
lb.
lc.
assign display_area = hsync_de && vsync_de;
ld.
le.
lf.
lg.
lh.
li.
assign blue_area = (cnt_hsy >= HDE_START + 400-h) && (cnt_hsy<HDE_START+400+h) &&
lj.
lk.
(cnt_vsy >= VDE_START + 240-v) && (cnt_vsy<VDE_START+240+v) ;
ll.
lm.
ln.
lo.
lp.
lq.
lr.
ls.
always @(posedge clk or negedge rst_n)begin
lt.
lu.
if(rst_n==1'b0)begin
lv.
lw.
h<=1;
lx.
ly.
end
lz.
ma.
else if(end_cnt_vsy && h<300)begin
mb.
mc.
h<=h+2;
md.
me.
end
mf.
mg.
end
mh.
mi.
mj.
mk.
always @(posedge clk or negedge rst_n)begin
ml.
mm.
if(rst_n==1'b0)begin
mn.
mo.
v<=1;
mp.
mq.
end
mr.
ms.
else if(end_cnt_vsy && v<200)begin
mt.
mu.
v<=v+1;
mv.
mw.
end
mx.
my.
end
mz.
na.
nb.
nc.
nd.
ne.
always @ (posedge clk or negedge rst_n)begin
nf.
ng.
if(!rst_n)begin
nh.
ni.
lcd_rgb <= 0;
nj.
nk.
end
nl.
nm.
else if(display_area)begin
nn.
no.
if(blue_area)begin
np.
nq.
lcd_rgb <= 24'h00_00_ff ;
nr.
ns.
end
nt.
nu.
else begin
nv.
nw.
lcd_rgb <= 24'hff_ff_ff ;
nx.
ny.
end
nz.
oa.
end
ob.
oc.
else begin
od.
oe.
lcd_rgb <= 0;
of.
og.
end
oh.
oi.
end
oj.
ok.
ol.
om.
on.
oo.
op.
oq.
endmodule
or.
os.
ot.
復(fù)制代碼
1.2 效果和總結(jié)
本案例我們設(shè)計(jì)了藍(lán)色的矩形,藍(lán)色矩形的場信號是從2行變到400行、行信號是從2個(gè)像素變到600個(gè)像素;
在這個(gè)設(shè)計(jì)案例中,至簡設(shè)計(jì)法和明德?lián)P計(jì)數(shù)器模板發(fā)揮了至關(guān)重要的作用,使我能夠快速準(zhǔn)確完成設(shè)計(jì)。希望有興趣的同學(xué)可以運(yùn)用至簡設(shè)計(jì)法和明德?lián)P模板嘗試一下拓展設(shè)計(jì)哦。
設(shè)計(jì)教學(xué)視頻和工程源代碼,請到明德?lián)P論壇(www.fpgabbs.cn)學(xué)習(xí):http://www.fpgabbs.cn/thread-1156-1-1.html
溫馨提示:明德?lián)P2023推出了全新課程——邏輯設(shè)計(jì)基本功修煉課,降低學(xué)習(xí)FPGA門檻的同時(shí),增加了學(xué)習(xí)的趣味性,并組織了考試贏積分活動
http://www.cqqtmy.cn/ffkc/415.html
(點(diǎn)擊→了解課程詳情?)感興趣請聯(lián)系易老師:13112063618(微信同步)