數(shù)字系統(tǒng)設(shè)計與VHDL 實驗指導(dǎo)書2014 (1)._第1頁
數(shù)字系統(tǒng)設(shè)計與VHDL 實驗指導(dǎo)書2014 (1)._第2頁
數(shù)字系統(tǒng)設(shè)計與VHDL 實驗指導(dǎo)書2014 (1)._第3頁
數(shù)字系統(tǒng)設(shè)計與VHDL 實驗指導(dǎo)書2014 (1)._第4頁
數(shù)字系統(tǒng)設(shè)計與VHDL 實驗指導(dǎo)書2014 (1)._第5頁
已閱讀5頁,還剩31頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、實驗一 Quartus9.0快速入門一、實驗?zāi)康耐ㄟ^實驗讓學(xué)生了解,熟悉和掌握Quartus9.0開發(fā)軟件的使用方法及Verilog HDL的編程方法。學(xué)習(xí)簡單時序電路的設(shè)計和硬件測試。二、實驗原理在LED1LED8引腳上周期性的輸出流水?dāng)?shù)據(jù),如原來輸出的數(shù)據(jù)是11111100 則表示點亮LED1,LED2,流水一次后,輸出地數(shù)據(jù)應(yīng)該為11111000,而此時應(yīng)該點亮LED1LED3三個發(fā)光二極管,就可以實現(xiàn)LED流水燈。為了觀察方便,流水速率最好在2Hz左右,在MagicSOPC核芯板上有一數(shù)字信號源,可選擇CLOCK3的2HZ時鐘信號源源作為流水燈的時鐘源。三、主要實驗設(shè)備計算機和Magi

2、cSOPC實驗箱。四、實驗內(nèi)容本實驗的內(nèi)容是建立可用于控制LED流水燈的簡單硬件電路,要求在MagicSOPC試驗箱上實現(xiàn)LED1LED8發(fā)光二極管流水燈顯示。實驗步驟如下:1啟動Quartus II建立一個空白工程,然后命名為led_water.qpf。2新建Verilog HDL 源程序文件ledwater.v,輸入程序代碼并保存,進(jìn)行綜合編譯,若在編譯過程中發(fā)現(xiàn)錯誤,則找出并更正錯誤,直至編譯成功為止。程序清單:module ledwater(led,clk); /模塊名ledwateroutput7:0 led; /定義LED輸出口input clk; /定義時鐘輸出口reg8:0 l

3、ed_r; /定義輸出寄存器assign led = led_r7:0; /寄存器輸出always (posedge clk) /在時鐘上升沿觸發(fā)進(jìn)程begin led_r <= led_r <<1; /是,則輸出左移一位 if(led_r = 9'd0) /循環(huán)完畢嗎? led_r <= 9'b111111111; /是,則重新賦初值endendmodule3從設(shè)計文件創(chuàng)建模塊,由ledwater.v生成名為ledwater.bsf的模塊符號文件。4新建圖形設(shè)計文件命名為led_water.bdf并保存。在空白處雙擊鼠標(biāo)左鍵,將symbol對話框中l(wèi)i

4、braries:project下的ledwater模塊放在圖形文件led_water.bdf中,加入輸入、輸出引腳,雙擊各引腳符號,進(jìn)行引腳命名。將與ledwater模塊led7.0連接的引腳命名為led7.0,與clk連接的引腳命名為clock3。完整的頂層模塊原理圖如圖1-1所示。圖1-1 流水燈頂層模塊5選擇目標(biāo)芯片并對相應(yīng)的引腳進(jìn)行鎖定,在這里所選擇的器件為Altera公司的CycloneII系列的EP2C35F672C8芯片,引腳鎖定方法如下表所列。將未使用的引腳設(shè)置為三態(tài)輸入(一定要設(shè)置,否則可能會損壞芯片)設(shè)置方法。信號引腳信號引腳信號引腳Led0R5Led3P6Led6R6Le

5、d1P9Led4P3Led7T3Led2P7Led5R8Clock3AE146將led_water.bdf設(shè)置為頂層實體。對該工程進(jìn)行全程編譯處理,若在編譯過程中發(fā)現(xiàn)錯誤,則找出并更正錯誤,直至編譯成功為止。7最后確保數(shù)字源(B4區(qū)域)的JP11的短路帽是處于ON位置,JP6中CLOCK3的短路帽處于2Hz位置:拿出Z-Blaster下載電纜,并將此電纜的兩端分別接到到PC機的USB接口和實驗箱主板模塊上的JTAG下載口(提示:下載線有小箭頭指示的為第1腳,與JTAG接口的J1腳相連),打開電源,執(zhí)行下載命令,把程序下載到FPGA器件中,此時,即可在MagicSOPC試驗箱上看到流水燈。8更改

6、JP6排針CLOCK3處短路帽的位置。觀察流水燈的變化。注意: 選擇好器件后,先編譯頂層文件,后分配引腳,是比較有利的,因為編譯之后,Quartus II軟件會自動將所有輸入.輸出引腳記錄下來,不需要重新輸入各個引腳的的信號名。分配引腳也可以通過編輯*qsf文件(該文件可以用記事本打開)實現(xiàn)。五、實驗總結(jié)1文本輸入的文件存盤時,文件名與模塊名一致,即ledwater.v。2項目名稱與頂層文件名一樣,即led_water.qpf。3USB接口和實驗箱主板模塊上的JTAG下載口(提示:下載線有小箭頭指示的為第1腳,與JTAG接口的J1腳相連)。4驅(qū)動的安裝:在初次使用USB-Blaster編程器前

7、,需首先安裝USB驅(qū)動程序。將USB-Blaster編程器一端插入PC機的USB口,這時會彈出一個USB驅(qū)動程序?qū)υ捒颍鶕?jù)對話框的引導(dǎo),選擇用戶自己搜索驅(qū)動程序,假定Quartus安裝在D盤,則驅(qū)動程序的路徑為D:altera90sp2quartusdiversusb-blaster。安裝完畢后,打開Quartus,選擇編程器,單擊左上角的Hardware Setup按鈕,在彈出的窗口中選擇USB-Blaster項,雙擊之,此后就能使用。六、預(yù)習(xí)及思考1思考:如何實現(xiàn)左流水或其他花樣流水呢?自己動手試試。2reg數(shù)據(jù)類型:Verilog HDL有兩大類數(shù)據(jù)類型,線網(wǎng)類型和寄存器類型,形式如下

