《基于FPGA的數(shù)字系統(tǒng)設(shè)計(jì)》課件第5章_第1頁(yè)
《基于FPGA的數(shù)字系統(tǒng)設(shè)計(jì)》課件第5章_第2頁(yè)
《基于FPGA的數(shù)字系統(tǒng)設(shè)計(jì)》課件第5章_第3頁(yè)
《基于FPGA的數(shù)字系統(tǒng)設(shè)計(jì)》課件第5章_第4頁(yè)
《基于FPGA的數(shù)字系統(tǒng)設(shè)計(jì)》課件第5章_第5頁(yè)
已閱讀5頁(yè),還剩263頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

5.1控制發(fā)光二極管循環(huán)發(fā)光

5.2旋轉(zhuǎn)開關(guān)控制發(fā)光二極管輪流發(fā)光

5.3控制液晶顯示屏顯示字符

5.4電子數(shù)字鐘

5.5運(yùn)動(dòng)計(jì)時(shí)器

5.6液晶顯示屏顯示PS/2鍵盤的鍵值

5.7通過(guò)RS-232異步串行通信接口

實(shí)現(xiàn)FPGA與計(jì)算機(jī)的通信

第5章設(shè)計(jì)實(shí)例

5.1控制發(fā)光二極管循環(huán)發(fā)光

實(shí)驗(yàn)開發(fā)板有8個(gè)并排放置的發(fā)光二極管LED7~LED0,其中1個(gè)發(fā)光二極管發(fā)光,其它7個(gè)發(fā)光二極管都處于截止?fàn)顟B(tài)。發(fā)光二極管的導(dǎo)通順序按照向左或向右兩個(gè)方向移動(dòng),并且通過(guò)撥動(dòng)開關(guān)SW0(L13)控制發(fā)光二極管循環(huán)發(fā)光移動(dòng)的方向,如圖5-1所示。圖5-1控制發(fā)光二極管循環(huán)發(fā)光實(shí)現(xiàn)控制發(fā)光二極管循環(huán)發(fā)光的電路的輸入和輸出端口信號(hào)如圖5-2所示。

圖5-2中,clk、reset和dir_r_l分別是50?MHz時(shí)鐘、復(fù)位和撥動(dòng)開關(guān)的輸入信號(hào)。led為控制8個(gè)發(fā)光二極管發(fā)光的控制信號(hào),F(xiàn)PGA控制發(fā)光二極管的導(dǎo)通和截止,輸出高電平時(shí)對(duì)應(yīng)發(fā)光二極管有電流流過(guò)而發(fā)光。實(shí)驗(yàn)開發(fā)板上的BTNSOUTH(K17)為復(fù)位按鍵,高電平有效,復(fù)位按鍵按下時(shí),8個(gè)發(fā)光二極管中的LED0發(fā)光。圖5-2輸入和輸出端口信號(hào)由于輸入時(shí)鐘信號(hào)的頻率為50?MHz,為了能夠觀察到發(fā)光的發(fā)光二極管循環(huán)移動(dòng)方向,將頻率為50?MHz的輸入時(shí)鐘信號(hào)分頻,得到一秒的信號(hào)new_second,不過(guò)該一秒信號(hào)脈沖的占空比不是1∶1的方波,其高電平的脈沖寬度等于50MHz時(shí)鐘信號(hào)的一個(gè)周期,該信號(hào)控制發(fā)光的發(fā)光二極管循環(huán)移動(dòng)的速度。程序如下:

moduleled_shift(clk,reset,dir_r_l,led);

inputclk;

inputreset;

inputdir_r_l;

output[7:0]led;

reg[7:0]led;

reg[27:0]cnt; //計(jì)數(shù)分頻器

always@(posedgeclkorposedgereset)

begin

if(reset)

begin

cnt<=28'd0;

end

else

begin

