EDA技術(shù)項(xiàng)目教程-基于VHDL與FPGA 課件 于潤(rùn)偉 項(xiàng)目6、7 信號(hào)發(fā)生器的設(shè)計(jì)與實(shí)現(xiàn)、數(shù)字系統(tǒng)設(shè)計(jì)實(shí)訓(xùn)_第1頁(yè)
EDA技術(shù)項(xiàng)目教程-基于VHDL與FPGA 課件 于潤(rùn)偉 項(xiàng)目6、7 信號(hào)發(fā)生器的設(shè)計(jì)與實(shí)現(xiàn)、數(shù)字系統(tǒng)設(shè)計(jì)實(shí)訓(xùn)_第2頁(yè)
EDA技術(shù)項(xiàng)目教程-基于VHDL與FPGA 課件 于潤(rùn)偉 項(xiàng)目6、7 信號(hào)發(fā)生器的設(shè)計(jì)與實(shí)現(xiàn)、數(shù)字系統(tǒng)設(shè)計(jì)實(shí)訓(xùn)_第3頁(yè)
EDA技術(shù)項(xiàng)目教程-基于VHDL與FPGA 課件 于潤(rùn)偉 項(xiàng)目6、7 信號(hào)發(fā)生器的設(shè)計(jì)與實(shí)現(xiàn)、數(shù)字系統(tǒng)設(shè)計(jì)實(shí)訓(xùn)_第4頁(yè)
EDA技術(shù)項(xiàng)目教程-基于VHDL與FPGA 課件 于潤(rùn)偉 項(xiàng)目6、7 信號(hào)發(fā)生器的設(shè)計(jì)與實(shí)現(xiàn)、數(shù)字系統(tǒng)設(shè)計(jì)實(shí)訓(xùn)_第5頁(yè)
已閱讀5頁(yè),還剩172頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

EDA項(xiàng)目教程

——基于VHDL與FPGA項(xiàng)目6信號(hào)發(fā)生器的設(shè)計(jì)與實(shí)現(xiàn)本章要點(diǎn)

子程序和LOOP語(yǔ)句

存儲(chǔ)器的設(shè)計(jì)

信號(hào)發(fā)生器的設(shè)計(jì)與實(shí)現(xiàn)

6.1

子程序和LOOP語(yǔ)句

子程序是由一組順序語(yǔ)句組成的,在程序包或結(jié)構(gòu)體內(nèi)定義,在結(jié)構(gòu)體或進(jìn)程中調(diào)用。子程序只有定義后才能被調(diào)用,將處理結(jié)果返回給主程序,主程序和子程序之間通過(guò)端口參數(shù)關(guān)聯(lián)進(jìn)行數(shù)據(jù)傳送,可以被多次調(diào)用以便完成重復(fù)性的任務(wù)。每次調(diào)用時(shí),都要先對(duì)子程序進(jìn)行初始化,一次執(zhí)行結(jié)束后再次調(diào)用需再次初始化,因此子程序內(nèi)部定義的變量都是局部量。雖然子程序可以被多次調(diào)用完成重復(fù)性的任務(wù),但從硬件角度看,EDA軟件的綜合工具對(duì)每次調(diào)用的子程序都要生成一個(gè)電路邏輯模塊,因此設(shè)計(jì)者在頻繁調(diào)用子程序時(shí)需要考慮硬件的承受能力。VHDL中的子程序有兩種類型:過(guò)程和函數(shù)。過(guò)程和函數(shù)的區(qū)別主要是返回值和參數(shù)不同,過(guò)程調(diào)用可以通過(guò)其接口返回多個(gè)值,函數(shù)只能返回單個(gè)值;過(guò)程可以有輸入?yún)?shù)、輸出參數(shù)和雙向參數(shù),函數(shù)的所有參數(shù)都是輸入?yún)?shù)。6.1.1子程序1.過(guò)程(PROCEDURE)過(guò)程的定義語(yǔ)句由兩部分組成,即過(guò)程首和過(guò)程體。過(guò)程定義的格式為:PROCEDURE過(guò)程名參數(shù)列表--過(guò)程首PROCEDURE過(guò)程名參數(shù)列表IS--過(guò)程體說(shuō)明部分;BEGIN順序語(yǔ)句;END過(guò)程名;調(diào)用過(guò)程語(yǔ)句的格式為:過(guò)程名參數(shù)列表;LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYpsumISPORT(a,b,c:INSTD_LOGIC_VECTOR(3DOWNTO0);clk,clr:INSTD_LOGIC;--clr為復(fù)位端,

高電平有效SUM:OUTSTD_LOGIC_VECTOR(3DOWNTO0));ENDpsum;用一個(gè)過(guò)程語(yǔ)句來(lái)實(shí)現(xiàn)3個(gè)4位二進(jìn)制數(shù)據(jù)求和的運(yùn)算程序ARCHITECTUREaOFpsumISPROCEDUREadd1(data,datb,datc:INSTD_LOGIC_VECTOR;--定義過(guò)程體datout:OUTSTD_LOGIC_VECTOR)ISBEGINdatout:=data+datb+datc;--數(shù)據(jù)求和ENDadd1;--過(guò)程體定義結(jié)束。

