第9章 FPGA在微機(jī)工程中實(shí)踐應(yīng)用課件_第1頁(yè)
第9章 FPGA在微機(jī)工程中實(shí)踐應(yīng)用課件_第2頁(yè)
第9章 FPGA在微機(jī)工程中實(shí)踐應(yīng)用課件_第3頁(yè)
第9章 FPGA在微機(jī)工程中實(shí)踐應(yīng)用課件_第4頁(yè)
第9章 FPGA在微機(jī)工程中實(shí)踐應(yīng)用課件_第5頁(yè)
已閱讀5頁(yè),還剩135頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

9.1鍵盤接口設(shè)計(jì)9.2LED驅(qū)動(dòng)器設(shè)計(jì)9.3D/A接口設(shè)計(jì)9.4

A/D接口設(shè)計(jì)

第9章FPGA在微機(jī)工程中實(shí)踐應(yīng)用

9.1鍵盤接口設(shè)計(jì)第9章FPGA在微機(jī)工程中實(shí)踐應(yīng)用教學(xué)目標(biāo)了解鍵盤接口原理及設(shè)計(jì)方法理解LED驅(qū)動(dòng)器設(shè)計(jì)原理理解和掌握D/A接口設(shè)計(jì)的主要內(nèi)容理解和掌握A/D接口設(shè)計(jì)的主要內(nèi)容教學(xué)目標(biāo)了解鍵盤接口原理及設(shè)計(jì)方法教學(xué)重點(diǎn)理解LED驅(qū)動(dòng)器設(shè)計(jì)理解和掌握D/A接口設(shè)計(jì)的主要內(nèi)容理解和掌握A/D接口設(shè)計(jì)的主要內(nèi)容教學(xué)重點(diǎn)理解LED驅(qū)動(dòng)器設(shè)計(jì)鍵盤工作原理

鍵盤是由一組規(guī)則排列的按鍵組成,一個(gè)按鍵實(shí)際上是一個(gè)開關(guān)元件,它是微型計(jì)算機(jī)最常用的輸入設(shè)備。微機(jī)鍵盤通常使用機(jī)械觸點(diǎn)式按鍵開關(guān),其主要功能是把機(jī)械上的通斷轉(zhuǎn)換為電氣上的邏輯關(guān)系。也就是說,它能提供標(biāo)準(zhǔn)的TTL邏輯電平,以便與通用數(shù)字系統(tǒng)的邏輯電平相容。

9.1鍵盤接口設(shè)計(jì)鍵盤工作原理鍵盤是由一組規(guī)則排列的按鍵組成,一個(gè)按鍵實(shí)際上在觸點(diǎn)抖動(dòng)期間檢測(cè)按鍵的通與斷狀態(tài),可能導(dǎo)致判斷出錯(cuò)。即按鍵一次按下或釋放被錯(cuò)誤地認(rèn)為是多次操作,這種情況是不允許出現(xiàn)的。為了克服按鍵觸點(diǎn)機(jī)械抖動(dòng)所致的檢測(cè)誤判,必須采取去抖動(dòng)措施,可從硬件、軟件兩方面予以考慮。硬件去抖動(dòng)措施:在鍵數(shù)較少時(shí),可采用硬件去抖軟件去抖動(dòng)措施:當(dāng)鍵數(shù)較多時(shí)采用軟件去抖。去抖動(dòng)措施在觸點(diǎn)抖動(dòng)期間檢測(cè)按鍵的通與斷狀態(tài),可能導(dǎo)致判斷出錯(cuò)。即按鍵矩陣式鍵盤的結(jié)構(gòu)及原理

該類型鍵盤由行線和列線組成,按鍵位于行、列線的交叉點(diǎn)上。由圖9-2可知,一個(gè)4×4的行、列結(jié)構(gòu)可以構(gòu)成一個(gè)含有16個(gè)按鍵的鍵盤,但是只占用8個(gè)I/O口線,因此,矩陣式鍵盤較之獨(dú)立式按鍵鍵盤可以節(jié)省很多I/O口。

圖9-2矩陣式鍵盤的結(jié)構(gòu)及原理該類型鍵盤由行線和列線組成,按鍵位于矩陣式鍵盤按鍵的識(shí)別

識(shí)別按鍵的方法很多,其中,最常見的方法是掃描法。以下是以8號(hào)鍵的識(shí)別為例來介紹掃描法:8號(hào)鍵按下時(shí),第2行一定為低電平,然而,第2行為低電平時(shí),能否肯定是8號(hào)鍵按下呢?回答是否定的,因?yàn)?、10、11號(hào)鍵按下同樣使第2行為低電平。

接下頁(yè)矩陣式鍵盤按鍵的識(shí)別識(shí)別按鍵的方法很多,其中,最常見的方法為進(jìn)一步確定具體鍵,不能使所有列線在同一時(shí)刻都處在低電平,可在某一時(shí)刻只讓一條列線處于低電平,其余列線均處于高電平,另一時(shí)刻,讓下一列處在低電平,依此循環(huán),這種依次輪流每次選通一列的工作方式稱為鍵盤掃描。采用鍵盤掃描后,再來觀察8號(hào)鍵按下時(shí)的工作過程,當(dāng)?shù)?列處于低電平時(shí),第2行處于低電平,而第1、2、3列處于低電平時(shí),第2行卻處在高電平,由此可判定按下的鍵應(yīng)是第2行與第0列的交叉點(diǎn),即8號(hào)鍵。為進(jìn)一步確定具體鍵,不能使所有列線在同一時(shí)刻都處在低電平,可對(duì)于矩陣式鍵盤,按鍵的位置由行號(hào)和列號(hào)唯一確定,因此可分別對(duì)行號(hào)和列號(hào)進(jìn)行二進(jìn)制編碼,然后將兩值合成一個(gè)字節(jié),高4位是行號(hào),低4位是列號(hào)。如圖9.2中的8號(hào)鍵,它位于第2行,第0列,因此,其鍵盤編碼應(yīng)為20H。采用上述編碼對(duì)于不同行的鍵離散性較大,不利于散轉(zhuǎn)指令對(duì)按鍵進(jìn)行處理。因此,可采用依次排列鍵號(hào)的方式對(duì)安排進(jìn)行編碼。以圖9-2中的4×4鍵盤為例,可將鍵號(hào)編碼為:01H、02H、03H…0EH、0FH、10H等16個(gè)鍵號(hào)。編碼相互轉(zhuǎn)換可通過計(jì)算或查表的方法實(shí)現(xiàn)。鍵盤的編碼對(duì)于矩陣式鍵盤,按鍵的位置由行號(hào)和列號(hào)唯一確定,因此可分別對(duì)矩陣式按鍵FPGA描述