8、: regmsb:lsb reg1,reg2.regN;msb和lsb定義了范圍,并且均為常數(shù)值表達(dá)式。范圍定義是可選的:如果沒有定義范圍,缺省值為1位寄存器。reg型數(shù)據(jù)的默認(rèn)初始值是不定值X,它可以賦正值,也可以賦負(fù)值。當(dāng)一個reg型數(shù)據(jù)是一個表達(dá)式的操作數(shù)時,它的值被當(dāng)做是無符號值,即正值。(如一個4位寄存器被賦值-1,則在表達(dá)式中進(jìn)行運算時,其值被認(rèn)為是+15。)reg型只表示被定義的信號將用在always塊內(nèi),理解這一點很重要。并不是說reg型信號一定是寄存器或觸發(fā)器的輸出。雖然reg型信號常常是寄存器或觸發(fā)器的輸出,但并不一定總是這樣,只有在時序邏輯中它對應(yīng)的才是寄存器,而在組合邏

9、輯電路中它表示一個節(jié)點。3按照上述工程進(jìn)行編譯,會出現(xiàn)“Warning:Found pins functioning as undefined clocks and/or memory enables Info:Assuming node "clock" is an undefined clock”的警告。大概意思是說發(fā)現(xiàn)“clock”節(jié)點沒有定義成時鐘信號。消除之個警告的方法如下:(1)選擇Assignments | Timing Seting 命令,在彈出的對話框中的Clock Setting 項選中Individual Clocks項,如圖1-2所示。圖1-2 Clo

10、ck設(shè)置頁面1(2)在圖1-2中按Clocks.進(jìn)行設(shè)置,在彈出的對話框中按New.按鈕添加節(jié)點,如圖1-3所示,并按圖1-3所示進(jìn)行設(shè)置,圖中Required fmax 為系統(tǒng)需求的最大時鐘頻率,在這里填50MHz就可以了。圖1-3 Clock設(shè)置頁面2(3)設(shè)置好之后一直按OK按鈕保存設(shè)置,最后再進(jìn)行編譯,原先的Warning就會消除。以上的操作是將“clock3”加入時鐘域。如時“clock3”不是一個時鐘信號,可將設(shè)置屬性改為“Not a clock”,也可以消除Warning。注意:如果編譯后有些Warning 或Error不能消除或解決,可選中提示信息,按F1按鍵,打開幫助文檔,Q

11、uartus II的幫助文檔將列出Warning或error產(chǎn)生的原因及解決辦法。實驗二 一位全加器的設(shè)計一、實驗?zāi)康耐ㄟ^此實驗讓用戶逐漸料及、熟悉和掌握FPGA開發(fā)軟件Quartu II的使用方法及原理圖輸入程序電路的方法。二、實驗原理一位全加器的電路原理圖如圖2-1所示,真值表如表2-1所列??筛鶕?jù)全加器的電路原理圖或真值表用Verilog HDL語言描述。圖2-1 一位全加器原理圖f_adder.bdf表2-1 一位全加器邏輯功能真值表ainbin cin sum cout 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 1 1 0 0 1 0 0 1 1 0 1 0 1 0