在結(jié)構(gòu)體中省略了過(guò)程首BEGIN--結(jié)構(gòu)體開(kāi)始PROCESS(clk)VARIABLEtmp:STD_LOGIC_VECTOR(3DOWNTO0);BEGIN--進(jìn)程開(kāi)始IF(clk'EVENTANDclk='1')THENIF(clr='1')THEN--高電平

同步復(fù)位tmp:="0000";ELSEadd1(a,b,c,tmp);--過(guò)程調(diào)用ENDIF;ENDIF;SUM<=tmp;ENDPROCESS;ENDa;

從仿真波形中可以看出,在0~50ns區(qū)間,CLR=1(同步復(fù)位有效),SUM=0000;在50~100ns區(qū)間,clk上升沿的左側(cè)(觀察輸入信號(hào)),a=0001、b=0100、c=0010,clk上升沿的右側(cè)(觀察輸出信號(hào)),SUM=0111;在350~400ns區(qū)間,clk上升沿的左側(cè),a=0111、b=0111、c=0011,clk上升沿的右側(cè),SUM=0001(數(shù)據(jù)溢出)。其他區(qū)間的波形情況符合題意。想一想、做一做:如何解決數(shù)據(jù)溢出的問(wèn)題?求和運(yùn)算程序的仿真波形

在VHDL中,用戶可以自己定義一個(gè)程序包,將一些數(shù)據(jù)類型、子程序和元件保存在該程序包中,以便被其他設(shè)計(jì)程序所利用。程序包分為包首和包體兩部分,格式如下。(1)包首:PACKAGE程序包名稱IS

包首說(shuō)明;END程序包名稱;(2)包體:PACKAGEBODY程序包名稱IS

包體說(shuō)明語(yǔ)句組,END程序包名稱;

說(shuō)明:包首說(shuō)明部分可定義函數(shù)、元件和子程序等。包體說(shuō)明語(yǔ)句組部分是具體描述函數(shù)、元件和子程序的內(nèi)容。在程序包結(jié)構(gòu)中,如果在包首中定義了函數(shù)、元件和子程序的具體內(nèi)容,這時(shí)包體可以缺省。2.程序包3.函數(shù)(FUNCTION)函數(shù)語(yǔ)句分為兩個(gè)部分:函數(shù)首和函數(shù)體。在進(jìn)程

和結(jié)構(gòu)體中,函數(shù)首可以省略,而在程序包中,必須定義函數(shù)首,放在程序包的包首部分,而函

數(shù)體放在包體部分。格式如下:FUNCTION函數(shù)名(參數(shù)列表)--函數(shù)首

RETURN數(shù)據(jù)類型名;FUNCTION函數(shù)名(參數(shù)列表)--函數(shù)體

RETURN數(shù)據(jù)類型名IS

說(shuō)明部分;

BEGIN

順序語(yǔ)句;

RETURN返回變量;

END函數(shù)名;調(diào)用函數(shù)語(yǔ)句的格式為:y<=函數(shù)名(參數(shù)列表);

編寫(xiě)一個(gè)能輸出2個(gè)4位二進(jìn)制數(shù)中較大數(shù)的函數(shù),并將這段函數(shù)放在一個(gè)程序包中,然后在進(jìn)程中調(diào)用該函數(shù)兩次,輸出3個(gè)4位二進(jìn)制數(shù)中的最大數(shù)。(1)在名稱為blockA的程序包中,定義函數(shù)名稱為maxA的函數(shù),程序包文件名為blockA.vhd。由于本題需要調(diào)用程序包中定義的函數(shù),可先建立一個(gè)文件夾,打開(kāi)QuartusⅡ軟件建立一個(gè)項(xiàng)目,項(xiàng)目名為smax,再編輯以下程序:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;PACKAGEblockAIS--定義程序包的包頭,blockA是程序包名FUNCTIONmaxA(a:STD_LOGIC_VECTOR;--定義函數(shù)首,函數(shù)名是maxAb:STD_LOGIC_VECTOR)RETURNSTD_LOGIC_VECTOR;--定義函數(shù)返回值的類型ENDblockA;PACKAGEBODYblockAIS--定義程序包體FUNCTIONmaxA(a:STD_LOGIC_VECTOR;--定義函數(shù)體b:STD_LOGIC_VECTOR)RETURNSTD_LOGIC_VECTORISVARIABLEtmp:STD_LOGIC_VECTOR(3DOWNTO0);BEGINIF(a>b)THENtmp:=a;ELSEtmp:=b;ENDIF;RETURNtmp;--tmp是函數(shù)返回變量ENDmaxA;--函數(shù)體結(jié)束ENDblockA;注意:編輯完成后,不用編譯,直接使用文件名blockA保存在當(dāng)前文件夾下,以供主程序調(diào)用。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;LIBRARYWORK;--WORK是用戶工作庫(kù)USEWORK.blockA.ALL;--使用WORK庫(kù)中的blockA程序包ENTITYsmaxISPORT(dc,da,db:INSTD_LOGIC_VECTOR(3DOWNTO0);clk,clr:INSTD_LOGIC;D:OUTSTD_LOGIC_VECTOR(3DOWNTO0));ENDsmax;(2)調(diào)用函數(shù)maxA的程序,文件名是smax.vhdARCHITECTUREaOFsmaxISBEGINPROCESS(clk)VARIABLEtmp:STD_LOGIC_VECTOR(3DOWNTO0);VARIABLEtmpmax:STD_LOGIC_VECTOR(3DOWNTO0);BEGINIF(clk'EVENTANDclk='1')THENIF(clr='1')THENtmpmax:="ZZZZ";ELSEtmp:=maxA(da,db);--調(diào)用函數(shù),最大值放入tmp中tmpmax:=maxA(dc,tmp);ENDIF;ENDIF;D<=tmpmax;ENDPROCESS;ENDa;從仿真波形中可以看出,在0~50ns區(qū)間,CLR=1(同步復(fù)位有效),D=ZZZZ(高阻);在50~100ns區(qū)間,clk上升沿的左側(cè)(觀察輸入信號(hào)),da=0001、db=0100、dc=0010,clk上升沿的右側(cè)(觀察輸出信號(hào)),D=0100。其他區(qū)間的波形情況符合題意。輸出最大值的仿真波形6.1.2LOOP語(yǔ)句1.FOR循環(huán)FOR循環(huán)是一種已知循環(huán)次數(shù)的語(yǔ)句,其格式如下:[循環(huán)標(biāo)號(hào)]:FOR循環(huán)變量IN循環(huán)次數(shù)范圍LOOP順序語(yǔ)句;

ENDLOOP[循環(huán)標(biāo)號(hào)];其中,循環(huán)標(biāo)號(hào)是用來(lái)表示FOR循環(huán)語(yǔ)句的標(biāo)識(shí)符,是可選項(xiàng)。循環(huán)次數(shù)范圍表示循環(huán)變量的取值范圍,且在每次循環(huán)中,循環(huán)變量的值都要發(fā)生變化。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYpcISPORT(a:INSTD_LOGIC_VECTOR(7DOWNTO0);y:OUTSTD_LOGIC);ENDpc;用FOR循環(huán)語(yǔ)句描述一個(gè)8位奇校驗(yàn)電路,電路輸入信號(hào)為a,輸出信號(hào)為yARCHITECTUREoddOFpcISBEGINcbc:PROCESS(a)VARIABLEtmp:STD_LOGIC;--tmp為局部變量,只能在進(jìn)程中定義BEGINtmp:='0';FORiIN0TO7LOOP--循環(huán)變量i由循環(huán)語(yǔ)句自動(dòng)定義tmp:=tmpXORa(i);ENDLOOP;--缺省了循環(huán)標(biāo)號(hào)y<=tmp;ENDPROCESScbc;ENDodd;2.WHILE循環(huán)WHILE循環(huán)是一種未知循環(huán)次數(shù)的語(yǔ)句,循環(huán)次數(shù)取決于條件表達(dá)式是否成立。其格式如下:[循環(huán)標(biāo)號(hào)]:WHILE條件表達(dá)式LOOP順序語(yǔ)句;

ENDLOOP[循環(huán)標(biāo)號(hào)];循環(huán)標(biāo)號(hào)是用來(lái)表示W(wǎng)HILE循環(huán)語(yǔ)句的標(biāo)識(shí)符,是可選項(xiàng)。在循環(huán)語(yǔ)句中,沒(méi)有給出循環(huán)次數(shù)的范圍,而是給出了循環(huán)語(yǔ)句的條件。WHILE后邊的條件表達(dá)式是一個(gè)布爾表達(dá)式,如果條件為T(mén)URE,則進(jìn)行循環(huán),如果條件為FALSE,則結(jié)束循環(huán)。用WHILE循環(huán)語(yǔ)句描述8位奇校驗(yàn)電路LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYpcISPORT(a:INSTD_LOGIC_VECTOR(7DOWNTO0);y:OUTSTD_LOGIC);ENDpc;ARCHITECTUREaOFpcISBEGINcbc:PROCESS(a)VARIABLEtmp:STD_LOGIC;--tmp為局部變量,只能在進(jìn)程中定義VARIABLEi:INTEGER;--定義循環(huán)變量i,WHILE語(yǔ)句不用自定義BEGINtmp:='0';i:=0;--給循環(huán)變量i賦初值WHILE(i<8)LOOPtmp:=tmpXORa(i);i:=i+1;ENDLOOP;

y<=tmp;ENDPROCESScbc;ENDa;注意:并非所有的EDA綜合器都支持WHILE語(yǔ)句。6.2存儲(chǔ)器

存儲(chǔ)器是數(shù)學(xué)系統(tǒng)的重要組成部分之一,用來(lái)存儲(chǔ)程序和數(shù)據(jù),表征系統(tǒng)的“記憶”功能。存儲(chǔ)器屬于通用大規(guī)模器件,一般不需要自行設(shè)計(jì),但是數(shù)字系統(tǒng)有時(shí)需要設(shè)計(jì)一些小型的存儲(chǔ)器件,用于臨時(shí)存放數(shù)據(jù),構(gòu)成查表運(yùn)算的數(shù)據(jù)表等。6.2.1ROMROM(只讀存儲(chǔ)器)是一種只能讀出所存數(shù)據(jù)的存儲(chǔ)器,其特性是一旦儲(chǔ)存資料就無(wú)法再將之改變或刪除。ROM所存數(shù)據(jù)穩(wěn)定,斷電后所存數(shù)據(jù)也不會(huì)改變;其結(jié)構(gòu)較簡(jiǎn)單,讀出較方便,因而常用于存儲(chǔ)各種固定程序和數(shù)據(jù)。

1.設(shè)計(jì)題目設(shè)計(jì)一個(gè)容量為256×4的ROM。2.實(shí)體的確定

容量為256×4的ROM應(yīng)該有8條輸入地址線(28=256),設(shè)為ADDR,即ADDR(0)~ADDR(7);ROM的數(shù)據(jù)寬度為4,應(yīng)該有4條數(shù)據(jù)輸出線,設(shè)為DOUT,即DOUT(0)~DOUT(3)。ENTITYROMISPORT(CLK:INSTD_LOGIC;ADDR:INSTD_LOGIC_VECTOR(7DOWNTO0);DOUT:OUTSTD_LOGIC_VECTOR(3DOWNTO0));ENDROM;ARCHITECTUREARTOFROMISBEGINPROCESS(CLK)BEGINIFCLK'EVENTANDCLK='1'THENCASEADDRISWHEN"00000000"=>DOUT<="0001";WHEN"00000001"=>DOUT<="0010";WHEN"00000010"=>DOUT<="0011";WHEN"00000011"=>DOUT<="0100";3.結(jié)構(gòu)體的確定WHEN"00000100"=>DOUT<="0101";WHEN"00000101"=>DOUT<="1000";WHEN"00011000"=>DOUT<="1100";WHEN"00011100"=>DOUT<="1110";WHEN"00100000"=>DOUT<="1101";WHEN"00100100"=>DOUT<="0111";WHENOTHERS=>DOUT<="ZZZZ";--其他情況輸出高阻狀態(tài)ENDCASE;ENDIF;ENDPROCESS;ENDART;LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;4.庫(kù)和程序包的確定波形仿真

從仿真波形中可以看出,地址ADDR=00000000,讀出的數(shù)據(jù)DOUT=0001;地址ADDR=00000001,讀出的數(shù)據(jù)DOUT=0010;符合表6-1中的設(shè)置。地址ADDR=00000110,該地址沒(méi)有存入數(shù)據(jù),DOUT=ZZZZ,符合設(shè)計(jì)要求。6.2.2SRAMRAM(隨機(jī)存取存儲(chǔ)器)是指可以從任意選定的存儲(chǔ)單元中讀出數(shù)據(jù),或?qū)?shù)據(jù)寫(xiě)入任意選定的存儲(chǔ)單元。其優(yōu)點(diǎn)是讀、寫(xiě)方便,使用靈活。缺點(diǎn)是掉電就丟失信息。RAM分為SRAM(靜態(tài)隨機(jī)存儲(chǔ)器)和DRAM(動(dòng)態(tài)隨機(jī)存儲(chǔ)器)兩大類。SRAM的特點(diǎn)是只要不斷電,信息將長(zhǎng)期保存,所需的讀/寫(xiě)控制電路簡(jiǎn)單,存取速度快,一般用于容量小于64KB的小系統(tǒng)或作為大系統(tǒng)中的高速緩沖器。DRAM的存儲(chǔ)單元由靜態(tài)存儲(chǔ)單元改為動(dòng)態(tài)存儲(chǔ)單元,能做到較大的存儲(chǔ)容量,但控制電路比較復(fù)雜。SRAM的容量用深度×寬度表示,深度是指存儲(chǔ)數(shù)據(jù)的數(shù)量;寬度是指存儲(chǔ)數(shù)據(jù)的位數(shù)。例如一個(gè)寬度為8、深度為8的SRAM,就可以存儲(chǔ)8個(gè)8位的數(shù)據(jù),表示為8×8的SRAM;同樣寬度為8、深度為12的SRAM就可以存儲(chǔ)12個(gè)8位的數(shù)據(jù),表示為12×8的SRAM。1.設(shè)計(jì)題目設(shè)計(jì)一個(gè)8×8的SRAM2.實(shí)體的確定8×8的SRAM表示存儲(chǔ)8個(gè)八位二進(jìn)制數(shù)據(jù),數(shù)據(jù)輸入和輸出端都需要八位的STD_LOGIC_VECTOR類型,設(shè)數(shù)據(jù)輸入端為DATAIN、數(shù)據(jù)輸出端為DATAOUT;存儲(chǔ)的數(shù)據(jù)有8個(gè),讀寫(xiě)地址線三位即可(23=8),設(shè)讀地址為RADDR、寫(xiě)地址為WADDR,均為STD_LOGIC_VECTOR類型;還需要讀寫(xiě)控制線,設(shè)讀控制線為RE、寫(xiě)控制線為WE,均為STD_LOGIC類型。ENTITYSRAMISPORT(CLK:INSTD_LOGIC;WE,RE:INSTD_LOGIC;--寫(xiě)、讀信號(hào),高電平有效DATAIN:INSTD_LOGIC_VECTOR(7DOWNTO0);WADDR:INSTD_LOGIC_VECTOR(2DOWNTO0);RADDR:INSTD_LOGIC_VECTOR(2DOWNTO0);DATAOUT:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDSRAM;3.結(jié)構(gòu)體的確定分為寫(xiě)、讀2個(gè)進(jìn)程,先寫(xiě)后讀;自定義8×8數(shù)組用于存儲(chǔ)數(shù)據(jù),該數(shù)組的行號(hào)使用寫(xiě)、讀地址產(chǎn)生,由于寫(xiě)、讀地址為STD_LOGIC_VECTOR類型,而數(shù)組的行號(hào)是整數(shù),需要使用數(shù)據(jù)類型轉(zhuǎn)換函數(shù)CONV_INTEGER。ARCHITECTUREARTOFSRAMISTYPEMEMISARRAY(7DOWNTO0)OFSTD_LOGIC_VECTOR(7DOWNTO0);--自定義8×8數(shù)組RAMTMPSIGNALRAMTMP:MEM;BEGIN

WR:PROCESS(CLK)--寫(xiě)進(jìn)程BEGINIFCLK'EVENTANDCLK='1'THENIFWE='1'THENRAMTMP(CONV_INTEGER(WADDR))<=DATAIN;--寫(xiě)入數(shù)據(jù)ENDIF;ENDIF;ENDPROCESSWR;RR:PROCESS(CLK)--讀進(jìn)程BEGINIFCLK'EVENTANDCLK='1'THENIFRE='1'THENDATAOUT<=RAMTMP(CONV_INTEGER(RADDR));--讀出數(shù)據(jù)ENDIF;ENDIF;ENDPROCESSRR;ENDART;由于結(jié)構(gòu)體中使用了數(shù)據(jù)類型轉(zhuǎn)換函數(shù)CONV_INTEGER,需要調(diào)用IEEE庫(kù)中的STD_LOGIC_UNSIGNED程序包,因此需要在實(shí)體的前面調(diào)用IEEE庫(kù),并使用該程序包。參考程序如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;4.庫(kù)和程序包的確定波形仿真

從仿真波形中可以看出,在0~250ns區(qū)間,WE=1(寫(xiě)控制有效)、寫(xiě)地址WADDR=000~100、數(shù)據(jù)DATAIN=02~06,按寫(xiě)地址寫(xiě)入數(shù)據(jù),同時(shí),RE=0(讀控制無(wú)效),數(shù)據(jù)DATAOUT=00(初始數(shù)據(jù));在300~600ns區(qū)間,WE=0(寫(xiě)控制無(wú)效)、RE=1(讀控制有效)、讀地址RADDR=000~101,在CLK上升沿右側(cè),讀出的數(shù)據(jù)DATAOUT=02~06,即讀出寫(xiě)入的數(shù)據(jù);在450~700ns區(qū)間,WE=1(寫(xiě)控制有效)、寫(xiě)地址WADDR=001~101、寫(xiě)入數(shù)據(jù)DATAIN=0B~0F,在850~1000ns區(qū)間,RE=1(讀控制有效)、讀地址RADDR=011~101、讀出數(shù)據(jù)DATAIN=0D~0F。6.2.3FIFO

FIFO是一種先進(jìn)先出的隊(duì)列式數(shù)據(jù)緩存器,與SRAM存儲(chǔ)器的區(qū)別是沒(méi)有外部讀寫(xiě)地址線,這樣使用起來(lái)非常簡(jiǎn)單,但缺點(diǎn)就是只能順序?qū)懭霐?shù)據(jù),按順序讀出數(shù)據(jù),其數(shù)據(jù)地址由內(nèi)部讀寫(xiě)指針自動(dòng)加1完成,不能像SRAM存儲(chǔ)器那樣可以由地址線決定讀取或?qū)懭肽硞€(gè)指定的地址。FIFO一般用于不同時(shí)鐘域之間的數(shù)據(jù)傳輸。例如FIFO的一端是AD數(shù)據(jù)采集,另一端是計(jì)算機(jī)的PCI總線,就可以采用FIFO來(lái)作為數(shù)據(jù)緩沖。另外對(duì)于不同寬度的數(shù)據(jù)接口也可以用FIFO,例如單片機(jī)是八位數(shù)據(jù)輸出,而DSP可能是十六位數(shù)據(jù)輸入,在單片機(jī)與DSP傳輸數(shù)據(jù)時(shí)就可以使用FIFO來(lái)達(dá)到數(shù)據(jù)匹配的目的。FIFO的一些重要參數(shù):

