數(shù)字系統(tǒng)設(shè)計練習(xí)_第1頁
數(shù)字系統(tǒng)設(shè)計練習(xí)_第2頁
數(shù)字系統(tǒng)設(shè)計練習(xí)_第3頁
數(shù)字系統(tǒng)設(shè)計練習(xí)_第4頁
數(shù)字系統(tǒng)設(shè)計練習(xí)_第5頁
已閱讀5頁,還剩172頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 第第6章數(shù)字系統(tǒng)設(shè)計練習(xí)章數(shù)字系統(tǒng)設(shè)計練習(xí) 6.1 開關(guān)、開關(guān)、LED燈及多路復(fù)用器燈及多路復(fù)用器 6.2 二進制與二進制與BCD碼的轉(zhuǎn)換及顯示碼的轉(zhuǎn)換及顯示 6.3 無符號數(shù)乘法器無符號數(shù)乘法器 6.4 鎖存器和觸發(fā)器鎖存器和觸發(fā)器 6.5 計數(shù)器計數(shù)器 6.6 時鐘與定時器時鐘與定時器 6.7 有限狀態(tài)機有限狀態(tài)機 6.8 存儲器塊存儲器塊 6.9 簡單的處理器簡單的處理器 6.10 增強型處理器增強型處理器 第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 6.1 開關(guān)、開關(guān)、LED燈及多路復(fù)用器燈及多路復(fù)用器6.1.1 將輸入將輸入/輸出器件連接到輸出器件連接到FPGA上上DE2平臺

2、上提供了18個波段開關(guān),可以作為電路的輸入,表示為SW17SW0;還有18個紅色LED,表示為LEDR17LEDR0,可以作為輸出顯示之用。使用紅色LED顯示波段開關(guān)狀態(tài)的電路可以用Verilog語言簡單地實現(xiàn),代碼如下:assign LEDR17 = SW17;assign LEDR16 = SW16;assign LEDR0 = SW0;第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 由于分別有18個紅色LED和18個波段開關(guān),因此在Verilog語言中可以很方便地用向量表示它們,進而可用一個賦值語句完成同樣的功能。DE2平臺上,LEDR17LEDR0和SW17SW0是與FPGA管腳直接相連的,使用這些管腳之前

3、應(yīng)參照本書附錄B或DE2用戶手冊中DE2平臺的引腳分配表,分配連接波段開關(guān)和LEDR的FPGA管腳,例如SW0連接在FPGA的N25腳,LEDR0連接在FPGA的AE23腳。最簡單的做法是在Quartus中導(dǎo)入DE2_pin_assignments.csv,導(dǎo)入方法參見本書2.10.3小節(jié)。第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 為保證從DE2_pin_assignments.csv導(dǎo)入的引腳分配表能夠正確使用,在Verilog模塊中使用到的引腳名稱必須與該文件中的完全一致,DE2_pin_assignments.csv中用SW0SW17和LEDR0LEDR17分別表示18個波段開關(guān)和18個紅色LED燈,因

4、此在編寫的Verilog代碼中也必須用這種方式來表示。用向量實現(xiàn)波段開關(guān)與紅色LED相連的模塊代碼如代碼6.1所示。第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 代碼6.1 將波段開關(guān)與紅色LED相連的Verilog代碼。module part1 (SW, LEDR);input 17:0 SW; /波段開關(guān)output 17:0 LEDR; /紅色LEDassign LEDR = SW;endmodule第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 請按照以下步驟在DE2上實現(xiàn)代碼6.1并進行測試:(1) 新建一個Quartus工程,用以在DE2平臺上實現(xiàn)所要求的電路,將FPGA器件設(shè)置為EP2C35F672C6。(2) 建立一個

5、Verilog文件,其內(nèi)容如代碼6.1所示,將該Verilog文件添加到工程中并編譯整個工程。(3) 導(dǎo)入DE2_pin_assignments.csv中的引腳分配或參照附錄B中DE2平臺的引腳分配表,分配連接波段開關(guān)和紅色LED的FPGA管腳。(4) 編譯該工程,完成后下載到FPGA中。(5) 通過撥動波段開關(guān)并觀察紅色LED的變化來驗證所設(shè)計的功能是否正確。第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 6.1.2 2選選1多路復(fù)用器多路復(fù)用器 圖6.1(a)是一個2選1多路復(fù)用器電路,如果s=1,則輸出m=y;如果s=0,則輸出m=x。圖6.1(b)是這個電路的真值表。圖6.1(c)是該電路的符號表示。第6章

6、 數(shù)字系統(tǒng)設(shè)計練習(xí) 圖6.1 最簡單的多路復(fù)用器 第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 這個多路復(fù)用器可以用以下的Verilog語句來實現(xiàn):assign m = ( s & x) | (s & y);這部分練習(xí)的任務(wù)是實現(xiàn)如圖6.2(a)所示的8位2選1多路復(fù)用電路,需要用8個賦值語句。該多路復(fù)用器的輸入為X和Y,都是8位寬,輸出M也為8位寬。如果s=0,M=X;如果s=1,則M=Y。圖6.2(b)是該電路的符號表示。2選1多路復(fù)用器電路的具體實現(xiàn)步驟如下:(1) 新建一個Quartus工程,用以在DE2平臺上實現(xiàn)所要求的電路。第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) (2) 建立一個Verilog文件,

7、用SW17作為輸入s,以SW7SW0作為輸入X,以SW15SW8作為輸入Y,將波段開關(guān)與紅色LED連接以顯示其狀態(tài),用綠色LED即LEDG7LEDG0作為輸出M,將該Verilog文件添加到工程中。(3) 導(dǎo)入DE2_pin_assignments.csv中的引腳分配或參照附錄B中DE2平臺的引腳分配表,分配連接波段開關(guān)、紅色LED以及綠色LED的FPGA管腳。(4) 編譯工程,完成后下載到FPGA中。(5) 撥動波段開關(guān)并觀察紅色LED與綠色LED的變化,以驗證8位2選1多路復(fù)用器的功能是否正確。第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 圖6.2 8位2選1多路復(fù)用器 第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 6.1.3