12、 1 0 1 1 0 1 1 1 1 1 13、 主要實驗設(shè)備計算機和MagicSOPC實驗箱。四、實驗內(nèi)容1為本項工程設(shè)計建立文件夾假設(shè)本項設(shè)計的文件夾取名為adder,路徑為F:adder。2建立原理圖文件工程和仿真原理圖編輯輸入流程如下:(1)打開原理圖編輯窗。打開Quartus,選菜單File | New,在彈出的New對話框中選擇原理圖文件編輯輸入項Block Diagram/Schematic File(如圖2-2所示),按OK按鈕后打開原理圖編輯窗口。圖2-2 選擇編輯文件類型(2)建立一個初始原理圖。在編輯窗口中的任何一個位置上右擊鼠標(biāo),將出現(xiàn)快捷菜單,選擇其中的輸入元件項In

13、sert | Symbol(如圖2-3所示),或直接雙擊原理圖編輯窗口,于是將彈出如圖2-4所示的輸入元件的對話框。在左下的Name欄鍵入輸入引腳符號input。然后單擊Symbol窗口的Ok按鈕,即可將元件調(diào)入原理圖編輯窗口中。(3)原理圖文件存盤。選擇菜單File | Save As,將此原理圖文件存于剛才建立的目錄F:adder中,將已設(shè)計好的原理圖文件取名為h_adder.bdf(注意默認(rèn)的后綴是.bdf,而且此原理圖尚未完成,因為只加入了一個輸入端口),并存盤在此文件夾內(nèi)。(4)建立原理圖文件為頂層設(shè)計的工程。然后將此文件h_adder.bdf設(shè)定為工程。(5)繪制半加器原理圖。創(chuàng)建

14、工程后即進(jìn)入工程管理窗,設(shè)工程名是h_adder。注意工程管理窗左上角的工程路徑和工程名是:F:/adder/h_adder。雙擊左側(cè)的工程名,再次進(jìn)入原理圖編輯窗。再雙擊原理圖編輯窗任何位置。再次彈出如圖2-4所示的輸入元件的對話框。分別在Name欄鍵入(調(diào)入)元件名and2、xor和輸出引腳output,并用單擊拖動的方法,連接好的電路如圖2-5所示。然后分別在input和output引腳的PIN NAME上雙擊使其變黑色,再用鍵盤分別輸入各引腳名:a、b、co和so。最后,作為本項工程的頂層電路原理設(shè)計圖如圖2-5所示。 圖2-3 選擇打開元件輸入窗 圖2-4 在元件輸入對話框輸入引腳圖

15、2-5 半加器原理圖(6)仿真測試半加器。仿真波形如圖2-6所示,顯然與表2-2的真值表有對應(yīng)關(guān)系,半加器設(shè)計成功。表2-2 半加器真值表absoco0000011010101101圖2-6 半加器仿真波形3將設(shè)計項目設(shè)置成可調(diào)用的元件為了構(gòu)成全加器的頂層設(shè)計,必須將以上設(shè)計的半加器h_adder.bdf設(shè)置成可調(diào)用的底層元件。方法如圖2-7所示,在半加器原理圖文件h_adder.bdf處于打開的情況下,選擇菜單命令File | Create/Update | Create Symbol Files for Current File,即可將當(dāng)前電路圖變成一個元件符號存盤(元件文件名是h_add

16、er.bsf),以便在高層次設(shè)計中調(diào)用。圖2-7 將半加器封裝成一個元件可以使用完全相同的方法將Verilog文本文件變成原理圖中的一個元件(Symbol),實現(xiàn)Veriog文本設(shè)計與原理圖的混合輸入設(shè)計方法。轉(zhuǎn)換中需要注意以下三點。(1)被轉(zhuǎn)換的Verilog文本也要呈打開狀態(tài),而且必須在某工程打開狀態(tài)下。(2)轉(zhuǎn)換好的元件必須存在當(dāng)前工程的路徑文件夾中,文件后綴也默認(rèn).bdf。(3)按圖2-7的方式進(jìn)行轉(zhuǎn)換,選擇Create Symbol Files for Current File項。4設(shè)計全加器頂層文件為了建立全加器的頂層文件,必須另打開一個原理圖編輯窗口,方法同前,即再次選擇菜單Fi