讀寫(xiě)指針其實(shí)就是讀寫(xiě)的地址,只不過(guò)這個(gè)地址不能任意選擇,而是連續(xù)的。為了保證數(shù)據(jù)正確的寫(xiě)入或讀出,而不發(fā)生溢出或空讀的狀態(tài)出現(xiàn),必須保證FIFO在滿的情況下,不能進(jìn)行寫(xiě)操作;在空的狀態(tài)下不能進(jìn)行讀操作。(1)滿標(biāo)志:FIFO已滿或?qū)⒁獫M(只能寫(xiě)入當(dāng)前數(shù)據(jù))時(shí),由狀態(tài)電路發(fā)出的一個(gè)信號(hào),以阻止寫(xiě)操作繼續(xù)向FIFO中寫(xiě)入數(shù)據(jù)而造成數(shù)據(jù)溢出。(2)空標(biāo)志:FIFO已空或?qū)⒁諘r(shí),由狀態(tài)電路發(fā)出的一個(gè)信號(hào),以阻止讀操作繼續(xù)從FIFO中讀出數(shù)據(jù)而造成無(wú)效數(shù)據(jù)的讀出。(3)讀指針:指向下一個(gè)讀出地址。讀完后自動(dòng)加1。(4)寫(xiě)指針:指向下一個(gè)要寫(xiě)入的地址的,寫(xiě)完自動(dòng)加1。2.設(shè)計(jì)提示有以下兩種情況不能寫(xiě)入:(1)寫(xiě)地址到達(dá)最后一位,同時(shí),讀地址在初始位置。即寫(xiě)滿全部空間,而且沒(méi)有讀出;(2)寫(xiě)滿后,讀出幾個(gè)字節(jié)但沒(méi)有全部讀完,留下的空位又被寫(xiě)滿。同樣有以下兩種情況不能讀出:(1)讀地址到達(dá)最后一位,同時(shí),寫(xiě)地址在初始位置即已將所有數(shù)據(jù)讀出,而且沒(méi)有再次寫(xiě)入;(2)讀空后,寫(xiě)入幾個(gè)字節(jié)但沒(méi)有寫(xiě)滿,又開(kāi)始讀操作,讀出這幾個(gè)字節(jié)后。3.實(shí)體的確定設(shè)寫(xiě)信號(hào)為WE、讀信號(hào)為RE、輸入數(shù)據(jù)位DATAIN、輸出數(shù)據(jù)為DATAOUT、空標(biāo)志為EF、滿標(biāo)志為FF、實(shí)體名為FIFO。ENTITYFIFOISPORT(CLK,CLR:INSTD_LOGIC;WE,RE:INSTD_LOGIC;--寫(xiě)信號(hào)、讀信號(hào)

DATAIN:INSTD_LOGIC_VECTOR(3DOWNTO0);EF,FF:OUTSTD_LOGIC;--空標(biāo)志、滿標(biāo)志

DATAOUT:OUTSTD_LOGIC_VECTOR(3DOWNTO0));ENDFIFO;3.結(jié)構(gòu)體的確定根據(jù)設(shè)計(jì)提示,分為修改寫(xiě)指針、寫(xiě)操作、修改讀指針、讀操作、產(chǎn)生滿標(biāo)志、產(chǎn)生空標(biāo)志6個(gè)進(jìn)程,先寫(xiě)后讀;建立結(jié)構(gòu)體內(nèi)定義寫(xiě)地址信號(hào)WADDR、讀地址信號(hào)RADDR、記錄指針位置的信號(hào)W和R;自定義4×4數(shù)組用于存儲(chǔ)數(shù)據(jù),由于寫(xiě)、讀地址為STD_LOGIC_VECTOR類型,而數(shù)組的行號(hào)是整數(shù),需要使用數(shù)據(jù)類型轉(zhuǎn)換函數(shù)CONV_INTEGER和CONV_STD_LOGIC_VECTOR,例如CONV_STD_LOGIC_VECTOR(3,2)是將整數(shù)3轉(zhuǎn)換成2位STD_LOGIC_VECTOR類型數(shù)據(jù),即3轉(zhuǎn)換成“11”。ARCHITECTUREARTOFFIFOISTYPEMEMISARRAY(3DOWNTO0)OFSTD_LOGIC_VECTOR(3DOWNTO0);--自定義4×4數(shù)組SIGNALRAMTMP:MEM;SIGNALWADDR:STD_LOGIC_VECTOR(1DOWNTO0);--寫(xiě)地址SIGNALRADDR:STD_LOGIC_VECTOR(1DOWNTO0);--讀地址SIGNALW,W1,R,R1:integerrange0to4;BEGINWRITE_POINTER:PROCESS(CLK,CLR,WADDR)ISBEGINIFCLR='0'THENWADDR<=(OTHERS=>'0');--寫(xiě)地址清零ELSIFCLK'EVENTANDCLK='1'THENIFWE='1'THEN--寫(xiě)信號(hào)有效IFWADDR="11"THENWADDR<=(OTHERS=>'0');--寫(xiě)地址已滿,清零ELSEWADDR<=WADDR+'1';ENDIF;ENDIF;ENDIF;W<=CONV_INTEGER(WADDR);W1<=W-1;--寫(xiě)指針當(dāng)前所在位置ENDPROCESSWRITE_POINTER;--修改寫(xiě)指針進(jìn)程