鍵盤接口頂層模塊矩陣式按鍵FPGA描述鍵盤接口頂層模塊libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entitykeyisPort(clk:instd_logic;keyin:instd_logic_vector(3downto0);keyvalue:outstd_logic_vector(3downto0);keypressed:outstd_logic;keydrv:inoutstd_logic_vector(3downto0));endkey;architectureBehavioralofkeyis接下頁(yè)libraryIEEE;接下頁(yè)componentkeyscan port(clk_scan:instd_logic; --掃描時(shí)鐘key_drv:outstd_logic_vector(3downto0)--掃描信號(hào));endcomponent; componentclkgen port( clk:instd_logic;clk_scan:outstd_logic);endcomponent;

接下頁(yè)componentkeyscan接下頁(yè)componentkeydecoderport(key_in:instd_logic_vector(3downto0);--鍵盤輸入key_drv:instd_logic_vector(3downto0);--鍵盤輸出clk:instd_logic;--全局時(shí)鐘clk_scan:instd_logic;--掃描時(shí)鐘keyvalue:outstd_logic_vector(3downto0);--鍵盤的鍵值key_pressed:outstd_logic);endcomponent;signalclk_scan:std_logic; begin接下頁(yè)componentkeydecoder接下頁(yè)keyscan1:keyscan portmap(clk_scan=>clk_scan, key_drv=>keydrv);clkgen1:clkgen portmap( clk=>clk, clk_scan=>clk_scan);keydecoder1:keydecoder portmap( key_in=>keyin,接下頁(yè)keyscan1:keyscan接下頁(yè) key_drv=>keydrv, clk=>clk, clk_scan=>clk_scan, keyvalue=>keyvalue, key_pressed=>keypressed);endBehavioral; key_drv=>keydrv,鍵盤掃描電路模塊