17、le | New | Block Diagram/Schematic File。然后將其設(shè)置成新的工程。首先將打開的空的原理圖存盤于F:adder,文件取名為f_adder.bdf,作為本項設(shè)計的頂層文件。然后按照前面介紹的方法將頂層文件f_adder.bdf設(shè)置為工程。圖2-8是f_adder.bdf的工程設(shè)置窗口,其工程名和頂層文件名都是f_adder。 圖2-8 全加器f_adder.bdf工程設(shè)置 圖2-9 在f_adder工程下的原理圖編輯 窗中加入半加器建立工程后,在新打開的原理圖編輯窗口雙擊鼠標(biāo),在彈出的窗口(圖2-9)中選擇Project下的先前存入的h_adder元件,調(diào)入原

18、理圖編輯窗中。最后調(diào)出相關(guān)元件,按照圖2-1進(jìn)行連接。5將設(shè)計項目進(jìn)行時序仿真工程完成后即可進(jìn)行全程編譯。此后的所有流程都與以上介紹的方法和流程相同。圖2-10是全加器工程f_adder的仿真波形。圖2-10 全加器工程f_adder的仿真波形6選擇目標(biāo)器件并對相應(yīng)的引腳進(jìn)行鎖定,在這里所選擇的器件為altera公司cycloneII系列的EP2C35F672C8芯片,引腳鎖定方法如圖2-3所列。將未使用的引腳設(shè)置為三態(tài)輸入(一定要設(shè)置,否則可能會損壞芯片)。注意,SW1-SW3的IO電平應(yīng)設(shè)置為2.5V。表3.8 引腳鎖定方法信號引腳信號引腳信號引腳信號引腳SW1L25SW3J21binP9

19、sumR6SW2L24ainR5cinP7coutT37最后把程序下載到FPGA器件中。撥動SW1-SW3,觀察發(fā)光二極管LED1LED3、LED7、led8的狀態(tài)。五、實驗總結(jié)1總之,Verilog文本設(shè)計中可用例化語句調(diào)用原理圖構(gòu)成的元件,同樣,原理圖中也能調(diào)用文本程序構(gòu)成的元件。2總結(jié)原理圖輸入方法的要點。六、預(yù)習(xí)及思考1思考:如何實現(xiàn)頂層文件的輸入設(shè)計。2多種形式文件的輸入方法和相互調(diào)用方法。實驗三 4位加法計數(shù)器一、實驗?zāi)康膶W(xué)習(xí)計數(shù)器的設(shè)計、仿真和硬件測試,進(jìn)一步熟悉Verilog HDL的編程方法。二、實驗原理圖3-1是一個含計數(shù)使能、異步復(fù)位的4位加法計數(shù)器,圖中間是4位鎖存器;

20、rst是異步清零信號,低電平有效;clk是鎖存信號;當(dāng)ena為1時使能鎖存器。圖3-1 含計數(shù)使能、異步復(fù)位的4位加法計數(shù)器三、主要實驗設(shè)備計算機和MagicSOPC實驗箱。四、實驗內(nèi)容1啟動Quartus II 建立一個空白工程,然后命名為cnt_4b.qpf。2新建 Verilog HDL源程序文件cnt4b.v,輸入程序代碼并保存,進(jìn)行綜合編譯,若在編譯過程中發(fā)現(xiàn)錯誤,則找出并更正錯誤,直至編譯成功為止。并將cnt4b.v封裝生成cnt4b.bsf元件。程序清單 cnt4b.vmodule cnt4b(clk,rst,ena,dout,cout);/模塊名cnt4binput clk,r