8、3位寬位寬5選選1多路復(fù)用器多路復(fù)用器與圖6.2(a)所示的2選1多路復(fù)用器不同,圖6.3(a)所示電路的任務(wù)是實現(xiàn)一個5選1的多路復(fù)用器,即從5個輸入x、y、w、u和v中選取一個輸出到m。這個電路采用了4個2選1多路復(fù)用器來實現(xiàn),輸出選擇用一個3位的輸入s2s1s0實現(xiàn),該電路的符號表示如圖6.3(b)所示,表6.1為該5選1多路復(fù)用器的真值表。第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 圖6.3 5選1多路復(fù)用器 第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 表 6.1 5 選 1 多路復(fù)用器的真值表 s2 s1 s0 m 0 0 0 0 1 1 1 1 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 1 u v

9、w x y y y y 第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 圖6.4實現(xiàn)了一個3位5選1多路復(fù)用器,這個電路中包含了3個圖6.3(a)所示的電路。請按照以下步驟實現(xiàn)3位5選1多路復(fù)用器:(1) 新建一個Quartus工程,用以在DE2平臺上實現(xiàn)所要求的電路。(2) 建立一個Verilog文件,用SW17SW15作為選擇端輸入s2s1s0,用剩下的15個波段開關(guān)SW14SW0作為輸入U、V、W、X、Y,將波段開關(guān)與紅色LED連接以顯示波段開關(guān)的狀態(tài),用綠色LED即LEDG2LEDG0作為輸出M,將該Verilog文件添加到工程中。第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 圖6.4 3位5選1多路復(fù)用器 第6章 數(shù)字系統(tǒng)設(shè)

10、計練習(xí) (3) 導(dǎo)入DE2_pin_assignments.csv中的引腳分配或參照附錄B中DE2平臺的引腳分配表,分配連接波段開關(guān)、紅色LED以及綠色LED的FPGA管腳。(4) 編譯工程,完成后下載到FPGA中。(5) 撥動波段開關(guān)并觀察紅色LED和綠色LED的變化,以驗證3位5選1多路復(fù)用器的功能是否正確,確定從U到Y(jié)的所有輸入都能夠被選擇輸出到M。 第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 6.1.4 用七段數(shù)碼管顯示簡單字符用七段數(shù)碼管顯示簡單字符圖6.5所示是一個簡單的七段解碼器模塊,c2c1c0是解碼器的3個輸入,用c2c1c0的不同取值來選擇在七段數(shù)碼管上輸出不同的字符。七段數(shù)碼管上的不同段位

11、用數(shù)字06表示。注意七段數(shù)碼管是共陽極的。表6.2列出了c2c1c0取不同值時數(shù)碼管上輸出的字符。本例中只輸出4個字符,當(dāng)c2c1c0取值為100111時,輸出空格。第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 圖6.5 七段解碼器第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 表 6.2 字 符 編 碼 c2 c1 c0 輸出字符 0 0 0 0 1 1 1 1 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 1 H E L O 第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 請按照以下步驟實現(xiàn)七段解碼器電路:(1) 新建一個Quartus工程,用以在DE2平臺上實現(xiàn)所要求的電路。(2) 建立一個Verilog文件,實現(xiàn)七段解碼器電路,用SW

12、2SW0作為輸入c2c0,DE2平臺上的數(shù)碼管分別為HEX0HEX7,輸出接HEX0,在Verilog中用以下語句定義端口:output 0:6 HEX0;(3) 導(dǎo)入DE2_pin_assignments.csv中的引腳分配或參照附錄B中DE2平臺的引腳分配表分配引腳。(4) 編譯工程,完成后下載到FPGA中。(5) 撥動波段開關(guān)并觀察七段數(shù)碼管HEX0的顯示,以驗證設(shè)計的功能是否正確。第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 6.1.5 循環(huán)顯示循環(huán)顯示5個字符個字符圖6.6中的電路采用了一個3位5選1多路復(fù)用電路,可分別從輸入的5個字符中選擇1個字符并通過七段解碼器電路在數(shù)碼管上顯示H、E、L、O和空格

13、中的任一字符。將SW14SW0分為5組,分別代表H、E、L、O和空格等5個字符,用SW17SW15來選擇要顯示的字符。第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 圖6.6 循環(huán)顯示5個字符的電路 第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 代碼6.2是實現(xiàn)這個電路的代碼大綱,其中部分代碼省略,被省略掉的代碼是前文練習(xí)中編寫過的。在這個電路中我們將6.1.3小節(jié)和6.1.4小節(jié)中的電路作為子電路。對代碼6.2中的代碼進行擴展后,可以用5個數(shù)碼管顯示,當(dāng)改變SW17SW15的狀態(tài)時,最終顯示的內(nèi)容與SW17SW15的對應(yīng)關(guān)系如表6.3所示,即可以循環(huán)顯示單詞“HELLO”。第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 代碼6.2 圖6.6所示電路的Ve

14、rilog代碼。module part5 (SW, HEX0);input 17:0 SW; /聲明波段開關(guān)output 0:6 HEX0; /聲明七段數(shù)碼管wire 2:0 M;mux_3bit_5to1 M0 (SW17:15, SW14:12, SW11:9, SW8:6, SW5:3, SW2:0, M);char 7seg H0 (M, HEX0);endmodule第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) /實現(xiàn)一個3位5選1多路復(fù)用器module mux_3bit_5to1 (S, U, V, W, X, Y, M);input 2:0 S, U, V, W, X, Y;output 2:0 M

15、;endmodule/實現(xiàn)一個H、E、L、O和空格的5字符七段解碼器module char_7seg (C, Display);input 2:0 C; /輸入碼output 0:6 Display; / 輸出碼 Endmodule第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 表 6.3 SW17SW15 與顯示內(nèi)容的對應(yīng)關(guān)系 SW17 SW16 SW15 HEX4 HEX3 HEX2 HEX1 HEX0 0 0 0 H E L L O 0 0 1 E L L O H 0 1 0 L L O H E 0 1 1 L O H E L 1 0 0 O H E L L 第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 請按照以下步驟實現(xiàn)“HE

