版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第6章數(shù)字系統(tǒng)設計練習6.1開關(guān)、LED燈及多路復用器6.2二進制與BCD碼的轉(zhuǎn)換及顯示6.3無符號數(shù)乘法器6.4鎖存器和觸發(fā)器6.5計數(shù)器6.6時鐘與定時器6.7有限狀態(tài)機6.8存儲器塊6.9簡單的處理器6.10增強型處理器6.1開關(guān)、LED燈及多路復用器6.1.1將輸入/輸出器件連接到FPGA上
DE2平臺上提供了18個波段開關(guān),可以作為電路的輸入,表示為SW17~SW0;還有18個紅色LED,表示為LEDR17~LEDR0,可以作為輸出顯示之用。使用紅色LED顯示波段開關(guān)狀態(tài)的電路可以用Verilog語言簡單地實現(xiàn),代碼如下:
assignLEDR[17]=SW[17]; assignLEDR[16]=SW[16]; assignLEDR[0]=SW[0];由于分別有18個紅色LED和18個波段開關(guān),因此在Verilog語言中可以很方便地用向量表示它們,進而可用一個賦值語句完成同樣的功能。DE2平臺上,LEDR17~LEDR0和SW17~SW0是與FPGA管腳直接相連的,使用這些管腳之前應參照本書附錄B或DE2用戶手冊中DE2平臺的引腳分配表,分配連接波段開關(guān)和LEDR的FPGA管腳,例如SW0連接在FPGA的N25腳,LEDR0連接在FPGA的AE23腳。最簡單的做法是在Quartus中導入DE2_pin_assignments.csv,導入方法參見本書2.10.3小節(jié)。為保證從DE2_pin_assignments.csv導入的引腳分配表能夠正確使用,在Verilog模塊中使用到的引腳名稱必須與該文件中的完全一致,DE2_pin_assignments.csv中用SW[0]~SW[17]和LEDR[0]~LEDR[17]分別表示18個波段開關(guān)和18個紅色LED燈,因此在編寫的Verilog代碼中也必須用這種方式來表示。用向量實現(xiàn)波段開關(guān)與紅色LED相連的模塊代碼如代碼6.1所示。代碼6.1將波段開關(guān)與紅色LED相連的Verilog代碼。modulepart1(SW,LEDR);input[17:0]SW; //波段開關(guān)output[17:0]LEDR; //紅色LEDassignLEDR=SW;endmodule請按照以下步驟在DE2上實現(xiàn)代碼6.1并進行測試:
(1)新建一個QuartusⅡ工程,用以在DE2平臺上實現(xiàn)所要求的電路,將FPGA器件設置為EP2C35F672C6。
(2)建立一個Verilog文件,其內(nèi)容如代碼6.1所示,將該Verilog文件添加到工程中并編譯整個工程。
(3)導入DE2_pin_assignments.csv中的引腳分配或參照附錄B中DE2平臺的引腳分配表,分配連接波段開關(guān)和紅色LED的FPGA管腳。
(4)編譯該工程,完成后下載到FPGA中。
(5)通過撥動波段開關(guān)并觀察紅色LED的變化來驗證所設計的功能是否正確。6.1.22選1多路復用器圖6.1(a)是一個2選1多路復用器電路,如果s=1,則輸出m=y;如果s=0,則輸出m=x。圖6.1(b)是這個電路的真值表。圖6.1(c)是該電路的符號表示。圖6.1最簡單的多路復用器這個多路復用器可以用以下的Verilog語句來實現(xiàn):
assignm=(~s&x)|(s&y);這部分練習的任務是實現(xiàn)如圖6.2(a)所示的8位2選1多路復用電路,需要用8個賦值語句。該多路復用器的輸入為X和Y,都是8位寬,輸出M也為8位寬。如果s=0,M=X;如果s=1,則M=Y。圖6.2(b)是該電路的符號表示。
2選1多路復用器電路的具體實現(xiàn)步驟如下:
(1)新建一個QuartusⅡ工程,用以在DE2平臺上實現(xiàn)所要求的電路。
(2)建立一個Verilog文件,用SW17作為輸入s,以SW7~SW0作為輸入X,以SW15~SW8作為輸入Y,將波段開關(guān)與紅色LED連接以顯示其狀態(tài),用綠色LED即LEDG7~LEDG0作為輸出M,將該Verilog文件添加到工程中。
(3)導入DE2_pin_assignments.csv中的引腳分配或參照附錄B中DE2平臺的引腳分配表,分配連接波段開關(guān)、紅色LED以及綠色LED的FPGA管腳。
(4)編譯工程,完成后下載到FPGA中。
(5)撥動波段開關(guān)并觀察紅色LED與綠色LED的變化,以驗證8位2選1多路復用器的功能是否正確。圖6.28位2選1多路復用器6.1.33位寬5選1多路復用器與圖6.2(a)所示的2選1多路復用器不同,圖6.3(a)所示電路的任務是實現(xiàn)一個5選1的多路復用器,即從5個輸入x、y、w、u和v中選取一個輸出到m。這個電路采用了4個2選1多路復用器來實現(xiàn),輸出選擇用一個3位的輸入s2s1s0實現(xiàn),該電路的符號表示如圖6.3(b)所示,表6.1為該5選1多路復用器的真值表。圖6.35選1多路復用器圖6.4實現(xiàn)了一個3位5選1多路復用器,這個電路中包含了3個圖6.3(a)所示的電路。請按照以下步驟實現(xiàn)3位5選1多路復用器:
(1)新建一個QuartusⅡ工程,用以在DE2平臺上實現(xiàn)所要求的電路。
(2)建立一個Verilog文件,用SW17~SW15作為選擇端輸入s2s1s0,用剩下的15個波段開關(guān)SW14~SW0作為輸入U、V、W、X、Y,將波段開關(guān)與紅色LED連接以顯示波段開關(guān)的狀態(tài),用綠色LED即LEDG2~LEDG0作為輸出M,將該Verilog文件添加到工程中。圖6.43位5選1多路復用器
(3)導入DE2_pin_assignments.csv中的引腳分配或參照附錄B中DE2平臺的引腳分配表,分配連接波段開關(guān)、紅色LED以及綠色LED的FPGA管腳。
(4)編譯工程,完成后下載到FPGA中。
(5)撥動波段開關(guān)并觀察紅色LED和綠色LED的變化,以驗證3位5選1多路復用器的功能是否正確,確定從U到Y(jié)的所有輸入都能夠被選擇輸出到M。6.1.4用七段數(shù)碼管顯示簡單字符圖6.5所示是一個簡單的七段解碼器模塊,c2c1c0是解碼器的3個輸入,用c2c1c0的不同取值來選擇在七段數(shù)碼管上輸出不同的字符。七段數(shù)碼管上的不同段位用數(shù)字0~6表示。注意七段數(shù)碼管是共陽極的。表6.2列出了c2c1c0取不同值時數(shù)碼管上輸出的字符。本例中只輸出4個字符,當c2c1c0取值為100~111時,輸出空格。圖6.5七段解碼器請按照以下步驟實現(xiàn)七段解碼器電路:
(1)新建一個QuartusⅡ工程,用以在DE2平臺上實現(xiàn)所要求的電路。
(2)建立一個Verilog文件,實現(xiàn)七段解碼器電路,用SW2~SW0作為輸入c2~c0,DE2平臺上的數(shù)碼管分別為HEX0~HEX7,輸出接HEX0,在Verilog中用以下語句定義端口:
output[0:6]HEX0;
(3)導入DE2_pin_assignments.csv中的引腳分配或參照附錄B中DE2平臺的引腳分配表分配引腳。
(4)編譯工程,完成后下載到FPGA中。
(5)撥動波段開關(guān)并觀察七段數(shù)碼管HEX0的顯示,以驗證設計的功能是否正確。6.1.5循環(huán)顯示5個字符圖6.6中的電路采用了一個3位5選1多路復用電路,可分別從輸入的5個字符中選擇1個字符并通過七段解碼器電路在數(shù)碼管上顯示H、E、L、O和空格中的任一字符。將SW14~SW0分為5組,分別代表H、E、L、O和空格等5個字符,用SW17~SW15來選擇要顯示的字符。圖6.6循環(huán)顯示5個字符的電路代碼6.2是實現(xiàn)這個電路的代碼大綱,其中部分代碼省略,被省略掉的代碼是前文練習中編寫過的。在這個電路中我們將6.1.3小節(jié)和6.1.4小節(jié)中的電路作為子電路。對代碼6.2中的代碼進行擴展后,可以用5個數(shù)碼管顯示,當改變SW17~SW15的狀態(tài)時,最終顯示的內(nèi)容與SW17~SW15的對應關(guān)系如表6.3所示,即可以循環(huán)顯示單詞“HELLO”。代碼6.2圖6.6所示電路的Verilog代碼。modulepart5(SW,HEX0);input[17:0]SW; //聲明波段開關(guān)output[0:6]HEX0; //聲明七段數(shù)碼管wire[2:0]M;mux_3bit_5to1M0(SW[17:15],SW[14:12],SW[11:9],SW[8:6],SW[5:3],SW[2:0],M);char7segH0(M,HEX0);endmodule //實現(xiàn)一個3位5選1多路復用器
modulemux_3bit_5to1(S,U,V,W,X,Y,M); input[2:0]S,U,V,W,X,Y; output[2:0]M;endmodule//實現(xiàn)一個H、E、L、O和空格的5字符七段解碼器modulechar_7seg(C,Display);input[2:0]C;//輸入碼output[0:6]Display;//輸出碼
Endmodule請按照以下步驟實現(xiàn)“HELLO”的循環(huán)顯示電路:
(1)新建一個QuartusⅡ工程,用以在DE2平臺上實現(xiàn)所要求的電路。
(2)建立一個Verilog文件,用SW17~SW15作為5個3位5選1多路復用器的選擇輸入,按照表6.3的對應關(guān)系,將SW14~SW0連接到每個多路復用器實例的輸入端,將5個多路復用器的輸出接到5個七段數(shù)碼管HEX4~HEX0上,將Verilog文件添加到工程中來。
(3)導入DE2_pin_assignments.csv中的引腳分配或參照附錄B中DE2平臺的引腳分配表,分配引腳。
(4)編譯工程,完成后下載到FPGA中。
(5)先按表6.3設置好SW14~SW0的位置,然后改變波段開關(guān)SW17~SW15的位置,觀察顯示是否正確。6.1.6循環(huán)顯示8個字符在6.1.5小節(jié)的基礎(chǔ)上,把5個字符擴展到8個字符,如果顯示內(nèi)容少于8個,比如顯示“HELLO”,則數(shù)碼管顯示輸出與SW17~SW15的對應關(guān)系如表6.4所示。請按照以下步驟實現(xiàn)“HELLO”的循環(huán)顯示電路:
(1)新建一個QuartusⅡ工程,用以在DE2平臺上實現(xiàn)所要求的電路。
(2)建立一個Verilog文件,這里會用到8個5選1多路復用器的電路,用SW17~SW15作為8個3位5選1多路復用器的選擇輸入,按照表6.4的對應關(guān)系,將SW14~SW0連接到每個多路復用器電路的輸入端(有些多路復用器的輸入會是空格),將8個多路復用器的輸出接到8個七段數(shù)碼管HEX7~HEX0上,將Verilog文件添加到工程文件中來。
(3)導入DE2_pin_assignments.csv中的引腳分配或參照附錄B中DE2平臺的引腳分配表,分配引腳。
(4)編譯工程,完成后下載到FPGA中。
(5)先按表6.4設置好SW14~SW0的位置,然后改變波段開關(guān)SW17~SW15的位置,觀察循環(huán)顯示是否正確。6.2二進制與BCD碼的轉(zhuǎn)換及顯示6.2.1二進制數(shù)字的顯示在HEX3~HEX0上顯示SW15~SW0所對應的數(shù)值,SW15~SW12、SW11~SW8、SW7~SW4和SW3~SW0分別對應HEX3、HEX2、HEX1和HEX0。在數(shù)碼管上只顯示數(shù)字0~9,當波段開關(guān)表示的數(shù)字在1010~1111之間時,沒有顯示輸出。顯示二進制數(shù)字的具體步驟如下:
(1)新建一個QuartusⅡ工程,用以在DE2平臺上實現(xiàn)所要求的電路。
(2)建立一個Verilog文件,實現(xiàn)要求的任務,本練習的目的是手工推導出數(shù)碼管顯示的邏輯函數(shù),因此要求只能用assign語句和布爾表達式實現(xiàn)所有的功能。
(3)導入DE2_pin_assignments.csv中的引腳分配或參照附錄B中DE2平臺的引腳分配表,分配引腳。
(4)編譯工程,完成后下載到FPGA中。
(5)改變SW15~SW0的位置,觀察顯示是否正確。6.2.2二進制值到十進制值的轉(zhuǎn)換若將4位二進制輸入V=v3v2v1v0轉(zhuǎn)換成2位十進制的等價表示D=d1d0,在HEX1和HEX0上分別顯示d1和d0,則輸入的二進制值與輸出的十進制值之間的對應關(guān)系如表6.5所示。圖6.7是實現(xiàn)這個任務的部分電路,比較器判斷V是否大于9,比較器的輸出z可以控制數(shù)碼管的顯示。二進制值轉(zhuǎn)換為十進制值的步驟如下:
(1)新建一個QuartusⅡ工程,用以在DE2平臺上實現(xiàn)所要求的電路。
(2)建立一個Verilog模塊,包括電路中的比較器、多路復用器和電路B,但不包括電路A和七段解碼器。這個模塊的輸入為4位二進制數(shù)V,輸出是z和4位的M。與6.2.1小節(jié)的要求一樣,編寫這個模塊時只能用assign語句和布爾表達式實現(xiàn)所要求的功能,而不能出現(xiàn)if-else和case等語句。圖6.7顯示二進制數(shù)值的電路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.8全加器及并行加法器(a)全加器電路;(b)全加器電路符號;(c)并行加法器電路實現(xiàn)并行加法器電路的步驟如下:
(1)為并行加法器建立一個QuartusⅡ工程文件。
(2)用Verilog編寫一個全加器電路模塊,然后用4個全加器電路來實現(xiàn)并行加法器電路。
(3)分別用SW7~SW4和SW3~SW0代表輸入A和B,使用SW8代表加法器的進位輸入ci,將SW8~SW0直接連接到LEDR8~LEDR0上,而將加法器的輸出co和S連接到LEDG4~LEDG0上,將代碼添加到工程中。
(4)導入DE2_pin_assignments.csv中的引腳分配或參照附錄B中DE2平臺的引腳分配表,分配引腳。
(5)編譯工程,完成后下載到FPGA中。
(6)改變輸入A、B和ci的值,觀察計算結(jié)果是否正確。6.2.41位BCD加法器在6.2.2小節(jié)的練習中,將二進制數(shù)轉(zhuǎn)換成十進制數(shù),而在有些場合,我們需要用二進制數(shù)表示十進制數(shù),就是將十進制數(shù)的每一位用4位二進制數(shù)來表示,比如將十進制數(shù)59表示為二進制數(shù)01011001。這種用4位二進制數(shù)表示十進制數(shù)的編碼,稱為BCD碼。本節(jié)練習的任務是實現(xiàn)BCD碼的加法,輸入為兩個BCD碼A和B以及1位的進位輸入,輸出是和的BCD碼S1S0。這個電路能夠處理的和的最大值為S1S0=9+9+1=19。請按照以下步驟完成練習:
(1)為BCD加法器新建一個QuartusⅡ工程。
(2)建立一個Verilog文件,實現(xiàn)要求的任務。先用6.2.3小節(jié)中完成的加法器實現(xiàn)4位二進制加法,輸出為A+B的4位和S1S0及進位位輸出c,然后再設計一個二進制到十進制的轉(zhuǎn)換電路,這個電路類似于6.2.2小節(jié)中完成的電路,注意最大輸出為19。編寫這個模塊時只能用assign語句和布爾表達式實現(xiàn)所要求的功能,而不能出現(xiàn)if-else和case等語句。
(3)將編寫好的Verilog文件添加到工程中,導入DE2_pin_assignments.csv中的引腳分配或參照附錄B中DE2平臺的引腳分配表,分配引腳。
(4)編譯工程,完成后下載到FPGA中。
(5)輸入不同的A、B和ci,驗證輸出S是否正確。6.2.52位BCD加法器若設計一個2位BCD加法器,計算兩個2位BCD碼A1A0和B1B0的和,輸出為3位BCD碼S2S1S0,則可以用兩個1位BCD加法器來實現(xiàn)本電路。請按照以下步驟完成練習:
(1)用SW15~SW8和SW7~SW0分別表示兩個BCD碼輸入A1A0和B1B0,A1A0的值顯示在數(shù)碼管HEX7和HEX6上,B1B0的值顯示在數(shù)碼管HEX5和HEX4上,S2S1S0顯示在數(shù)碼管HEX2~HEX0上。
(2)分配引腳。
(3)編譯工程,完成后下載到FPGA中。
(4)輸入不同的A1A0和B1B0的值,驗證輸出S2S1S0是否正確。6.2.62位BCD加法器的另一種實現(xiàn)在6.2.5小節(jié)的練習中,通過調(diào)用兩個1位BCD加法器實現(xiàn)了一個2位BCD加法器。在本節(jié)練習中,我們按代碼6.3所示的用偽代碼描述的算法重新設計一個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 endif9 S0=T0-Z010 T1=A1+B1+c111 if(T1>9)then12 Z1=10;13 c2=1;14 else15 Z1=0;16 c2=0;17 endif18 S1=T1-Z119 S2=c2這個偽代碼用電路實現(xiàn)起來很容易,第1、9、10和18行可用加法器實現(xiàn),第2~8行及第11~17行是多路復用器,可以用比較器判斷T0>9和T1>9。用Verilog代碼實現(xiàn)這段偽代碼時,注意第9行和第18行的減法可以用加法實現(xiàn)。該偽代碼中使用了if-else結(jié)構(gòu)以及“>”及“+”等運算,比實際的電路要抽象一些,其目的是讓Verilog編譯器去決定具體電路的實現(xiàn)。請按照以下步驟完成練習:
(1)建立新的QuartusⅡ工程,所有的輸入、輸出以及顯示都與6.2.5小節(jié)中的練習相同,參照代碼6.3所示的偽代碼編寫一個Verilog文件,并添加到工程中去。
(2)編譯該工程,用QuartusⅡ的RTLViewer工具查看編譯后生成的電路,并與6.2.5小節(jié)中的電路進行比較。
(3)把編譯后的電路下載到FPGA中。
(4)對電路進行功能驗證。6.2.76位二進制數(shù)轉(zhuǎn)換為2位十進制數(shù)的電路用Verilog語言實現(xiàn)一個電路,將6位二進制數(shù)轉(zhuǎn)換成2位BCD編碼的十進制數(shù),用SW5~SW0作為6位二進制數(shù)輸入,用HEX1和HEX0顯示2位十進制數(shù),完成后在DE2上驗證該電路。6.3無符號數(shù)乘法器6.3.14位二進制數(shù)乘法圖6.9(a)為兩位十進制數(shù)乘法的實現(xiàn)P=A×B,其中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.9二進制數(shù)相乘(a)十進制;(b)二進制;(c)二進制數(shù)乘法的實現(xiàn)過程圖6.10是實現(xiàn)4位二進制乘法P=A×B的電路。該電路中,用邏輯與實現(xiàn)每一行的乘法,用全加器實現(xiàn)每一列的加法,從而得到所需要的和。根據(jù)這種乘法器的結(jié)構(gòu),我們把它稱做矩陣乘法器。圖6.104位二進制乘法器的實現(xiàn)電路請按照以下步驟完成本練習:
(1)新建一個QuartusⅡ工程,用以在DE2平臺上實現(xiàn)所要求的電路。
(2)建立一個Verilog文件,實現(xiàn)要求的任務,再編譯工程,仿真并驗證代碼的正確性。
(3)用SW11~SW8表示輸入A,用SW3~SW0表示輸入B,將A和B的十六進制值分別用HEX6和HEX4顯示,將P=A×B的乘積結(jié)果用HEX1和HEX0顯示。
(4)重新編譯工程,并下載到FPGA中。
(5)改變相關(guān)波段開關(guān)的位置,觀察顯示結(jié)果。6.3.28位二進制數(shù)乘法參照6.3.1小節(jié)的結(jié)果,將乘數(shù)A和B擴展到8位寬,用SW15~SW8和SW7~SW0分別表示乘數(shù)A和B,A和B的十六進制值分別在HEX7~HEX6和HEX5~HEX4上顯示,16位乘積輸出P=A×B在HEX3~HEX0上顯示。6.3.3用LPM實現(xiàn)8位二進制數(shù)乘法用QuartusⅡ軟件中提供的參數(shù)化功能模塊lpm_mult實現(xiàn)8位二進制無符號數(shù)的乘法。完成后,與6.3.2小節(jié)的電路比較,看這兩種實現(xiàn)方法所占用的邏輯單元的數(shù)量有什么不同。6.4鎖存器和觸發(fā)器6.4.1RS鎖存器
Altera公司的FPGA內(nèi)有可供用戶使用的觸發(fā)器電路。在6.4.4小節(jié)中將會涉及到這些觸發(fā)器的使用方法,而在本小節(jié)的練習中我們探討如何不使用專用觸發(fā)器而在FPGA中構(gòu)建存儲單元。圖6.11是一個門控RS鎖存電路。這個鎖存電路可以用兩種方法實現(xiàn):第一種方法為使用邏輯門電路來實現(xiàn),如代碼6.4所示;另一種方法則使用邏輯表達式來實現(xiàn),如代碼6.5所示。如果在一個含有4輸入查找表的FPGA中實現(xiàn)這個電路,那么只需一個查找表即可,如圖6.12(a)所示。圖6.11門控RS鎖存器圖6.12在FPGA上實現(xiàn)門控RS鎖存器(a)用一個4輸入查找表實現(xiàn);(b)用4個4輸入查找表實現(xiàn)代碼6.4用邏輯門電路實現(xiàn)的RS鎖存器。modulepart1(Clk,R,S,Q);inputClk,R,S;outputQ;wireR_g,S_g,Qa,Qb; /*synthesiskeep*/and(R_g,R,Clk);and(S_g,S,Clk);nor(Qa,R_g,Qb);nor(Qb,S_g,Qa);assignQ=Qa;endmodule代碼6.5用邏輯表達式實現(xiàn)的RS鎖存器。modulepart1(Clk,R,S,Q);inputClk,R,S;outputQ;wireR_g,S_g,Qa,Qb; /*synthesiskeep*/assignR_g=R&Clk;assignS_g=S&Clk;assignQa=~(R_g|Qb);assignQb=~(S_g|Qa);assignQ=Qa;endmodule圖6.12(a)中,盡管用一個4輸入查找表就可以實現(xiàn)門控RS鎖存器,但使用這種方法無法觀察鎖存器的內(nèi)部信號,比如R_g和S_g信號。為了能夠觀察到這兩個內(nèi)部信號,需要使用編譯指令,在Verilog代碼中出現(xiàn)的/*synthesiskeep*/就是編譯指令,要求Quartus在編譯R_g、S_g、Qa和Qb信號時各自采用獨立的邏輯單元。編譯后生成的電路如圖6.12(b)所示。請按照以下步驟完成練習:
(1)為RS鎖存器新建一個QuartusⅡ工程,用以在DE2平臺上實現(xiàn)所要求的電路。
(2)建立一個Verilog文件,采用代碼6.4或代碼6.5(兩種代碼生成的電路是一樣的)將這個Verilog文件添加到工程中。
(3)編譯這個工程,用RTLViewer工具查看代碼生成的門級電路,然后用TechnologyMapViewer工具查看鎖存器是否是按圖6.12(b)所示方式實現(xiàn)的。
(4)建立一個矢量波形文件,繪制R、S和Clk的波形,并使用仿真工具對電路進行仿真。6.4.2D鎖存器圖6.13所示是一個D鎖存器電路。圖6.13D鎖存器電路請按照以下步驟完成練習:
(1)為D鎖存器新建一個QuartusⅡ工程。
(2)建立一個Verilog文件,采用類似于代碼6.4和代碼6.5的代碼,實現(xiàn)圖6.13中的D鎖存器。在Verilog代碼中采用編譯指令/*synthesiskeep*/?以保證編譯時編譯器采用獨立的邏輯單元實現(xiàn)R、R_g、S_g、Qa和Qb信號。
(3)用RTLViewer工具查看代碼生成的門級電路,然后用TechnologyMapViewer工具查看鎖存器在FPGA中的實現(xiàn)。
(4)再新建一個QuartusⅡ工程,用以在DE2平臺上實現(xiàn)D鎖存器。
(5)建立一個頂層文件,在頂層文件中使用一個D鎖存器來定義相應的輸入/輸出引腳,用SW0作為輸入D,用SW1作為Clk,并將Q連接到LEDR0。
(6)編譯工程,并將電路下載到DE2平臺上。
(7)對電路進行功能測試。6.4.3D觸發(fā)器圖6.14所示是一個主從式D觸發(fā)器電路。圖6.14主從式D觸發(fā)器電路請按照以下步驟完成練習:
(1)為D觸發(fā)器新建一個QuartusⅡ工程。
(2)建立一個Verilog文件,采用兩個D鎖存器來實現(xiàn)D觸發(fā)器。
(3)將Verilog文件添加到工程中,配置輸入/輸出引腳,用SW0作為輸入D,用SW1作為Clk,并將Q輸出連接到LEDR0;
(4)編譯工程,用RTLViewer工具查看代碼生成的門級電路,然后用TechnologyMapViewer工具查看觸發(fā)器在FPGA中的實現(xiàn)。
(5)將電路下載到DE2平臺上,對電路進行功能測試。6.4.4三種存儲單元圖6.15(a)所示的電路包含了三種不同的儲存單元:一個門控D鎖存器、一個以上升沿觸發(fā)的D觸發(fā)器和一個以下降沿觸發(fā)的D觸發(fā)器。圖6.15三種存儲單元的電路和時序圖(a)電路;(b)時序請在QuartusⅡ中按以下步驟完成練習:
(1)新建一個QuartusⅡ工程。
(2)建立一個Verilog文件,調(diào)用三種不同的存儲單元來完成電路。在這部分的練習中,可以不用編譯指令/*synthesiskeep*/。代碼6.6給出了用Verilog實現(xiàn)D鎖存器的代碼,這段代碼使用一個4輸入查找表實現(xiàn)D鎖存器??刹捎妙愃频拇a來實現(xiàn)D觸發(fā)器。
(3)編譯工程,用RTLViewer工具查看代碼生成的門級電路,然后用TechnologyMapViewer工具查看觸發(fā)器在FPGA中的實現(xiàn),可以看到D鎖存器由一個4輸入查找表實現(xiàn),而D觸發(fā)器則由FPGA內(nèi)的觸發(fā)器實現(xiàn)。
(4)建立一個矢量波形文件,按圖6.15(b)的時序繪制D和Clk的波形,使用仿真工具對電路進行仿真,并比較三種存儲單元的不同。代碼6.6用Verilog語言實現(xiàn)D鎖存器。moduleD_latch(D,Clk,Q);inputD,Clk;outputregQ;always@(D,Clk)if(Clk)Q=D;endmodule6.4.5D觸發(fā)器的應用在DE2上顯示兩個16位數(shù)A和B,A在HEX7~HEX4上顯示,B在HEX3~HEX0上顯示。用SW15~SW0輸入A和B,先輸入A,然后再輸入B,因此要將數(shù)據(jù)A保存在電路中??砂凑找韵虏襟E完成練習:
(1)新建一個QuartusⅡ工程。
(2)建立一個Verilog文件,實現(xiàn)所要求的任務,用KEY0作為低電平有效的異步復位輸入,KEY1作為時鐘輸入。
(3)將Verilog文件添加到工程中,編譯工程,用RTLViewer工具查看代碼生成的門級電路,然后用TechnologyMapViewer工具查看觸發(fā)器在FPGA中的實現(xiàn)。
(4)將電路下載到DE2平臺上并進行功能測試。6.5計數(shù)器6.5.1用T觸發(fā)器實現(xiàn)16位計數(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.164位計數(shù)器請按以下步驟完成練習:
(1)建立一個Verilog文件,參照圖6.16所示的結(jié)構(gòu)實現(xiàn)一個16位的計數(shù)器。Verilog文件中應該有一個T觸發(fā)器模塊,通過對T觸發(fā)器模塊的16次調(diào)用來實現(xiàn)16位計數(shù)器。
(2)編譯這個電路,查看所占用的LE數(shù)量以及Fmax值。
(3)對電路進行仿真。
(4)在DE2平臺上,用KEY0作為Clock輸入,用SW1作為Enable,用SW0作為Clear,用HEX3~HEX0顯示計數(shù)器的輸出。
(5)將電路下載到DE2平臺上,測試電路功能的正確性。
(6)用RTLViewer查看QuartusⅡ軟件是如何對該電路進行綜合的,與圖6.16相比,綜合后的電路有什么不同。6.5.2用賦值語句實現(xiàn)16位計數(shù)器在Verilog中可以用Q<=Q+1簡單地實現(xiàn)一個計數(shù)器?,F(xiàn)在用這種方法實現(xiàn)一個16位計數(shù)器,查看該電路一共占用了多少個LE以及Fmax是多少;再用同樣的方法實現(xiàn)一個4位的計數(shù)器,用RTLViewer查看QuartusⅡ軟件是如何綜合這個電路的,與前面設計的電路相比看看有何不同。6.5.3用LPM實現(xiàn)16位計數(shù)器用參數(shù)化功能模塊實現(xiàn)一個16位計數(shù)器,配置與6.5.2小節(jié)的練習一樣,即包含使能端和同步清除端。查看該電路所占用的LE數(shù)量和Fmax值。再用這種方法實現(xiàn)一個4位的計數(shù)器,用RTLViewer查看QuartusⅡ軟件是如何綜合這個電路的,與用T觸發(fā)器及賦值語句實現(xiàn)的計數(shù)器電路相比,看看有何不同。6.5.4閃爍的數(shù)碼管在HEX0上連續(xù)循環(huán)地顯示數(shù)字0~9,每秒刷新一次顯示。使用計數(shù)器產(chǎn)生1?s的時間間隔,這個計數(shù)器的時鐘由DE2平臺上的50?MHz時鐘提供。注意:這個設計中只允許使用DE2平臺上的50?MHz時鐘,而不允許使用其他時鐘,并保證所有的觸發(fā)器都使用這個50?MHz的時鐘。6.5.5循環(huán)顯示的“HELLO”設計一個電路來實現(xiàn)在HEX7~HEX0上循環(huán)顯示“HELLO”,使所有字母從右向左移動,每秒移動一次,移動模式如表6.7所示。6.6時鐘與定時器6.6.13位BCD計數(shù)器設計一個3位BCD計數(shù)器。計數(shù)器值每秒增加一次,計數(shù)器的輸出顯示在HEX2~HEX0上,用KEY0可以將計數(shù)器清零。計數(shù)器的控制信號由DE2平臺上的50?MHz時鐘提供。請按以下步驟完成練習:
(1)新建一個QuartusⅡ工程。
(2)建立一個Verilog文件,實現(xiàn)所要求的電路。
(3)將Verilog文件添加到工程中,編譯工程并對電路進行仿真,確定其功能的正確性。
(4)分配引腳,將顯示輸出連接到HEX2~HEX0,用KEY0作為同步清除端。
(5)重新編譯工程,將電路下載到DE2平臺上并測試其功能。6.6.2實時時鐘在DE2上實現(xiàn)一個實時時鐘,用HEX7~HEX6顯示小時(0~23),用HEX5~HEX4顯示分鐘(0~59),用HEX3~HEX2顯示秒鐘(0~59),用SW15~SW0設定時間。6.6.3反應時間測試電路在DE2上實現(xiàn)一個反應時間測試電路。測試電路的工作過程如下:
(1)按KEY0鍵可以復位測試電路。
(2)復位后過一段時間,紅燈LEDR0打開,4位BCD計數(shù)器開始以毫秒為單位計數(shù)。從復位到紅燈亮之間的時間可以用SW7~SW0以秒為單位進行設置。
(3)被測試的人看到紅燈亮時,馬上按KEY3鍵,KEY3鍵按下后,紅燈熄滅,4位計數(shù)器停止計數(shù)并將此時的計數(shù)值顯示在HEX2~HEX0上,此計數(shù)值即為反應時間。6.7有?限?狀?態(tài)?機本節(jié)練習主要學習使用有限狀態(tài)機。在數(shù)字電路系統(tǒng)中,有限狀態(tài)機是一種十分重要的時序邏輯電路模塊,它對數(shù)字系統(tǒng)的設計具有十分重要的作用。有限狀態(tài)機是指輸出取決于過去輸入和當前輸入的時序邏輯電路。一般來說,除了輸入和輸出以外,有限狀態(tài)機還含有一組具有“記憶”功能的寄存器,這些寄存器的功能是記憶有限狀態(tài)機的內(nèi)部狀態(tài),它們常被稱為狀態(tài)寄存器。在有限狀態(tài)機中,狀態(tài)寄存器的下一個狀態(tài)不僅與輸入信號有關(guān),而且還與該寄存器的當前狀態(tài)有關(guān),因此有限狀態(tài)機又可以認為是組合邏輯和寄存器邏輯的一種組合。其中,寄存器邏輯的功能是存儲有限狀態(tài)機的內(nèi)部狀態(tài);而組合邏輯又可以分為次態(tài)邏輯和輸出邏輯兩部分,次態(tài)邏輯的功能是確定有限狀態(tài)機的下一個狀態(tài),輸出邏輯的功能是確定有限狀態(tài)機的輸出。在實際的應用中,根據(jù)有限狀態(tài)機是否使用輸入信號,設計人員經(jīng)常將其分為Moore型有限狀態(tài)機和Mealy型有限狀態(tài)機兩種類型。Moore型有限狀態(tài)機的輸出信號僅與當前狀態(tài)有關(guān),即可以把Moore型有限狀態(tài)機的輸出看成是當前狀態(tài)的函數(shù)。Mealy型有限狀態(tài)機的輸出信號不僅與當前狀態(tài)有關(guān),而且還與輸入信號有關(guān),即可以把Mealy型有限狀態(tài)機的輸出看成是當前狀態(tài)和所有輸入信號的函數(shù)。6.7.1One-hot編碼的FSM在這部分的練習中我們設計一個區(qū)別兩種特定時序的有限狀態(tài)機(FSM)。該有限狀態(tài)機有一個輸入w和一個輸出z。當w是4個連續(xù)的0或4個連續(xù)的1時,輸出z=1,否則z=0。時序允許重疊,若w是連續(xù)的5個1時,則在第4個和第5個時鐘之后,z均為1。圖6.17是這個有限狀態(tài)機的時序圖。圖6.17FSM的時序圖這個有限狀態(tài)機的狀態(tài)圖如圖6.18所示,按照該狀態(tài)圖實現(xiàn)這個有限狀態(tài)機的電路,就是從輸入到每一個狀態(tài)觸發(fā)器的邏輯表達式的實現(xiàn)電路。可以用9個狀態(tài)觸發(fā)器來實現(xiàn)這個有限狀態(tài)機,這9個狀態(tài)觸發(fā)器用表示。該有限狀態(tài)機的One-hot編碼如表6.8所示。圖6.18FSM的狀態(tài)圖請按照以下步驟完成練習:
(1)新建一個QuartusⅡ工程,以在DE2上實現(xiàn)該狀態(tài)機。
(2)建立一個Verilog文件,調(diào)用9個觸發(fā)器來實現(xiàn)這個FSM,用簡單的assign語句連接觸發(fā)器的輸入,用SW0作為FSM的低電平有效同步復位端,用SW1作為輸入w,用KEY0作為手動的時鐘輸入,用LEDG0作為輸出z,用LEDR8~LEDR0顯示9個觸發(fā)器的狀態(tài)。
(3)將Verilog文件添加到工程中,編譯工程并對電路進行仿真,確定其功能的正確性。
(4)分配引腳,重新編譯工程,將電路下載到DE2平臺上并進行功能測試。
(5)對表6.8所示的One-hot碼進行簡單的改動,將復位狀態(tài)的所有觸發(fā)器輸出改為全0,這樣在FPGA中實現(xiàn)FSM時會簡化電路。因為FPGA中的觸發(fā)器一般都帶有Clear端,而沒有Set端,所以用Clear端復位電路很方便。
(6)表6.9是對One-hot碼所做的另一種改變,對于狀態(tài)A,所有觸發(fā)器的狀態(tài)都是0。為了實現(xiàn)這個FSM,只要對表6.8中One-hot碼的取反即可。按照表6.9的One-hot碼修改前面完成的FSM并進行功能測試。6.7.2二進制編碼的FSM這部分的練習中,我們用另一種Verilog代碼實現(xiàn)如圖6.18所示的狀態(tài)機。在這個版本的狀態(tài)機中,不需要手工推導每一個狀態(tài)觸發(fā)器的邏輯表達式,而是在第一個always塊中用case語句描述FSM的狀態(tài)表,用第二個always塊實例化狀態(tài)觸發(fā)器,用第三個always塊為輸出z賦值。如表6.10所示,可以用4個狀態(tài)寄存器按二進制編碼的形式實現(xiàn)這個FSM。代碼6.7是本練習的Verilog代碼的建議架構(gòu)。代碼6.7FSM的建議架構(gòu)。modulepart2(...); //定義輸入/輸出
//定義信號reg[3:0]y_Q,Y_D;//y_Q代表當前狀態(tài),Y_D代表下一狀態(tài)parameterA=4’b0000,B=4’b0001,C=4’b0010,D=4’b0011,E=4’b0100,F=4’b0101,G=4’b0110,H=4’b0111,I=4’b1000;always@(w,y_Q)begin:state_tablecase(y_Q)A:if(!w)Y_D=B;elseY_D=F;//狀態(tài)表其余部分default:Y_D=4’bxxxx;endcaseend//狀態(tài)表always@(posedgeClock)begin:state_FFsend//state_FFS //為z和LED賦值endmodule請按照以下步驟完成練習:
(1)新建一個QuartusⅡ工程,以在DE2上實現(xiàn)該狀態(tài)機。
(2)建立一個Verilog文件,調(diào)用9個觸發(fā)器來實現(xiàn)這個FSM,用簡單的assign語句連接觸發(fā)器的輸入。用SW0作為FSM的低電平有效同步復位端,用SW1作為輸入w,用KEY0作為手動時鐘輸入,用LEDG0作為輸出z,用LEDR3~LEDR0顯示4個狀態(tài)觸發(fā)器的輸出。
(3)在編譯工程之前,應明確指定QuartusⅡ的綜合工具采用Verilog代碼中的狀態(tài)分配,如果不作明確說明,綜合工具會自動選擇狀態(tài)機的狀態(tài)分配,而忽略Verilog代碼中指定的狀態(tài)碼。要改變這個設置,在QuartusⅡ中選擇Assignments>Settings,單擊窗口左端的Analysis&SynthesisSettings項,如圖6.19所示,在StateMachineProcessing欄中選中User-Encoded即可。
(4)編譯工程,用RTLViewer工具查看具體電路。單擊電路中的狀態(tài)機,將它與圖6.18的狀態(tài)圖比較,檢查是否正確。打開編譯報告,選擇Analysis&SynthesisSettings,然后單擊StateMachines可以查看狀態(tài)機的狀態(tài)代碼。
(5)對生成的電路進行仿真。
(6)確認電路功能沒有問題后即可分配引腳,將電路下載到FPGA中,進行實際功能的測試。
(7)在第(3)步中,在StateMachineProcessing欄中選擇One-hot選項,編譯后打開編譯報告,選擇Analysis&SynthesisSettings,然后單擊StateMachines可以查看狀態(tài)機的狀態(tài)代碼,再將該狀態(tài)代碼與表6.8的One-hot編碼作比較,看看有何不同。圖6.19在QuartusⅡ中改變狀態(tài)機設置的處理方法6.7.3序列檢測FSM本練習中使用兩個移位寄存器實現(xiàn)序列檢測FSM。在Verilog代碼中用兩個4位移位寄存器來識別0000和1111這兩個序列。參照6.7.2小節(jié)的步驟完成練習,并將其結(jié)果與One-hot編碼FSM及二進制編碼FSM進行比較。請仔細考慮一下能否只用一個4位移位寄存器來實現(xiàn)這個狀態(tài)機,為什么?6.7.4模10加計數(shù)器本練習實現(xiàn)一個模10加計數(shù)器,具體功能如下:Reset輸入用于將計數(shù)器清零;兩個輸入和用于控制計數(shù)器的計數(shù)操作,當=00時計數(shù)值不變,當=01時計數(shù)值加1,當=10時計數(shù)值加2,當=11時計數(shù)值減1。所有的改變都由Clock輸入端的上升沿觸發(fā)。用SW2和SW1分別作為和,用SW0作為Reset輸入,用KEY0作為手動Clock輸入,在HEX0上顯示計數(shù)器的十進制計數(shù)值。請按以下步驟完成練習:
(1)新建一個QuatusⅡ工程,以在DE2上實現(xiàn)該計數(shù)器。
(2)建立一個Verilog文件,參照代碼6.7所示的代碼架構(gòu)實現(xiàn)所要求的電路。
(3)將Verilog文件添加到工程中,編譯工程并對電路進行仿真,確定其功能的正確性。
(4)分配引腳,將顯示輸出連接到HEX0上。
(5)重新編譯工程,將電路下載到DE2平臺上并進行功能測試。6.7.5用移位寄存器與FSM實現(xiàn)“HELLO”的循環(huán)顯示本練習用移位寄存器結(jié)合FSM實現(xiàn)在DE2平臺上的“HELLO”循環(huán)顯示。在HEX7~HEX0上循環(huán)顯示“HELLO”,根據(jù)手動時鐘輸入脈沖的控制,每接收到一個脈沖,顯示左移一位,當“HELLO”移出左邊后,從右邊重新開始顯示。將8個7位寄存器按流水線的形式排列,即第一個寄存器的輸出作為第二個寄存器的輸入,第二個寄存器的輸出作為第三個寄存器的輸入,依此類推。每個寄存器的輸出同時驅(qū)動七段數(shù)碼管顯示。請設計一個狀態(tài)機對寄存器流水線進行以下控制:
(1)在前8個時鐘,F(xiàn)SM將字符“H,E,L,L,O,,,”分別插入8個7位寄存器。
(2)第(1)步完成后,將寄存器流水線配置成循環(huán)模式,即最后一個寄存器的輸出作為第一個寄存器的輸入,使字符可以無限循環(huán)顯示。建立一個新的QuartusⅡ工程,完成以上任務。用DE2平臺上的KEY0作為FSM及移位寄存器的手動時鐘輸入,用SW0作為低電平有效同步清除輸入,并參照代碼6.7所示的代碼架構(gòu)實現(xiàn)所要求的電路。工程編譯完成后,將電路下載到FPGA中測試其功能。6.7.6用FSM實現(xiàn)“HELLO”的自動循環(huán)顯示本練習對6.7.5小節(jié)中的內(nèi)容加以改動,字符的移動以1?s為間隔自動進行,在HEX7~HEX0上循環(huán)顯示“HELLO”,“HELLO”從左邊移出后,再從右邊重新開始顯示。建立一個新的QuartusⅡ工程,完成此任務,用DE2平臺上的50?MHz時鐘(CLOCK_50)作為FSM及移位寄存器的時鐘輸入,并確保所有的觸發(fā)器都采用CLOCK_50作為時鐘,用KEY0作為低電平有效同步清除輸入,并參照代碼6.7所示的代碼架構(gòu)實現(xiàn)所要求的電路。工程編譯完成后,將電路下載到FPGA中進行功能測試。6.7.7移動速度可控的“HELLO”的自動循環(huán)顯示對6.7.6小節(jié)中的練習加以改動,使“HELLO”移動的速度可以控制:當KEY1按下時,移動速度增加一倍;當KEY2按下時,移動速度減小一半。
KEY2和KEY1是經(jīng)過去抖處理的,能夠產(chǎn)生一個精確的脈沖,但脈沖的長度是任意的。建議另外增加一個FSM以監(jiān)測按鍵的狀態(tài),這個FSM的輸出可以作為調(diào)整移動時間間隔的一個變量。KEY2和KEY1是異步輸入的,因此在FSM中使用時應先與系統(tǒng)時鐘同步。電路復位后,字符每秒移動一次。當連續(xù)按KEY1鍵時,字符最快以每秒4次的速度移動;當連續(xù)按KEY2鍵時,字符最慢以每4秒一次的速度移動。建立一個新的QuartusⅡ工程,完成以上任務,并在DE2上測試其功能。6.8存儲器塊在計算機系統(tǒng)中,一般都需要提供一定數(shù)量的存儲器。在用FPGA實現(xiàn)的系統(tǒng)中,除可以使用FPGA本身提供的存儲器資源外,還可以使用FPGA的外部擴充存儲器。本節(jié)練習主要是研究與存儲器相關(guān)的內(nèi)容。圖6.20(a)是一個RAM的結(jié)構(gòu)示意圖,它包含32個8位寬的字節(jié),可通過一個5位的地址口、8位的數(shù)據(jù)口和一個寫控制端口來操作。我們考慮用兩種方法實現(xiàn)這個存儲器:第一種方法采用FPGA上的存儲器塊實現(xiàn);第二種方法采用外部存儲器芯片實現(xiàn)。
EP2C35FPGA片內(nèi)提供專用存儲器M4K存儲器塊。每個M4K存儲器塊包含4096位,支持4K×1、2K×2、1K×4和512×8四種配置。本練習中選擇其512×8的配置,只使用存儲器的前32個字節(jié)。本練習不涉及M4K支持的其他存儲模式。
M4K有兩個重要特性,即每個M4K存儲器塊都有專用的寄存器用于所有輸入/輸出與時鐘同步,而每一個M4K存儲器塊的數(shù)據(jù)讀端口和寫端口是獨立的。因此在使用M4KRAM時,要讓輸入/輸出端口之一或全部與輸入時鐘同步。圖6.20(b)所示是一個改進的32×8RAM模塊,其Address、Write和DataIn端口都通過寄存器與時鐘Clock同步,DataOut沒有經(jīng)過寄存器而直接輸出。圖6.2032×8RAM模塊(a)RAM的結(jié)構(gòu);(b)改進的32×8RAM模塊6.8.1用LPM實現(xiàn)RAM常用的邏輯電路如加法器、計數(shù)器、寄存器及存儲器,都可調(diào)用QuartusⅡ提供的參數(shù)化功能模塊LPM來實現(xiàn)。Altera公司推薦采用LPMaltsyncram實現(xiàn)存儲器。請按照以下步驟,用LPM實現(xiàn)圖6.20(b)所示的存儲器。
(1)新建一個QuartusⅡ工程,設定其目標器件為EP2C35F672C6。
(2)用MegaWizardPlug-InManager產(chǎn)生需要的LPM模塊,在如圖6.21所示的MegaWizardPlug-InManager[page2a]對話框中選擇Storage類的ALTSYNCRAMLPM模塊,將Whichtypeofoutputfiledoyouwanttocreate一項選為VerilogHDL,即選擇生成VerilogHDL文件。在Whatnamedoyouwantfortheoutputfile框中輸入要建立的Verilog文件名,本例中將這個Verilog文件命名為ramlpm。按Next按鈕繼續(xù),在page3of10對話框中選擇單端口模式(Single-portmode),如圖6.22所示。將page7of10對話框中的Whatportsshouldberegistered欄下的復選項Readoutputports(s)'q'去掉,如圖6.23所示。其他配置均選用默認值。按Finish按鈕即可生成如圖6.20(b)所示的RAM模塊的Verilog代碼。圖6.21選擇ALTSYNCRAMLPM圖6.22選擇單端口模式圖6.23配置輸入/輸出端口
(3)編譯工程,在編譯報告里可以看到工程占用了1個M4K塊中256個字節(jié)的RAM。
(4)對電路進行仿真,并驗證電路的功能。6.8.2在DE2上驗證RAM本練習的任務是在DE2上驗證6.8.1小節(jié)中的存儲器電路,即用波段開關(guān)寫一部分數(shù)據(jù)到RAM中,并將RAM中的內(nèi)容讀出來,顯示在數(shù)碼管上。請按照以下步驟完成練習:
(1)新建一個QuartusⅡ工程。
(2)新建一個Verilog文件,例化ramlpm模塊,用DE2平臺上的資源作為其輸入/輸出。用SW15~SW11作為5位的地址輸入,用SW7~SW0作為數(shù)據(jù)輸入,用SW17作為Write信號,用KEY0作為時鐘信號,將Write信號的值在LEDG0上顯示,將地址值在HEX7~HEX6上顯示,將輸入數(shù)據(jù)在HEX5和HEX4上顯示,從RAM中讀出的數(shù)據(jù)在HEX1~HEX0上顯示。
(3)編譯工程,并下載到DE2上。
(4)對電路進行功能測試,確保所有的地址都能夠被正確地讀/寫。6.8.3用Verilog實現(xiàn)RAM除調(diào)用LPM外,我們還可以用Verilog實現(xiàn)RAM的結(jié)構(gòu)。在Verilog代碼中,可以用多維數(shù)組定義存儲器。一個32字節(jié)的8位RAM塊,可以定義為32×8的數(shù)組,在Verilog中可用以下聲明語句來定義:
Reg[7:0]memory_array[31:0];在CycloneⅡ系列FPGA中,這種數(shù)組可以由觸發(fā)器實現(xiàn),也可以由M4K存儲器塊實現(xiàn)。有兩種方法可以保證用M4K存儲器塊實現(xiàn)RAM:第一種方法是調(diào)用LPM庫;另一種方法是用適當形式的Verilog代碼定義RAM,QuartusⅡ軟件在編譯的時候,會自動推斷出該代碼描述的是一個RAM塊,從而用M4K存儲器塊實現(xiàn)RAM。具體實現(xiàn)方法可通過在QuartusⅡ的軟件幫助中搜索主題“Inferredmemory”來查閱。參照Inferredmemory的內(nèi)容完成以下練習:
(1)新建一個QuartusⅡ工程。
(2)新建一個Verilog文件,用Verilog代碼實現(xiàn)類似于6.8.2小節(jié)中練習的功能。RAM模塊用數(shù)組定義,Verilog代碼中應包含RAM的寫入和讀出功能。
(3)編譯工程,并下載到DE2上。
(4)對電路進行功能測試,確保所有的地址都能夠被正確地讀/寫,并與6.8.2小節(jié)中練習的功能作比較。6.8.4FPGA片外RAM的使用
DE2平臺上集成了一個SRAM芯片IS61LV25616AL-10,這是一個256?K字節(jié)的16位靜態(tài)RAM(SRAM)。這個SRAM芯片的接口包括18位地址口A17~A0,16位雙向數(shù)據(jù)口I/O?15~I/O?0,還包括CE、OE、WE、UB和LB等控制信號,且這些控制信號都是低電平有效的,具體功能如表6.11所示。
IS61LV25616AL的具體操作參考其數(shù)據(jù)手冊,數(shù)據(jù)手冊中描述了IS61LV25616AL的多種操作模式以及各種操作模式的時序及參數(shù)。本練習中采用最簡單的一種操作模式,即保持CE、OE、UB和LB等信號有效(置0),而只用WE信號作為讀/寫控制。這種操作模式的時序如圖6.24所示,其中圖6.24(a)是讀循環(huán)的時序,當WE保持高電平而地址信號A17~A0有效時,存儲器延時,然后將有效數(shù)據(jù)送到I/O15~I/O0端口。地址信號改變后,讀循環(huán)結(jié)束,有效數(shù)據(jù)仍然可以保持。圖6.24(b)是寫循環(huán)的時序,從WE置0開始到WE置1結(jié)束,在WE上升沿之前,地址信號必須保持地址建立時間有效,而數(shù)據(jù)必須保持數(shù)據(jù)建立時間有效。表6.12列出了圖6.24中的所有時間參數(shù)。圖6.24SRAM讀/寫操作時序(a)?SRAM讀循環(huán)時序;(b)?SRAM寫循環(huán)時序本練習用SRAM芯片實現(xiàn)如圖6.20(a)所示的32×8的RAM模塊,請按照以下步驟完成練習:
(1)建立一個新的QuartusⅡ工程,編寫Verilog代碼,完成所需的功能,包括對存儲器的讀/寫,使用與6.8.2小節(jié)及6.8.3小節(jié)相同的LED和七段數(shù)碼管顯示,使用表6.11的引腳配置實現(xiàn)IS61LV256AL的接口設置。注意,本例中沒有使用IS61LV256AL的所有數(shù)據(jù)及地址引腳,故在Verilog中應將不需要使用的引腳接地。
(2)編譯工程,并下載到FPGA中。
(3)對電路進行功能測試,確保所有的地址都能夠正確讀/寫。6.8.5用LPM實現(xiàn)簡單雙口RAM圖6.20所示的存儲器是一個單口RAM,即對RAM的讀/寫操作共用一組地址端口。本練習建立另外一種RAM模塊,即雙口RAM,其讀/寫采用不同的地址端口。請按以下步驟完成練習:
(1)建立一個新的QuartusⅡ工程,在MegaWizardPlug-InManager[Page2a]對話框中選擇Storage類下的ALTSYNCRAMLPM模塊,在Whichtypeofoutputfiledoyouwanttocreate項中選VerilogHDL,即選擇生成VerilogHDL文件。在Whatnamedoyouwantfortheoutputfile框中輸入要建立的Verilog文件名。按Next按鈕繼續(xù),在如圖6.25所示的page3of10對話框中,選擇簡單雙口模式(Simpledual-portmode),在如圖6.26所示的page8of10對話框中,在MixedPortRead-During-WriteforSingleInputClockRAM欄中選擇Idon’tcare,表示當讀/寫地址相同時,不考慮輸出的是舊數(shù)據(jù)還是新數(shù)據(jù);在如圖6.27所示的page9of10對話框的Doyouwanttospecifytheinitialcontentofthememory欄中選擇yes,use…,這種選擇允許當電路下載到FPGA中去的時候,可以對存儲器的內(nèi)容進行初始化,初始化的內(nèi)容以存儲器初始化文件(MemoryInitializationFile,MIF)格式存儲。在Filename欄中輸入.mif文件的文件名,本例中選用的文件名為ramlpm.mif。關(guān)于MIF文件的具體格式,請參照QuartusⅡ的幫助或相關(guān)手冊,這個文件需要由用戶建立。圖6.25確定RAM的模式圖6.26確定同時讀同一個地址內(nèi)容時的處理機制圖6.27確定存儲器初始化文件的名稱
(2)關(guān)閉向?qū)Ш?,測試生成的存儲器模塊文件ramlpm.v。
(3)編寫一個Verilog文件,然后調(diào)用一個存儲器模塊的實例。為了查看RAM中的內(nèi)容,將RAM中的內(nèi)容用十六進制形式逐字節(jié)地顯示在HEX1和HEX0上,約每秒鐘滾動一次,同時在HEX3和HEX2上顯示該字節(jié)的地址。使用DE2平臺上的50?MHz時鐘CLOCK_50作為時鐘源,使用KEY0作為Reset輸入。輸入數(shù)據(jù)所用的波段開關(guān)、數(shù)碼管與6.8.2小節(jié)中的相同,注意要將波段開關(guān)的輸入與50?MHz時鐘同步。
(4)編譯工程并在DE2上對電路進行測試,確認存儲器中的內(nèi)容是否與ramlpm.mif文件中的相同,確??梢杂貌ǘ伍_關(guān)向任何地址寫入任何數(shù)據(jù)。6.8.6偽雙口RAM在6.8.5小節(jié)中建立的雙口RAM,由于有兩個地址口,因此可以同時對其進行讀操作和寫操作。本練習中建立的RAM具有類似的功能,但只使用一個單口RAM來實現(xiàn)。由于只有一個地址端口,因此需要通過復用來分時進行讀/寫操作。請按以下步驟完成練習:
(1)新建一個QuartusⅡ工程,使用MegaWizardPlug-InManager建立一個單口RAM。與6.8.1小節(jié)中建立的單口RAM不同的是,在Page9of10對話框中選擇RAM內(nèi)容的初始化文件時,要同時選中AllowIn-SystemMemoryContentEditortocaptureandupdatecontentindependentlyofthesystemclock項,即允許QuartusⅡ的在系統(tǒng)存儲器內(nèi)容編輯器(In-SystemMemoryContentEditor)查看和修改這個RAM塊中的內(nèi)容,如圖6.28所示。使用這個工具的時候,可以為存儲器塊設定一個“InstanceID”,本例中將這個存儲器的InstanceID設為32x8。圖6.28允許在系統(tǒng)存儲器內(nèi)容編輯器修改的RAM內(nèi)容
(2)編寫一個Verilog文件,調(diào)用這個RAM模塊,實現(xiàn)與6.8.5小節(jié)練習一樣的功能。
(3)在使用In-SystemMemoryContentEditor查看和編輯RAM內(nèi)容之前,還要對另一個設置進行修改。用Assignment>settings菜單打開Settings對話框,在Analysis&SynthesisSettings欄的DefaultParameters中添加一個參數(shù)CYCLONEII_SAFE_WRITE,其默認設置為RESTRUCTURE,如圖6.29所示。這個參數(shù)允許Quartus的綜合工具對單口RAM加以改進,使之能被In-SystemMemoryContentEditor查看和修改。圖6.29設置CYCLONEII_SAFE_WRITE參數(shù)
(4)編譯并將電路下載到DE2中,對電路進行功能測試,確認所有RAM的內(nèi)容都可以讀/寫,并與6.8.5小節(jié)中練習的結(jié)果進行比較。
(5)用Tools>In-SystemMemoryContentEditor菜單打開如圖6.30所示的窗口,通過這個窗口可以讀取或修改RAM中的內(nèi)容,具體使用方法請參照QuartusⅡ軟件的使用幫助。改變RAM中的內(nèi)容,確認在數(shù)碼管上顯示的內(nèi)容與In-SystemMemoryContentEditor中的內(nèi)容一致。圖6.30In-SystemMemoryContentEditor窗口6.8.7用DE2控制面板查看并修改片外RAM的內(nèi)容本練習用SRAM芯片IS61LV25616AL取代M4K存儲器塊,實現(xiàn)6.8.6小節(jié)和
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 建筑監(jiān)理基礎(chǔ)施工協(xié)議
- 農(nóng)業(yè)創(chuàng)新園區(qū)停車場改造合同
- 鉆孔工程安全生產(chǎn)考核合同
- 環(huán)保工程木地板工程合同
- 醫(yī)院管理團隊聘用合同
- 租用合同樣本:消防設備
- 護理科研項目管理與實施
- 藥品采購績效評估體系
- 電子產(chǎn)品招投標市場現(xiàn)狀分析
- 陶瓷制品廠建設鋼結(jié)構(gòu)施工合同
- 鍋爐控制器modbus協(xié)議支持說明
- 粉末涂料有限公司危廢庫安全風險分級管控清單
- 安全生產(chǎn)信息管理制度全
- 住宅物業(yè)危險源辨識評價表
- 世界主要國家洲別、名稱、首都、代碼、區(qū)號、時差匯總表
- 2023學年廣東省廣州市越秀區(qū)鐵一中學九年級(上)物理期末試題及答案解析
- 《報告文學研究》(07562)自考考試復習題庫(含答案)
- 安全操作規(guī)程
- 電源日常點檢記錄表
- 人教版小學三年級語文上冊期末測試卷.及答題卡2
- 鋼軌接頭位置及接頭聯(lián)結(jié)形式
評論
0/150
提交評論