21、st,ena;/輸入信號output3:0dout;/計數(shù)輸出output cout;/進(jìn)位輸出reg3:0cnt;/計數(shù)器assign cout = &cnt;/進(jìn)位輸出assign dout = cnt;/計數(shù)器輸出always (posedge clk or negedge rst)beginif(rst = 1'b0)/異步清零,低電平有效cnt <= 4'h0;else if (ena = 1'b1)/同步使能計數(shù),高電平有效cnt <= cnt + 1'b1;endendmodule3建立波形仿真文件并進(jìn)行仿真驗證。4數(shù)碼管動態(tài)驅(qū)

22、動程序dec17s.v清單module decl7s(d,seg);/模塊名decl7sinput3:0 d;/輸入4位二進(jìn)制碼output7:0seg;/七段譯碼輸出reg7:0 seg_r;/定義數(shù)碼管輸出寄存器assign seg = seg_r;/輸出數(shù)碼管譯碼結(jié)果always (d)begincase(d)/七段譯碼4'h0:seg_r = 8'hc0;/顯示04'h1:seg_r = 8'hf9;/顯示14'h2:seg_r = 8'ha4;/顯示24'h3:seg_r = 8'hb0;/顯示34'h4:seg

23、_r = 8'h99;/顯示44'h5:seg_r = 8'h92;/顯示54'h6:seg_r = 8'h82;/顯示64'h7:seg_r = 8'hf8;/顯示74'h8:seg_r = 8'h80;/顯示84'h9:seg_r = 8'h90;/顯示94'ha:seg_r = 8'h88;/顯示a4'hb:seg_r = 8'h83;/顯示b4'hc:seg_r = 8'hc6;/顯示c4'hd:seg_r = 8'ha1;/顯示d4&

24、#39;he:seg_r = 8'h86;/顯示e4'hf:seg_r = 8'h8e;/顯示fendcaseendendmodule將dec17s.v封裝生成dec17s.bsf元件。5新建圖形設(shè)計文件(頂層模塊)命名為cnt_4b.bdf并保存。其模塊原理圖如圖3-2所示。圖3-2 4位加法計數(shù)器頂層模塊6選擇目標(biāo)器件并對對應(yīng)的引腳進(jìn)行鎖定,在這里所選擇的器件為Atera公司Cyclone ll系列的EP2C35F672C8芯片,引腳鎖定方法如表3-1所列。注意ena信號是撥檔開關(guān)的輸入,I/O Bank 工作電壓是2. 5v,所在I/O電平要設(shè)置為2.5v。將未使

25、用的引腳設(shè)置為三態(tài)輸入(一定要設(shè)置,否則可能會損壞芯片)。設(shè)置方法見3.1節(jié)。表3-1 引腳鎖定方法信號引腳信號引腳信號引腳信號引腳seg0J8seg6L10dig4J3enaL25seg1M3seg7L9dig5K4Led1R5seg2K6dig0L6dig6L3Led2P9seg3J6dig1K5dig7M4Led8T7seg4U10dig2G3clock0N2seg5N9dig3G4sys_rstAC13注:ena 信號引腳輸入應(yīng)設(shè)為2.5v電平標(biāo)準(zhǔn)。7將cnt_4b.bdf 設(shè)置為頂層實體。對該工程文件進(jìn)行全程編譯處理,若在編譯過程中發(fā)現(xiàn)錯誤,則找出并更正錯誤,知道編譯成功為止。8確保

26、數(shù)字信號源(B4 區(qū)域)的JP11的短路帽是處于ON位置,JP7中CLOCK0的短路帽處于4Hz位置;最后把程序下載到FPGA 器件中。撥動撥動開關(guān)SW1,按SYS_RST按鍵,觀察數(shù)碼管和發(fā)光二極管的狀態(tài),是否與設(shè)計想符合。五、實驗總結(jié)1文本文件生成原理圖元件的方法及其元件調(diào)用。2多個源文件如何進(jìn)行管理,放在同一個項目的文件夾下。六、預(yù)習(xí)及思考1帶異步復(fù)位的4位加法計數(shù)器程序always (posedge clock or negedge rst_n)beginif(!rst_n)cnt<=4d0;elsecnt<= cnt +4d1;end帶異步復(fù)位的4位加法計數(shù)器RTL圖如圖

27、3-3所示。2帶同步復(fù)位的4位加法計數(shù)器程序always (posedge clock)beginif(!rst_n)cnt<=4d0;elsecnt<= cnt +4d1;end帶同步復(fù)位的4位加法計數(shù)器RTL圖如圖3-4所示。 圖3-3 帶異步復(fù)位4位加法計數(shù)器RTL圖 圖3-4 帶同步復(fù)位4位加法計數(shù)器RTL圖實驗四 數(shù)字時鐘設(shè)計一、實驗?zāi)康膶W(xué)習(xí)數(shù)字時鐘的硬件設(shè)計。二、實驗原理一個完整的時鐘應(yīng)由3部分組成:秒脈沖發(fā)生電路、計數(shù)顯示部分和時鐘調(diào)整部分。一個時鐘的準(zhǔn)確與否主要取決于秒時鐘的精確度。為了保證計時準(zhǔn)確對系統(tǒng)時鐘50MHz進(jìn)行了50000000分頻,從而得到了1Hz的秒

28、脈沖,至于顯示部分與LED數(shù)碼管原理相同,而校對電路用戶可以自由發(fā)揮,如定義3個鍵keystart、keymon、keyadd,分別用于控制時鐘的計時開始、調(diào)整功能選擇和加1處理,從而完成對現(xiàn)在時間的調(diào)整。本實驗的校時電路在此僅僅完成了暫停、清零等基本功能。三、主要實驗設(shè)備計算機和MagicSOPC實驗箱。四、實驗內(nèi)容1在QuartusII中建立了工程項目文件clock.qpf,并在該項 目下新建VerilogHDL源程序文件clock.v輸入程序代碼并保存。完整的VerilogHDL程序參考清單3.18.2FPGA的I/O管腳分配見表4-1。注意,時鐘信號應(yīng)選擇clk,而不是clock。表4

29、-1 引腳鎖定方法信號引腳信號引腳信號引腳信號引腳seg0J8dig1K5Led2P7key3P1seg1M3dig2G3Led3P6key4AD13seg2K6dig3G4Led4P3key5AF14seg3J6dig4J3Led5R8key6P25seg4U10dig5K4Led6R6key7P26seg5N9dig6L3Led7T7clock/clkB13seg6L10dig7M4key0C13clock0N2seg7L9Led0R5key1 D13foutF18dig0L6Led1P9key2N13對該工程文件進(jìn)行全程編輯處理,若在編輯過程中發(fā)現(xiàn)錯誤,則找出并更改錯誤,直至編譯成功為止

30、。程序清單:clock.vmodule clock(clk,key,dig,seg);/模塊名clockinput clk;/輸入時鐘input1:0 key;/輸入按鍵output7:0dig;/數(shù)碼管選擇輸出引腳output7:0 seg;/數(shù)碼管段輸出引腳reg7:0 seg_r;/定義數(shù)碼管輸出寄存器reg7:0 dig_r;/定義數(shù)碼管選擇輸出寄存器reg3:0 disp_dat;/定義顯示數(shù)據(jù)寄存器reg24:0count;/定義計數(shù)寄存器reg23:0hour;/定義現(xiàn)在時刻寄存器reg sec,keyen;/定義標(biāo)志位reg1:0dout1,dout2,dout3;/寄存器wi

31、re1:0key_done;/按鍵消抖輸出assign dig = dig_r;/輸出數(shù)碼管選擇assign seg = seg_r;/輸出數(shù)碼管譯碼結(jié)果/秒信號產(chǎn)生部分always (posedge clk) /定義clock上升沿觸發(fā)begincount = count + 1'b1;if(count = 25'd25000000)/0.5S到了嗎?begincount = 25'd0;/計數(shù)器清零sec = sec;/置位秒標(biāo)志endend/按鍵消抖處理部分assign key_done = (dout1 | dout2 | dout3);/按鍵消抖輸出alway