16、LLO”的循環(huán)顯示電路:(1) 新建一個Quartus工程,用以在DE2平臺上實現(xiàn)所要求的電路。(2) 建立一個Verilog文件,用SW17SW15作為5個3位5選1多路復(fù)用器的選擇輸入,按照表6.3的對應(yīng)關(guān)系,將SW14SW0連接到每個多路復(fù)用器實例的輸入端,將5個多路復(fù)用器的輸出接到5個七段數(shù)碼管HEX4HEX0上,將Verilog文件添加到工程中來。(3) 導(dǎo)入DE2_pin_assignments.csv中的引腳分配或參照附錄B中DE2平臺的引腳分配表,分配引腳。(4) 編譯工程,完成后下載到FPGA中。(5) 先按表6.3設(shè)置好SW14SW0的位置,然后改變波段開關(guān)SW17SW15

17、的位置,觀察顯示是否正確。第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 6.1.6 循環(huán)顯示循環(huán)顯示8個字符個字符在6.1.5小節(jié)的基礎(chǔ)上,把5個字符擴展到8個字符,如果顯示內(nèi)容少于8個,比如顯示“HELLO”,則數(shù)碼管顯示輸出與SW17SW15的對應(yīng)關(guān)系如表6.4所示。第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 表 6.4 “HELLO”在 8 個數(shù)碼管上的循環(huán)顯示 SW17 SW16 SW15 HEX7 HEX6 HEX5 HEX4 HEX3 HEX2 HEX1 HEX0 0 0 0 H E L L O 0 0 1 H E L L O 0 1 0 H E L L O 0 1 1 H E L L O 1 0 0 E L L O

18、H 1 0 1 L L O H E 1 1 0 L O H E L 1 1 1 O H E L L 第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 請按照以下步驟實現(xiàn)“HELLO”的循環(huán)顯示電路:(1) 新建一個Quartus工程,用以在DE2平臺上實現(xiàn)所要求的電路。(2) 建立一個Verilog文件,這里會用到8個5選1多路復(fù)用器的電路,用SW17SW15作為8個3位5選1多路復(fù)用器的選擇輸入,按照表6.4的對應(yīng)關(guān)系,將SW14SW0連接到每個多路復(fù)用器電路的輸入端(有些多路復(fù)用器的輸入會是空格),將8個多路復(fù)用器的輸出接到8個七段數(shù)碼管HEX7HEX0上,將Verilog文件添加到工程文件中來。(3) 導(dǎo)入DE

19、2_pin_assignments.csv中的引腳分配或參照附錄B中DE2平臺的引腳分配表,分配引腳。(4) 編譯工程,完成后下載到FPGA中。(5) 先按表6.4設(shè)置好SW14SW0的位置,然后改變波段開關(guān)SW17SW15的位置,觀察循環(huán)顯示是否正確。第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 6.2 二進制與二進制與BCD碼的轉(zhuǎn)換及顯示碼的轉(zhuǎn)換及顯示6.2.1 二進制數(shù)字的顯示二進制數(shù)字的顯示在HEX3HEX0上顯示SW15SW0所對應(yīng)的數(shù)值,SW15SW12、SW11SW8、SW7SW4和SW3SW0分別對應(yīng)HEX3、HEX2、HEX1和HEX0。在數(shù)碼管上只顯示數(shù)字09,當(dāng)波段開關(guān)表示的數(shù)字在10101

20、111之間時,沒有顯示輸出。第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 顯示二進制數(shù)字的具體步驟如下:(1) 新建一個Quartus工程,用以在DE2平臺上實現(xiàn)所要求的電路。(2) 建立一個Verilog文件,實現(xiàn)要求的任務(wù),本練習(xí)的目的是手工推導(dǎo)出數(shù)碼管顯示的邏輯函數(shù),因此要求只能用assign語句和布爾表達(dá)式實現(xiàn)所有的功能。(3) 導(dǎo)入DE2_pin_assignments.csv中的引腳分配或參照附錄B中DE2平臺的引腳分配表,分配引腳。(4) 編譯工程,完成后下載到FPGA中。(5) 改變SW15SW0的位置,觀察顯示是否正確。第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 6.2.2 二進制值到十進制值的轉(zhuǎn)換二進制值到十進

21、制值的轉(zhuǎn)換若將4位二進制輸入v3v2v1v0轉(zhuǎn)換成2位十進制的等價表示D=d1d0,在HEX1和HEX0上分別顯示d1和d0,則輸入的二進制值與輸出的十進制值之間的對應(yīng)關(guān)系如表6.5所示。圖6.7是實現(xiàn)這個任務(wù)的部分電路,比較器判斷V是否大于9,比較器的輸出z可以控制數(shù)碼管的顯示。二進制值轉(zhuǎn)換為十進制值的步驟如下:(1) 新建一個Quartus工程,用以在DE2平臺上實現(xiàn)所要求的電路。(2) 建立一個Verilog模塊,包括電路中的比較器、多路復(fù)用器和電路B,但不包括電路A和七段解碼器。這個模塊的輸入為4位二進制數(shù)V,輸出是z和4位的M。與6.2.1小節(jié)的要求一樣,編寫這個模塊時只能用assi

22、gn語句和布爾表達(dá)式實現(xiàn)所要求的功能,而不能出現(xiàn)if-else和case等語句。第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 表 6.5 二進制值與十進制值的轉(zhuǎn)換關(guān)系 v3 v2 v1 0v d1 d0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 2 0 0 1 1 0 3 0 1 0 0 0 4 0 1 0 1 0 5 0 1 1 0 0 6 0 1 1 1 0 7 1 0 0 0 0 8 1 0 0 1 0 9 1 0 1 0 1 0 1 0 1 1 1 1 1 1 0 0 1 2 1 1 0 1 1 3 1 1 1 0 1 4 1 1 1 1 1 5 第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 圖6.

23、7 顯示二進制數(shù)值的電路 第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 6.2.3 并行加法器并行加法器 全加器的電路如圖6.8(a)所示,輸入為a、b和ci,輸出為s和co;圖6.8(b)是該電路的符號表示。表6.6是全加器的真值表。全加器實現(xiàn)了二進制加法,其輸出為一個2位的二進制和:cos=a+b+ci。用4個全加器模塊的電路可以實現(xiàn)4位二進制數(shù)的加法,如圖6.8(c)所示,這種加法電路一般稱為并行加法器。第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 圖6.8 全加器及并行加法器(a) 全加器電路;(b) 全加器電路符號;(c) 并行加法器電路第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 表 6.6 全加器的真值表 b a ci co s 0 0