if(cnt==28'd49999999)

begin

cnt<=28'd0;

end

else

begin

cnt<=cnt+1;

end

end

end

regnew_second; //得到1秒信號(hào)

always@(posedgeclkorposedgereset)

begin

if(reset)

new_second<=1'b0;

else

begin

if(cnt==28‘d49999999)

new_second<=1'b1; //只有計(jì)數(shù)到第49999999個(gè)脈沖時(shí),

//秒信號(hào)脈沖才為高電平,在其它時(shí)

//間為低電平

elseif(new_second)

new_second<=1'b0;

end

endalways@(posedgeclk)

begin

if(reset)

led<=8'b0000001;

else

if(new_second)

begin

if(dir_r_l==1)

begin

led<={led[0],led[7:1]};//向右移動(dòng)

end

else

begin

led<={led[6:0],led[7]};//向左移動(dòng)

end

end

end

endmodule下面是程序使用到的信號(hào)和對(duì)應(yīng)的管腳以及電平標(biāo)準(zhǔn)等參數(shù)的選擇:

NET"clk" LOC="C9"|IOSTANDARD=LVTTL;

NET"reset" LOC="K17"|IOSTANDARD=LVTTL|pulldown|DRIVE=2;

NET"dir_r_l" LOC="L13"|IOSTANDARD=LVTTL|pullup|DRIVE=2;

NET"led<0>"LOC="F12"|IOSTANDARD=LVTTL|SLEW=SLOW|DRIVE=4;

NET"led<1>"LOC="E12"|IOSTANDARD=LVTTL|SLEW=SLOW|DRIVE=4;

NET"led<2>"LOC="E11"|IOSTANDARD=LVTTL|SLEW=SLOW|DRIVE=4;NET"led<3>"LOC="F11"|IOSTANDARD=LVTTL|SLEW=SLOW|DRIVE=4;

NET"led<4>"LOC="C11"|IOSTANDARD=LVTTL|SLEW=SLOW|DRIVE=4;

NET"led<5>"LOC="D11"|IOSTANDARD=LVTTL|SLEW=SLOW|DRIVE=4;

NET"led<6>"LOC="E9"|IOSTANDARD=LVTTL|SLEW=SLOW|DRIVE=4;

NET"led<7>"LOC="F9"|IOSTANDARD=LVTTL|SLEW=SLOW|DRIVE=4;5.2旋轉(zhuǎn)開關(guān)控制發(fā)光二極管輪流發(fā)光

利用Spartan-3E實(shí)驗(yàn)開發(fā)板上的旋轉(zhuǎn)開關(guān)和8個(gè)并排的發(fā)光二極管,設(shè)計(jì)一個(gè)旋轉(zhuǎn)開關(guān)控制8個(gè)發(fā)光二極管循環(huán)發(fā)光及移位方向的電路。Spartan-3E實(shí)驗(yàn)開發(fā)板上的FPGA芯片型號(hào)為XC3S500E-4FG320C,F(xiàn)PGA芯片接收反映旋轉(zhuǎn)開關(guān)旋轉(zhuǎn)方向的兩個(gè)開關(guān)A和B信號(hào)和FPGA芯片輸出信號(hào),控制實(shí)驗(yàn)開發(fā)板上的8個(gè)發(fā)光二極管的導(dǎo)通和截止。由于旋轉(zhuǎn)開關(guān)的開關(guān)A和開關(guān)B的一個(gè)觸點(diǎn)接地,另外兩個(gè)分別接FPGA的I/O管腳,因此應(yīng)該定義FPGA的I/O管腳為帶有上拉電阻的輸入管腳。

FPGA實(shí)現(xiàn)旋轉(zhuǎn)開關(guān)控制8個(gè)發(fā)光二極管循環(huán)發(fā)光及移位方向的電路的輸入和輸出端口信號(hào)如圖5-3所示。其中clk、reset、R_A和R_B分別是50MHz時(shí)鐘、復(fù)位和旋轉(zhuǎn)開關(guān)的輸入信號(hào),LED_DATA為控制8個(gè)發(fā)光二極管發(fā)光的控制信號(hào)。

要求在8個(gè)發(fā)光二極管中只有一個(gè)發(fā)光二極管導(dǎo)通,而旋轉(zhuǎn)開關(guān)控制實(shí)驗(yàn)開發(fā)板上的8個(gè)發(fā)光二極管中的一個(gè)導(dǎo)通的發(fā)光二極管的移位方向。當(dāng)旋轉(zhuǎn)開關(guān)順時(shí)針?lè)较蛐D(zhuǎn)時(shí),導(dǎo)通發(fā)光二極管向右移動(dòng);當(dāng)旋轉(zhuǎn)開關(guān)逆時(shí)針?lè)较蛐D(zhuǎn)時(shí),導(dǎo)通發(fā)光二極管向左移動(dòng),如圖5-4所示。圖5-3輸入和輸出端口信號(hào)圖5-4旋轉(zhuǎn)開關(guān)控制發(fā)光二極管的移位方向當(dāng)旋轉(zhuǎn)開關(guān)輸出的開關(guān)B信號(hào)為高電平和開關(guān)A信號(hào)變?yōu)楦唠娖綍r(shí),表示旋轉(zhuǎn)開關(guān)逆時(shí)針旋轉(zhuǎn);當(dāng)旋轉(zhuǎn)開關(guān)輸出的開關(guān)B信號(hào)為低電平和開關(guān)A信號(hào)變?yōu)楦唠娖綍r(shí),表示旋轉(zhuǎn)開關(guān)順時(shí)針旋轉(zhuǎn),如圖5-5所示。

任何機(jī)械觸點(diǎn)接觸時(shí)都存在抖動(dòng)現(xiàn)象,抖動(dòng)現(xiàn)象有可能導(dǎo)致錯(cuò)誤判斷旋轉(zhuǎn)開關(guān)的旋轉(zhuǎn)方向,如圖5-6所示。

為了正確地獲取旋轉(zhuǎn)開關(guān)的旋轉(zhuǎn)方向,必須加入消除機(jī)械觸點(diǎn)接觸時(shí)產(chǎn)生抖動(dòng)的措施。對(duì)于帶有兩個(gè)開關(guān)A和B輸出的旋轉(zhuǎn)開關(guān),檢測(cè)第一個(gè)發(fā)生變化的開關(guān)信號(hào),需要忽略緊接著后面的抖動(dòng)信號(hào),直到另外一個(gè)開關(guān)信號(hào)發(fā)生變化。圖5-5旋轉(zhuǎn)開關(guān)的輸出波形