--寫(xiě)操作進(jìn)程WRITE_RAM:PROCESS(CLK)ISBEGINIFCLK'EVENTANDCLK='1'THENIFWE='1'THENRAMTMP(CONV_INTEGER(WADDR))<=DATAIN;--寫(xiě)入數(shù)據(jù)ENDIF;ENDIF;ENDPROCESSWRITE_RAM;READ_POINTER:PROCESS(CLK,CLR,RADDR)ISBEGINIFCLR='0'THENRADDR<=(OTHERS=>'0');--讀地址清零ELSIFCLK'EVENTANDCLK='1'THENIFRE='1'THEN--讀信號(hào)有效IFRADDR="11"THENRADDR<=(OTHERS=>'0');--已讀空,讀地址清零ELSERADDR<=RADDR+'1';ENDIF;ENDIF;ENDIF;R<=CONV_INTEGER(RADDR);--讀地址轉(zhuǎn)換為整數(shù)

R1<=R-1;--讀指針?biāo)诘奈恢肊NDPROCESSREAD_POINTER;--修改讀指針進(jìn)程--讀操作進(jìn)程READ_RAM:PROCESS(CLK)ISBEGINIFCLK'EVENTANDCLK='1'THENIFRE='1'THENDATAOUT<=RAMTMP(CONV_INTEGER(RADDR));--讀出數(shù)據(jù)ENDIF;ENDIF;ENDPROCESSREAD_RAM;FFLAG:PROCESS(CLK,CLR)ISBEGINIFCLR='0'THENFF<='0';--滿標(biāo)志清零ELSIFCLK'EVENTANDCLK='1'THENIFWE='1'ANDRE='0'THENIF(W=R1)OR((WADDR=CONV_STD_LOGIC_VECTOR(3,2))AND(RADDR="00"))THENFF<='1';--產(chǎn)生滿標(biāo)志ENDIF;ELSEFF<='0';ENDIF;ENDIF;ENDPROCESSFFLAG;--產(chǎn)生滿標(biāo)志進(jìn)程EFLAG:PROCESS(CLK,CLR)ISBEGINIFCLR='0'THENEF<='0';ELSIFCLK'EVENTANDCLK='1'THENIFRE='1'ANDWE='0'THENIF(R=W1)OR((RADDR=CONV_STD_LOGIC_VECTOR(3,2))AND(WADDR="00"))THENEF<='1';--產(chǎn)生空標(biāo)志ENDIF;ELSEEF<='0';ENDIF;ENDIF;ENDPROCESSEFLAG;ENDART;--產(chǎn)生空標(biāo)志進(jìn)程由于結(jié)構(gòu)體中使用了數(shù)據(jù)類型轉(zhuǎn)換函數(shù)CONV_INTEGER,需要調(diào)用IEEE庫(kù)中的STD_LOGIC_UNSIGNED程序包;使用了數(shù)據(jù)類型轉(zhuǎn)換函數(shù)CONV_STD_LOGIC_VECTOR,需要調(diào)用IEEE庫(kù)中的STD_LOGIC_ARITH程序包,因此需要在實(shí)體的前面調(diào)用IEEE庫(kù),并使用這2個(gè)程序包。參考程序如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;4.庫(kù)和程序包的確定波形仿真