24、0 0 0 0 0 1 0 1 0 1 0 0 1 0 1 1 1 0 1 0 0 0 1 1 0 1 1 0 1 1 0 1 0 1 1 1 1 1 第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 實現(xiàn)并行加法器電路的步驟如下:(1) 為并行加法器建立一個Quartus工程文件。(2) 用Verilog編寫一個全加器電路模塊,然后用4個全加器電路來實現(xiàn)并行加法器電路。(3) 分別用SW7SW4和SW3SW0代表輸入A和B,使用SW8代表加法器的進位輸入ci,將SW8SW0直接連接到LEDR8LEDR0上,而將加法器的輸出co和S連接到LEDG4LEDG0上,將代碼添加到工程中。(4) 導(dǎo)入DE2_pin_assi

25、gnments.csv中的引腳分配或參照附錄B中DE2平臺的引腳分配表,分配引腳。(5) 編譯工程,完成后下載到FPGA中。(6) 改變輸入A、B和ci的值,觀察計算結(jié)果是否正確。第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 6.2.4 1位位BCD加法器加法器在6.2.2小節(jié)的練習(xí)中,將二進制數(shù)轉(zhuǎn)換成十進制數(shù),而在有些場合,我們需要用二進制數(shù)表示十進制數(shù),就是將十進制數(shù)的每一位用4位二進制數(shù)來表示,比如將十進制數(shù)59表示為二進制數(shù)0101 1001。這種用4位二進制數(shù)表示十進制數(shù)的編碼,稱為BCD碼。本節(jié)練習(xí)的任務(wù)是實現(xiàn)BCD碼的加法,輸入為兩個BCD碼A和B以及1位的進位輸入,輸出是和的BCD碼S1S0。這個

26、電路能夠處理的和的最大值為S1S0=9+9+1=19。請按照以下步驟完成練習(xí):(1) 為BCD加法器新建一個Quartus工程。第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) (2) 建立一個Verilog文件,實現(xiàn)要求的任務(wù)。先用6.2.3小節(jié)中完成的加法器實現(xiàn)4位二進制加法,輸出為A+B的4位和S1S0及進位位輸出c,然后再設(shè)計一個二進制到十進制的轉(zhuǎn)換電路,這個電路類似于6.2.2小節(jié)中完成的電路,注意最大輸出為19。編寫這個模塊時只能用assign語句和布爾表達(dá)式實現(xiàn)所要求的功能,而不能出現(xiàn)if-else和case等語句。(3) 將編寫好的Verilog文件添加到工程中,導(dǎo)入DE2_pin_ assignme

27、nts.csv中的引腳分配或參照附錄B中DE2平臺的引腳分配表,分配引腳。(4) 編譯工程,完成后下載到FPGA中。(5) 輸入不同的A、B和ci,驗證輸出S是否正確。第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 6.2.5 2位位BCD加法器加法器若設(shè)計一個2位BCD加法器,計算兩個2位BCD碼A1A0和B1B0的和,輸出為3位BCD碼S2S1S0,則可以用兩個1位BCD加法器來實現(xiàn)本電路。請按照以下步驟完成練習(xí):(1) 用SW15SW8和SW7SW0分別表示兩個BCD碼輸入A1A0和B1B0,A1A0的值顯示在數(shù)碼管HEX7和HEX6上,B1B0的值顯示在數(shù)碼管HEX5和HEX4上,S2S1S0顯示在數(shù)碼管H

28、EX2HEX0上。(2) 分配引腳。(3) 編譯工程,完成后下載到FPGA中。(4) 輸入不同的A1A0和B1B0的值,驗證輸出S2S1S0是否正確。第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 6.2.6 2位位BCD加法器的另一種實現(xiàn)加法器的另一種實現(xiàn)在6.2.5小節(jié)的練習(xí)中,通過調(diào)用兩個1位BCD加法器實現(xiàn)了一個2位BCD加法器。在本節(jié)練習(xí)中,我們按代碼6.3所示的用偽代碼描述的算法重新設(shè)計一個2位BCD加法器。代碼6.3 實現(xiàn)2位BCD加法器的偽代碼。1 T0 = A0 + B02 if(T0 9) then3 Z0 = 10;4 c1 = 1;5 else6 Z0 = 0;7 c1 = 0;8 end

29、if第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 9 S0 = T0 Z010 T1 = A1 + B1 + c111 if (T1 9) then12 Z1 = 10;13 c2 = 1;14 else15 Z1 = 0;16 c2 = 0;17 end if18 S1 = T1 Z119 S2 = c2第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 這個偽代碼用電路實現(xiàn)起來很容易,第1、9、10和18行可用加法器實現(xiàn),第28行及第1117行是多路復(fù)用器,可以用比較器判斷T09和T19。用Verilog代碼實現(xiàn)這段偽代碼時,注意第9行和第18行的減法可以用加法實現(xiàn)。該偽代碼中使用了if-else結(jié)構(gòu)以及“”及“+”等運算,比實際的電

30、路要抽象一些,其目的是讓Verilog編譯器去決定具體電路的實現(xiàn)。第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 請按照以下步驟完成練習(xí):(1) 建立新的Quartus工程,所有的輸入、輸出以及顯示都與6.2.5小節(jié)中的練習(xí)相同,參照代碼6.3所示的偽代碼編寫一個Verilog文件,并添加到工程中去。(2) 編譯該工程,用Quartus的RTL Viewer工具查看編譯后生成的電路,并與6.2.5小節(jié)中的電路進行比較。(3) 把編譯后的電路下載到FPGA中。(4) 對電路進行功能驗證。第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 6.2.7 6位二進制數(shù)轉(zhuǎn)換為位二進制數(shù)轉(zhuǎn)換為2位十進制數(shù)的電路位十進制數(shù)的電路用Verilog語言實現(xiàn)一