接下頁(yè)鍵盤掃描電路模塊接下頁(yè)libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entitykeyscanisPort(clk_scan:instd_logic; --掃描時(shí)鐘key_drv:outstd_logic_vector(3downto0));endkeyscan;architectureBehavioralofkeyscanisconstants0:STD_LOGIC_VECTOR(3DOWNTO0):="1110";constants1:STD_LOGIC_VECTOR(3DOWNTO0):="1101";constants2:STD_LOGIC_VECTOR(3DOWNTO0):="1011";接下頁(yè)libraryIEEE;接下頁(yè)constants3:STD_LOGIC_VECTOR(3DOWNTO0):="0111";signalpresent_state:STD_LOGIC_VECTOR(3DOWNTO0);--當(dāng)前狀態(tài)機(jī)signalnext_state:STD_LOGIC_VECTOR(3DOWNTO0);--下次狀態(tài)機(jī)begin process(clk_scan) begin if(clk_scan'eventandclk_scan='1')then present_state<=next_state;--狀態(tài)機(jī)在上升沿時(shí)翻轉(zhuǎn)endif;endprocess;接下頁(yè)接下頁(yè)process(present_state) begin casepresent_stateis whens0=>next_state<=s1; whens1=>next_state<=s2; whens2=>next_state<=s3; whens3=>next_state<=s0; whenothers=>next_state<=s0; endcase; endprocess; key_drv<=present_state; --輸出譯碼信號(hào)endBehavioral;process(present_state)鍵盤譯碼電路模塊接下頁(yè)鍵盤譯碼電路模塊接下頁(yè)libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entitykeydecoderisPort(key_in:instd_logic_vector(3downto0);--鍵盤輸入key_drv:instd_logic_vector(3downto0);--鍵盤輸出clk:instd_logic;--全局時(shí)鐘clk_scan:instd_logic;--掃描時(shí)鐘keyvalue:outstd_logic_vector(3downto0)--鍵盤的鍵值);接下頁(yè)libraryIEEE;接下頁(yè)key_pressed:outstd_logic);--有鍵盤按下去的標(biāo)志endkeydecoder;architectureBehavioralofkeydecoderissignaltemp:STD_LOGIC_VECTOR(7DOWNTO0);--鍵盤的輸入信號(hào)signaltemp_preseed:STD_LOGIC;--鍵盤按下標(biāo)志位signaltemp1,temp2,temp3,temp4,temp5,temp6:STD_LOGIC;--同步化信號(hào)signalkey_pressed_asy:STD_LOGIC;begin temp<=key_drv&key_in; process(temp) begin接下頁(yè)key_pressed:outstd_logic);-casetempiswhen"11101110"=>keyvalue<=CONV_STD_LOGIC_VECTOR(1,4); temp_preseed<='1';when"11101101"=>keyvalue<=CONV_STD_LOGIC_VECTOR(2,4); temp_preseed<='1';when"11101011"=>keyvalue<=CONV_STD_LOGIC_VECTOR(3,4); temp_preseed<='1';when"11100111"=>keyvalue<=CONV_STD_LOGIC_VECTOR(4,4);temp_preseed<='1';when"11011110"=>keyvalue<=CONV_STD_LOGIC_VECTOR(5,4);temp_preseed<='1';when"11011101"=>keyvalue<=CONV_STD_LOGIC_VECTOR(6,4);temp_preseed<='1';when"11011011"=>keyvalue<=CONV_STD_LOGIC_VECTOR(7,4);temp_preseed<='1';接下頁(yè)casetempis接下頁(yè)when"11010111"=>keyvalue<=CONV_STD_LOGIC_VECTOR(8,4);temp_preseed<='1';when"10111110"=>keyvalue<=CONV_STD_LOGIC_VECTOR(9,4); temp_preseed<='1';when"10111101"=>keyvalue<=CONV_STD_LOGIC_VECTOR(10,4); temp_preseed<='1';when"10111011"=>keyvalue<=CONV_STD_LOGIC_VECTOR(11,4); temp_preseed<='1';when"10110111"=>keyvalue<=CONV_STD_LOGIC_VECTOR(12,4); temp_preseed<='1';when"01111110"=>keyvalue<=CONV_STD_LOGIC_VECTOR(13,4); temp_preseed<='1';when"01111101"=>keyvalue<=CONV_STD_LOGIC_VECTOR(14,4);temp_preseed<='1';接下頁(yè)when"11010111"=>keyvalue<=CONwhen"01111011"=>keyvalue<=CONV_STD_LOGIC_VECTOR(15,4); temp_preseed<='1';when"01110111"=>keyvalue<=CONV_STD_LOGIC_VECTOR(16,4); temp_preseed<='1';whenothers=>temp_preseed<='0';endcase;endprocess;接下頁(yè)when"01111011"=>keyvalue<=CONprocess(clk_scan)begin if(clk_scan'eventandclk_scan='1')then temp1<=temp_preseed; temp2<=temp1; temp3<=temp2; temp4<=temp3;endif; key_pressed_asy<=temp1ORtemp2ORtemp3ORtemp4;endprocess;接下頁(yè)process(clk_scan)接下頁(yè)process(clk) begin if(clk'eventandclk='1')then temp5<=key_pressed_asy; temp6<=temp5; endif; key_pressed<=temp5AND(NOT(temp6)); endprocess;endBehavioral;process(clk)時(shí)鐘電路產(chǎn)生模塊

接下頁(yè)時(shí)鐘電路產(chǎn)生模塊接下頁(yè)libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entityclkgenisPort(clk:instd_logic;clk_scan:outstd_logic);endclkgen;architectureBehavioralofclkgenis接下頁(yè)libraryIEEE;接下頁(yè)signalcnt:INTEGERrange0to199;beginprocess(clk)begin if(clk'eventandclk='1')then if(cnt=199)then cnt<=0; else cnt<=cnt+1; endif; endif;endprocess;接下頁(yè)signalcnt:INTEGERrange0toprocess(cnt,clk)begin if(clk'eventandclk='1')then if(cnt>=199/2)then clk_scan<='1'; else clk_scan<='0'; endif; endif;endprocess;endBehavioral;process(cnt,clk)9.2LED驅(qū)動(dòng)器設(shè)計(jì)9.2LED驅(qū)動(dòng)器設(shè)計(jì)LED數(shù)碼管的工作原理LED數(shù)碼管用8段發(fā)光二極管來顯示數(shù)字,每一段都是一個(gè)發(fā)光二極管。一般把所有段的相同一端相連,連接到地(共陰極接法)或者是連接到電源(共陽(yáng)極接法)。

LED數(shù)碼管的工作原理LED數(shù)碼管用8段發(fā)光二極管來顯示數(shù)字FPGA實(shí)現(xiàn)LED靜態(tài)顯示控制運(yùn)用硬件描述語(yǔ)言(如VHDL)設(shè)計(jì)一個(gè)顯示譯碼驅(qū)動(dòng)器,即將要顯示的字符譯成8段碼。由于FPGA有相當(dāng)多的引腳端資源,如果顯示的位數(shù)N較少,可以直接使用靜態(tài)顯示方式,即將每一個(gè)數(shù)碼管都分別連接到不同的8個(gè)引腳線上,共需要8×N條引腳線控制,如左圖所示。FPGA實(shí)現(xiàn)LED靜態(tài)顯示控制運(yùn)用硬件描述語(yǔ)言(如VHDL)采用FPGA實(shí)現(xiàn)LED數(shù)碼管動(dòng)態(tài)顯示控制N個(gè)LED數(shù)碼管以靜態(tài)方式顯示時(shí),需用到8×N條引腳線。在較為復(fù)雜的系統(tǒng)中,F(xiàn)PGA的引腳端資源是有限的。因此對(duì)于多個(gè)LED數(shù)碼管顯示,可以采用掃描方式來實(shí)現(xiàn)LED數(shù)碼管動(dòng)態(tài)顯示。實(shí)現(xiàn)方法是依次點(diǎn)亮各個(gè)LED數(shù)碼管,循環(huán)進(jìn)行顯示,即一個(gè)數(shù)碼管顯示之后另一個(gè)數(shù)碼管馬上顯示,利用人眼的視覺暫留特性,可以到多個(gè)數(shù)碼管同時(shí)顯示的效果。采用掃描方式來實(shí)現(xiàn)LED數(shù)碼管動(dòng)態(tài)顯示,控制好數(shù)碼管之間的延時(shí)是相當(dāng)重要。接下頁(yè)采用FPGA實(shí)現(xiàn)LED數(shù)碼管動(dòng)態(tài)顯示控制N個(gè)LED數(shù)碼管以靜根據(jù)人眼視覺暫留原理,LED數(shù)碼管每秒的導(dǎo)通16次以上,人眼就無(wú)法分辨LED數(shù)碼管短暫的不亮,認(rèn)為是一直點(diǎn)亮的(其實(shí)LED數(shù)碼管是以一定頻率在閃動(dòng)的)。但是,延時(shí)(導(dǎo)通頻率)也不是越小越好,因?yàn)長(zhǎng)ED數(shù)碼管達(dá)到一定亮度需要一定時(shí)間。如果延時(shí)控制的不好則會(huì)出現(xiàn)閃動(dòng),或者亮度不夠。據(jù)經(jīng)驗(yàn),延時(shí)0.005秒可以達(dá)到滿意的效果。接下頁(yè)根據(jù)人眼視覺暫留原理,LED數(shù)碼管每秒的導(dǎo)通16次以上,人眼修改延時(shí),亦能得到更多的顯示效果,如加長(zhǎng)延時(shí),使得數(shù)碼管顯示一小段時(shí)間,再點(diǎn)亮下一個(gè),即可得到數(shù)碼管逐個(gè)顯示的效果。另外,顯示的字符有變化時(shí),可在延時(shí)到達(dá)后送一個(gè)低電平(共陰極數(shù)碼管)讓LED數(shù)碼管先短暫熄滅,再顯示下一個(gè)字符,可使在視覺上字符的變化更清晰。