32、s (posedge count17)begindout1 <= key;dout2 <= dout1;dout3 <= dout2;endalways (negedge key_done0)beginkeyen = keyen;/將琴鍵開關(guān)轉(zhuǎn)換為乒乓開關(guān)end/數(shù)碼管動態(tài)掃描顯示部分always (posedge clk) /count17:15大約1ms改變一次begincase(count17:15)/選擇掃描顯示數(shù)據(jù)3'd0:disp_dat = hour3:0;/秒個位3'd1:disp_dat = hour7:4;/秒十位3'd2:disp

33、_dat = 4'ha;/顯示"-"3'd3:disp_dat = hour11:8;/分個位3'd4:disp_dat = hour15:12;/分十位3'd5:disp_dat = 4'ha;/顯示"-"3'd6:disp_dat = hour19:16;/時個位3'd7:disp_dat = hour23:20;/時十位endcasecase(count17:15)/選擇數(shù)碼管顯示位3'd0:dig_r = 8'b11111110;/選擇第一個數(shù)碼管顯示3'd1:dig

34、_r = 8'b11111101;/選擇第二個數(shù)碼管顯示3'd2:dig_r = 8'b11111011;/選擇第三個數(shù)碼管顯示3'd3:dig_r = 8'b11110111;/選擇第四個數(shù)碼管顯示3'd4:dig_r = 8'b11101111;/選擇第五個數(shù)碼管顯示3'd5:dig_r = 8'b11011111;/選擇第六個數(shù)碼管顯示3'd6:dig_r = 8'b10111111;/選擇第七個數(shù)碼管顯示3'd7:dig_r = 8'b01111111;/選擇第八個數(shù)碼管顯示endc

35、aseendalways (posedge clk)begincase(disp_dat)4'h0:seg_r = 8'hc0;/顯示04'h1:seg_r = 8'hf9;/顯示14'h2:seg_r = 8'ha4;/顯示24'h3:seg_r = 8'hb0;/顯示34'h4:seg_r = 8'h99;/顯示44'h5:seg_r = 8'h92;/顯示54'h6:seg_r = 8'h82;/顯示64'h7:seg_r = 8'hf8;/顯示74'h