31、個電路,將6位二進制數(shù)轉(zhuǎn)換成2位BCD編碼的十進制數(shù),用SW5SW0作為6位二進制數(shù)輸入,用HEX1和HEX0顯示2位十進制數(shù),完成后在DE2上驗證該電路。第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 6.3 無符號數(shù)乘法器無符號數(shù)乘法器6.3.1 4位二進制數(shù)乘法位二進制數(shù)乘法圖6.9(a)為兩位十進制數(shù)乘法的實現(xiàn)P=AB,其中A=12,B=11,P=132;圖6.9(b)是用4位二進制乘法實現(xiàn)的A和B的乘積,對于二進制乘法,B的每一位要么是0,要么是1,因此算式中的加數(shù)要么是移位的A,要么是0000;圖6.9(c)是用邏輯與實現(xiàn)二進制乘法的過程。第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 圖6.9 二進制數(shù)相乘(a) 十進制;

32、(b) 二進制;(c) 二進制數(shù)乘法的實現(xiàn)過程第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 圖6.10是實現(xiàn)4位二進制乘法P=AB的電路。該電路中,用邏輯與實現(xiàn)每一行的乘法,用全加器實現(xiàn)每一列的加法,從而得到所需要的和。根據(jù)這種乘法器的結(jié)構(gòu),我們把它稱做矩陣乘法器。第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 圖6.10 4位二進制乘法器的實現(xiàn)電路 第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 請按照以下步驟完成本練習(xí):(1) 新建一個Quartus工程,用以在DE2平臺上實現(xiàn)所要求的電路。(2) 建立一個Verilog文件,實現(xiàn)要求的任務(wù),再編譯工程,仿真并驗證代碼的正確性。(3) 用SW11SW8表示輸入A,用SW3SW0表示輸入B,將A和B的十六

33、進制值分別用HEX6和HEX4顯示,將P=AB的乘積結(jié)果用HEX1和HEX0顯示。(4) 重新編譯工程,并下載到FPGA中。(5) 改變相關(guān)波段開關(guān)的位置,觀察顯示結(jié)果。第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 6.3.2 8位二進制數(shù)乘法位二進制數(shù)乘法參照6.3.1小節(jié)的結(jié)果,將乘數(shù)A和B擴展到8位寬,用SW15SW8和SW7SW0分別表示乘數(shù)A和B,A和B的十六進制值分別在HEX7HEX6和HEX5HEX4上顯示,16位乘積輸出P=AB在HEX3HEX0上顯示。6.3.3 用用LPM實現(xiàn)實現(xiàn)8位二進制數(shù)乘法位二進制數(shù)乘法用Quartus軟件中提供的參數(shù)化功能模塊lpm_mult實現(xiàn)8位二進制無符號數(shù)的乘法

34、。完成后,與6.3.2小節(jié)的電路比較,看這兩種實現(xiàn)方法所占用的邏輯單元的數(shù)量有什么不同。第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 6.4 鎖存器和觸發(fā)器鎖存器和觸發(fā)器6.4.1 RS鎖存器鎖存器Altera公司的FPGA內(nèi)有可供用戶使用的觸發(fā)器電路。在6.4.4小節(jié)中將會涉及到這些觸發(fā)器的使用方法,而在本小節(jié)的練習(xí)中我們探討如何不使用專用觸發(fā)器而在FPGA中構(gòu)建存儲單元。圖6.11是一個門控RS鎖存電路。這個鎖存電路可以用兩種方法實現(xiàn):第一種方法為使用邏輯門電路來實現(xiàn),如代碼6.4所示;另一種方法則使用邏輯表達(dá)式來實現(xiàn),如代碼6.5所示。如果在一個含有4輸入查找表的FPGA中實現(xiàn)這個電路,那么只需一個查找表即

35、可,如圖6.12(a)所示。第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 圖6.11 門控RS鎖存器第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 圖6.12 在FPGA上實現(xiàn)門控RS鎖存器(a) 用一個4輸入查找表實現(xiàn);(b) 用4個4輸入查找表實現(xiàn)第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 代碼6.4 用邏輯門電路實現(xiàn)的RS鎖存器。module part1 (Clk, R, S, Q);input Clk, R, S;output Q;wire R_g, S_g, Qa, Qb; /* synthesis keep */ and (R_g, R, Clk);and (S_g, S, Clk);nor (Qa, R_g, Qb);nor (Qb, S

36、_g, Qa);assign Q = Qa;endmodule第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 代碼6.5 用邏輯表達(dá)式實現(xiàn)的RS鎖存器。module part1 (Clk, R, S, Q);input Clk, R, S;output Q;wire R_g, S_g, Qa, Qb;/* synthesis keep */ assign R_g = R & Clk;assign S_g = S & Clk;assign Qa = (R_g | Qb);assign Qb = (S_g | Qa);assign Q = Qa;endmodule第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 圖6.12(a

37、)中,盡管用一個4輸入查找表就可以實現(xiàn)門控RS鎖存器,但使用這種方法無法觀察鎖存器的內(nèi)部信號,比如R_g和S_g信號。為了能夠觀察到這兩個內(nèi)部信號,需要使用編譯指令,在Verilog代碼中出現(xiàn)的/* synthesis keep */就是編譯指令,要求Quartus在編譯R_g、S_g、Qa和Qb信號時各自采用獨立的邏輯單元。編譯后生成的電路如圖6.12(b)所示。第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 請按照以下步驟完成練習(xí):(1) 為RS鎖存器新建一個Quartus工程,用以在DE2平臺上實現(xiàn)所要求的電路。(2) 建立一個Verilog文件,采用代碼6.4或代碼6.5(兩種代碼生成的電路是一樣的)將這個

38、Verilog文件添加到工程中。(3) 編譯這個工程,用RTL Viewer工具查看代碼生成的門級電路,然后用Technology Map Viewer工具查看鎖存器是否是按圖6.12(b)所示方式實現(xiàn)的。(4) 建立一個矢量波形文件,繪制R、S和Clk的波形,并使用仿真工具對電路進行仿真。第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 6.4.2 D鎖存器鎖存器圖6.13所示是一個D鎖存器電路。圖6.13 D鎖存器電路 第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 請按照以下步驟完成練習(xí):(1) 為D鎖存器新建一個Quartus工程。(2) 建立一個Verilog文件,采用類似于代碼6.4和代碼6.5的代碼,實現(xiàn)圖6.13中的D鎖存