從仿真波形中可以看出,在0~50ns區(qū)間,WE=1(寫(xiě)入有效),但CLR=0(清零有效),數(shù)據(jù)不能寫(xiě)入;在50~250ns區(qū)間,WE=1(寫(xiě)入有效),寫(xiě)入數(shù)據(jù)4~7,F(xiàn)F=1(寫(xiě)滿);在250~450ns區(qū)間,RE=1(讀出)、讀出數(shù)據(jù)DATAOUT=4~7、EF=1(讀空);在500~650ns區(qū)間,WE=1(寫(xiě)入有效),寫(xiě)入數(shù)據(jù)D、E和F,F(xiàn)F=0(未寫(xiě)滿);在600~700ns區(qū)間,RE=1(讀出),讀出數(shù)據(jù)DATAOUT=D和E、EF=0(未讀空),剩下一個(gè)數(shù)據(jù)F;在750~850ns區(qū)間,WE=1(寫(xiě)入有效),寫(xiě)入數(shù)據(jù)2、3和4,雖然只寫(xiě)入3個(gè)數(shù)據(jù),但前期數(shù)據(jù)F未被讀出,所以FF=1(寫(xiě)滿)。

正弦信號(hào)發(fā)生器由地址發(fā)生器(計(jì)數(shù)器)、存儲(chǔ)正弦信號(hào)數(shù)據(jù)的ROM和D/A(數(shù)/模)轉(zhuǎn)換電路模塊構(gòu)成。

工作時(shí),按照地址發(fā)生器輸出的地址,從ROM中讀出存儲(chǔ)的正弦信號(hào)數(shù)字,經(jīng)過(guò)D/A轉(zhuǎn)換輸出正弦波(模擬信號(hào))。6.3正弦信號(hào)發(fā)生器的設(shè)計(jì)1.設(shè)計(jì)題目

設(shè)計(jì)一個(gè)7位二進(jìn)制計(jì)數(shù)器,具有異步復(fù)位、同步使能、遞增計(jì)數(shù)的功能。2.電路設(shè)計(jì)

參考項(xiàng)目4中設(shè)計(jì)的計(jì)數(shù)器,結(jié)合題意,在結(jié)構(gòu)體中建立一個(gè)臨時(shí)信號(hào),再判斷時(shí)鐘脈沖的上升沿,在每個(gè)時(shí)鐘脈沖的上升沿到來(lái)時(shí),臨時(shí)信號(hào)就加1,最后輸出信號(hào)值。建立文件夾E:\EDAFILE\Example6_7作為項(xiàng)目文件夾。設(shè)CLK為時(shí)鐘輸入端、RST為異步復(fù)位端、EN為計(jì)數(shù)器使能端、Q為計(jì)數(shù)器輸出端,實(shí)體名為count7。6.3.1計(jì)數(shù)器模塊LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYcount7ISPORT(CLK,RST,EN:INSTD_LOGIC;Q:OUTSTD_LOGIC_VECTOR(6DOWNTO0));ENDcount7;ARCHITECTUREaOFcount7ISSIGNALqtemp:STD_LOGIC_VECTOR(6DOWNTO0);--臨時(shí)信號(hào)BEGINProcess(RST,CLK)BEGINIFRST='1'THENqtemp<="0000000";--RST高電平清零ELSIFCLK'EVENTANDCLK='1'THENIFEN='1'THEN--EN高電平使能qtemp<=qtemp+1;ENDIF;ENDIF;Q<=qtemp;ENDPROCESS;ENDa;

在涉及RAM和ROM等存儲(chǔ)器應(yīng)用的EDA設(shè)計(jì)開(kāi)發(fā)中,調(diào)用LPM模塊存儲(chǔ)器是最方便、最經(jīng)濟(jì)和最高效的途徑。在許多設(shè)計(jì)中,必須利用LPM模塊才可以使用FPGA器件中一些特定硬件功能模塊,例如片上存儲(chǔ)器、DSP模塊、嵌入式鎖相環(huán)PLL模塊等。設(shè)計(jì)者可以根據(jù)實(shí)際電路的設(shè)計(jì)需要,選擇LPM庫(kù)中的適當(dāng)模塊,并為其設(shè)定適當(dāng)?shù)膮?shù),滿足自己的設(shè)計(jì)需要。采用原理圖輸入方式,用LPM設(shè)計(jì)一個(gè)128×8的ROM,存儲(chǔ)正弦信號(hào)數(shù)據(jù)。請(qǐng)跟著老師一起完成!6.3.2LPM_ROM

使用QuartusII軟件的在系統(tǒng)存儲(chǔ)器讀寫(xiě)編輯器(In-SystemMemoryContentEditor)能夠直接通過(guò)JTAG接口讀取或修改FPGA內(nèi)處于工作狀態(tài)的存儲(chǔ)器中的數(shù)據(jù),讀取過(guò)程不影響FPGA的正常工作。

(1)啟動(dòng)編輯器。打開(kāi)項(xiàng)目prom,將編程器的下載

電纜與計(jì)算機(jī)接口連接好,打開(kāi)實(shí)驗(yàn)箱或開(kāi)發(fā)板電

源。請(qǐng)跟著老師一起完成!6.3.2在系統(tǒng)存儲(chǔ)器數(shù)據(jù)讀寫(xiě)編輯器

設(shè)計(jì)一個(gè)正弦信號(hào)發(fā)生器,先將一個(gè)完整周期的正弦波采樣成128個(gè)8位數(shù)據(jù)的數(shù)字信號(hào),存儲(chǔ)在ROM內(nèi),ROM需要7位地址線和8位數(shù)據(jù)線;再設(shè)計(jì)一個(gè)7位二進(jìn)制遞增計(jì)數(shù)器作為地址發(fā)生器,按照順序?qū)OM中的正弦波數(shù)據(jù)讀出;讀出的數(shù)據(jù)經(jīng)D/A轉(zhuǎn)換電路生成正弦波(模擬信號(hào)),D/A轉(zhuǎn)換電路可使用DAC0832實(shí)現(xiàn)。請(qǐng)跟著老師一起完成!6.3.4正弦信號(hào)發(fā)生器

嵌入式邏輯分析儀(SignalTapII)可以隨設(shè)計(jì)文件一起下載到目標(biāo)芯片中,用以捕捉目標(biāo)芯片內(nèi)部系統(tǒng)信號(hào)節(jié)點(diǎn)處的信息或總線上的數(shù)據(jù)流,而且不影響硬件系統(tǒng)的正常工作。在實(shí)際監(jiān)測(cè)中,SignalTapII將測(cè)得的樣本信號(hào)暫存于目標(biāo)器件的嵌入式RAM(會(huì)占用芯片存儲(chǔ)資源)中,然后通過(guò)器件的JTAG接口將采得的信息傳出。請(qǐng)跟著老師一起完成!6.3.5嵌入式邏輯分析儀1.題目說(shuō)明

利用QuartusⅡ軟件的原理圖輸入方式,使用LPM宏單元庫(kù)設(shè)計(jì)一個(gè)存儲(chǔ)64個(gè)8位數(shù)據(jù)、具有獨(dú)立的讀地址和寫(xiě)地址的雙口LPM_RAM,完成編譯和波形仿真后,下載到實(shí)驗(yàn)平臺(tái)驗(yàn)證電路功能。2.建立項(xiàng)目(1)在計(jì)算機(jī)的E盤(pán),建立文件夾E:\EDAFILE\Example6_10作為項(xiàng)目文件夾。啟動(dòng)QuartusⅡ新建項(xiàng)目,項(xiàng)目名為PRAM、頂層設(shè)計(jì)實(shí)體名也為PRAM。(2)由于采用原理圖輸入方式,在添加文件對(duì)話框的Filename中輸入PROM.bdf,然后單擊【Add】按鈕,添加該文件。6.4實(shí)訓(xùn):LPM_RAM的設(shè)計(jì)與實(shí)現(xiàn)7.實(shí)訓(xùn)報(bào)告(1)記錄并說(shuō)明仿真波形。(2)整理電路測(cè)試記錄表,分析測(cè)試結(jié)果。EDA項(xiàng)目教程

