EDA技術(shù)項目教程-基于VHDL與FPGA 課件 項目1 數(shù)據(jù)比較器的設(shè)計與實現(xiàn)_第1頁
EDA技術(shù)項目教程-基于VHDL與FPGA 課件 項目1 數(shù)據(jù)比較器的設(shè)計與實現(xiàn)_第2頁
EDA技術(shù)項目教程-基于VHDL與FPGA 課件 項目1 數(shù)據(jù)比較器的設(shè)計與實現(xiàn)_第3頁
EDA技術(shù)項目教程-基于VHDL與FPGA 課件 項目1 數(shù)據(jù)比較器的設(shè)計與實現(xiàn)_第4頁
EDA技術(shù)項目教程-基于VHDL與FPGA 課件 項目1 數(shù)據(jù)比較器的設(shè)計與實現(xiàn)_第5頁
已閱讀5頁,還剩57頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

EDA項目教程

——基于VHDL與FPGA主編:于潤偉項目6信號發(fā)生器的設(shè)計與實現(xiàn)本章要點

子程序和LOOP語句

存儲器的設(shè)計

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

6.1

子程序和LOOP語句

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

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

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

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

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

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

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

包體說明語句組,END程序包名稱;

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

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

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

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

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

說明部分;

BEGIN

順序語句;

RETURN返回變量;

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

編寫一個能輸出2個4位二進制數(shù)中較大數(shù)的函數(shù),并將這段函數(shù)放在一個程序包中,然后在進程中調(diào)用該函數(shù)兩次,輸出3個4位二進制數(shù)中的最大數(shù)。(1)在名稱為blockA的程序包中,定義函數(shù)名稱為maxA的函數(shù),程序包文件名為blockA.vhd。由于本題需要調(diào)用程序包中定義的函數(shù),可先建立一個文件夾,打開QuartusⅡ軟件建立一個項目,項目名為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保存在當前文件夾下,以供主程序調(diào)用。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;LIBRARYWORK;--WORK是用戶工作庫USEWORK.blockA.ALL;--使用WORK庫中的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(同步復位有效),D=ZZZZ(高阻);在50~100ns區(qū)間,clk上升沿的左側(cè)(觀察輸入信號),da=0001、db=0100、dc=0010,clk上升沿的右側(cè)(觀察輸出信號),D=0100。其他區(qū)間的波形情況符合題意。輸出最大值的仿真波形6.1.2LOOP語句1.FOR循環(huán)FOR循環(huán)是一種已知循環(huán)次數(shù)的語句,其格式如下:[循環(huán)標號]:FOR循環(huán)變量IN循環(huán)次數(shù)范圍LOOP順序語句;

ENDLOOP[循環(huán)標號];其中,循環(huán)標號是用來表示FOR循環(huán)語句的標識符,是可選項。循環(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)語句描述一個8位奇校驗電路,電路輸入信號為a,輸出信號為yARCHITECTUREoddOFpcISBEGINcbc:PROCESS(a)VARIABLEtmp:STD_LOGIC;--tmp為局部變量,只能在進程中定義BEGINtmp:='0';FORiIN0TO7LOOP--循環(huán)變量i由循環(huán)語句自動定義tmp:=tmpXORa(i);ENDLOOP;--缺省了循環(huán)標號y<=tmp;ENDPROCESScbc;ENDodd;2.WHILE循環(huán)WHILE循環(huán)是一種未知循環(huán)次數(shù)的語句,循環(huán)次數(shù)取決于條件表達式是否成立。其格式如下:[循環(huán)標號]:WHILE條件表達式LOOP順序語句;

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

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

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

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

容量為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.庫和程序包的確定波形仿真

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

WR:PROCESS(CLK)--寫進程BEGINIFCLK'EVENTANDCLK='1'THENIFWE='1'THENRAMTMP(CONV_INTEGER(WADDR))<=DATAIN;--寫入數(shù)據(jù)ENDIF;ENDIF;ENDPROCESSWR;RR:PROCESS(CLK)--讀進程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庫中的STD_LOGIC_UNSIGNED程序包,因此需要在實體的前面調(diào)用IEEE庫,并使用該程序包。參考程序如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;4.庫和程序包的確定波形仿真

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

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

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

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

DATAOUT:OUTSTD_LOGIC_VECTOR(3DOWNTO0));ENDFIFO;3.結(jié)構(gòu)體的確定根據(jù)設(shè)計提示,分為修改寫指針、寫操作、修改讀指針、讀操作、產(chǎn)生滿標志、產(chǎn)生空標志6個進程,先寫后讀;建立結(jié)構(gòu)體內(nèi)定義寫地址信號WADDR、讀地址信號RADDR、記錄指針位置的信號W和R;自定義4×4數(shù)組用于存儲數(shù)據(jù),由于寫、讀地址為STD_LOGIC_VECTOR類型,而數(shù)組的行號是整數(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);--寫地址SIGNALRADDR:STD_LOGIC_VECTOR(1DOWNTO0);--讀地址SIGNALW,W1,R,R1:integerrange0to4;BEGINWRITE_POINTER:PROCESS(CLK,CLR,WADDR)ISBEGINIFCLR='0'THENWADDR<=(OTHERS=>'0');--寫地址清零ELSIFCLK'EVENTANDCLK='1'THENIFWE='1'THEN--寫信號有效IFWADDR="11"THENWADDR<=(OTHERS=>'0');--寫地址已滿,清零ELSEWADDR<=WADDR+'1';ENDIF;ENDIF;ENDIF;W<=CONV_INTEGER(WADDR);W1<=W-1;--寫指針當前所在位置ENDPROCESSWRITE_POINTER;--修改寫指針進程

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

R1<=R-1;--讀指針所在的位置ENDPROCESSREAD_POINTER;--修改讀指針進程--讀操作進程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';--滿標志清零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)生滿標志ENDIF;ELSEFF<='0';ENDIF;ENDIF;ENDPROCESSFFLAG;--產(chǎ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)生空標志ENDIF;ELSEEF<='0';ENDIF;ENDIF;ENDPROCESSEFLAG;ENDART;--產(chǎn)生空標志進程由于結(jié)構(gòu)體中使用了數(shù)據(jù)類型轉(zhuǎn)換函數(shù)CONV_INTEGER,需要調(diào)用IEEE庫中的STD_LOGIC_UNSIGNED程序包;使用了數(shù)據(jù)類型轉(zhuǎn)換函數(shù)CONV_STD_LOGIC_VECTOR,需要調(diào)用IEEE庫中的STD_LOGIC_ARITH程序包,因此需要在實體的前面調(diào)用IEEE庫,并使用這2個程序包。參考程序如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;4.庫和程序包的確定波形仿真

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

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

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

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

參考項目4中設(shè)計的計數(shù)器,結(jié)合題意,在結(jié)構(gòu)體中建立一個臨時信號,再判斷時鐘脈沖的上升沿,在每個時鐘脈沖的上升沿到來時,臨時信號就加1,最后輸出信號值。建立文件夾E:\EDAFILE\Example6_7作為項目文件夾。設(shè)CLK為時鐘輸入端、RST為異步復位端、EN為計數(shù)器使能端、Q為計數(shù)器輸出端,實體名為count7。6.3.1計數(shù)器模塊LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYcount7ISPORT(CLK,RST,EN:INSTD_LOGIC;Q:OUTSTD_LOGIC_VECTOR(6DOWNTO0));ENDcoun

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論