36、8:seg_r = 8'h80;/顯示84'h9:seg_r = 8'h90;/顯示94'ha:seg_r = 8'hbf;/顯示-default:seg_r = 8'hff;/不顯示endcaseif(count17:15= 3'd2)&sec)seg_r = 8'hff;end/計時處理部分always (negedge sec or negedge key_done1)/計時處理beginif(!key_done1)/是清零鍵嗎?beginhour = 24'h0;/是,則清零endelse if(!keye

37、n)beginhour3:0 = hour3:0 + 1'b1;/秒加1if(hour3:0 = 4'ha)beginhour3:0 = 4'h0;hour7:4 = hour7:4 + 1'b1;/秒的十位加一if(hour7:4 = 4'h6)beginhour7:4 = 4'h0;hour11:8 = hour11:8 + 1'b1;/分個位加一if(hour11:8 = 4'ha)beginhour11:8 = 4'h0;hour15:12 = hour15:12 + 1'b1;/分十位加一if(hour1

38、5:12 = 4'h6)beginhour15:12 = 4'h0;hour19:16 = hour19:16 + 1'b1;/時個位加一if(hour19:16 = 4'ha)beginhour19:16 = 4'h0;hour23:20 = hour23:20 + 1'b1;/時十位加一endif(hour23:16 = 8'h24)hour23:16 = 8'h0;endendendendend endendmodule4把程序下載到FPGA器件中,觀察數(shù)碼管的顯示狀態(tài)。按下按鍵KEY1、KEY2觀察數(shù)字鐘的時間有什么變化。

39、五、實驗總結(jié)1提高計時準(zhǔn)確度的方法,關(guān)鍵是1秒時間的準(zhǔn)確度。2時鐘信號應(yīng)選擇clk(與圖4-1中的SYS_CLK_50M相連),即鎖定引腳為B13,而不是CLOCK0、CLOCK1、CLOCK2、CLOCK3。如圖4-1所示。圖4-1 系統(tǒng)時鐘電路六、預(yù)習(xí)及思考自己動手把校時功能添加進(jìn)去試試看。實驗五 交通燈控制器一、實驗?zāi)康膶W(xué)習(xí)交通燈控制器的設(shè)計,學(xué)習(xí)簡單狀態(tài)機的設(shè)計和硬件測試。二、實驗原理本實驗設(shè)計的交通燈控制器要求實現(xiàn)對A、B兩個方向的紅、綠、黃三種燈的控制,并能實現(xiàn)時間顯示的倒計時。因此每個方向的燈可以用一個狀態(tài)機實現(xiàn),狀態(tài)的跳轉(zhuǎn)順序為紅燈-綠燈-黃燈-紅燈(另一個的狀態(tài)應(yīng)為綠-黃-紅

40、-綠),同時設(shè)計一個計時器,來記錄每種燈的倒計時時間。最后將交通燈的狀態(tài)信息輸出,至數(shù)碼管顯示模塊和交通燈顯示模塊。注意一個方向的紅燈時間應(yīng)和另一個方向的綠黃燈時間總和相等。三、主要實驗設(shè)備計算機和MagicSOPC實驗箱。四、實驗內(nèi)容1啟動QuartusII建立一個空白工程,然后命名為traffic-top.qpf。2新建Verilog HDL源程序文件traffic.v、traffic_test、traffic_top.v,輸入程序代碼并保存,對各個HDL文件進(jìn)行綜合編譯,若在編譯過程中發(fā)現(xiàn)錯誤,則找出并更改錯誤,直至編譯成功為止。程序清單:交通燈程序。(1)交通燈控制器,文件traffi

41、c.v,本模塊實現(xiàn)交通燈控制器的邏輯功能。module traffic(clock,rst_n,clken,lampa,lampb,acount,bcount);inputclock;/系統(tǒng)時鐘50MHzinput rst_n;/同步復(fù)位信號,低電平有效inputclken;/時鐘使能信號:1Hz。output2:0lampa;/控制A方向三盞燈的亮滅;其中l(wèi)ampa2:0分/別控制A方向的綠燈、黃燈、紅燈(低電平燈亮)output2:0lampb;/控制B方向三盞燈的亮滅;其中l(wèi)ampb2:0分/別控制B方向的綠燈、黃燈、紅燈(低電平燈亮)output7:0acount;/用于A方向燈的時間