——基于VHDL與FPGA項(xiàng)目7數(shù)字系統(tǒng)設(shè)計(jì)實(shí)訓(xùn)本章要點(diǎn)

數(shù)字系統(tǒng)層次化設(shè)計(jì)元件例化語(yǔ)句的應(yīng)用

數(shù)字系統(tǒng)的功能測(cè)試7.1籃球比賽24秒計(jì)時(shí)器7.1.1項(xiàng)目說(shuō)明1.任務(wù)書(shū)國(guó)際籃聯(lián)修改的藍(lán)球比賽規(guī)則中,有一個(gè)關(guān)于24秒進(jìn)攻的規(guī)則,即從獲取球權(quán)到投籃擊中籃框、命中、被侵犯(對(duì)方犯規(guī))、球出界,其有效時(shí)間合計(jì)不能超過(guò)24秒,否則被判違例,將失去球權(quán)。另外,對(duì)非投籃的防守犯規(guī)、腳踢球或者出界球等判罰之后,如果所剩時(shí)間超過(guò)14秒(包括14秒),開(kāi)球后繼續(xù)計(jì)時(shí);如果所剩時(shí)間少于14秒(不包括14秒),將從14秒開(kāi)始計(jì)時(shí)。(1)能夠設(shè)置24秒倒計(jì)時(shí)和14秒倒計(jì)時(shí),遞減時(shí)間隔為1秒;(2)計(jì)時(shí)器遞減到零時(shí),數(shù)碼管顯示“00”,同時(shí)發(fā)出聲音報(bào)警信號(hào);(3)設(shè)置外部操作開(kāi)關(guān),控制計(jì)時(shí)器的清零、啟動(dòng)計(jì)時(shí)、暫停和繼續(xù)計(jì)時(shí)。啟動(dòng)、暫停、繼續(xù)計(jì)時(shí)用1個(gè)按鈕開(kāi)關(guān)控制,按下為“啟動(dòng)”或“繼續(xù)”、抬起為“暫停”。設(shè)計(jì)一個(gè)用2個(gè)數(shù)碼管顯示的籃球比賽24秒計(jì)時(shí)器,具體要求如下:

2.計(jì)劃書(shū)(1)閱讀、討論項(xiàng)目要求,明確項(xiàng)目?jī)?nèi)容;(2)研究項(xiàng)目設(shè)計(jì)方案,分析參考程序;(3)編輯、編譯、仿真參考程序,確定一個(gè)項(xiàng)目實(shí)現(xiàn)方案;(4)測(cè)試24秒計(jì)時(shí)器,評(píng)價(jià)性能和應(yīng)用效果。1.項(xiàng)目分析

籃球比賽24秒計(jì)時(shí)器的主要功能是倒計(jì)時(shí),工作人員按動(dòng)“清零”按鈕,顯示24秒,這時(shí)按動(dòng)“14秒設(shè)置”鍵則顯示14秒;按下“啟動(dòng)/暫停/繼續(xù)”按鈕,開(kāi)始倒計(jì)時(shí);計(jì)時(shí)過(guò)程中,抬起(再按1次)“啟動(dòng)/暫停/繼續(xù)”按鈕,計(jì)時(shí)暫停,保持顯示時(shí)間;再次按下“啟動(dòng)/暫停/繼續(xù)”按鈕,從停止的時(shí)間開(kāi)始繼續(xù)倒計(jì)時(shí);時(shí)間結(jié)束時(shí)顯示00,不再變化同時(shí)發(fā)出報(bào)警信號(hào)。整個(gè)系統(tǒng)可分為計(jì)時(shí)控制模塊和顯示控制模塊兩個(gè)部分。7.1.2設(shè)計(jì)方案

7.1.2設(shè)計(jì)方案1.項(xiàng)目分析籃球比賽24秒計(jì)時(shí)器的主要功能是倒計(jì)時(shí),工作人員按動(dòng)“清零”按鈕,顯示24秒,這時(shí)按動(dòng)“14秒設(shè)置”鍵則顯示14秒;按下“啟動(dòng)/暫停/繼續(xù)”按鈕,開(kāi)始倒計(jì)時(shí);計(jì)時(shí)過(guò)程中,抬起(再按1次即可)“啟動(dòng)/暫停/繼續(xù)”按鈕,計(jì)時(shí)暫停,顯示時(shí)間不變;再次按下“啟動(dòng)/暫停/繼續(xù)”按鈕,從停止的時(shí)間開(kāi)始繼續(xù)計(jì)時(shí);時(shí)間結(jié)束時(shí)顯示00,不再變化同時(shí)發(fā)出報(bào)警信號(hào)。整個(gè)系統(tǒng)可分為計(jì)時(shí)控制模塊和顯示控制模塊2個(gè)部分。24秒計(jì)時(shí)器系統(tǒng)框圖

計(jì)時(shí)模塊完成24秒或14秒倒計(jì)時(shí)功能。設(shè)系統(tǒng)時(shí)鐘為CLK(1Hz)、14秒預(yù)置端為PLD、啟動(dòng)/暫停/繼續(xù)控制端為ENB、清零端為CLR;報(bào)警信號(hào)輸出端為WARN、十位數(shù)字輸出端為DDOUT、個(gè)位數(shù)字輸出端為SSOUT,文件名為BSJSB。參考程序如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;2.計(jì)時(shí)模塊ENTITYBSJSBISPORT(CLR,PLD,ENB,CLK:INSTD_LOGIC;WARN:OUTSTD_LOGIC;--報(bào)警信號(hào)DDOUT:OUTSTD_LOGIC_VECTOR(3DOWNTO0);--十位SSOUT:OUTSTD_LOGIC_VECTOR(3DOWNTO0));--個(gè)位ENDENTITYBSJSB;ARCHITECTUREARTOFBSJSBISBEGINPROCESS(CLK,CLR,ENB)ISVARIABLETMPA:STD_LOGIC_VECTOR(3DOWNTO0);VARIABLETMPB:STD_LOGIC_VECTOR(3DOWNTO0);VARIABLETMPWARN:STD_LOGIC;BEGINIFCLR='1'THENTMPA:="0100";TMPB:="0010";TMPWARN:='0';ELSIFCLK'EVENTANDCLK='1'THENIFPLD='1'THENTMPB:="0001";TMPA:="0100";ELSIFENB='1'THENIFTMPA="0000"THENIFTMPB/="0000"THENTMPA:="1001";TMPB:=TMPB-1;ELSETMPWARN:='1';ENDIF;ELSETMPA:=TMPA-1;ENDIF;ENDIF;ENDIF;SSOUT<=TMPA;DDOUT<=TMPB;WARN<=TMPWARN;ENDPROCESS;ENDARCHITECTUREART;LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYsdispISPORT(D:INSTD_LOGIC_VECTOR(3DOWNTO0);--4位數(shù)據(jù)輸入端S:OUTSTD_LOGIC_VECTOR(6DOWNTO0));--七位數(shù)碼輸出端ENDsdisp;ARCHITECTUREAOFsdispISBEGINPROCESS(D)BEGIN3.顯示模塊CASEDISWHEN"0000"=>S<="1111110";--0WHEN"0001"=>S<="0110000";--1WHEN"0010"=>S<="1101101";--2WHEN"0011"=>S<="1111001";--3WHEN"0100"=>S<="0110011";--4WHEN"0101"=>S<="1011011";--5WHEN"0110"=>S<="1011111";--6WHEN"0111"=>S<="1110000";--7WHEN"1000"=>S<="1111111";--8WHEN"1001"=>S<="1111011";--9WHENOTHERS=>S<="0000000";--其他狀態(tài)不顯示,

數(shù)碼管全暗ENDCASE;ENDPROCESS;ENDA;1.頂層文件設(shè)計(jì)