修改延時(shí),亦能得到更多的顯示效果,如加長(zhǎng)延時(shí),使得數(shù)碼管顯示FPGA實(shí)現(xiàn)LED動(dòng)態(tài)方式顯示的控制電路FPGA實(shí)現(xiàn)LED動(dòng)態(tài)方式顯示的控制電路FPGA驅(qū)動(dòng)LED靜態(tài)顯示程序(1)libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entitydecoderisPort(seg:instd_logic_vector(3downto0);--四位二進(jìn)制碼輸入q3:outstd_logic_vector(6downto0));--輸出LED七段碼enddecoder;architectureBehavioralofdecoderisbeginprocess(seg)begin接下頁(yè)FPGA驅(qū)動(dòng)LED靜態(tài)顯示程序(1)libraryIEEEFPGA驅(qū)動(dòng)LED靜態(tài)顯示程序(2)casesegiswhen"0000"=>q3<="0000001";--0when"0001"=>q3<="1001111";--1when"0010"=>q3<="0010010";--2when"0011"=>q3<="0000110";--3when"0100"=>q3<="1001100"--4when"0101"=>q3<="0100100";--5when"0110"=>q3<="0100000";--6when"0111"=>q3<="0001111";--7when"1000"=>q3<="0000000";--8when"1001"=>q3<="0000100";--9whenothers=>q3<="1111111";endcase;endprocess;endBehavioral;FPGA驅(qū)動(dòng)LED靜態(tài)顯示程序(2)casesegisFPGA驅(qū)動(dòng)LED動(dòng)態(tài)顯示(4位電子表)libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entityclockisPort(seg:outstd_logic_vector(7downto0); a:outstd_logic_vector(3downto0); en:outstd_logic; clk:instd_logic);endclock;接下頁(yè)FPGA驅(qū)動(dòng)LED動(dòng)態(tài)顯示(4位電子表)libraryIEarchitectureBehavioralofclockissignaldivcounter:std_logic_vector(27downto0);signaldivclk:std_logic;signalsec_counter1:std_logic_vector(3downto0);signalsec_counter2:std_logic_vector(3downto0);signalmin_counter1:std_logic_vector(3downto0);signalmin_counter2:std_logic_vector(3downto0);signalscan :std_logic_vector(18downto0);signalscan_clk:std_logic_vector(1downto0);signalSecSeg1,MinSeg1,SecSeg2,MinSeg2:std_logic_vector(7downto0);接下頁(yè)architectureBehavioralofclobegin process(clk) begin if(clk'eventandclk='1')then if(divcounter>=X"17D783F")then divcounter<=X"0000000"; divclk<=notdivclk; else divcounter<=divcounter+'1'; endif; endif; endprocess;接下頁(yè)begin接下頁(yè)begin if(divclk'eventanddivclk='1')then if(sec_counter1>=X“9”)then sec_counter1<=X"0"; if(sec_counter2>=X"5")then sec_counter2<=X"0"; if(min_counter1>=X"9")then min_counter1<=X"0"; if(min_counter2>X"5")then min_counter2<=X"0"; elsein_counter2<=min_counter2+'1'; endif; elsemin_counter1<=min_counter1+'1'; endif; 接下頁(yè)begin接下頁(yè)else sec_counter2<=sec_counter2+'1'; endif; elsesec_counter1<=sec_counter1+'1'; endif; endif; endprocess; process(clk) begin if(clk'eventandclk='1')then scan<=scan+1; endif; endprocess; scan_clk<=scan(18downto17);接下頁(yè)else sec process(scan_clk) begin casescan_clkis when“00”=>seg<=SecSeg1;a<="0001"; when“01”=>seg<=SecSeg2;a<="0010"; when“10”=>seg<=MinSeg1;a<="0100"; when“11”=>seg<=MinSeg2;a<="1000"; whenothers=>seg<="11111111";a<="0000"; endcase; endprocess;接下頁(yè) process(scan_clk)接下頁(yè)process(sec_counter1)begincasesec_counter1iswhen"0000"=>SecSeg1<="00010001";--0when"0001"=>SecSeg1<="11010111";--1when"0010"=>SecSeg1<="00110010";--2when"0011"=>SecSeg1<="10010010";--3when"0100"=>SecSeg1<="11010100";--4when"0101"=>SecSeg1<="10011000";--5when"0110"=>SecSeg1<="00011000";--6when"0111"=>SecSeg1<="11010011";--7when"1000"=>SecSeg1<="00010000";--8when"1001"=>SecSeg1<="10010000";--9whenothers=>SecSeg1<="11111111";endcase;endprocess;接下頁(yè)process(sec_counter1)接下頁(yè) process(sec_counter2) begin casesec_counter2is when"0000"=>SecSeg2<="00010001";--0 when"0001"=>SecSeg2<="11010111";--1 when"0010"=>SecSeg2<="00110010";--2 when"0011"=>SecSeg2<="10010010";--3 when"0100"=>SecSeg2<="11010100";--4 when"0101"=>SecSeg2<="10011000";--5 whenothers=>SecSeg2<="11111111"; endcase; endprocess;接下頁(yè) process(sec_counter2)接下頁(yè)process(min_counter1) begin casemin_counter1is when"0000"=>MinSeg1(7downto0)<="00010001";--0 when"0001"=>MinSeg1(7downto0)<="11010111";--1 when"0010"=>MinSeg1(7downto0)<="00110010";--2when"0011"=>MinSeg1(7downto0)<="10000010";--3 when"0100"=>MinSeg1(7downto0)<="11000100";--4 when"0101"=>MinSeg1(7downto0)<="10001000";--5 when"0110"=>MinSeg1(7downto0)<="00001000";--6 when"0111"=>MinSeg1(7downto0)<="11000011";--7 when"1000"=>MinSeg1(7downto0)<="00000000";--8 when"1001"=>MinSeg1(7downto0)<="10000000";--9 whenothers=>MinSeg1(7downto0)<="11111111";endcase;endprocess;接下頁(yè)process(min_counter1)接下頁(yè)process(min_counter2) begin casemin_counter2is when"0000"=>MinSeg2<="00010001";--0 when"0001"=>MinSeg2<="11010111";--1 when"0010"=>MinSeg2<="00110010";--2 when"0011"=>MinSeg2<="10010010";--3 when"0100"=>MinSeg2<="11010100";--4 when"0101"=>MinSeg2<="10011000";--5 whenothers=>MinSeg2<="11111111"; endcase;endprocess; en<='0';endBehavioral;process(min_counter2)D/A轉(zhuǎn)換器概述D/A轉(zhuǎn)換器輸入的是數(shù)字量,經(jīng)轉(zhuǎn)換后輸出的是模擬量。有關(guān)D/A轉(zhuǎn)換器的技術(shù)性能指標(biāo)很多,例如分辯率、建立時(shí)間、接口形式、偏移量誤差以及線性度等等。D/A轉(zhuǎn)換器有2大類:一類是在電子線路中使用,不帶使能控制端口和控制端口,只有數(shù)字量輸入和模擬量輸出;另外一類帶有使能控制端口,可以與微機(jī)直接連接。在本書電路板中采用后者中的DAC0832,以實(shí)現(xiàn)數(shù)字信號(hào)到模擬信號(hào)的轉(zhuǎn)換,下面將重點(diǎn)介紹該芯片的結(jié)構(gòu)及使用。9.3D/A接口設(shè)計(jì)D/A轉(zhuǎn)換器概述9.3D/A接口設(shè)計(jì)DAC0832

轉(zhuǎn)換精度:8位;單電源供電:+5V~+15V;基準(zhǔn)電壓:±10V;電流建立時(shí)間:1μS;工藝:CMOS;低功耗:20mW;封裝:20引腳,DIPDAC0832轉(zhuǎn)換精度:8位;FPGA與DAC0832接口電路原理圖

FPGA與DAC0832接口電路原理圖FPGA與DAC0832接口電路設(shè)計(jì)P1_3~10向DAC0832的數(shù)據(jù)輸入口(DI0~DI7)輸送數(shù)據(jù)。P1_2提供DAC0832數(shù)據(jù)鎖存允許控制信號(hào)ILE,高電平有效。P1_1提供DAC0832控制信號(hào)(CS:片選信號(hào);),低電平有效。Iout1、Iout2、Rfb與運(yùn)算放大器LM324完成電流/電壓的轉(zhuǎn)換

FPGA與DAC0832接口電路設(shè)計(jì)P1_3~10向DAC0DAC0832輸出控制時(shí)序圖

DAC0832輸出控制時(shí)序圖DAC0832時(shí)序

根據(jù)DAC0832輸出控制時(shí)序,利用接口電路圖,通過改變輸出數(shù)據(jù)設(shè)計(jì)一個(gè)鋸齒波發(fā)生器。DAC0832是8位的D/A轉(zhuǎn)換器,轉(zhuǎn)換周期為1μs。鋸齒波形數(shù)據(jù)可以由256個(gè)點(diǎn)構(gòu)成,每個(gè)點(diǎn)的數(shù)據(jù)長(zhǎng)度為8位。又因?yàn)镕PGA的系統(tǒng)時(shí)鐘為50MHz,必須對(duì)其進(jìn)行分頻處理,這里進(jìn)行64分頻,得到的鋸齒波的頻率為762.9Hz。DAC0832時(shí)序根據(jù)DAC0832輸出控制時(shí)序,利用DAC0832接口電路程序

libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;useieee.std_logic_arith.all;entityDAC0832isport(clk:instd_logic;--系統(tǒng)時(shí)鐘rst:instd_logic;--復(fù)位信號(hào)ile:outstd_logic;--數(shù)據(jù)鎖存允許信號(hào)cont:outstd_logic;--控制信號(hào)data_out:outstd_logic_vector(7downto0));--波形數(shù)據(jù)輸出endDAC0832;接下頁(yè)DAC0832接口電路程序libraryieee;接下architecturebehavofDAC0832issignalq:integerrange0to63;--計(jì)數(shù)器signaldata:std_logic_vector(7downto0);--波形數(shù)據(jù)Beginprocess(clk)beginifrst='1'thenq<=0;--復(fù)位,對(duì)計(jì)數(shù)器q清零elsifclk'eventandclk='1'thenifq=63thenq<=0;--此IF語(yǔ)句對(duì)系統(tǒng)時(shí)鐘進(jìn)行64分頻接下頁(yè)architecturebehavofDAC0832ifdata="11111111"thendata<="00000000";elsedata<=data+1;endif;elseq<=q+1;endif;endif;endprocess;ile<='1';cont<='0';data_out<=data;--ile、cont賦值;波形數(shù)據(jù)輸出;endbehav;ifdata="11111111"thendata<=A/D轉(zhuǎn)換器概述A/D轉(zhuǎn)換器是一種能把輸入模擬電壓或者電流變換為與之成正比的數(shù)字量,既把被控制的對(duì)象的各種模擬信息轉(zhuǎn)換為計(jì)算機(jī)可以識(shí)別的數(shù)字量。根據(jù)轉(zhuǎn)換原理可分為四種,即:計(jì)數(shù)式A/D轉(zhuǎn)換器、雙積分式A/D轉(zhuǎn)換器、逐次逼近式A/D轉(zhuǎn)換器和并行式A/D轉(zhuǎn)換器。9.4A/D接口設(shè)計(jì)

A/D轉(zhuǎn)換器概述9.4A/D接ADC0809介紹封裝:28引腳,DIP;IN7~0:模擬量輸入通道ADDA/B/C:地址線ALE:地址鎖存信號(hào)START:轉(zhuǎn)換啟動(dòng)信號(hào)D7~0:數(shù)據(jù)輸出線

ADC0809介紹封裝:28引腳,DIP;CBA選擇通道000IN0001IN1010IN2011IN3100IN4101IN5110IN6111IN7選擇通道定義CBA選擇通道000IN0001IN1010IN2第9章FPGA在微機(jī)工程中實(shí)踐應(yīng)用課件

ADC0809與FPGA連接引腳圖

ADC0809與FPGA連接引腳圖ADC0809采樣接口電路程序

libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;useieee.std_logic_arith.all;entityADC0809isport(d:instd_logic_vector(7downto0);--ADC0809輸出數(shù)據(jù)clk,eoc:instd_logic;--clk為系統(tǒng)時(shí)鐘,eoc為轉(zhuǎn)換結(jié)束信號(hào)clk1,start,ale,en:outstd_logic;--ADC0809控制信號(hào)abc_in:instd_logic_vector(2downto0);--模擬選通信號(hào)abc_out:outstd_logic_vector(2downto0);--ADC0809模擬信號(hào)選通信號(hào)q:outstd_logic_vector(7downto0));--送至8個(gè)并排數(shù)碼管信號(hào)endADC0809;接下頁(yè)ADC0809采樣接口電路程序libraryieee;接architecturebehavofADC0809istypestatesis(st0,st1,st2,st3,st4,st5,st6);--定義各狀態(tài)的子類型signalcurrent_state,next_state:states:=st0;signalregl:std_logic_vector(7downto0);--中間數(shù)據(jù)寄存信號(hào)signalqq:std_logic_vector(7downto0);begincom:process(current_state,eoc)--規(guī)定各種狀態(tài)的轉(zhuǎn)換方式接下頁(yè)architecturebehavofADC0809begincasecurrent_stateiswhenst0=>next_state<=st1;ale<='0';start<='0';en<='0';whenst1=>next_state<=st2;ale<='1';start<='0';en<='0';whenst2=>next_state<=st3;ale<='0';start<='1';en<='0';whenst3=>ale<='0';start<='0';en<='0';ifeoc='1'thennext_state<=st3;接下頁(yè)begin接下頁(yè)elsenext_state<=st4;endif;whenst4=>ale<='0';start<='0';en<='0';ifeoc='0'thennext_state<=st4;--檢測(cè)EOC的上升沿elsenext_state<=st5;接下頁(yè)elsenext_state<=st4;接endif;whenst5=>next_state<=st6;ale<='0';start<='0';en<='1';whenst6=>next_state<=st0;ale<='0';start<='0';en<='1';regl<=d;whenothers=>next_state<=st0;ale<='0';start<='0';en<='0';endcase;endprocess;clock:process(clk)begin接下頁(yè)endif;接下頁(yè)ifclk'eventandclk='1'thenqq<=qq+1;--在clk1的上升沿,轉(zhuǎn)換至下一狀態(tài)ifQQ="01111111"THENclk1<='1';current_state<=next_state;elsifqq<="01111111"thenclk1<='0'; endif;endif;endprocess;q<=regl;abc_out<=abc_in;endbehav;