圖5-6旋轉(zhuǎn)開關(guān)的機(jī)械觸點(diǎn)接觸時(shí)存在的抖動(dòng)現(xiàn)象例如,開關(guān)A信號(hào)經(jīng)過(guò)消除抖動(dòng)后的信號(hào)為rotary_q1,開關(guān)B信號(hào)經(jīng)過(guò)消除抖動(dòng)后的信號(hào)為rotary_q2。當(dāng)檢測(cè)到開關(guān)A信號(hào)由低電平變化到高電平時(shí),rotary_q1信號(hào)先不發(fā)生變化,并且忽略緊接著后面的抖動(dòng)信號(hào),直到檢測(cè)到開關(guān)B信號(hào)由低電平變化到高電平時(shí),rotary_q1才由低電平變化到高電平,從而消除了開關(guān)A信號(hào)的抖動(dòng)信號(hào);檢測(cè)到開關(guān)A信號(hào)由高電平變化到低電平時(shí),rotary_q1信號(hào)先不發(fā)生變化,直到檢測(cè)到開關(guān)B信號(hào)由高電平變化到低電平時(shí),才由高電平變化到低電平,如圖5-7所示。圖中的rotary_q1信號(hào)波形中的細(xì)線表示保持當(dāng)前狀態(tài)不變。只有當(dāng)開關(guān)A信號(hào)和開關(guān)B信號(hào)均為高電平時(shí),rotary_q1才為高電平;當(dāng)開關(guān)A信號(hào)和開關(guān)B信號(hào)均為低電平時(shí),rotary_q1才為低電平,在其它情況下,rotary_q1的狀態(tài)保持不變。同理,經(jīng)過(guò)相同的方法可消除開關(guān)B信號(hào)的抖動(dòng)信號(hào)。當(dāng)檢測(cè)到開關(guān)B信號(hào)由低電平變化到高電平時(shí),rotary_q2信號(hào)先不發(fā)生變化,并且忽略緊接著后面的抖動(dòng)信號(hào),直到檢測(cè)到開關(guān)A信號(hào)由高電平變化到低電平時(shí),rotary_q2才由低電平變化到高電平,從而消除了開關(guān)B信號(hào)的抖動(dòng)信號(hào);當(dāng)檢測(cè)到開關(guān)B信號(hào)由高電平變化到低電平時(shí),rotary_q2信號(hào)先不發(fā)生變化,直到檢測(cè)到開關(guān)A信號(hào)由低電平變化到高電平時(shí),才由高電平變化到低電平,如圖5-7所示。只有當(dāng)開關(guān)A信號(hào)為低電平和開關(guān)B信號(hào)為高電平時(shí),rotary_q2才為高電平;當(dāng)開關(guān)A信號(hào)為高電平和開關(guān)B信號(hào)為低電平時(shí),rotary_q2才為低電平,在其它情況下,rotary_q2的狀態(tài)保持不變。旋轉(zhuǎn)開關(guān)逆時(shí)針旋轉(zhuǎn)和順時(shí)針旋轉(zhuǎn)時(shí)的信號(hào)波形如圖5-8所示。信號(hào)rotary_q1由低電平變?yōu)楦唠娖綍r(shí),如果rotary_q2為低電平,就表示順時(shí)針旋轉(zhuǎn);如果rotary_q2為高電平,則表示逆時(shí)針旋轉(zhuǎn)。

利用信號(hào)rotary_q1作為判斷旋轉(zhuǎn)開關(guān)旋轉(zhuǎn)事件發(fā)生的信號(hào),當(dāng)rotary_q1由低電平變成高電平時(shí),旋轉(zhuǎn)開關(guān)旋轉(zhuǎn)事件發(fā)生的信號(hào)rotary_event=“1”;當(dāng)rotary_q1由低電平變成高電平時(shí),根據(jù)信號(hào)rotary_q2判斷旋轉(zhuǎn)開關(guān)的旋轉(zhuǎn)方向,旋轉(zhuǎn)開關(guān)旋轉(zhuǎn)方向信號(hào)rotary_left=“1”時(shí),表示旋轉(zhuǎn)開關(guān)逆時(shí)針旋轉(zhuǎn);rotary_left=“0”時(shí),表示旋轉(zhuǎn)開關(guān)順時(shí)針旋轉(zhuǎn)。圖5-7消除旋轉(zhuǎn)開關(guān)的機(jī)械觸點(diǎn)接觸時(shí)存在的抖動(dòng)現(xiàn)象圖5-8旋轉(zhuǎn)開關(guān)逆時(shí)針旋轉(zhuǎn)和順時(shí)針旋轉(zhuǎn)時(shí)的信號(hào)產(chǎn)生判斷旋轉(zhuǎn)事件發(fā)生信號(hào)rotary_event和旋轉(zhuǎn)方向信號(hào)rotary_left的電路如圖5-9所示。

用Verilog-HDL語(yǔ)言描述實(shí)現(xiàn)旋轉(zhuǎn)開關(guān)控制發(fā)光二極管循環(huán)移位的程序如下:

modulerotary_led(clk,reset,R_A,R_B,LED_DATA);

//輸入信號(hào)

inputclk; //50MHz的時(shí)鐘信號(hào)

inputreset; /復(fù)位信號(hào),高電平有效

inputR_A; //旋轉(zhuǎn)開關(guān)A

inputR_B; //旋轉(zhuǎn)開關(guān)B//輸出信號(hào)

output[7:0]LED_DATA; //8個(gè)LED發(fā)光二極管

//引入一些內(nèi)部信號(hào)

reg[7:0]shift_d; //控制8個(gè)LED發(fā)光二極管的8個(gè)移位寄存器

regrotary_q1,rotary_q2; //消除抖動(dòng)后的開關(guān)信號(hào)

regrotary_q1_d; //保存前一時(shí)刻的rotary_q1信號(hào)