這里采用元件例化語(yǔ)句連接各個(gè)模塊的文本設(shè)計(jì)方式。(1)新建項(xiàng)目。在項(xiàng)目建立向?qū)У奶砑游募?duì)話框中輸入BASKCOUNT.VHD(文件名),單擊【Add】按鈕,添加該文件;再單擊添加文件對(duì)話框的Filename右側(cè)的按鈕,選擇BSJSB.VHD文件所在的文件夾,選中BSJSB.VHD文件,單擊【Add】按鈕,添加該文件;再次單擊添加文件對(duì)話框的Filename右側(cè)的按鈕,選擇DISP.VHD文件所在的文件夾,選中DISP.VHD文件,單擊【Add】按鈕,添加DISP.VHD文件。7.1.3項(xiàng)目實(shí)現(xiàn)(2)建立文本文件,編輯頂層文件設(shè)計(jì)程序。在程序?qū)嶓w中定義整個(gè)系統(tǒng)的輸入和輸出,設(shè)系統(tǒng)時(shí)鐘為CLK(1Hz)、14秒預(yù)置端為PLD、啟動(dòng)/暫停/繼續(xù)控制端為ENB、清零端為CLR;報(bào)警信號(hào)輸出端為WARN、顯示輸出信號(hào)為S0和S1,接2個(gè)7段數(shù)碼管;結(jié)構(gòu)體中定義2臨時(shí)信號(hào),代表十位數(shù)字輸出端DDOUT和個(gè)位數(shù)字輸出端SSOUT;文件名為BASKCOUNT。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYBASKCOUNTISPORT(CLR,PLD,ENB,CLK:INSTD_LOGIC;WARN:OUTSTD_LOGIC;S0,S1:OUTSTD_LOGIC_VECTOR(6DOWNTO0));ENDENTITYBASKCOUNT;ARCHITECTUREARTOFBASKCOUNTISCOMPONENTBSJSBISPORT(CLR,PLD,ENB,CLK:INSTD_LOGIC;WARN:OUTSTD_LOGIC;DDOUT:OUTSTD_LOGIC_VECTOR(3DOWNTO0);SSOUT:OUTSTD_LOGIC_VECTOR(3DOWNTO0));ENDCOMPONENTBSJSB;COMPONENTDISPISPORT(D:INSTD_LOGIC_VECTOR(3DOWNTO0);S:OUTSTD_LOGIC_VECTOR(6DOWNTO0));ENDCOMPONENTDISP;SIGNALTEMPDD:STD_LOGIC_VECTOR(3DOWNTO0);SIGNALTEMPSS:STD_LOGIC_VECTOR(3DOWNTO0);BEGINU0:BSJSBPORTMAP(CLR,PLD,ENB,CLK,WARN,TEMPDD,TEMPSS);U1:DISPPORTMAP(TEMPDD,S0);U2:DISPPORTMAP(TEMPSS,S1);ENDARCHITECTUREART;7.1.4功能擴(kuò)展與項(xiàng)目評(píng)價(jià)1.功能擴(kuò)展在完成項(xiàng)目的任務(wù)要求后,考慮以下內(nèi)容:(1)蜂鳴器的長(zhǎng)音改成斷續(xù)音。(2)不顯示十位數(shù)碼管無(wú)效的數(shù)碼“0”,例如09顯示9、08顯示為8。(3)倒計(jì)時(shí)的最后5秒,每減少1秒就發(fā)出1個(gè)提示信號(hào)(蜂鳴器短音)。(4)增加手動(dòng)設(shè)置時(shí)間(預(yù)置數(shù))功能。(5)將顯示模塊改成2位一體共陰極數(shù)碼管動(dòng)態(tài)顯示。2.項(xiàng)目評(píng)價(jià)

項(xiàng)目評(píng)價(jià)是在教師的主持下,通過(guò)項(xiàng)目負(fù)責(zé)人的講解演示,評(píng)估項(xiàng)目的完成情況,評(píng)價(jià)內(nèi)容如下:(1)功能評(píng)價(jià)?;@球比賽計(jì)時(shí)器能否完成比賽計(jì)時(shí)、計(jì)時(shí)誤差是多少、操作是否方便等方面。(2)演示過(guò)程評(píng)價(jià)。主要評(píng)價(jià)演示過(guò)程中操作是否熟練、回答問(wèn)題是否準(zhǔn)確等方面。(3)拓展功能完成情況評(píng)價(jià)。7.2數(shù)字頻率計(jì)7.2.1項(xiàng)目說(shuō)明1.任務(wù)書(shū)設(shè)計(jì)一個(gè)能測(cè)量方波信號(hào)頻率的簡(jiǎn)易數(shù)字頻率計(jì),測(cè)量結(jié)果用十進(jìn)制數(shù)顯示,測(cè)量的頻率范圍是1~9999Hz,用四位數(shù)碼管顯示測(cè)量頻率。2.計(jì)劃書(shū)(1)閱讀、討論項(xiàng)目要求,明確項(xiàng)目?jī)?nèi)容;(2)研究設(shè)計(jì)方案,分析方案中的參考程序;(3)完成數(shù)字頻率計(jì)的設(shè)計(jì);(4)測(cè)量數(shù)字信號(hào),計(jì)算頻率計(jì)的誤差。7.2.2設(shè)計(jì)方案1.項(xiàng)目分析方波信號(hào)的頻率就是在單位時(shí)間內(nèi)產(chǎn)生的脈沖個(gè)數(shù),表達(dá)式為f=N/T,其中f為被測(cè)信號(hào)的頻率;N為計(jì)數(shù)器所累計(jì)的脈沖數(shù);T為產(chǎn)生N個(gè)脈沖所需的時(shí)間。計(jì)數(shù)器在1秒時(shí)間內(nèi)所計(jì)的結(jié)果,就是被測(cè)信號(hào)的頻率。簡(jiǎn)易數(shù)字頻率計(jì)可以分為測(cè)頻控制模塊和譯碼顯示模塊2個(gè)部分。2.系統(tǒng)框圖該模塊將1Hz的系統(tǒng)工作時(shí)鐘脈沖2分頻,取前半個(gè)周期產(chǎn)生脈寬為1秒的控制時(shí)鐘脈沖,作為計(jì)數(shù)器的閘門(mén)信號(hào),當(dāng)控制時(shí)鐘為上升沿(由低變高)時(shí),開(kāi)始計(jì)數(shù);當(dāng)控制時(shí)鐘為下降沿(由高變低)時(shí),輸出計(jì)數(shù)值;最后還要在下次控制時(shí)鐘上升沿到來(lái)之前,產(chǎn)生清零信號(hào),將計(jì)數(shù)器清零,為下次計(jì)數(shù)作準(zhǔn)備。設(shè)系統(tǒng)時(shí)鐘脈沖為CLK(1Hz)、被測(cè)信號(hào)為T(mén)EST,輸出信號(hào)為DOUT(十六位),文件名為FREQ。2.測(cè)頻控制模塊LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYFREQISPORT(TEST:INSTD_LOGIC;--被測(cè)信號(hào)CLK:INSTD_LOGIC;--系統(tǒng)時(shí)鐘脈沖DOUT:OUTSTD_LOGIC_VECTOR(15DOWNTO0));--計(jì)數(shù)值ENDENTITYFREQ;ARCHITECTUREARTOFFREQISSIGNALCLR,EN:STD_LOGIC;--CLR清零信號(hào)、EN計(jì)數(shù)使能信號(hào)SIGNALDATA:STD_LOGIC_VECTOR(15DOWNTO0);--計(jì)數(shù)值寄存器,與DOUT對(duì)應(yīng)BEGINPROCESS(CLK,CLR,EN)IS--產(chǎn)生寬度為1秒的閘門(mén)信號(hào)進(jìn)程BEGINIFCLK'EVENTANDCLK='1'THEN--檢查CLK的上升沿EN<=NOTEN;ENDIF;ENDPROCESS;

CLR<=NOTCLKANDNOTEN;--CLK和EN同時(shí)為低電平時(shí),產(chǎn)生清零信號(hào)PROCESS(TEST,CLR)IS--計(jì)數(shù)進(jìn)程BEGINIFCLR='1'THENDATA<="0000000000000000";--清零ELSIFRISING_EDGE(TEST)THEN--RISING_EDGE檢查信號(hào)上升沿--下面的IF語(yǔ)句可以將十六進(jìn)制數(shù)轉(zhuǎn)換成十進(jìn)制數(shù)IFDATA(11DOWNTO0)="100110011001"THENDATA<=DATA+"011001100111";ELSIFDATA(7DOWNTO0)="10011001"THENDATA<=DATA+"01100111";ELSIFDATA(3DOWNTO0)="1001"THENDATA<=DATA+"0111";ELSEDATA<=DATA+'1';ENDIF;ENDIF;ENDPROCESS;PROCESS(DATA,EN)IS--控制時(shí)鐘下降沿輸出計(jì)數(shù)值進(jìn)程BEGINIFFALLING_EDGE(EN)THENDOUT<=DATA;--FALLING_EDGE檢查信號(hào)下降沿ENDIF;ENDPROCESS;ENDART;