ifclk'eventandclk='1'then9.1鍵盤接口設(shè)計(jì)9.2LED驅(qū)動(dòng)器設(shè)計(jì)9.3D/A接口設(shè)計(jì)9.4

A/D接口設(shè)計(jì)

第9章FPGA在微機(jī)工程中實(shí)踐應(yīng)用

9.1鍵盤接口設(shè)計(jì)第9章FPGA在微機(jī)工程中實(shí)踐應(yīng)用教學(xué)目標(biāo)了解鍵盤接口原理及設(shè)計(jì)方法理解LED驅(qū)動(dòng)器設(shè)計(jì)原理理解和掌握D/A接口設(shè)計(jì)的主要內(nèi)容理解和掌握A/D接口設(shè)計(jì)的主要內(nèi)容教學(xué)目標(biāo)了解鍵盤接口原理及設(shè)計(jì)方法教學(xué)重點(diǎn)理解LED驅(qū)動(dòng)器設(shè)計(jì)理解和掌握D/A接口設(shè)計(jì)的主要內(nèi)容理解和掌握A/D接口設(shè)計(jì)的主要內(nèi)容教學(xué)重點(diǎn)理解LED驅(qū)動(dòng)器設(shè)計(jì)鍵盤工作原理

鍵盤是由一組規(guī)則排列的按鍵組成,一個(gè)按鍵實(shí)際上是一個(gè)開關(guān)元件,它是微型計(jì)算機(jī)最常用的輸入設(shè)備。微機(jī)鍵盤通常使用機(jī)械觸點(diǎn)式按鍵開關(guān),其主要功能是把機(jī)械上的通斷轉(zhuǎn)換為電氣上的邏輯關(guān)系。也就是說,它能提供標(biāo)準(zhǔn)的TTL邏輯電平,以便與通用數(shù)字系統(tǒng)的邏輯電平相容。

9.1鍵盤接口設(shè)計(jì)鍵盤工作原理鍵盤是由一組規(guī)則排列的按鍵組成,一個(gè)按鍵實(shí)際上在觸點(diǎn)抖動(dòng)期間檢測(cè)按鍵的通與斷狀態(tài),可能導(dǎo)致判斷出錯(cuò)。即按鍵一次按下或釋放被錯(cuò)誤地認(rèn)為是多次操作,這種情況是不允許出現(xiàn)的。為了克服按鍵觸點(diǎn)機(jī)械抖動(dòng)所致的檢測(cè)誤判,必須采取去抖動(dòng)措施,可從硬件、軟件兩方面予以考慮。硬件去抖動(dòng)措施:在鍵數(shù)較少時(shí),可采用硬件去抖軟件去抖動(dòng)措施:當(dāng)鍵數(shù)較多時(shí)采用軟件去抖。去抖動(dòng)措施在觸點(diǎn)抖動(dòng)期間檢測(cè)按鍵的通與斷狀態(tài),可能導(dǎo)致判斷出錯(cuò)。即按鍵矩陣式鍵盤的結(jié)構(gòu)及原理

該類型鍵盤由行線和列線組成,按鍵位于行、列線的交叉點(diǎn)上。由圖9-2可知,一個(gè)4×4的行、列結(jié)構(gòu)可以構(gòu)成一個(gè)含有16個(gè)按鍵的鍵盤,但是只占用8個(gè)I/O口線,因此,矩陣式鍵盤較之獨(dú)立式按鍵鍵盤可以節(jié)省很多I/O口。

圖9-2矩陣式鍵盤的結(jié)構(gòu)及原理該類型鍵盤由行線和列線組成,按鍵位于矩陣式鍵盤按鍵的識(shí)別

識(shí)別按鍵的方法很多,其中,最常見的方法是掃描法。以下是以8號(hào)鍵的識(shí)別為例來介紹掃描法:8號(hào)鍵按下時(shí),第2行一定為低電平,然而,第2行為低電平時(shí),能否肯定是8號(hào)鍵按下呢?回答是否定的,因?yàn)?、10、11號(hào)鍵按下同樣使第2行為低電平。

接下頁(yè)矩陣式鍵盤按鍵的識(shí)別識(shí)別按鍵的方法很多,其中,最常見的方法為進(jìn)一步確定具體鍵,不能使所有列線在同一時(shí)刻都處在低電平,可在某一時(shí)刻只讓一條列線處于低電平,其余列線均處于高電平,另一時(shí)刻,讓下一列處在低電平,依此循環(huán),這種依次輪流每次選通一列的工作方式稱為鍵盤掃描。采用鍵盤掃描后,再來觀察8號(hào)鍵按下時(shí)的工作過程,當(dāng)?shù)?列處于低電平時(shí),第2行處于低電平,而第1、2、3列處于低電平時(shí),第2行卻處在高電平,由此可判定按下的鍵應(yīng)是第2行與第0列的交叉點(diǎn),即8號(hào)鍵。為進(jìn)一步確定具體鍵,不能使所有列線在同一時(shí)刻都處在低電平,可對(duì)于矩陣式鍵盤,按鍵的位置由行號(hào)和列號(hào)唯一確定,因此可分別對(duì)行號(hào)和列號(hào)進(jìn)行二進(jìn)制編碼,然后將兩值合成一個(gè)字節(jié),高4位是行號(hào),低4位是列號(hào)。如圖9.2中的8號(hào)鍵,它位于第2行,第0列,因此,其鍵盤編碼應(yīng)為20H。采用上述編碼對(duì)于不同行的鍵離散性較大,不利于散轉(zhuǎn)指令對(duì)按鍵進(jìn)行處理。因此,可采用依次排列鍵號(hào)的方式對(duì)安排進(jìn)行編碼。以圖9-2中的4×4鍵盤為例,可將鍵號(hào)編碼為:01H、02H、03H…0EH、0FH、10H等16個(gè)鍵號(hào)。編碼相互轉(zhuǎn)換可通過計(jì)算或查表的方法實(shí)現(xiàn)。鍵盤的編碼對(duì)于矩陣式鍵盤,按鍵的位置由行號(hào)和列號(hào)唯一確定,因此可分別對(duì)矩陣式按鍵FPGA描述

