版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年高職(鋼結(jié)構(gòu)工程技術(shù))鋼結(jié)構(gòu)工程施工試題及答案
- 2025年高職食品營(yíng)養(yǎng)與檢測(cè)(營(yíng)養(yǎng)配餐設(shè)計(jì))試題及答案
- 2025年本科云計(jì)算與大數(shù)據(jù)技術(shù)(云計(jì)算架構(gòu)設(shè)計(jì))試題及答案
- 2025年大學(xué)城市軌道交通工程技術(shù)(城軌工程設(shè)計(jì))試題及答案
- 2025年高職臨床醫(yī)學(xué)基礎(chǔ)(臨床基礎(chǔ)理論)試題及答案
- 內(nèi)墻施工方案八局-中國(guó)建設(shè)銀行濟(jì)南分行濼源大街辦公樓裝修改造項(xiàng)目
- 河北省秦皇島市2025年八年級(jí)上學(xué)期期末考試物理試題附答案
- 近七年北京中考語(yǔ)文試題及答案2025
- 2026年汕頭招商局港口集團(tuán)有限公司招聘?jìng)淇碱}庫(kù)參考答案詳解
- 養(yǎng)老院老人生活設(shè)施定期檢查制度
- 2025年榮昌縣輔警招聘考試真題及答案詳解(網(wǎng)校專用)
- 上海落戶業(yè)務(wù)培訓(xùn)
- 2025年國(guó)家開放大學(xué)(電大)《中國(guó)法律史》期末考試復(fù)習(xí)題庫(kù)及答案解析
- 雨課堂在線學(xué)堂《創(chuàng)業(yè)管理四季歌:藝術(shù)思維與技術(shù)行動(dòng)》單元考核測(cè)試答案
- 2025年水利工程質(zhì)量檢測(cè)員資格考試模擬試題:(巖土工程)復(fù)習(xí)題庫(kù)及答案
- 廣東省深圳市羅湖區(qū)2024-2025學(xué)年六年級(jí)上學(xué)期語(yǔ)文11月期中試卷(含答案)
- 耳聾護(hù)理查房記錄
- 中國(guó)臨床腫瘤學(xué)會(huì)(CSCO)食管癌診療指南2025
- 二保焊培訓(xùn)課件
- 工程變更通知(ECN)流程及管理規(guī)范
- 2025至2030中國(guó)助聽(tīng)器行業(yè)調(diào)研及市場(chǎng)前景預(yù)測(cè)評(píng)估報(bào)告
評(píng)論
0/150
提交評(píng)論