regrotary_event; //判斷旋轉(zhuǎn)開關(guān)旋轉(zhuǎn)事件發(fā)生的信號(hào)

regrotary_left; //旋轉(zhuǎn)開關(guān)的旋轉(zhuǎn)方向

reg[3:0]clk_cnt; //計(jì)數(shù)器信號(hào)

regR_A_d,R_B_d; //保存開關(guān)A和B信號(hào)wire[7:0]LED_DATA;

wirerotary_press_in=1'b0;

//對(duì)50MHz時(shí)鐘信號(hào)進(jìn)行分頻,獲得低頻時(shí)鐘信號(hào)

always@(posedgeclkorposedgereset)

if(reset)

clk_cnt<=4'b0;

else

clk_cnt<=clk_cnt+1; //產(chǎn)生分頻后的時(shí)鐘信號(hào)clk_cnt[3]

//對(duì)旋轉(zhuǎn)開關(guān)的開關(guān)A信號(hào)和開關(guān)B信號(hào)進(jìn)行采集和鎖存

always@(posedgeclk_cnt[3]orposedgereset)

if(reset)begin

R_A_d<=1'b0;

R_B_d<=1'b0;

end

elsebegin

R_A_d<=R_A;//鎖存旋轉(zhuǎn)開關(guān)的開關(guān)A信號(hào)和開關(guān)B信號(hào)

R_B_d<=R_B;

end

//對(duì)開關(guān)A信號(hào)進(jìn)行濾波,得到消除抖動(dòng)后的信號(hào)rotary_q1

always@(posedgeclkorposedgereset)

if(reset)

rotary_q1<=1'b0;

elseif(R_A_d&&R_B_d)

rotary_q1<=1'b1;

elseif(!(R_A_d||R_B_d))

rotary_q1<=1'b0;

//對(duì)開關(guān)B信號(hào)進(jìn)行濾波,得到消除抖動(dòng)后的信號(hào)rotary_q2

always@(posedgeclkorposedgereset)

if(reset)

rotary_q2<=1'b0;

elseif(!R_A_d&&R_B_d)

rotary_q2<=1'b1;

elseif(R_A_d&&!R_B_d)

rotary_q2<=1'b0;//保存前一時(shí)刻的rotary_q1信號(hào)

always@(posedgeclkorposedgereset)

if(reset)

rotary_q1_d<=1'b0;

else

rotary_q1_d<=rotary_q1;

//確認(rèn)旋轉(zhuǎn)事件是否發(fā)生,當(dāng)信號(hào)rotary_event=“1”時(shí),表示旋轉(zhuǎn)事件發(fā)生

always@(posedgeclkorposedgereset)

if(reset)

rotary_event<=1'b0;

else

rotary_event<=!rotary_q1_d&&rotary_q1;/*確定旋轉(zhuǎn)方向,當(dāng)rotary_left=“1”時(shí),表示逆時(shí)針旋轉(zhuǎn),rotary_left=“0”時(shí),表示順時(shí)針旋轉(zhuǎn)*/

always@(posedgeclkorposedgereset)

if(reset)

rotary_left<=1'b0;

elseif(!rotary_q1_d&&rotary_q1)

rotary_left<=rotary_q2;

//控制8個(gè)發(fā)光二極管導(dǎo)通和截止的8個(gè)移位寄存器

always@(posedgeclkorposedgereset)

if(reset) //當(dāng)按下復(fù)位按鍵時(shí),8個(gè)發(fā)光二極管中只有LED0導(dǎo)通

shift_d<=8'h01;

elseif(rotary_event)

shift_d<=rotary_left?{shift_d[6:0],shift_d[7]}:{shift_d[0],shift_d[7:1]};

/*如果檢測(cè)到旋轉(zhuǎn)開關(guān)旋轉(zhuǎn)事件發(fā)生(rotary_event=“1”),則判斷旋轉(zhuǎn)方向(當(dāng)rotary_left=“1”時(shí),表示旋轉(zhuǎn)開關(guān)逆時(shí)針(向左)旋轉(zhuǎn),8個(gè)發(fā)光二極管中的一個(gè)導(dǎo)通的發(fā)光二極管向左移動(dòng)

//shift_d<={shift_d[6:0],shift_d[7]})*/

//控制8個(gè)發(fā)光二極管的輸出信號(hào)LED_DATA,由旋轉(zhuǎn)開關(guān)控制

assignLED_DATA={8{rotary_press_in}}^shift_d;

endmodule圖5-9事件發(fā)生信號(hào)和旋轉(zhuǎn)方向信號(hào)的產(chǎn)生電路下面是程序使用到的信號(hào)和對(duì)應(yīng)的管腳以及電平標(biāo)準(zhǔn)等參數(shù)的選擇:

NET"clk"LOC="C9"|IOSTANDARD=LVCMOS33;

NET"reset"LOC="V16"|IOSTANDARD=LVTTL|PULLDOWN;

NET"R_A"LOC="K18"|IOSTANDARD=LVTTL|PULLUP;

NET"R_B"LOC="G18"|IOSTANDARD=LVTTL|PULLUP;

NET"LED_DATA<7>"LOC="F12"|IOSTANDARD=LVTTL|SLEW=SLOW|DRIVE=8;

NET"LED_DATA<6>"LOC="E12"|IOSTANDARD=LVTTL|SLEW=SLOW|DRIVE=8;NET"LED_DATA<5>"LOC="E11"|IOSTANDARD=LVTTL|SLEW=SLOW|DRIVE=8;

