VHDL編寫(xiě)的數(shù)字鐘.doc
《VHDL編寫(xiě)的數(shù)字鐘.doc》由會(huì)員分享,可在線閱讀,更多相關(guān)《VHDL編寫(xiě)的數(shù)字鐘.doc(11頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
FPGA課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告 題目: VHDL編寫(xiě)的數(shù)字鐘設(shè)計(jì) 學(xué)院: 電子信息學(xué)院 專業(yè): 電子與通訊工程 姓名: 朱振軍 基于FPGA的VHDL數(shù)字鐘設(shè)計(jì) 一、功能介紹 1.在七段數(shù)碼管上具有時(shí)--分--秒的依次顯示。 2.時(shí)、分、秒的個(gè)位記滿十向高位進(jìn)一,分、秒的十位記滿五向高位進(jìn)一,小時(shí)按24進(jìn)制計(jì)數(shù),分、秒按60進(jìn)制計(jì)數(shù)。 3.整點(diǎn)報(bào)時(shí),當(dāng)計(jì)數(shù)到整點(diǎn)時(shí)揚(yáng)聲器發(fā)出響聲。 4.時(shí)間設(shè)置:可以通過(guò)按鍵手動(dòng)調(diào)節(jié)秒和分的數(shù)值。此功能中可通過(guò)按鍵實(shí)現(xiàn)整體清零和暫停的功能。 5.LED燈循環(huán)顯示:在時(shí)鐘正常計(jì)數(shù)下,LED燈被依次循環(huán)點(diǎn)亮。 待增加功能: 1. 實(shí)現(xiàn)手動(dòng)調(diào)節(jié)鬧鈴時(shí)間,在制定時(shí)間使揚(yáng)聲器發(fā)聲。 2. 實(shí)現(xiàn)微妙的快速計(jì)數(shù)功能,可實(shí)現(xiàn)暫停、保存當(dāng)前時(shí)間、繼續(xù)計(jì)數(shù)的功能。 二、設(shè)計(jì)方案 本文數(shù)字鐘的設(shè)計(jì)采用了自頂向下分模塊的設(shè)計(jì)。底層是實(shí)現(xiàn)各功能的模塊,各模塊由vhdl語(yǔ)言編程實(shí)現(xiàn):頂層采用原理圖形式調(diào)用。其中底層模塊包括秒、分、時(shí)三個(gè)計(jì)數(shù)器模塊、按鍵去抖動(dòng)模塊、按鍵控制模塊、時(shí)鐘分頻模塊、數(shù)碼管顯示模塊共7個(gè)模塊。 設(shè)計(jì)框圖如下: 圖一 數(shù)字鐘系統(tǒng)設(shè)計(jì)框圖 由圖1可以清晰的看到數(shù)字鐘系統(tǒng)設(shè)計(jì)中各功能模塊間連接關(guān)系。系統(tǒng)時(shí)鐘50MHZ經(jīng)過(guò)分頻后產(chǎn)生1秒的時(shí)鐘信號(hào),1秒的時(shí)鐘信號(hào)作為秒計(jì)數(shù)模塊的輸入信號(hào),秒計(jì)數(shù)模塊產(chǎn)生的進(jìn)位信號(hào)作為分計(jì)數(shù)模塊的輸入信號(hào),分計(jì)數(shù)模塊的進(jìn)位信號(hào)作為時(shí)計(jì)數(shù)模塊的輸入信號(hào)。秒計(jì)數(shù)模塊、分計(jì)數(shù)模塊、時(shí)計(jì)數(shù)模塊的計(jì)數(shù)輸出分別送到顯示模塊。由于設(shè)計(jì)中要使用按鍵進(jìn)行調(diào)節(jié)時(shí)間,而按鍵的動(dòng)作過(guò)程中存在產(chǎn)生得脈沖的不穩(wěn)定問(wèn)題,所以就牽扯到按鍵去抖動(dòng)的問(wèn)題,對(duì)此系統(tǒng)中設(shè)置了按鍵去抖動(dòng)模塊,按鍵去抖動(dòng)模塊產(chǎn)生穩(wěn)定的脈沖信號(hào)送入按鍵控制模塊,按鍵控制模塊根據(jù)按鍵的動(dòng)作對(duì)秒、分、時(shí)進(jìn)行調(diào)節(jié)。 圖二 數(shù)字鐘的頂層設(shè)計(jì)原理圖 三、設(shè)計(jì)過(guò)程 由數(shù)字鐘的頂層設(shè)計(jì)原理圖可知:系統(tǒng)的外部輸入即為系統(tǒng)的時(shí)鐘信號(hào)CLK =50MHZ,系統(tǒng)的外部輸出有蜂鳴器信號(hào)buzzer,LED顯示信號(hào)LED[3..1]和shan(與按鍵去抖動(dòng)模塊的o3相連),數(shù)碼管顯示信號(hào)xianshi[7..0],數(shù)碼管位選信號(hào)xuanze[7..0]。 下面將對(duì)內(nèi)部功能模塊進(jìn)行詳細(xì)說(shuō)明; 1.分頻模塊pinlv 對(duì)系統(tǒng)的時(shí)鐘50MHZ進(jìn)行分頻,設(shè)置不同長(zhǎng)度的計(jì)數(shù)值,當(dāng)系統(tǒng)時(shí)鐘clk有變化時(shí)計(jì)數(shù)器開(kāi)始計(jì)數(shù),當(dāng)計(jì)數(shù)到某個(gè)值時(shí)輸出一個(gè)信號(hào),計(jì)數(shù)值不同輸出信號(hào)的周期也就不同,從而實(shí)現(xiàn)了對(duì)系統(tǒng)時(shí)鐘進(jìn)行不同的分頻,產(chǎn)生不同頻率的信號(hào)。 由VHDL語(yǔ)言生成的模塊圖和程序說(shuō)明如下: 圖三 分頻模塊 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity pinlv is port( clk:in std_logic;--系統(tǒng)時(shí)鐘輸入端口 clk2ms:out std_logic; clk500ms:out std_logic; clk1s:out std_logic);--各頻率信號(hào)的輸出端口 end; architecture beh of pinlv is begin p1:process(clk) –進(jìn)程p1 variable count1:integer range 0 to 49999999; begin if(clkevent and clk=1)then count1:=count1+1;--在clk 的上升沿計(jì)數(shù) if count1<=24999999 then clk1s<=0; elsif count1<=49999999 then clk1s<=1; else count1:=0; --產(chǎn)生周期為1s的時(shí)鐘信號(hào) end if; end if; end process p1;--結(jié)束進(jìn)程p1 p2:process(clk)—進(jìn)程p2 variable count2:integer range 0 to 99999; begin if(clkevent and clk=1)then count2:=count2+1;--在clk上升沿計(jì)數(shù) if count2<=49999 then clk2ms<=0; elsif count2<=99999 then clk2ms<=1; --產(chǎn)生周期為2ms的掃描信號(hào) end if; end if; end process p2;--結(jié)束進(jìn)程p2 p3:process(clk)—進(jìn)程p3 variable count3:integer range 0 to 24999999; begin if(clkevent and clk=1)then count3:=count3+1;在clk上升沿計(jì)數(shù) if count3<=12499999 then clk500ms<=0; elsif count3<=24999999 then clk500ms<=1; else count3:=0; 產(chǎn)生周期為500ms的時(shí)鐘信號(hào) end if; end if; end process p3; end beh; 2.按鍵去抖動(dòng)模塊qudou 本設(shè)計(jì)用到FPGA開(kāi)發(fā)板上的四個(gè)按鍵,由于按鍵有反應(yīng)時(shí)間、抖動(dòng)的問(wèn)題,可能當(dāng)按鍵被按一次時(shí)而系統(tǒng)感應(yīng)到幾次,造成誤差。所以應(yīng)該進(jìn)行按鍵消抖的處理,讓每按一次鍵系統(tǒng)只感應(yīng)到一次按鍵??梢圆捎密浖訒r(shí),觸發(fā)反相器等方式進(jìn)行消除抖動(dòng),本設(shè)計(jì)中采用軟件延時(shí)的方式。 由VHDL語(yǔ)言生成的模塊圖和程序說(shuō)明如下: 圖四 按鍵去抖動(dòng)模塊 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity qudou is port(clk,k1,k2,k3,k4:in std_logic; o1,o2,o3,o4:out std_logic);--設(shè)置按鍵輸入信號(hào)輸出端口 end; architecture beh of qudou is begin process(clk,k1,k2,k3,k4) variable cant1:integer; variable cant2:integer; variable cant3:integer; variable cant4:integer; begin if clkevent and clk=1 then if k1=1 then cant1:=0; end if;--設(shè)置計(jì)數(shù)初值 if k2=1 then cant2:=0; end if; --設(shè)置計(jì)數(shù)初值 if k3=1 then cant3:=0; end if; if k4=1 then cant4:=0; end if; --設(shè)置計(jì)數(shù)初值 if cant1>2499999 then o1<=0; else o1<=1;--延時(shí)0.5s end if; if cant2>2499999 then o2<=0; else o2<=1; --延時(shí)0.5s end if; if cant3>2499999 then o3<=0; else o3<=1; --延時(shí)0.5s end if; if cant4>2499999 then o4<=0; else o4<=1; --延時(shí)0.5s end if; cant1:=cant1+1; --加一計(jì)數(shù) cant2:=cant2+1; --加一計(jì)數(shù) cant3:=cant3+1; --加一計(jì)數(shù) cant4:=cant4+1; --加一計(jì)數(shù) end if; end process; end beh; --設(shè)置計(jì)數(shù)初值 在quartus II開(kāi)發(fā)環(huán)境中進(jìn)行仿真驗(yàn)證 圖五 按鍵去抖動(dòng)仿真效果圖 由于0.5s太長(zhǎng),在本仿真中設(shè)置了很小的一個(gè)量10clk,從圖中可以看出基本實(shí)現(xiàn)了按鍵去抖動(dòng)的效果。無(wú)論按鍵怎么抖動(dòng),輸出總是保持穩(wěn)態(tài)10clk,當(dāng)下一個(gè)觸發(fā)來(lái)了以后,就可以觸發(fā)單穩(wěn)態(tài)。 3,按鍵控制模塊self1 本設(shè)計(jì)中使用了兩個(gè)按鍵進(jìn)行對(duì)時(shí)鐘的暫停和調(diào)秒操作,當(dāng)ok2按下時(shí)時(shí)鐘暫停,再按ok3則進(jìn)行秒個(gè)位的加一計(jì)數(shù),每按一次進(jìn)行加一處理。當(dāng)調(diào)節(jié)好時(shí)間后,在按ok2鍵重新開(kāi)始計(jì)數(shù)。 由VHDL語(yǔ)言生成的模塊圖和程序說(shuō)明如下: 圖六 按鍵控制模塊 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity self1 is port( c:in std_logic; ok2:in std_logic; ok3:in std_logic; ck:out std_logic); end ;--設(shè)置端口 architecture bea of self1 is signal m:std_logic; signal t:std_logic; begin p1:process(ok2,ok3,c)—ok2和ok3觸發(fā)進(jìn)程 begin if ok2event and ok2=0 then m<=not m;--由ok2 的動(dòng)作產(chǎn)生m的電平信號(hào) end if; if m=1 then ck<=not(ok3);--把按鍵ok3的脈沖信號(hào)給輸出 else ck<=c;--否則把正常計(jì)數(shù)時(shí)鐘給輸出 end if; end process p1;--結(jié)束進(jìn)程 end bea; 4,秒、分六十進(jìn)制模塊cantsixty 本設(shè)中秒、分的六十進(jìn)制是由個(gè)位的十進(jìn)制和十位的六進(jìn)制進(jìn)行組合實(shí)現(xiàn)的。當(dāng)個(gè)位記到9時(shí)自動(dòng)向高位進(jìn)一,同時(shí)個(gè)位自動(dòng)清零。當(dāng)十位記到5并且個(gè)位記到9時(shí),自動(dòng)產(chǎn)生一個(gè)進(jìn)位脈沖,同時(shí)個(gè)位和十位分別從零開(kāi)始重新計(jì)數(shù)。 由VHDL語(yǔ)言生成的模塊圖和程序說(shuō)明如下: 圖七 六十進(jìn)制模塊 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity cantsixty is port(clk:in std_logic; reset:in std_logic; out1:out std_logic_vector(3 downto 0); out2:out std_logic_vector(3 downto 0); c:out std_logic); end; architecture beh of cantsixty is signal ss1,ss2:std_logic_vector( 3 downto 0); begin p1:process(clk,reset) begin if(reset=0)then ss1<="0000";ss2<="0000"; elsif(clkevent and clk=1)then if ss1="1001" and ss2="0101" then c<=1;--當(dāng)計(jì)數(shù)到59時(shí)產(chǎn)生進(jìn)位信號(hào) else c<=0;--否則不產(chǎn)生 end if; if ss1="1001" then ss1<="0000"; if ss2="0101" then ss2<="0000"; else ss2<=ss2+1; end if; else ss1<=ss1+1;--計(jì)數(shù)過(guò)程 end if; end if; end process p1;--結(jié)束進(jìn)程 out1<=ss1;out2<=ss2;--把信號(hào)送輸出 end beh; 在quartus II開(kāi)發(fā)環(huán)境中進(jìn)行仿真驗(yàn)證: 圖八 六十進(jìn)制波形仿真圖 由上圖可見(jiàn),當(dāng)1s的時(shí)鐘信號(hào)加入時(shí),個(gè)位out1從0到9不斷循環(huán),而且當(dāng)個(gè)位out1記到9時(shí)產(chǎn)生一個(gè)進(jìn)位信號(hào) 使十位out2加一,以此類推就實(shí)現(xiàn)了六十進(jìn)制計(jì)數(shù)?;具_(dá)到了正確計(jì)數(shù)的理想效果。 5.時(shí)計(jì)數(shù)模塊hourtwenty 時(shí)計(jì)數(shù)模塊是二十四進(jìn)制相對(duì)復(fù)雜一點(diǎn),因?yàn)楫?dāng)十位0或著1時(shí)個(gè)位需要記到9并產(chǎn)生進(jìn)位信號(hào),當(dāng)十位是2時(shí),個(gè)位記到3時(shí),就全部從零開(kāi)始重新計(jì)數(shù)。即是在十位為不同值時(shí)個(gè)位兩種計(jì)數(shù)過(guò)程。 由VHDL語(yǔ)言生成的模塊圖和程序說(shuō)明如下: 圖九 二十四進(jìn)制波形仿真圖 在quartus II開(kāi)發(fā)環(huán)境中進(jìn)行仿真驗(yàn)證: 圖十 二十四進(jìn)制波形仿真圖 由上圖看出十位為0或1時(shí),個(gè)位記到9時(shí),十位才進(jìn)行加一計(jì)數(shù),但當(dāng)十位為2時(shí),個(gè)位記到3時(shí),十位變成了0,個(gè)位又從0重新開(kāi)始計(jì)數(shù),這樣就實(shí)現(xiàn)了二十四進(jìn)制的計(jì)數(shù)。從圖形的顯示波形可知,設(shè)計(jì)基本達(dá)到了正確計(jì)數(shù)的功能。 6.秒、分、時(shí)組合后的仿真驗(yàn)證 把設(shè)計(jì)的秒、分、時(shí)模塊連接起來(lái),再通過(guò)仿真驗(yàn)證,各模塊間的進(jìn)位是否正確 連接后的原理圖如下 圖十一 秒、分、時(shí)組合后原理圖 在quartus II開(kāi)發(fā)環(huán)境中進(jìn)行仿真驗(yàn)證: 圖十二 組合后波形仿真圖 由于需要設(shè)置很長(zhǎng)的仿真時(shí)間,才能完全觀察到進(jìn)位信號(hào),本次仿真只截取了一小部分,觀察不到分模塊向時(shí)模塊的進(jìn)位。由仿真結(jié)果圖可以看到,秒模塊向分鐘模塊的正常進(jìn)位,以及分模塊的正常計(jì)數(shù),所以各模塊連接后的計(jì)數(shù)狀態(tài)也符合設(shè)計(jì)的要求,基本實(shí)現(xiàn)了正常計(jì)數(shù)。 7 .數(shù)碼管顯示模塊 本模塊中包含數(shù)碼管的段選和位選設(shè)計(jì),Led燈循環(huán)設(shè)計(jì),以及整點(diǎn)報(bào)時(shí)的設(shè)計(jì)。模塊的輸入信號(hào)有數(shù)碼管掃描頻率clk2ms,秒、分、時(shí)各模塊的個(gè)位和十位輸入,以及由分模塊向時(shí)模塊產(chǎn)生的進(jìn)位脈沖信號(hào)。 由VHDL語(yǔ)言生成的模塊圖和程序說(shuō)明如下: 圖十三 數(shù)碼管顯示原理圖 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity qudong is port(s1,s2,m1,m2,h1,h2:in std_logic_vector(3 downto 0); clk2ms: in std_logic; xiang:in std_logic; led:out std_logic_vector(3 downto 1); buzzer:out std_logic; xianshi:out std_logic_vector(7 downto 0); xuanze:out std_logic_vector( 7 downto 0)); end qudong; architecture behav of qudong is signal sel:std_logic_vector( 2 downto 0); signal A:std_logic_vector( 3 downto 0); signal t:std_logic_vector ( 11 downto 0); signal f:std_logic_vector(1 downto 0); signal count1:std_logic_vector(1 downto 0); begin p1:process(clk2ms) begin if clk2msevent and clk2ms=1 then sel<=sel+1;t<=t+1; if t="110010000000" then t<=(others=>0); end if; end if; f<=t(11)&t(10); if f="01" then led(3)<=0;else led(3)<=1; end if; if f="10" then led(2)<=0;else led(2)<=1; end if; if f="11" then led(1)<=0; else led(1)<=1; end if;--led的循環(huán)顯示設(shè)計(jì) end process p1; p2:process(sel,s1,s2,m1,m2,h1,h2) begin case sel is when "000" =>xuanze<="11111110"; A<=s1; --秒個(gè)位在數(shù)碼管1上顯示 when "001" =>xuanze<="11111101"; A<=s2; --秒十位在數(shù)碼管2上顯示 when "010" =>xuanze<="11111011"; A<="1010";--數(shù)碼管3上顯示橫杠 when "011" =>xuanze<="11110111"; A<=m1; --分個(gè)位在數(shù)碼管4上顯示 when "100" =>xuanze<="11101111"; A<=m2; --分十位在數(shù)碼管5上顯示 when "101" =>xuanze<="11011111"; A<="1011";--數(shù)碼管6上顯示橫杠 when "110" =>xuanze<="10111111"; A<=h1; --時(shí)個(gè)位在數(shù)碼管7上顯示 when "111" =>xuanze<="01111111"; A<=h2; --時(shí)十位在數(shù)碼管8上顯示 when others =>null; end case; end process p2; p3:process(A) begin case A is when "0000" => xianshi <="11000000";--顯示0 when "0001" => xianshi <="11111001"; --顯示1 when "0010" => xianshi <="10100100"; --顯示2 when "0011" => xianshi <="10110000"; --顯示3 when "0100" => xianshi <="10011001"; --顯示4 when "0101" => xianshi <="10010010"; --顯示5 when "0110" => xianshi <="10000010"; --顯示6 when "0111" => xianshi <="11111000"; --顯示7 when "1000" => xianshi <="10000000"; --顯示8 when "1001" => xianshi <="10010000"; --顯示9 when "1010" =>xianshi <="10111111"; --顯示-- when "1011" =>xianshi <="10111111"; --顯示-- when others =>null; --數(shù)碼管的段選設(shè)計(jì) end case; end process p3; P4:process(xiang) begin if xiang=1 then buzzer<=0; --當(dāng)進(jìn)位信號(hào)xiang為1時(shí)就把低電平給buzzer讓蜂鳴器響 else buzzer<=1; --否則把高電平給buzzer不給蜂鳴器觸發(fā)信號(hào) end if; end process p4; --結(jié)束進(jìn)程 end behav; 四、實(shí)驗(yàn)結(jié)果 將調(diào)試好的程序下載到實(shí)驗(yàn)板上進(jìn)行驗(yàn)證,達(dá)到了設(shè)計(jì)的各項(xiàng)功能。時(shí)鐘準(zhǔn)確計(jì)數(shù),各模塊的進(jìn)位也正確,當(dāng)按下實(shí)驗(yàn)板上的key1鍵時(shí)系統(tǒng)復(fù)位清零,實(shí)驗(yàn)板上的key2鍵可實(shí)現(xiàn)系統(tǒng)的暫停和開(kāi)始,在系統(tǒng)暫停的狀態(tài)下,按key3鍵可實(shí)現(xiàn)調(diào)節(jié)秒計(jì)數(shù),每按一次計(jì)數(shù)加一,key4鍵可實(shí)現(xiàn)調(diào)節(jié)分模塊,每按一次計(jì)數(shù)加一,長(zhǎng)按則一直加,當(dāng)達(dá)到整點(diǎn)時(shí),蜂鳴器發(fā)聲。 五、實(shí)驗(yàn)小結(jié)與體會(huì) 這個(gè)實(shí)驗(yàn)帶給我的體會(huì)很多也很深,我以前沒(méi)有對(duì)數(shù)字鐘進(jìn)行系統(tǒng)的設(shè)計(jì),這次獨(dú)立的設(shè)計(jì),我遇到了很多問(wèn)題,也走了很多彎路,還好最后終于通過(guò)自己的努力看到了理想的結(jié)果。通過(guò)實(shí)驗(yàn),我對(duì)EDA技術(shù)和FPGA技術(shù)有了更進(jìn)一步的理解,掌握了FPGA的層次化設(shè)計(jì)電路的方法,掌握了用VHDL語(yǔ)言編寫(xiě)各個(gè)功能模塊并通過(guò)波形確定電路設(shè)計(jì)是否正確。掌握了下載驗(yàn)到目標(biāo)器件的過(guò)程。 實(shí)驗(yàn)中遇到的問(wèn)題很多,有的是很基礎(chǔ)的但我卻不知道,例如數(shù)碼管的掃描頻率,剛開(kāi)始時(shí)數(shù)碼管不顯示,我找了很多原因都沒(méi)想到是掃描頻率的問(wèn)題,浪費(fèi)了很多時(shí)間。還有分頻的時(shí)候,看過(guò)很多分頻的電路程序,但那些并不是都可以實(shí)現(xiàn)準(zhǔn)確的分頻,需要通過(guò)波形進(jìn)行驗(yàn)證。還有計(jì)數(shù)器的設(shè)計(jì),我用了很長(zhǎng)時(shí)間才編寫(xiě)出來(lái),現(xiàn)在看看,也沒(méi)有那么難了。 總之,我很感謝這次實(shí)驗(yàn)可以給我這樣的機(jī)會(huì),這個(gè)實(shí)驗(yàn)給了我很對(duì)的收獲,我相信這會(huì)對(duì)我以后的學(xué)習(xí)和工作都有幫助。- 1.請(qǐng)仔細(xì)閱讀文檔,確保文檔完整性,對(duì)于不預(yù)覽、不比對(duì)內(nèi)容而直接下載帶來(lái)的問(wèn)題本站不予受理。
- 2.下載的文檔,不會(huì)出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請(qǐng)點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
9.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁(yè)顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開(kāi)word文檔。
- 特殊限制:
部分文檔作品中含有的國(guó)旗、國(guó)徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對(duì)作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- VHDL 編寫(xiě) 數(shù)字

鏈接地址:http://ioszen.com/p-6670438.html