42、顯示,8位BCD碼輸出output7:0bcount;/用于B方向燈的時間顯示,8位BCD碼輸出reg2:0 lampa,lampb;reg7:0 numa,numb;/時間計數(shù)器reg tempa,tempb;/防重進(jìn)入標(biāo)志reg2:0 StateA,StateB;/A、B方向燈控制狀態(tài)機的狀態(tài)/設(shè)置各種燈的計數(shù)器的預(yù)置數(shù)parameter ared=8'h30,/30秒ayellow=8'h5,/5秒agreen=8'h15,/15秒bred=8'h20,/20秒byellow=8'h5,/5秒bgreen=8'h25;/25秒assign

43、acount=numa;assign bcount=numb;/控制A方向的三種燈always (posedge clock or negedge rst_n)beginif(!rst_n)beginStateA <= 3'h0; lampa <= 3'b011;tempa <= 1'b0;endelse if(clken)beginif(!tempa)begintempa <= 1'b1;/防重進(jìn)入標(biāo)志case(StateA)/控制亮燈的順序0: begin numa <= agreen;lampa <= 3'b01

44、1;StateA <= 1; end1: begin numa <= ayellow;lampa <= 3'b101;StateA <= 2; end2: begin numa <= ared;lampa <= 3'b110; StateA <= 0; enddefault:lampa <= 3'b110;endcaseendelsebegin /倒計時if(numa>1)if(numa3:0=0) begin numa3:0<=4'h9; numa7:4<=numa7:4-4'h1; e

45、ndelse numa3:0<=numa3:0-4'h1; if (numa=2) tempa<=1'b0;endendend/控制A方向的三種燈always (posedge clock or negedge rst_n)beginif(!rst_n)beginlampb<=3'b110;StateB<=3'h0;tempb<=1'b0; endelse if (clken)begin if(!tempb) begin tempb<=1'b1;/防重進(jìn)入標(biāo)志 case (StateB)/控制亮燈的順序0: b

46、egin numb<=bred;lampb<=3'b110;StateB<=1; end1: begin numb<=bgreen;lampb<=3'b011;StateB<=2; end2: begin numb<=byellow;lampb<=3'b101;StateB<=0; enddefault:lampb<=3'b110; endcase end else begin/倒計時 if(numb>1) if(numb3:0=0) beginnumb3:0<=4'h9; numb

47、7:4<=numb7:4-4'h1;endelse numb3:0<=numb3:0-4'h1;if(numb=2)tempb <= 1'b0; end endendendmodule(2)顯示控制程序,文件名為traffic.v,功能:顯示交通燈時間,并產(chǎn)生1Hz時鐘使能信號。module traffic_test(clock,clken,rst_n,acount,bcount,seg,dig);inputclock;/系統(tǒng)時鐘(50MHz)inputrst_n;outputclken;input7:0acount;input7:0bcount;ou

48、tput7:0seg;/數(shù)碼管段碼輸出output7:0dig;/數(shù)碼管位碼輸出/I/O寄存器reg7:0seg;reg7:0dig;/內(nèi)部寄存器reg25:0clk_cnt;reg16:0count;/時鐘分頻計數(shù)器reg1:0 cnt;/數(shù)碼管掃描計數(shù)器reg3:0disp_dat;/數(shù)碼管掃描顯存wire div_clk;/分頻時鐘/產(chǎn)生1Hz時鐘使能信號always (posedge clock)beginif(clken)clk_cnt <= 26'h0;elseclk_cnt <= clk_cnt + 26'h1;endassign clken = (c

49、lk_cnt >= 26'd49999999);/時鐘分頻進(jìn)程,用于數(shù)碼管掃描顯示always (posedge clock)begincount <= count + 1'b1;endassign div_clk = &count;/數(shù)碼管掃描顯示部分always (posedge clock) beginif(div_clk)cnt <= cnt + 1'b1;endalways (posedge clock) beginif(div_clk)begincase(cnt)/選擇掃描顯示數(shù)據(jù)2'd0:disp_dat <= ac

50、ount7:4;/第一個數(shù)碼管2'd1:disp_dat <= acount3:0;/第二個數(shù)碼管2'd2:disp_dat <= bcount7:4;/第五個數(shù)碼管2'd3:disp_dat <= bcount3:0;/第六個數(shù)碼管endcasecase(cnt)/選擇數(shù)碼管顯示位2'd0:dig <= 8'b01111111;/選擇第一個數(shù)碼管顯示2'd1:dig <= 8'b10111111;/選擇第二個數(shù)碼管顯示2'd2:dig <= 8'b11110111;/選擇第五個數(shù)碼管顯示2'd3:dig <= 8'b11111011;/選擇第六個數(shù)碼管顯示endcaseendendalways (disp_dat)begincase(disp_dat)/七段譯碼4'h0:s

溫馨提示

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

最新文檔

評論

0/150

提交評論