NET"LED_DATA<4>"LOC="F11"|IOSTANDARD=LVTTL|SLEW=SLOW|DRIVE=8;

NET"LED_DATA<3>"LOC="C11"|IOSTANDARD=LVTTL|SLEW=SLOW|DRIVE=8;

NET"LED_DATA<2>"LOC="D11"|IOSTANDARD=LVTTL|SLEW=SLOW|DRIVE=8;

NET"LED_DATA<1>"LOC="E9"|IOSTANDARD=LVTTL|SLEW=SLOW|DRIVE=8;

NET"LED_DATA<0>"LOC="F9"|IOSTANDARD=LVTTL|SLEW=SLOW|DRIVE=8;

5.3控制液晶顯示屏顯示字符

實(shí)驗(yàn)開發(fā)板上設(shè)置了一個(gè)2行16字符液晶顯示屏LCD,液晶顯示屏包含一個(gè)SitronixST7066U圖形控制芯片,為了節(jié)約FPGA芯片的I/O管腳資源,盡可能少占用FPGA芯片的管腳,采用與StrataFlash存儲(chǔ)器芯片共享FPGA的I/O管腳的方法,F(xiàn)PGA芯片僅通過(guò)4位數(shù)據(jù)信號(hào)線和3位控制信號(hào)線與LCD控制芯片進(jìn)行通信。向液晶顯示屏傳輸數(shù)據(jù)時(shí),分兩次輸入到LCD控制芯片中,高4位先送,低4位后送。

用Verilog-HDL語(yǔ)言描述一個(gè)控制液晶顯示屏顯示字符“OK!”的電路。

FPGA實(shí)現(xiàn)控制液晶顯示屏顯示字符“OK!”的電路的輸入和輸出端口信號(hào)如圖5-10所示。其中,clk、reset分別是50MHz時(shí)鐘和復(fù)位輸入信號(hào),reset高電平有效。lcd_rs、lcd_rw、lcd_e和lcd_d分別為與液晶顯示屏控制芯片連接的控制信號(hào)。lcd_rs為寄存器選擇控制輸出信號(hào),當(dāng)lcd_rs為低電平時(shí),表示數(shù)據(jù)總線傳輸?shù)氖敲羁刂菩盘?hào),當(dāng)lcd_rs為高電平時(shí),表示數(shù)據(jù)總線傳輸?shù)氖菙?shù)據(jù)信號(hào);lcd_rw為讀/寫控制輸出信號(hào),當(dāng)lcd_rw為低電平時(shí),表示向液晶顯示屏控制芯片寫數(shù)據(jù),反之,為讀取數(shù)據(jù);lcd_e為讀/寫操作允許控制脈沖輸出信號(hào),高電平有效;

lcd_d為數(shù)據(jù)信號(hào),由于在設(shè)計(jì)控制液晶顯示屏顯示字符時(shí),嚴(yán)格按照液晶顯示屏控制芯片的時(shí)序設(shè)計(jì),留給液晶顯示屏控制芯片完成所有操作的時(shí)間,因此不需要讀取液晶顯示屏控制芯片是否處于忙的狀態(tài),相對(duì)FPGA來(lái)說(shuō),4位lcd_d數(shù)據(jù)總線設(shè)置為單向輸出信號(hào)。flash_ce為StrataFlash存儲(chǔ)器芯片的使能控制信號(hào),低電平有效,由于lcd_d數(shù)據(jù)信號(hào)分別與StrataFlash存儲(chǔ)器芯片的數(shù)據(jù)信號(hào)SF_D<9>~SF_D<11>連接在一起,因此在控制液晶顯示屏顯示字符的設(shè)計(jì)中,該信號(hào)設(shè)置為高電平,不允許StrataFlash存儲(chǔ)器芯片占用數(shù)據(jù)總線。圖5-10輸入和輸出端口信號(hào)設(shè)置為高電平,不允許StrataFlash存儲(chǔ)器芯片占用數(shù)據(jù)總線。

圖5-10輸入和輸出端口信號(hào)上電后,必須傳送給液晶顯示屏控制芯片初始化命令,初始化完成后,還要傳輸指定地址計(jì)數(shù)器地址和顯示字符的編碼數(shù)據(jù)。接通電源后,F(xiàn)PGA向液晶顯示屏控制芯片發(fā)送指令的流程如圖5-11所示。

根據(jù)上述流程圖,可以采用狀態(tài)機(jī)實(shí)現(xiàn)對(duì)液晶顯示屏控制芯片的控制。由于執(zhí)行不同的操作過(guò)程,需要的時(shí)間也不一樣,因此采用計(jì)數(shù)器和狀態(tài)機(jī)配合的方式。為每個(gè)狀態(tài)設(shè)置不同的時(shí)間(也就是延遲計(jì)數(shù)值的不同),計(jì)數(shù)器與狀態(tài)設(shè)置不同延遲計(jì)數(shù)值相比較,并且給狀態(tài)機(jī)發(fā)出計(jì)數(shù)時(shí)間到的信號(hào),通知狀態(tài)機(jī)轉(zhuǎn)換到下一個(gè)狀態(tài),直到所有的數(shù)據(jù)傳送完畢后,再循環(huán)向液晶顯示屏控制芯片發(fā)送顯示字符編碼數(shù)據(jù)。圖5-11FPGA向液晶顯示屏控制芯片發(fā)送指令的流程圖