39、器。在Verilog代碼中采用編譯指令/* synthesis keep */以保證編譯時編譯器采用獨立的邏輯單元實現(xiàn)R、R_g、S_g、Qa和Qb信號。(3) 用RTL Viewer工具查看代碼生成的門級電路,然后用Technology Map Viewer工具查看鎖存器在FPGA中的實現(xiàn)。第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) (4) 再新建一個Quartus工程,用以在DE2平臺上實現(xiàn)D鎖存器。(5) 建立一個頂層文件,在頂層文件中使用一個D鎖存器來定義相應(yīng)的輸入/輸出引腳,用SW0作為輸入D,用SW1作為Clk,并將Q連接到LEDR0。(6) 編譯工程,并將電路下載到DE2平臺上。(7) 對電路進行

40、功能測試。第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 6.4.3 D觸發(fā)器觸發(fā)器圖6.14所示是一個主從式D觸發(fā)器電路。圖6.14 主從式D觸發(fā)器電路 第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 請按照以下步驟完成練習(xí):(1) 為D觸發(fā)器新建一個Quartus工程。(2) 建立一個Verilog文件,采用兩個D鎖存器來實現(xiàn)D觸發(fā)器。(3) 將Verilog文件添加到工程中,配置輸入/輸出引腳,用SW0作為輸入D,用SW1作為Clk,并將Q輸出連接到LEDR0;(4) 編譯工程,用RTL Viewer工具查看代碼生成的門級電路,然后用Technology Map Viewer工具查看觸發(fā)器在FPGA中的實現(xiàn)。(5) 將電路下載到D

41、E2平臺上,對電路進行功能測試。第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 6.4.4 三種存儲單元三種存儲單元 圖6.15(a)所示的電路包含了三種不同的儲存單元:一個門控D鎖存器、一個以上升沿觸發(fā)的D觸發(fā)器和一個以下降沿觸發(fā)的D觸發(fā)器。第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 圖6.15 三種存儲單元的電路和時序圖(a) 電路;(b) 時序第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 請在Quartus中按以下步驟完成練習(xí):(1) 新建一個Quartus工程。(2) 建立一個Verilog文件,調(diào)用三種不同的存儲單元來完成電路。在這部分的練習(xí)中,可以不用編譯指令/* synthesis keep */。代碼6.6給出了用Verilog實現(xiàn)D鎖

42、存器的代碼,這段代碼使用一個4輸入查找表實現(xiàn)D鎖存器。可采用類似的代碼來實現(xiàn)D觸發(fā)器。(3) 編譯工程,用RTL Viewer工具查看代碼生成的門級電路,然后用Technology Map Viewer工具查看觸發(fā)器在FPGA中的實現(xiàn),可以看到D鎖存器由一個4輸入查找表實現(xiàn),而D觸發(fā)器則由FPGA內(nèi)的觸發(fā)器實現(xiàn)。(4) 建立一個矢量波形文件,按圖6.15(b)的時序繪制D和Clk的波形,使用仿真工具對電路進行仿真,并比較三種存儲單元的不同。第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 代碼6.6 用Verilog語言實現(xiàn)D鎖存器。module D_latch (D, Clk, Q);input D, Clk;ou

43、tput reg Q;always (D, Clk)if (Clk)Q = D;endmodule第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 6.4.5 D觸發(fā)器的應(yīng)用觸發(fā)器的應(yīng)用 在DE2上顯示兩個16位數(shù)A和B,A在HEX7HEX4上顯示,B在HEX3HEX0上顯示。用SW15SW0輸入A和B,先輸入A,然后再輸入B,因此要將數(shù)據(jù)A保存在電路中??砂凑找韵虏襟E完成練習(xí):(1) 新建一個Quartus工程。(2) 建立一個Verilog文件,實現(xiàn)所要求的任務(wù),用KEY0作為低電平有效的異步復(fù)位輸入,KEY1作為時鐘輸入。(3) 將Verilog文件添加到工程中,編譯工程,用RTL Viewer工具查看代碼生成

44、的門級電路,然后用Technology Map Viewer工具查看觸發(fā)器在FPGA中的實現(xiàn)。(4) 將電路下載到DE2平臺上并進行功能測試。第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 6.5 計計 數(shù)數(shù) 器器6.5.1 用用T觸發(fā)器實現(xiàn)觸發(fā)器實現(xiàn)16位計數(shù)器位計數(shù)器圖6.16是由4個T觸發(fā)器構(gòu)成的4位計數(shù)器,如果Enable端有效,則在Clock的每個上升沿,計數(shù)器輸出加1。Clear信號可以使計數(shù)器清零。按照這種結(jié)構(gòu),用T觸發(fā)器實現(xiàn)一個16位計數(shù)器。第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 圖6.16 4位計數(shù)器 第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 請按以下步驟完成練習(xí):(1) 建立一個Verilog文件,參照圖6.16所示的結(jié)構(gòu)實

45、現(xiàn)一個16位的計數(shù)器。Verilog文件中應(yīng)該有一個T觸發(fā)器模塊,通過對T觸發(fā)器模塊的16次調(diào)用來實現(xiàn)16位計數(shù)器。(2) 編譯這個電路,查看所占用的LE數(shù)量以及Fmax值。(3) 對電路進行仿真。(4) 在DE2平臺上,用KEY0作為Clock輸入,用SW1作為Enable,用SW0作為Clear,用HEX3HEX0顯示計數(shù)器的輸出。(5) 將電路下載到DE2平臺上,測試電路功能的正確性。(6) 用RTL Viewer查看Quartus軟件是如何對該電路進行綜合的,與圖6.16相比,綜合后的電路有什么不同。第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 6.5.2 用賦值語句實現(xiàn)用賦值語句實現(xiàn)16位計數(shù)器位計數(shù)器