鍵盤接口頂層模塊矩陣式按鍵FPGA描述鍵盤接口頂層模塊libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entitykeyisPort(clk:instd_logic;keyin:instd_logic_vector(3downto0);keyvalue:outstd_logic_vector(3downto0);keypressed:outstd_logic;keydrv:inoutstd_logic_vector(3downto0));endkey;architectureBehavioralofkeyis接下頁(yè)libraryIEEE;接下頁(yè)componentkeyscan port(clk_scan:instd_logic; --掃描時(shí)鐘key_drv:outstd_logic_vector(3downto0)--掃描信號(hào));endcomponent; componentclkgen port( clk:instd_logic;clk_scan:outstd_logic);endcomponent;

接下頁(yè)componentkeyscan接下頁(yè)componentkeydecoderport(key_in:instd_logic_vector(3downto0);--鍵盤輸入key_drv:instd_logic_vector(3downto0);--鍵盤輸出clk:instd_logic;--全局時(shí)鐘clk_scan:instd_logic;--掃描時(shí)鐘keyvalue:outstd_logic_vector(3downto0);--鍵盤的鍵值key_pressed:outstd_logic);endcomponent;signalclk_scan:std_logic; begin接下頁(yè)componentkeydecoder接下頁(yè)keyscan1:keyscan portmap(clk_scan=>clk_scan, key_drv=>keydrv);clkgen1:clkgen portmap( clk=>clk, clk_scan=>clk_scan);keydecoder1:keydecoder portmap( key_in=>keyin,接下頁(yè)keyscan1:keyscan接下頁(yè) key_drv=>keydrv, clk=>clk, clk_scan=>clk_scan, keyvalue=>keyvalue, key_pressed=>keypressed);endBehavioral; key_drv=>keydrv,鍵盤掃描電路模塊