向液晶顯示屏控制芯片發(fā)送指令或數(shù)據(jù)的時(shí)序如圖5-12所示,每次發(fā)送數(shù)據(jù)需要滿足:①數(shù)據(jù)超前使能信號(hào)lcd_e的時(shí)間大于40ns;②使能信號(hào)lcd_e保持高電平的時(shí)間大于230ns;③使能信號(hào)lcd_e無(wú)效后,經(jīng)過(guò)大于10ns時(shí)間,有效數(shù)據(jù)信號(hào)才能改變?yōu)槠渌鼣?shù)據(jù)信號(hào)。

根據(jù)上述時(shí)序,傳送一次數(shù)據(jù)可以分三個(gè)狀態(tài):第一個(gè)狀態(tài)先建立數(shù)據(jù),等待時(shí)間大于40ns;第二個(gè)狀態(tài)將使能信號(hào)lcd_e變成高電平,等待時(shí)間大于230ns;第三個(gè)狀態(tài)將使能信號(hào)lcd_e變成低電平,等待大于1μs(對(duì)應(yīng)8位數(shù)據(jù)分兩次傳輸,兩個(gè)4位傳輸之間的間隔)或40μs(對(duì)應(yīng)完成一個(gè)8位數(shù)據(jù)傳輸,與下一次數(shù)據(jù)傳輸之間的間隔)時(shí)間后,有效數(shù)據(jù)信號(hào)才能改變?yōu)槠渌鼣?shù)據(jù)信號(hào)。圖5-12數(shù)據(jù)傳輸時(shí)序

例如,傳送命令“0010”到液晶顯示屏控制芯片,則在第一個(gè)狀態(tài)時(shí),設(shè)置定時(shí)計(jì)數(shù)值為4(大于40ns);lcd_rs設(shè)置為1'b0,表示傳輸?shù)氖敲羁刂谱郑?位數(shù)據(jù)總線信號(hào)lcd_d為4'h2;使能信號(hào)lcd_e仍然為低電平。轉(zhuǎn)換到第二個(gè)狀態(tài)時(shí),設(shè)置定時(shí)計(jì)數(shù)值為12(大于230ns);使能信號(hào)lcd_e變成高電平。轉(zhuǎn)換到第三個(gè)狀態(tài)時(shí),設(shè)置定時(shí)計(jì)數(shù)值為80(大于1μs)或2000(等于40μs);使能信號(hào)lcd_e變成低電平。該狀態(tài)機(jī)的敏感信號(hào)為state_change,信號(hào)state_change由定時(shí)計(jì)數(shù)器模塊提供,這一段傳送命令“0010”的狀態(tài)及代碼如下:

state1:begin

state<=state2;

num_count<=20'd4;

lcd_rs<=1'b0;

cd_e<=1'b0;

lcd_d<=4'h2;

end

state2:begin

state<=state3;

num_count<=20'd12;

lcd_e<=1'b1;

end

state3:begin

state<=state4;

num_count<=20'd4000;

lcd_e<=1'b0;

end

描述控制液晶顯示屏顯示字符“OK!”的電路,采用計(jì)數(shù)器和狀態(tài)機(jī)配合的方式。狀態(tài)機(jī)根據(jù)計(jì)數(shù)器發(fā)出的轉(zhuǎn)換狀態(tài)控制信號(hào)轉(zhuǎn)換到下一個(gè)狀態(tài);計(jì)數(shù)器根據(jù)狀態(tài)下機(jī)在不同的狀態(tài)下提供計(jì)數(shù)值,發(fā)出轉(zhuǎn)換狀態(tài)控制信號(hào),如圖5-13所示。圖5-13兩個(gè)模塊的通信信號(hào)用Verilog-HDL語(yǔ)言描述實(shí)現(xiàn)液晶顯示屏顯示字符“OK!”的程序如下:

modulelcd_control(clk,reset,lcd_rs,lcd_rw,lcd_e,lcd_d,flash_ce);

inputclk;

inputreset;

outputlcd_rs;

outputlcd_rw;

outputlcd_e;

outputflash_ce;

output[3:0]lcd_d;

reglcd_rs,lcd_e;

reg[3:0]lcd_d;

/*StrataFlash存儲(chǔ)器芯片的使能控制信號(hào)flash_ce信號(hào)設(shè)置為高電平,不允許StrataFlash存儲(chǔ)器芯片占用數(shù)據(jù)總線*/

assignflash_ce=1;

//lcd_rw為讀/寫控制信號(hào),由于只向液晶顯示屏控制芯片寫數(shù)據(jù),lcd_rw設(shè)置為低電平

assignlcd_rw=0;

//定義用于定時(shí)的計(jì)數(shù)器信號(hào)

reg[19:0]delay_count;

reg[19:0]num_count;/*根據(jù)傳送給液晶顯示屏控制芯片初始化命令和指定地址計(jì)數(shù)器地址以及顯示字符的編碼數(shù)據(jù)的時(shí)序,定義若干狀態(tài)*/

parameterstate1=6'b000001;

parameterstate2=6'b000010;

parameterstate3=6'b000011;

parameterstate4=6'b000100;

parameterstate5=6'b000101;

parameterstate6=6'b000110;

parameterstate7=6'b000111;

parameterstate8=6'b001000;

parameterstate9=6'b001001;parameterstate10=6'b001010;

parameterstate11=6'b001011;

parameterstate12=6'b001100;

parameterstate13=6'b001101;