46、在Verilog中可以用QSettings,單擊窗口左端的Analysis & Synthesis Settings項,如圖6.19所示,在State Machine Processing欄中選中User-Encoded即可。 第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) (4) 編譯工程,用RTL Viewer工具查看具體電路。單擊電路中的狀態(tài)機,將它與圖6.18的狀態(tài)圖比較,檢查是否正確。打開編譯報告,選擇Analysis & Synthesis Settings,然后單擊State Machines可以查看狀態(tài)機的狀態(tài)代碼。(5) 對生成的電路進行仿真。(6) 確認(rèn)電路功能沒有問題后即可分配

47、引腳,將電路下載到FPGA中,進行實際功能的測試。(7) 在第(3)步中,在State Machine Processing欄中選擇One-hot選項,編譯后打開編譯報告,選擇Analysis & Synthesis Settings,然后單擊State Machines可以查看狀態(tài)機的狀態(tài)代碼,再將該狀態(tài)代碼與表6.8的One-hot編碼作比較,看看有何不同。第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 圖6.19 在Quartus中改變狀態(tài)機設(shè)置的處理方法 第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 6.7.3 序列檢測序列檢測FSM 本練習(xí)中使用兩個移位寄存器實現(xiàn)序列檢測FSM。在Verilog代碼中用兩個4位移位寄

48、存器來識別0000和1111這兩個序列。參照6.7.2小節(jié)的步驟完成練習(xí),并將其結(jié)果與One-hot編碼FSM及二進制編碼FSM進行比較。請仔細(xì)考慮一下能否只用一個4位移位寄存器來實現(xiàn)這個狀態(tài)機,為什么?第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 6.7.4 模模10加計數(shù)器加計數(shù)器 本練習(xí)實現(xiàn)一個模10加計數(shù)器,具體功能如下:Reset輸入用于將計數(shù)器清零;兩個輸入和用于控制計數(shù)器的計數(shù)操作,當(dāng)=00時計數(shù)值不變,當(dāng)=01時計數(shù)值加1,當(dāng)=10時計數(shù)值加2,當(dāng)=11時計數(shù)值減1。所有的改變都由Clock輸入端的上升沿觸發(fā)。用SW2和SW1分別作為和,用SW0作為Reset輸入,用KEY0作為手動Clock輸入

49、,在HEX0上顯示計數(shù)器的十進制計數(shù)值。第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 請按以下步驟完成練習(xí):(1) 新建一個Quatus工程,以在DE2上實現(xiàn)該計數(shù)器。(2) 建立一個Verilog文件,參照代碼6.7所示的代碼架構(gòu)實現(xiàn)所要求的電路。(3) 將Verilog文件添加到工程中,編譯工程并對電路進行仿真,確定其功能的正確性。(4) 分配引腳,將顯示輸出連接到HEX0上。(5) 重新編譯工程,將電路下載到DE2平臺上并進行功能測試。第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 6.7.5 用移位寄存器與用移位寄存器與FSM實現(xiàn)實現(xiàn)“HELLO”的循環(huán)顯示的循環(huán)顯示本練習(xí)用移位寄存器結(jié)合FSM實現(xiàn)在DE2平臺上的“HELLO

50、”循環(huán)顯示。在HEX7HEX0上循環(huán)顯示“HELLO”,根據(jù)手動時鐘輸入脈沖的控制,每接收到一個脈沖,顯示左移一位,當(dāng)“HELLO”移出左邊后,從右邊重新開始顯示。第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 將8個7位寄存器按流水線的形式排列,即第一個寄存器的輸出作為第二個寄存器的輸入,第二個寄存器的輸出作為第三個寄存器的輸入,依此類推。每個寄存器的輸出同時驅(qū)動七段數(shù)碼管顯示。請設(shè)計一個狀態(tài)機對寄存器流水線進行以下控制:(1) 在前8個時鐘,F(xiàn)SM將字符“H,E,L,L,O, , , ”分別插入8個7位寄存器。(2) 第(1)步完成后,將寄存器流水線配置成循環(huán)模式,即最后一個寄存器的輸出作為第一個寄存器的輸入,

51、使字符可以無限循環(huán)顯示。建立一個新的Quartus工程,完成以上任務(wù)。用DE2平臺上的KEY0作為FSM及移位寄存器的手動時鐘輸入,用SW0作為低電平有效同步清除輸入,并參照代碼6.7所示的代碼架構(gòu)實現(xiàn)所要求的電路。工程編譯完成后,將電路下載到FPGA中測試其功能。第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 6.7.6 用用FSM實現(xiàn)實現(xiàn)“HELLO”的自動循環(huán)顯示的自動循環(huán)顯示本練習(xí)對6.7.5小節(jié)中的內(nèi)容加以改動,字符的移動以1s為間隔自動進行,在HEX7HEX0上循環(huán)顯示“HELLO”,“HELLO”從左邊移出后,再從右邊重新開始顯示。建立一個新的Quartus工程,完成此任務(wù),用DE2平臺上的50MHz

52、時鐘(CLOCK_50)作為FSM及移位寄存器的時鐘輸入,并確保所有的觸發(fā)器都采用CLOCK_50作為時鐘,用KEY0作為低電平有效同步清除輸入,并參照代碼6.7所示的代碼架構(gòu)實現(xiàn)所要求的電路。工程編譯完成后,將電路下載到FPGA中進行功能測試。第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 6.7.7 移動速度可控的移動速度可控的“HELLO”的自動循環(huán)顯示的自動循環(huán)顯示對6.7.6小節(jié)中的練習(xí)加以改動,使“HELLO”移動的速度可以控制:當(dāng)KEY1按下時,移動速度增加一倍;當(dāng)KEY2按下時,移動速度減小一半。KEY2和KEY1是經(jīng)過去抖處理的,能夠產(chǎn)生一個精確的脈沖,但脈沖的長度是任意的。建議另外增加一個FSM