譯碼顯示模塊采用共陰極7段數(shù)碼管靜態(tài)顯示方式實(shí)現(xiàn)。可使用項(xiàng)目四中數(shù)碼管靜態(tài)顯示的程序,也可以調(diào)用籃球比賽計(jì)時(shí)器中生成的模塊sdisp。2.譯碼顯示模塊7.2.3項(xiàng)目實(shí)現(xiàn)(1)新建項(xiàng)目。在項(xiàng)目建立向?qū)У奶砑游募?duì)話框中輸入SDF.VHD(文件名),單擊【Add】按鈕,添加該文件;再單擊添加文件對(duì)話框的Filename右側(cè)的按鈕,選擇FREQ.VHD文件所在的文件夾,選中FREQ.VHD文件,再次單擊【Add】按鈕,添加該文件;再次單擊添加文件對(duì)話框的Filename右側(cè)的按鈕,選擇DISP.VHD所在的文件夾,選中DISP.VHD文件,再次單擊【Add】按鈕,添加DISP.VHD文件。(2)建立文本文件,編輯頂層文件設(shè)計(jì)程序。在程序?qū)嶓w中,定義整個(gè)系統(tǒng)的輸入和輸出,設(shè)系統(tǒng)時(shí)鐘脈沖為CLK(1Hz)、被測(cè)信號(hào)為T(mén)EST,輸出的顯示信號(hào)為S0、S1、S2和S3,接4個(gè)7段數(shù)碼管;結(jié)構(gòu)體中描述模塊的連接關(guān)系,需要定義臨時(shí)信號(hào),代表模塊之間的連線。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYSDFISPORT(TEST:INSTD_LOGIC;--被測(cè)信號(hào)CLK:INSTD_LOGIC;--系統(tǒng)時(shí)鐘脈沖S0,S1,S2,S3:OUTSTD_LOGIC_VECTOR(6DOWNTO0));--顯示信號(hào)ENDENTITYSDF;ARCHITECTUREARTOFSDFISCOMPONENTFREQIS--測(cè)頻控制模塊的例化聲明PORT(TEST:INSTD_LOGIC;CLK:INSTD_LOGIC;DOUT:OUTSTD_LOGIC_VECTOR(15DOWNTO0));ENDCOMPONENTFREQ;COMPONENTDISPIS--顯示模塊的例化聲明PORT(D:INSTD_LOGIC_VECTOR(3DOWNTO0);S:OUTSTD_LOGIC_VECTOR(6DOWNTO0));ENDCOMPONENTDISP;SIGNALTEMPDOUT:STD_LOGIC_VECTOR(15DOWNTO0);--定義臨時(shí)信號(hào)SIGNALTEMPD:STD_LOGIC_VECTOR(3DOWNTO0);--定義臨時(shí)信號(hào)BEGINU0:FREQPORTMAP(TEST,CLK,TEMPDOUT);--測(cè)頻控制模塊的端口映射U1:DISPPORTMAP(TEMPDOUT(3DOWNTO0),S0);--顯示模塊的端口映射(個(gè)位)U2:DISPPORTMAP(TEMPDOUT(7DOWNTO4),S1);--顯示模塊的端口映射(十位)U3:DISPPORTMAP(TEMPDOUT(11DOWNTO8),S2);--顯示模塊的端口映射(百位)U4:DISPPORTMAP(TEMPDOUT(15DOWNTO12),S3);--顯示模塊的端口映射(千位)ENDARCHITECTUREART;數(shù)字頻率計(jì)的仿真波形7.2.4功能擴(kuò)展與項(xiàng)目評(píng)價(jià)在完成項(xiàng)目的任務(wù)要求后,考慮以下內(nèi)容:(1)將輸出的靜態(tài)顯示改為4位一體共陰極數(shù)碼管動(dòng)態(tài)顯示。(2)通過(guò)改變閘門(mén)時(shí)間(2秒),提高測(cè)量精度。(3)將元件例化語(yǔ)句的位置映射改成名稱映射。2.項(xiàng)目評(píng)價(jià)項(xiàng)目評(píng)價(jià)是在教師的主持下,通過(guò)項(xiàng)目負(fù)責(zé)人的講解演示,評(píng)估項(xiàng)目的完成情況,評(píng)價(jià)內(nèi)容如下:(1)項(xiàng)目的功能描述情況。(2)團(tuán)隊(duì)合作和任務(wù)分配情況。(3)簡(jiǎn)易數(shù)字頻率計(jì)的設(shè)計(jì)完成情況。(4)簡(jiǎn)易數(shù)字頻率計(jì)的操作和信號(hào)測(cè)量誤差分析。7.3電子密碼鎖7.3.1項(xiàng)目說(shuō)明1.任務(wù)書(shū)設(shè)計(jì)一個(gè)具有4×3掃描鍵盤(pán)(不需要去抖動(dòng))、4個(gè)數(shù)碼管動(dòng)態(tài)顯示,能夠設(shè)置和輸入四位密碼的電子密碼鎖,具體要求如下:(1)每按下一個(gè)數(shù)字鍵,就輸入一個(gè)數(shù)碼,并在4個(gè)數(shù)碼管的最右方顯示出該數(shù)值,同時(shí)將先前輸入的數(shù)據(jù)依序左移一個(gè)數(shù)字位置;(2)有數(shù)碼清除鍵,按下該鍵可清除前面所有的輸入數(shù)碼,清除后數(shù)碼管顯示“0000”;(3)有密碼設(shè)置鍵,在鎖開(kāi)的狀態(tài)下,按下該鍵,會(huì)將當(dāng)前數(shù)碼管顯示的數(shù)字設(shè)置成新密碼;(4)有密碼鎖鎖定鍵,按下該鍵可將密碼鎖上鎖;(5)有密碼鎖開(kāi)鎖鍵,按下該鍵,會(huì)檢查輸入的密碼是否正確,密碼正確即開(kāi)鎖。(6)為保證密碼鎖主人能夠隨時(shí)開(kāi)鎖,設(shè)有萬(wàn)能密碼(3581),用于解除其他人設(shè)置的密碼。2.計(jì)劃書(shū)(1)討論、分析項(xiàng)目要求,明確項(xiàng)目?jī)?nèi)容;(2)檢索閱讀相關(guān)的參考資料,研究項(xiàng)目設(shè)計(jì)方案;(3)制定計(jì)劃并分組后,實(shí)現(xiàn)設(shè)計(jì)方案中的各個(gè)模塊;(4)完成項(xiàng)目并測(cè)試功能;(5)撰寫(xiě)項(xiàng)目開(kāi)發(fā)報(bào)告。(6)項(xiàng)目演示、講解設(shè)計(jì)方案,完成項(xiàng)目評(píng)價(jià)。7.3.2設(shè)計(jì)方案1.項(xiàng)目分析輸入模塊外接的一個(gè)4×3矩陣式鍵盤(pán),數(shù)字0~9作為密碼數(shù)字輸入按鍵,功能按鍵“*”作為密碼鎖鎖定鍵,功能按鍵“#”作為密碼鎖開(kāi)鎖鍵/數(shù)碼清除鍵,密碼正確,開(kāi)鎖后清除輸入的數(shù)碼;密碼不正確,不開(kāi)鎖直接清除輸入的數(shù)碼。輸入模塊需要產(chǎn)生鍵盤(pán)掃描信號(hào)和控制模塊工作時(shí)鐘信號(hào),并對(duì)輸入的按鍵信號(hào)進(jìn)行譯碼。設(shè)系統(tǒng)時(shí)鐘脈沖為CLK(1KHz)、按鍵輸入端為KEYIN;鍵盤(pán)掃描信號(hào)輸出端為SCAN、數(shù)字按鍵輸出端為DATAOUT、功能按鍵輸出端為FUNOUT、數(shù)字鍵輸出標(biāo)志為DF、功能鍵輸出標(biāo)志為FF、控制電路工作時(shí)鐘輸出端為CLKOUT;文件名為INPUTBLOCK。2.輸入模塊LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYinputblockISPORT(CLK:INSTD_LOGIC;--系統(tǒng)時(shí)鐘脈沖KEYIN:INSTD_LOGIC_VECTOR(2DOWNTO0);

溫馨提示

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