parameterstate14=6'b001110;

parameterstate15=6'b001111;

parameterstate16=6'b010000;

parameterstate17=6'b010001;

parameterstate18=6'b010010;

parameterstate19=6'b010011;

parameterstate20=6'b010100;

parameterstate21=6'b010101;parameterstate22=6'b010110;

parameterstate23=6'b010111;

parameterstate24=6'b011000;

parameterstate25=6'b011001;

parameterstate26=6'b011010;

parameterstate27=6'b011011;

parameterstate28=6'b011100;

parameterstate29=6'b011101;

parameterstate30=6'b011110;

parameterstate31=6'b011111;

parameterstate32=6'b100000;

parameterstate33=6'b100001;

parameterstate34=6'b100010;

parameterstate35=6'b100011;

parameterstate36=6'b100100;

parameterstate37=6'b100101;

parameterstate38=6'b100110;

parameterstate39=6'b100111;

parameterstate40=6'b101000;

parameterstate41=6'b101001;

parameterstate42=6'b101010;

parameterstate43=6'b101011;

parameterstate44=6'b101100;

parameterstate45=6'b101101;

parameterstate46=6'b101110;parameterstate47=6'b101111;

parameterstate48=6'b110000;

parameterstate49=6'b110001;

parameterstate50=6'b110010;

parameterstate51=6'b110011;

parameterstate52=6'b110100;

parameterstate53=6'b110101;

reg[5:0]state; //狀態(tài)信號(hào)

regstate_change; //改變狀態(tài)信號(hào)/*計(jì)數(shù)定時(shí)器根據(jù)對(duì)液晶顯示屏控制芯片進(jìn)行初始化和傳輸數(shù)據(jù)的時(shí)序,以及各狀態(tài)的停留時(shí)間,完成計(jì)數(shù)定時(shí)功能,輸出改變狀態(tài)信號(hào)*/

always@(posedgeclkorposedgereset)

if(reset)

begin

state_change<=1'b0;

delay_count<=1'b1;

end

else

if(delay_count==num_count-1)

begin

state_change<=1'b1;

delay_count<=1'b1;

end

else

begin

state_change<=1'b0;

delay_count<=delay_count+1'b1;

end

/*狀態(tài)機(jī)根據(jù)對(duì)液晶顯示屏控制芯片進(jìn)行初始化和傳輸數(shù)據(jù)的時(shí)序,以及各狀態(tài)的停留時(shí)間,設(shè)置下一個(gè)狀態(tài)停留的時(shí)間常數(shù),同時(shí)完成狀態(tài)轉(zhuǎn)移和輸出液晶顯示屏控制芯片的控制信號(hào)lcd_rs和lcd_e,數(shù)據(jù)信號(hào)lcd_d*/

always@(posedgestate_changeorposedgereset)

if(reset)

begin

state<=state1;

num_count<=20'd750000; //等待15ms,對(duì)應(yīng)750000個(gè)時(shí)

//鐘脈沖信號(hào)

endelse

case(state)

state1:begin

state<=state2;

num_count<=20'd4;//先傳送控制命令,超前使能信號(hào)

//lcd_e的時(shí)間大于40ns

lcd_rs<=1'b0;

lcd_e<=1'b0;

lcd_d<=4'h3; //寫入功能設(shè)置指令

end

state2:begin

state<=state3;

num_count<=20'd12; //保持使能信號(hào)lcd_e為高電平

//時(shí)間大于等于240ns

lcd_e<=1'b1;

end

state3: begin

state<=state4;

num_count<=20'd205000; //等待100μs

lcd_e<=1'b0;

end

state4: begin //重復(fù)寫入功能設(shè)置指令

state<=state5;

num_count<=20'd4;

lcd_d<=4'h3;

end

state5: begin

state<=state6;

num_count<=20'd12;

lcd_e<=1'b1;

end

state6: begin

state<=state7;

num_count<=20'd5000;

lcd_e<=1'b0;

end

/*寫入功能設(shè)置指令,采用4位數(shù)據(jù)總線傳輸,傳輸功能設(shè)置控制字中的DL=0,功能控制字為0x2*/

state7: begin

state<=state8;

num_count<=20'd4;

lcd_d<=4'h2;

end

state8: begin

state<=state9;

num_count<=20'd12;

lcd_e<=1'b1;

end

state9: begin

state<=state10;

num_count<=20'd4000;

lcd_e<=1'b0;

end/*傳送功能設(shè)置命令控制字0x28,采用4位數(shù)據(jù)總線DB7~DB4,所以DL(對(duì)應(yīng)數(shù)據(jù)DB4)=0,雙行顯示N(對(duì)應(yīng)數(shù)據(jù)DB3)=1,5×7點(diǎn)陣F(對(duì)應(yīng)數(shù)據(jù)DB2)=0*/

state10:begin

state<=state11;

num_count<=20'd4;

lcd_rs<=0;

lcd_d<=4'h2;

end

state11:begin

state<=state12;

num_count<=20'd12;

lcd_e<=1'b1;

end

state12: begin

state<=state13;

num_count<=20'd80;//兩個(gè)四位數(shù)據(jù)之間的時(shí)間

//間隔大于1μs

lcd_e<=1'b0;

end

state13:begin

state<=state14;

num_count<=20'd4;

lcd_d<=4'h8;

end

state14:begin

state<=state15;

num_count<=20'd12;

lcd_e<=1'b1;

end

state15:begin

state<=state16;

