本(běn)文(wén)为(wèi)明(míng)德揚原創文(wén)章(zhāng),轉(zhuǎn)载請注明(míng)出(chū)处!
1.1 總(zǒng)體(tǐ)設計(jì)
1.1.1 概述
液晶顯示器是(shì)一(yī)-種(zhǒng)通(tòng)过(guò)液晶和(hé)色(sè)彩过(guò)濾器过(guò)濾光(guāng)源,在(zài)平面(miàn)面(miàn)板上(shàng)産生(shēng)图(tú)像的(de)數字(zì)顯示器。LCD 的(de)構造是(shì)在(zài)两(liǎng)片(piàn)平行的(de)玻璃基板當中(zhōng)放(fàng)置液晶盒,下(xià)基板玻璃上(shàng)設置薄膜晶體(tǐ)管(guǎn),.上(shàng)基板玻璃上(shàng)設置彩色(sè)濾光(guāng)片(piàn),通(tòng)过(guò)薄膜晶體(tǐ)管(guǎn)上(shàng)的(de)信(xìn)号(hào)與(yǔ)電(diàn)壓改變(biàn)来(lái)控制液晶分(fēn)子的(de)轉(zhuǎn)動(dòng)方(fāng)向(xiàng),從而(ér)达(dá)到(dào)控制每个(gè)像素點(diǎn)偏振光(guāng)出(chū)射與(yǔ)否而(ér)达(dá)到(dào)顯示目的(de)。與(yǔ)傳統的(de)陰极(jí)射線(xiàn)管(guǎn)相比,LCD具有(yǒu)占用(yòng)空間(jiān)小,低功耗,低輻射,无閃爍,降低視覺疲勞等优點(diǎn)。現(xiàn)在(zài)LCD已漸替代(dài)CRT成(chéng)为(wèi)主(zhǔ)流,價格也(yě)已經(jīng)下(xià)降了(le)很多(duō),并已充分(fēn)的(de)普及(jí)。
本(běn)設計(jì)的(de)主(zhǔ)要(yào)任务是(shì)基于(yú)FPGA的(de)LCD顯示控制器設計(jì),兼顧程序的(de)易用(yòng)性(xìng),方(fāng)便此(cǐ)後(hòu)模块(kuài)的(de)移植和(hé)應(yìng)用(yòng)。采用(yòng)VHDL硬(yìng)件(jiàn)描述語(yǔ)言在(zài)QUARTUS II软(ruǎn)件(jiàn)平台(tái)上(shàng)实現(xiàn)FPGA对(duì)LCD的(de)控制,在(zài)LCD模块(kuài)上(shàng)实現(xiàn)任意(yì)彩色(sè)图(tú)片(piàn)的(de)顯示,與(yǔ)此(cǐ)同(tóng)时(shí)還(huán)須实現(xiàn)实时(shí)刷新數據(jù)的(de)功能(néng)。这(zhè)将有(yǒu)助于(yú)采用(yòng)FPGA的(de)系(xì)列産品的(de)開(kāi)發(fà),特(tè)别是(shì)需要(yào)用(yòng)到(dào)LCD而(ér)采用(yòng)FPGA的(de)産品的(de)開(kāi)發(fà)。不(bù)但縮短(duǎn)了(le)FPGA的(de)開(kāi)發(fà)周期(qī),也(yě)使更(gèng)多(duō)采用(yòng)FPGA設計(jì)的(de)産品上(shàng)出(chū)現(xiàn)LCD,增加了(le)人(rén)機(jī)之間(jiān)的(de)交互性(xìng)。
1.1.2 設計(jì)目标(biāo)
此(cǐ)設計(jì)通(tòng)过(guò)fpga給(gěi)lcd發(fà)送图(tú)片(piàn)信(xìn)息,然後(hòu)直(zhí)接在(zài)LCD顯示矩形動(dòng)画(huà),矩形的(de)宽(kuān)從2變(biàn)化(huà)到(dào)600,矩形的(de)高(gāo)從2變(biàn)化(huà)到(dào)400
1.1.3信(xìn)号(hào)列表(biǎo)
信(xìn)号(hào)名
| 接口(kǒu)方(fāng)向(xiàng) | 定(dìng)義 |
clk_50m | 輸入(rù) | 系(xì)統时(shí)鐘(zhōng) |
rst_n | 輸入(rù) | 低電(diàn)平複位信(xìn)号(hào) |
lcd_hsync | 輸出(chū) | 行同(tóng)步信(xìn)号(hào) |
lcd_vsync | 輸出(chū) | 场同(tóng)步信(xìn)号(hào) |
lcd_de | 輸出(chū) | 行和(hé)场同(tóng)时(shí)顯示时(shí)序段(duàn)
有(yǒu)效顯示數據(jù)段(duàn)信(xìn)号(hào) |
lcd_rgb | 輸出(chū) | 顯示顔色(sè)RGB
[23:16]:表(biǎo)示的(de)是(shì)R[7:0]
[15:8]:表(biǎo)示的(de)是(shì)G[7:0]
[7:0]:表(biǎo)示的(de)是(shì)B[7:0] |
lcd_dclk | 輸出(chū) | 像素时(shí)鐘(zhōng)信(xìn)号(hào) |
1.1.4 設計(jì)思(sī)路(lù)
設計(jì)行顯示时(shí)序段(duàn)和(hé)场顯示时(shí)序段(duàn),来(lái)确定(dìng)矩形邊(biān)框的(de)宽(kuān)度(dù),根(gēn)據(jù)各(gè)種(zhǒng)顔色(sè)的(de)數值来(lái)确定(dìng)lcd顯示屏顯示出(chū)的(de)邊(biān)框顔色(sè)
行时(shí)鐘(zhōng)計(jì)數器cnt_hys:用(yòng)来(lái)計(jì)算行同(tóng)步信(xìn)号(hào)的(de)幀长,加一(yī)条(tiáo)件(jiàn)是(shì)1,結束(shù)条(tiáo)件(jiàn)为(wèi)數到(dào)1056个(gè)像素就(jiù)結束(shù)
场时(shí)鐘(zhōng)計(jì)數器cnt_vys:用(yòng)来(lái)計(jì)算场同(tóng)步信(xìn)号(hào)的(de)幀长,加一(yī)条(tiáo)件(jiàn)是(shì)场信(xìn)号(hào)每數到(dào)1056个(gè)像素(即为(wèi)一(yī)行結束(shù)的(de)时(shí)刻),結束(shù)条(tiáo)件(jiàn)为(wèi)數到(dào)525行就(jiù)結束(shù)
1.1.5參考代(dài)碼
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.
複制代(dài)碼
1.2 效果(guǒ)和(hé)總(zǒng)結
本(běn)案(àn)例我(wǒ)们(men)設計(jì)了(le)藍(lán)色(sè)的(de)矩形,藍(lán)色(sè)矩形的(de)场信(xìn)号(hào)是(shì)從2行變(biàn)到(dào)400行、行信(xìn)号(hào)是(shì)從2个(gè)像素變(biàn)到(dào)600个(gè)像素;
在(zài)这(zhè)个(gè)設計(jì)案(àn)例中(zhōng),至(zhì)簡設計(jì)法和(hé)明(míng)德揚計(jì)數器模板發(fà)揮了(le)至(zhì)關(guān)重(zhòng)要(yào)的(de)作用(yòng),使我(wǒ)能(néng)够快(kuài)速準确完成(chéng)設計(jì)。希望有(yǒu)興趣的(de)同(tóng)学可(kě)以(yǐ)運用(yòng)至(zhì)簡設計(jì)法和(hé)明(míng)德揚模板嘗試一(yī)下(xià)拓展(zhǎn)設計(jì)哦。
設計(jì)教学視頻和(hé)工程源代(dài)碼,請到(dào)明(míng)德揚論壇(www.fpgabbs.cn)学習:http://www.fpgabbs.cn/thread-1156-1-1.html
温(wēn)馨提(tí)示:明(míng)德揚2023推出(chū)了(le)全(quán)新課程——邏輯設計(jì)基本(běn)功修煉課,降低学習FPGA門(mén)檻的(de)同(tóng)时(shí),增加了(le)学習的(de)趣味性(xìng),并組織了(le)考試赢積分(fēn)活動(dòng)
http://www.minyingyiyuan.com/ffkc/415.html
(點(diǎn)擊→了(le)解(jiě)課程詳情(qíng)☝)感(gǎn)興趣請聯系(xì)易老(lǎo)师(shī):13112063618(微信(xìn)同(tóng)步)