53、以監(jiān)測按鍵的狀態(tài),這個FSM的輸出可以作為調(diào)整移動時間間隔的一個變量。KEY2和KEY1是異步輸入的,因此在FSM中使用時應(yīng)先與系統(tǒng)時鐘同步。電路復(fù)位后,字符每秒移動一次。當(dāng)連續(xù)按KEY1鍵時,字符最快以每秒4次的速度移動;當(dāng)連續(xù)按KEY2鍵時,字符最慢以每4秒一次的速度移動。建立一個新的Quartus工程,完成以上任務(wù),并在DE2上測試其功能。第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 6.8 存存 儲儲 器器 塊塊在計算機系統(tǒng)中,一般都需要提供一定數(shù)量的存儲器。在用FPGA實現(xiàn)的系統(tǒng)中,除可以使用FPGA本身提供的存儲器資源外,還可以使用FPGA的外部擴充存儲器。本節(jié)練習(xí)主要是研究與存儲器相關(guān)的內(nèi)容。圖6.

54、20(a)是一個RAM的結(jié)構(gòu)示意圖,它包含32個8位寬的字節(jié),可通過一個5位的地址口、8位的數(shù)據(jù)口和一個寫控制端口來操作。我們考慮用兩種方法實現(xiàn)這個存儲器:第一種方法采用FPGA上的存儲器塊實現(xiàn);第二種方法采用外部存儲器芯片實現(xiàn)。EP2C35 FPGA片內(nèi)提供專用存儲器M4K存儲器塊。每個M4K存儲器塊包含4096位,支持4K1、2K2、1K4和5128四種配置。本練習(xí)中選擇其5128的配置,只使用存儲器的前32個字節(jié)。本練習(xí)不涉及M4K支持的其他存儲模式。第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) M4K有兩個重要特性,即每個M4K存儲器塊都有專用的寄存器用于所有輸入/輸出與時鐘同步,而每一個M4K存儲器塊的

55、數(shù)據(jù)讀端口和寫端口是獨立的。因此在使用M4K RAM時,要讓輸入/輸出端口之一或全部與輸入時鐘同步。圖6.20(b)所示是一個改進的328 RAM模塊,其Address、Write和DataIn端口都通過寄存器與時鐘Clock同步,DataOut沒有經(jīng)過寄存器而直接輸出。第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 圖6.20 328 RAM模塊(a) RAM的結(jié)構(gòu);(b) 改進的328 RAM模塊第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 6.8.1 用用LPM實現(xiàn)實現(xiàn)RAM常用的邏輯電路如加法器、計數(shù)器、寄存器及存儲器,都可調(diào)用Quartus提供的參數(shù)化功能模塊LPM來實現(xiàn)。Altera公司推薦采用LPM altsyncram

56、實現(xiàn)存儲器。請按照以下步驟,用LPM實現(xiàn)圖6.20(b)所示的存儲器。(1) 新建一個Quartus工程,設(shè)定其目標(biāo)器件為EP2C35F672C6。第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) (2) 用MegaWizard Plug-In Manager產(chǎn)生需要的LPM模塊,在如圖6.21所示的MegaWizard Plug-In Managerpage 2a對話框中選擇Storage類的ALTSYNCRAM LPM模塊,將Which type of output file do you want to create一項選為Verilog HDL,即選擇生成Verilog HDL文件。在What name do

57、 you want for the output file框中輸入要建立的Verilog文件名,本例中將這個Verilog文件命名為ramlpm。按Next按鈕繼續(xù),在page 3 of 10對話框中選擇單端口模式(Single-port mode),如圖6.22所示。將page 7 of 10對話框中的What ports should be registered欄下的復(fù)選項Read output ports (s) q 去掉,如圖6.23所示。其他配置均選用默認(rèn)值。按Finish按鈕即可生成如圖6.20(b)所示的RAM模塊的Verilog代碼。第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 圖6.21 選擇A

58、LTSYNCRAM LPM 第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 圖6.22 選擇單端口模式 第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 圖6.23 配置輸入/輸出端口 第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) (3) 編譯工程,在編譯報告里可以看到工程占用了1個M4K塊中256個字節(jié)的RAM。(4) 對電路進行仿真,并驗證電路的功能。第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 6.8.2 在在DE2上驗證上驗證 RAM本練習(xí)的任務(wù)是在DE2上驗證6.8.1小節(jié)中的存儲器電路,即用波段開關(guān)寫一部分?jǐn)?shù)據(jù)到RAM中,并將RAM中的內(nèi)容讀出來,顯示在數(shù)碼管上。請按照以下步驟完成練習(xí):(1) 新建一個Quartus工程。(2) 新建一個Verilog文件,例化ra

59、mlpm模塊,用DE2平臺上的資源作為其輸入/輸出。用SW15SW11作為5位的地址輸入,用SW7SW0作為數(shù)據(jù)輸入,用SW17作為Write信號,用KEY0作為時鐘信號,將Write信號的值在LEDG0上顯示,將地址值在HEX7HEX6上顯示,將輸入數(shù)據(jù)在HEX5和HEX4上顯示,從RAM中讀出的數(shù)據(jù)在HEX1HEX0上顯示。第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) (3) 編譯工程,并下載到DE2上。(4) 對電路進行功能測試,確保所有的地址都能夠被正確地讀/寫。第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 6.8.3 用用Verilog實現(xiàn)實現(xiàn)RAM除調(diào)用LPM外,我們還可以用Verilog實現(xiàn)RAM的結(jié)構(gòu)。在Verilo

60、g代碼中,可以用多維數(shù)組定義存儲器。一個32字節(jié)的8位RAM塊,可以定義為328的數(shù)組,在Verilog中可用以下聲明語句來定義:Reg7:0 memory_array31:0;在Cyclone系列FPGA中,這種數(shù)組可以由觸發(fā)器實現(xiàn),也可以由M4K存儲器塊實現(xiàn)。有兩種方法可以保證用M4K存儲器塊實現(xiàn)RAM:第一種方法是調(diào)用LPM庫;另一種方法是用適當(dāng)形式的Verilog代碼定義RAM,Quartus軟件在編譯的時候,會自動推斷出該代碼描述的是一個RAM塊,從而用M4K存儲器塊實現(xiàn)RAM。具體實現(xiàn)方法可通過在Quartus的軟件幫助中搜索主題“Inferred memory”來查閱。第6章 數(shù)字系統(tǒng)設(shè)計練習(xí) 參照Inferred memory的

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論