num_count<=20'd4000;

lcd_e<=1'b0;

end/*輸入模式控制字0x06,采用增量模式(地址計(jì)數(shù)器AC自動(dòng)加1),數(shù)據(jù)位DB1(I/D)設(shè)置為1。

顯示不移動(dòng),則DB0(S)設(shè)置為0*/

state16:begin

state<=state17;

num_count<=20'd4;

lcd_d<=4'h0;

end

state17:begin

state<=state18;

num_count<=20'd12;//50

lcd_e<=1'b1;

end

state18:begin

state<=state19;

num_count<=20'd80;

lcd_e<=1'b0;

end

state19:begin

state<=state20;

num_count<=20'd4;

lcd_d<=4'h6;

end

state20:begin

state<=state21;

num_count<=20'd12; //50

lcd_e<=1'b1;

end

state21:begin

state<=state22;

num_count<=20'd4000;

lcd_e<=1'b0;

end

/*輸入打開顯示控制字0x0C,打開顯示,則D(對(duì)應(yīng)DB2)設(shè)置為1,關(guān)光標(biāo)顯示和光標(biāo)不閃爍,則C(對(duì)應(yīng)DB1)和B(對(duì)應(yīng)DB0)均設(shè)置為0*/

state22:begin

state<=state23;

num_count<=20'd4;

lcd_d<=4'h0;

end

state23:begin

state<=state24;

num_count<=20'd12; //50

lcd_e<=1'b1;

end

state24:begin

state<=state25;

num_count<=20'd80;

lcd_e<=1'b0;

end

state25:begin

state<=state26;

num_count<=20'd4;

lcd_d<=4'hc;

end

state26:begin

state<=state27;

num_count<=20'd12; //50

lcd_e<=1'b1;

end

state27:begin

state<=state28;

num_count<=20'd2000;

lcd_e<=1'b0;

end

state28:begin

state<=state29;

num_count<=20'd82000;//完成初始化命令后,等待時(shí)

//間大于等于1.64ms(對(duì)應(yīng)

//82000個(gè)時(shí)鐘脈沖)

end

/*輸入DDRAM地址,其中DB7=1,DB6(A6)~DB0(A0)為DDRAM地址,第一行第一個(gè)字符的存儲(chǔ)地址為0,所以輸入DDRAM地址命令為0x80*/

state29: begin

state<=state30;

num_count<=20'd4;

lcd_rs<=1'b0;

lcd_e<=1'b0;

lcd_d<=4'h8;

end

state30:begin

state<=state31;

num_count<=20'd12;

lcd_e<=1'b1;

end

state31:begin

state<=state32;

num_count<=20'd80;

lcd_e<=1'b0;

end

state32:begin

state<=state33;

num_count<=20'd4;

lcd_d<=4'h0;

end

state33:begin

state<=state34;

num_count<=20'd12;

lcd_e<=1'b1;

end

state34:begin

state<=state35;

num_count<=20'd4000;

lcd_e<=1'b0;

end//傳輸字符"OK!"的字符編碼,其中字符O的編碼為0x4F

state35:begin

state<=state36;

num_count<=20'd4;

lcd_rs<=1'b1;//傳輸數(shù)據(jù)

lcd_d<=4'h4;

end

state36:begin

state<=state37;

num_count<=20'd12;

lcd_e<=1'b1;

end

state37:begin

state<=state38;

num_count<=20'd80;

lcd_e<=1'b0;

end

state38:begin

state<=state39;

num_count<=20'd4;

lcd_d<=4'hf;

end

state39:begin

state<=state40;

num_count<=20'd12;

lcd_e<=1'b1;

end

state40:begin

state<=state41;

num_count<=20'd2000;

lcd_e<=1'b0;

end//字符K的編碼為0x4B

state41:begin

state<=state42;

num_count<=20'd4;

lcd_rs<=1'b1;

lcd_d<=4'h4;

end

state42:begin

state<=state43;

num_count<=20'd12;

lcd_e<=1'b1;

end

state43:begin

state<=state44;

num_count<=20'd80;

lcd_e<=1'b0;

end

state44:begin

state<=state45;

num_count<=20'd4;

lcd_d<=4'hb;

end

state45:begin

state<=state46;

num_count<=20'd12;

lcd_e<=1'b1;

end

state46:begin

state<=state47;

num_count<=20'd2000;

lcd_e<=1'b0;

end

//字符!的編碼為0x21

state47:begin

state<=state48;

num_count<=20'd4;

lcd_rs<=1'b1;

lcd_d<=4'h2;

end

state48:begin

state<=state49;

num_count<=20'd12;

lcd_e<=1'b1;

end

state49:begin

state<=state50;

num_count<=20'd80;

lcd_e<=1'b0;

end

state50:begin

state<=state51;

num_count<=20'd4;

lcd_d<=4'h1;

end

state51:begin

state<=state52;

num_count<=20'd12;

lcd_e<=1'b1;

end

state52:begin

state<=state53;

num_count<=20'd4000;

lcd_e<=1'b0;

end

state53: begin

state<=state29;

num_count<=20'd800;

end

default: begin

state<=state1;

num_count<=20'd800;

end

endcase

endmodule

下面是程序使用到的信號(hào)和對(duì)應(yīng)的管腳以及電平標(biāo)準(zhǔn)等參數(shù)的選擇:

NET"clk"LOC="C9"|IOSTANDARD=LVTTL;

NET"reset"LOC

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論