接下頁(yè)鍵盤掃描電路模塊接下頁(yè)libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entitykeyscanisPort(clk_scan:instd_logic; --掃描時(shí)鐘key_drv:outstd_logic_vector(3downto0));endkeyscan;architectureBehavioralofkeyscanisconstants0:STD_LOGIC_VECTOR(3DOWNTO0):="1110";constants1:STD_LOGIC_VECTOR(3DOWNTO0):="1101";constants2:STD_LOGIC_VECTOR(3DOWNTO0):="1011";接下頁(yè)libraryIEEE;接下頁(yè)constants3:STD_LOGIC_VECTOR(3DOWNTO0):="0111";signalpresent_state:STD_LOGIC_VECTOR(3DOWNTO0);--當(dāng)前狀態(tài)機(jī)signalnext_state:STD_LOGIC_VECTOR(3DOWNTO0);--下次狀態(tài)機(jī)begin process(clk_scan) begin if(clk_scan'eventandclk_scan='1')then present_state<=next_state;--狀態(tài)機(jī)在上升沿時(shí)翻轉(zhuǎn)endif;endprocess;接下頁(yè)接下頁(yè)process(present_state) begin casepresent_stateis whens0=>next_state<=s1; whens1=>next_state<=s2; whens2=>next_state<=s3; whens3=>next_state<=s0; whenothers=>next_state<=s0; endcase; endprocess; key_drv<=present_state; --輸出譯碼信號(hào)endBehavioral;process(present_state)鍵盤譯碼電路模塊接下頁(yè)鍵盤譯碼電路模塊接下頁(yè)libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entitykeydecoderisPort(key_in:instd_logic_vector(3downto0);--鍵盤輸入key_drv:instd_logic_vector(3downto0);--鍵盤輸出clk:instd_logic;--全局時(shí)鐘clk_scan:instd_logic;--掃描時(shí)鐘keyvalue:outstd_logic_vector(3downto0)--鍵盤的鍵值);接下頁(yè)libraryIEEE;接下頁(yè)key_pressed:outstd_logic);--有鍵盤按下去的標(biāo)志endkeydecoder;architectureBehavioralofkeydecoderissignaltemp:STD_LOGIC_VECTOR(7DOWNTO0);--鍵盤的輸入信號(hào)signaltemp_preseed:STD_LOGIC;--鍵盤按下標(biāo)志位signaltemp1,temp2,temp3,temp4,temp5,temp6:STD_LOGIC;--同步化信號(hào)signalkey_pressed_asy:STD_LOGIC;begin temp<=key_drv&key_in; process(temp) begin接下頁(yè)key_pressed:outstd_logic);-casetempiswhen"11101110"=>keyvalue<=CONV_STD_LOGIC_VECTOR(1,4); temp_preseed<='1';when"11101101"=>keyvalue<=CONV_STD_LOGIC_VECTOR(2,4); temp_preseed<='1';when"11101011"=>keyvalue<=CONV_STD_LOGIC_VECTOR(3,4); temp_preseed<='1';when"11100111"=>keyvalue<=CONV_STD_LOGIC_VECTOR(4,4);temp_preseed<='1';when"11011110"=>keyvalue<=CONV_STD_LOGIC_VECTOR(5,4);temp_preseed<='1';when"11011101"=>keyvalue<=CONV_STD_LOGIC_VECTOR(6,4);temp_preseed<='1';when"11011011"=>keyvalue<=CONV_STD_LOGIC_VECTOR(7,4);temp_preseed<='1';接下頁(yè)casetempis接下頁(yè)when"11010111"=>keyvalue<=CONV_STD_LOGIC_VECTOR(8,4);temp_preseed<='1';when"10111110"=>keyvalue<=CONV_STD_LOGIC_VECTOR(9,4); temp_preseed<='1';when"10111101"=>keyvalue<=CONV_STD_LOGIC_VECTOR(10,4); temp_preseed<='1';when"10111011"=>keyvalue<=CONV_STD_LOGIC_VECTOR(11,4); temp_preseed<='1';when"10110111"=>keyvalue<=CONV_STD_LOGIC_VECTOR(12,4); temp_preseed<='1';when"01111110"=>keyvalue<=CONV_STD_LOGIC_VECTOR(13,4); temp_preseed<='1';when"01111101"=>keyvalue<=CONV_STD_LOGIC_VECTOR(14,4);temp_preseed<='1';接下頁(yè)when"11010111"=>keyvalue<=CONwhen"01111011"=>keyvalue<=CONV_STD_LOGIC_VECTOR(15,4); temp_preseed<='1';when"01110111"=>keyvalue<=CONV_STD_LOGIC_VECTOR(16,4); temp_preseed<='1';whenothers=>temp_preseed<='0';endcase;endprocess;接下頁(yè)when"01111011"=>keyvalue<=CONprocess(clk_scan)begin if(clk_scan'eventandclk_scan='1')then temp1<=temp_preseed; temp2<=temp1; temp3<=temp2; temp4<=temp3;endif; key_pressed_asy<=temp1ORtemp2ORtemp3ORtemp4;endprocess;接下頁(yè)process(clk_scan)接下頁(yè)process(clk) begin if(clk'eventandclk='1')then temp5<=key_pressed_asy; temp6<=temp5; endif; key_pressed<=temp5AND(NOT(temp6)); endprocess;endBehavioral;process(clk)時(shí)鐘電路產(chǎn)生模塊

接下頁(yè)時(shí)鐘電路產(chǎn)生模塊接下頁(yè)libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entityclkgenisPort(clk:instd_logic;clk_scan:outstd_logic);endclkgen;architectureBehavioralofclkgenis接下頁(yè)libraryIEEE;接下頁(yè)signalcnt:INTEGERrange0to199;beginprocess(clk)begin if(clk'eventandclk='1')then if(cnt=199)then cnt<=0; else cnt<=cnt+1; endif; endif;endprocess;接下頁(yè)signalcnt:INTEGERrange0toprocess(cnt,clk)begin if(clk'eventandclk='1')then if(cnt>=199/2)then clk_scan<='1'; else clk_scan<='0'; endif; endif;endprocess;endBehavioral;process(cnt,clk)9.2LED驅(qū)動(dòng)器設(shè)計(jì)9.2LED驅(qū)動(dòng)器設(shè)計(jì)LED數(shù)碼管的工作原理LED數(shù)碼管用8段發(fā)光二極管來顯示數(shù)字,每一段都是一個(gè)發(fā)光二極管。一般把所有段的相同一端相連,連接到地(共陰極接法)或者是連接到電源(共陽(yáng)極接法)。

LED數(shù)碼管的工作原理LED數(shù)碼管用8段發(fā)光二極管來顯示數(shù)字FPGA實(shí)現(xiàn)LED靜態(tài)顯示控制運(yùn)用硬件描述語(yǔ)言(如VHDL)設(shè)計(jì)一個(gè)顯示譯碼驅(qū)動(dòng)器,即將要顯示的字符譯成8段碼。由于FPGA有相當(dāng)多的引腳端資源,如果顯示的位數(shù)N較少,可以直接使用靜態(tài)顯示方式,即將每一個(gè)數(shù)碼管都分別連接到不同的8個(gè)引腳線上,共需要8×N條引腳線控制,如左圖所示。FPGA實(shí)現(xiàn)LED靜態(tài)顯示控制運(yùn)用硬件描述語(yǔ)言(如VHDL)采用FPGA實(shí)現(xiàn)LED數(shù)碼管動(dòng)態(tài)顯示控制N個(gè)LED數(shù)碼管以靜態(tài)方式顯示時(shí),需用到8×N條引腳線。在較為復(fù)雜的系統(tǒng)中,F(xiàn)PGA的引腳端資源是有限的。因此對(duì)于多個(gè)LED數(shù)碼管顯示,可以采用掃描方式來實(shí)現(xiàn)LED數(shù)碼管動(dòng)態(tài)顯示。實(shí)現(xiàn)方法是依次點(diǎn)亮各個(gè)LED數(shù)碼管,循環(huán)進(jìn)行顯示,即一個(gè)數(shù)碼管顯示之后另一個(gè)數(shù)碼管馬上顯示,利用人眼的視覺暫留特性,可以到多個(gè)數(shù)碼管同時(shí)顯示的效果。采用掃描方式來實(shí)現(xiàn)LED數(shù)碼管動(dòng)態(tài)顯示,控制好數(shù)碼管之間的延時(shí)是相當(dāng)重要。接下頁(yè)采用FPGA實(shí)現(xiàn)LED數(shù)碼管動(dòng)態(tài)顯示控制N個(gè)LED數(shù)碼管以靜根據(jù)人眼視覺暫留原理,LED數(shù)碼管每秒的導(dǎo)通16次以上,人眼就無(wú)法分辨LED數(shù)碼管短暫的不亮,認(rèn)為是一直點(diǎn)亮的(其實(shí)LED數(shù)碼管是以一定頻率在閃動(dòng)的)。但是,延時(shí)(導(dǎo)通頻率)也不是越小越好,因?yàn)長(zhǎng)ED數(shù)碼管達(dá)到一定亮度需要一定時(shí)間。如果延時(shí)控制的不好則會(huì)出現(xiàn)閃動(dòng),或者亮度不夠。據(jù)經(jīng)驗(yàn),延時(shí)0.005秒可以達(dá)到滿意的效果。接下頁(yè)根據(jù)人眼視覺暫留原理,LED數(shù)碼管每秒的導(dǎo)通16次以上,人眼修改延時(shí),亦能得到更多的顯示效果,如加長(zhǎng)延時(shí),使得數(shù)碼管顯示一小段時(shí)間,再點(diǎn)亮下一個(gè),即可得到數(shù)碼管逐個(gè)顯示的效果。另外,顯示的字符有變化時(shí),可在延時(shí)到達(dá)后送一個(gè)低電平(共陰極數(shù)碼管)讓LED數(shù)碼管先短暫熄滅,再顯示下一個(gè)字符,可使在視覺上字符的變化更清晰。

修改延時(shí),亦能得到更多的顯示效果,如加長(zhǎng)延時(shí),使得數(shù)碼管顯示FPGA實(shí)現(xiàn)LED動(dòng)態(tài)方式顯示的控制電路FPGA實(shí)現(xiàn)LED動(dòng)態(tài)方式顯示的控制電路FPGA驅(qū)動(dòng)LED靜態(tài)顯示程序(1)libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entitydecoderisPort(seg:instd_logic_vector(3downto0);--四位二進(jìn)制碼輸入q3:outstd_logic_vector(6downto0));--輸出LED七段碼enddecoder;architectureBehavioralofdecoderisbeginprocess(seg)begin接下頁(yè)FPGA驅(qū)動(dòng)LED靜態(tài)顯示程序(1)libraryIEEEFPGA驅(qū)動(dòng)LED靜態(tài)顯示程序(2)casesegiswhen"0000"=>q3<="0000001";--0when"0001"=>q3<="1001111";--1when"0010"=>q3<="0010010";--2when"0011"=>q3<="0000110";--3when"0100"=>q3<="1001100"--4when

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論