




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
VHDL硬件描述語言
第二章VHDL語言程序的基本結(jié)構(gòu)第三章VHDL語言的數(shù)據(jù)類型及運算操作符第四章VHDL語言構(gòu)造體的描述方式第五章VHDL語言的主要描述語句
第七章基本邏輯電路設(shè)計VHDL硬件描述語言第二章VHDL語言程序的基本結(jié)構(gòu)1VHDL語言描述數(shù)字系統(tǒng)的基本方法
在電原理圖中,如果要描述一個“與門”,那么在圖上畫出一個“與門”的邏輯符號就行了,如圖1所示。
圖1“與門”的邏輯符號描述VHDL語言描述數(shù)字系統(tǒng)的基本方法圖1“與門”的邏輯符號2人們看到了這個邏輯符號(如圖1所示),就會聯(lián)想到兩件事:(1)確定該邏輯有兩個輸入信號a和b,有一個輸出信號c,而且都是位信號(每個信號占二進(jìn)制位1位)。(2)根據(jù)邏輯符號形狀判斷,它是一個“與門”,在電路中實現(xiàn)“與”操作,即c=a·b。知道了這兩點,該電路的功能就一目了然了。由此我們可推論,要完整地描述一個系統(tǒng)或電路,就必須對輸入和輸出以及電路的功能這兩部分作詳細(xì)說明,從大規(guī)模的CPU到最簡單的邏輯門都適用這一法則。從這個認(rèn)識出發(fā),用VHDL語言描述電路,就是要用相應(yīng)的語句將電路的輸入和輸出及電路的功能描述清楚,那么其結(jié)果是完全和電原理圖描述等效的。人們看到了這個邏輯符號(如圖1所示),就會聯(lián)想3
在用VHDL語言描述一個“與門”時,其語言描述與電原理圖描述的對應(yīng)關(guān)系如圖2所示。圖2VHDL語言描述與電原理圖描述的對應(yīng)關(guān)系在用VHDL語言描述一個“與門”時,其語言描4第二章:VHDL語言程序的基本結(jié)構(gòu)
2.1VHDL語言的基本設(shè)計單元構(gòu)成
VHDL語言程序的完整設(shè)計單元應(yīng)由5部分構(gòu)成:庫(Library)說明、包集合(Package)說明、實體(Entity)描述、構(gòu)造體(Architecture)描述和配置(Configuration)描述。1.最基本的設(shè)計單元構(gòu)成一個最基本的設(shè)計單元由實體和構(gòu)造體兩部分組成,如例2-1所示。第二章:VHDL語言程序的基本結(jié)構(gòu)2.1VHDL語言的5【例2-1】
ENTITYmux2ISPROT(d0,d1,sel:INBIT; q:OUTBIT);ENDmux2;ARCHITECTURErtlOFmux2ISBEGIN; PROCESS(d0,d1,sel) VARIABLEtmp1,tmp2,tmp3:BIT; BEGIN tmp1:=d0ANDsel; tmp2:=d1AND(NOTsel); tmp3:=tmp1ORtmp2; q<=tmp3; ENDPROCESS;ENDrtl;【例2-1】6例2-1是一個最基本的設(shè)計單元,只有實體和構(gòu)造體就行了。如前所述,它描述的是一個二選一選擇器電路。利用EDA工具可以對它進(jìn)行編譯、綜合生成TTL的器件。該設(shè)計單元僅由實體和構(gòu)造體這兩個描述部分組成。這是有條件的:第一,在實體和構(gòu)造體中所使用的數(shù)據(jù)類型一定是在STD庫中定義的,如BIT類型。STD庫已自動掛接在VHDL語言的編譯器中,因而無需在設(shè)計單元描述中進(jìn)行獨立的庫聲明。第二,設(shè)計單元的實體只與一個構(gòu)造體對應(yīng)。如前所述,一個實體可以對應(yīng)多個構(gòu)造體。在編譯時一個實體只能選擇某一個構(gòu)造體進(jìn)行設(shè)計單元編譯,這種選擇應(yīng)由配置語句描述。例2-1是一個最基本的設(shè)計單元,只有實體和構(gòu)72.一個完整的設(shè)計單元構(gòu)成一個完整的設(shè)計單元構(gòu)成的實例如例2-2所示?!纠?-2】
LIBRARYIEEE; --庫說明USEIEEE.STD_LOGIC_1164.ALL; --包集合說明ENTITYmux2IS --實體說明PORT(d0,d1,sel:INSTD_LOGIC; q:OUTSTD_LOGIC);ENDmux2;ARCHITECTURErtl1OFmux2IS --構(gòu)造體說明
2.一個完整的設(shè)計單元構(gòu)成8BEGIN PROCESS(d0,d1,sel) VARIABLEtmp1,tmp2,tmp3:STD_LOGIC; BEGINtmp1:=d0ANDsel;tmp2:=d1AND(NOTsel);tmp3:=tmp1ORtmp2; ENDPROCESS;ENDrtl1;ARCHITECTURErtl2OFmux2IS --構(gòu)造體說明
BEGIN9ENDrtl2;CONFIGURATIONrtl_mux2OFmux2IS --配置說明FORrtl1ENDFOR;ENDrtl_mux2;ENDrtl2;10
例2-2中的第一行是對設(shè)計單元所使用的庫進(jìn)行的描述和說明,這是因為該設(shè)計單元使用了IEEE庫中定義的包集合。第二行說明使用了IEEE庫中定義的1164包集合。這是因為STD_LOGIC數(shù)據(jù)類型等在該1164包集合中定義。例2-2中包含了一個實體和兩個構(gòu)造體,配置說明編譯時應(yīng)選中rtl1構(gòu)造體。當(dāng)然,如果只有一個構(gòu)造體,配置說明也就可以省略了。例2-2中的第一行是對設(shè)計單元所使用的庫進(jìn)行11
2.1.1.實體描述實體在電路描述中主要是說明該電路的輸入和輸出關(guān)系。此外,實體還定義電路名稱及構(gòu)造體中所用參數(shù)等。實體描述的一般書寫格式如下:ENTITY實體名IS[類屬參數(shù)說明];[端口說明];END實體名;2.1.1.實體描述12實體描述從“ENTITY實體名IS”開始,至“END實體名”結(jié)束。例如在例2-2中,實體描述可從“ENTITYmux2IS”開始,至“ENDmux2”結(jié)束。這里的大寫字母表示實體描述的框架,所用的詞都是VHDL語言的保留用詞,用戶在編程中一般不能將其用作它用。每個實體都應(yīng)這樣書寫,它們是不可缺少和省略的部分。小寫字母是設(shè)計者添寫的部分,隨設(shè)計單元的不同而不同。實際上,對VHDL語言而言,大寫和小寫字母都一視同仁,不加區(qū)分。這樣規(guī)定僅僅是為了增加程序的可讀性而已。實體描述從“ENTITY實體名IS”開始,至“END實體名”13【例2-3】2輸入或非門的實體說明程序:ENTITYnor2ISPORT(a,b:INbit;--說明兩個輸入端口a、bz:OUTbit);--說明一個輸出端口zENDnor2;【例2-4】3位計數(shù)器的實體說明程序:ENTITYcount3ISGENERIC(m:TIME:=5ns);PORT(clock,enable:INSTD_LOGIC;qout:OUTINTEGERRANGE0TO7);ENDcount3;【例2-3】2輸入或非門的實體說明程序:14圖2-1二選一選擇器的電原理圖圖2-1二選一選擇器的電原理圖15【例2-5】圖2-1的VHDL語言描述:ENTITYmux2ISGENERIC(m:TIME:=1ns);PORT(d0,d1,sel:INBIT; q:OUTBIT);ENDmux2;ARCHITECTUREconnectOFmux2ISSIGNALtmp:BIT;BEGIN; PROCESS(d0,d1,sel); VARIABLEtmp1,tmp2,tmp3:BIT;【例2-5】圖2-1的VHDL語言描述:16BEGIN;tmp1=d0ANDsel;tmp2=d1AND(NOTsel);tmp3=tmp1ORtmp2;tmp<=tmp3;q<=tmpAFTERm;ENDPROCESS;ENDconnect;BEGIN;171.類屬參數(shù)說明類屬參數(shù)說明必須放在端口說明之前,用于指定參數(shù),如例2-5中的GENERIC(m:TIME=1ns)。該語句指定了構(gòu)造體內(nèi)m的值為1ns。這樣,語句 q<=tmpAFTERm;表示tmp經(jīng)1ns延遲才送到q。在這個例子中,GENERIC利用類屬參數(shù)為q建立一個延遲值。1.類屬參數(shù)說明18類屬參數(shù)說明語句的書寫格式如下:GENERIC(常數(shù)名:數(shù)據(jù)類型:=設(shè)定值;……;……;常數(shù)名:數(shù)據(jù)類型:=設(shè)定值);類屬參數(shù)說明語句的書寫格式如下:192.端口說明端口說明是對基本設(shè)計實體(單元)與外部接口的描述,也可以說是對外部引腳信號的名稱,數(shù)據(jù)類型和輸入、輸出方向的描述。其一般書寫格式如下:
PORT(端口名{,端口名}:方向數(shù)據(jù)類型名;
端口名{,端口名}:方向數(shù)據(jù)類型名);
1)
端口名。端口名是賦予每個外部引腳的名稱,通常用一個或幾個英文字母,或者用英文字母加數(shù)字命名之,例如圖2-1中的外部引腳d0,d1,sel,q等?!?.端口說明…20
2)
端口方向。端口方向用來定義外部引腳的信號方向是輸入還是輸出。例如,圖2-1中的d0,d1,sel為輸入引腳,故用方向說明符“IN”說明之,而q則為輸出引腳,用方向說明符“OUT”說明之。凡是用“IN”進(jìn)行方向說明的端口,其信號自端口輸入到構(gòu)造體,而構(gòu)造體內(nèi)部的信號不能從該端口輸出。相反,凡是用“OUT”進(jìn)行方向說明的端口,其信號將從構(gòu)造體內(nèi)經(jīng)端口輸出,而不能通過該端口向構(gòu)造體輸入信號。
2)端口方向。端口方向用來定義外部引腳的信號21
另外,“INOUT”用以說明該端口是雙向的,可以輸入也可以輸出;“BUFFER”用以說明該端口可以輸出信號,且在構(gòu)造體內(nèi)部也可以利用該輸出信號?!癓INKAGE”用以說明該端口無指定方向,可以與任何方向的信號相連接。表示方向的說明符及其含義如表2-1所示。
另外,“INOUT”用以說明該端口是雙向的,22表2-1端口方向說明方向定義含義IN輸入端口輸入OUT輸出端口輸出(構(gòu)造體內(nèi)部不能再使用)INOUT雙向端口雙向BUFFER緩沖端口輸出(構(gòu)造體內(nèi)部可再使用)LINKAGE可連接端口不指定方向,無論那個方向都可連接表2-1端口方向說明方向定義含義IN輸入端口輸入OU23
表2-1中“OUT”和“BUFFER”都可以定義輸出端口,但是它們之間是有區(qū)別的,如圖2-2所示。
圖2-2OUT和BUFFER的區(qū)別(a)OUT;(b)BUFFER表2-1中“OUT”和“BUFFER”都可以243)數(shù)據(jù)類型。
在VHDL語言中有10種標(biāo)準(zhǔn)數(shù)據(jù)類型,但是在邏輯電路設(shè)計中常用到兩種:
BIT和BIT_VECTOR。當(dāng)端口被說明為BIT數(shù)據(jù)類型時,該端口的信號取值只可能是“1”或“0”。注意,這里的“1”和“0”是指邏輯值。所以,BIT數(shù)據(jù)類型是位邏輯數(shù)據(jù)類型,其取值只能是兩個邏輯值(“1”和“0”)中的一個。當(dāng)端口被說明為BIT_VECTOR數(shù)據(jù)類型時,該端口的取值可能是一組二進(jìn)制位的值。例如,某一數(shù)據(jù)總線輸出端口具有8位的總線寬度,那么這樣的總線端口的數(shù)據(jù)類型可以被說明成BIT_VECTOR??偩€端口上的值由8位二進(jìn)制位的值所確定。較完整的端口說明如例2-6所示。3)數(shù)據(jù)類型。25【例2-6】PORT(d0,d1,sel:INBIT; q:OUTBIT; bus:OUTBIT_VECTOR(7DOWNTO0));該例中,d0,d1,sel,q都是BIT數(shù)據(jù)類型,而bus是BIT_VECTOR類型,(7DOWNTO0)表示該bus端口是一個8位端口,由B7~B08位構(gòu)成,位矢量長度為8位。在某些VHDL語言的程序中,數(shù)據(jù)類型的說明符號有所不同。仍以例2-6為例進(jìn)行說明?!纠?-6】26【例2-7】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYmuIS PORT(d0,d1,sel:INSTD_LOGIC;q:OUTSTD_LOGIC;bus:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDmu;【例2-7】27
該例中BIT類型用STD_LOGIC替代,而bus則用STD_LOGIC_VECTOR(7DOWNTO0)說明。這樣做在語法上都是對的,所不同的是BIT、BIT_VECTOR與STD_LOGIC、STD_LOGIC_VECTOR盡管都同樣描述位和位矢量,但是它們的數(shù)據(jù)類型是不一樣的,前者只有兩種狀態(tài)“1”和“0”;而后者卻有9種狀態(tài)(這一點在后面詳述)。BIT和BIT_VECTOR在VHDL語言的標(biāo)準(zhǔn)庫(STD庫)中定義,使用該類型數(shù)據(jù)可以不作任何說明。STD_LOGIC和STD_LOGIC_VECTOR在IEEE庫的1164包集合中定義。在該包集合中專門對STD_LOGIC和STD_LOGIC_VECTOR數(shù)據(jù)類型的定義作了具體說明,其作用像C語言中的include文件一樣。正如例2-7所示那樣,如果在實體和構(gòu)造體中要使用這種類型的數(shù)據(jù),就必須在實體描述前加兩條語句:庫說明語句和使用包集合的說明語句。這樣可以使VHDL語言的編譯器在對實體編譯時從指定庫的包集合中找到數(shù)據(jù)類型的定義。該例中BIT類型用STD_LOGIC替代,而282.1.2構(gòu)造體描述
構(gòu)造體具體地指明了該對應(yīng)實體的行為、元件及內(nèi)部的連接關(guān)系,也就是說它定義了設(shè)計單元具體的功能。構(gòu)造體功能可以用3種描述方式,即行為描述(數(shù)學(xué)模型描述)、寄存器傳輸描述(數(shù)據(jù)流描述)和結(jié)構(gòu)描述(邏輯元件連接描述)。不同的描述方式,只體現(xiàn)在描述語句上,而其構(gòu)造體的結(jié)構(gòu)是完全一樣的。由于構(gòu)造體是對實體功能的具體描述,因此它一定要跟在實體的后面。通常,編譯實體之后才能對構(gòu)造體進(jìn)行編譯。如果實體需要重新編譯,那么相應(yīng)構(gòu)造體也應(yīng)重新進(jìn)行編譯。2.1.2構(gòu)造體描述29一個構(gòu)造體的具體結(jié)構(gòu)描述如下:
ARCHITECTURE構(gòu)造體名OF實體名IS[定義語句]內(nèi)部信號,常數(shù),數(shù)據(jù)類型,函數(shù)等的定義;BEGIN[并行處理語句];END構(gòu)造體名;一個構(gòu)造體從“ARCHITECTURE構(gòu)造體名OF實體名IS”開始,至“END構(gòu)造體名”結(jié)束。下面對構(gòu)造體的有關(guān)內(nèi)容和書寫方法作一說明。一個構(gòu)造體的具體結(jié)構(gòu)描述如下:301.構(gòu)造體名稱的命名構(gòu)造體的名稱是對本構(gòu)造體的命名,它是該構(gòu)造體的惟一名稱。OF后面緊跟的實體名表明了該構(gòu)造體所對應(yīng)的是哪一個實體。用IS來結(jié)束構(gòu)造體的命名。構(gòu)造體的名稱可以由設(shè)計者自由命名,但最好與其性質(zhì)有關(guān)。在大多數(shù)的文獻(xiàn)和資料中,通常把構(gòu)造體的名稱命名為behavioral(行為)、dataflow(數(shù)據(jù)流)、rtl(寄存器傳輸)或者structural(結(jié)構(gòu))。如前所述,這3個名稱實際上是3種構(gòu)造體描述方式的名稱。當(dāng)設(shè)計者采用某一種描述方式來描述構(gòu)造體時,該構(gòu)造體的結(jié)構(gòu)名稱就命名為某名稱。這樣,使得閱讀VHDL語言程序的人能直接了解設(shè)計者所采用的描述方式。例如,使用結(jié)構(gòu)描述方式來描述二選一電路,那么二選一電路的構(gòu)造體就可以這樣命名:ARCHITECTUREstructuralOFmuxIS1.構(gòu)造體名稱的命名312.定義語句定義語句位于ARCHITECTURE和BEGIN之間,用于對構(gòu)造體內(nèi)部所使用的信號、常數(shù)、數(shù)據(jù)類型和函數(shù)等進(jìn)行定義,例如:ARCHITECTUREbehavOFmuxISSIGNALnes1:BIT;
BEGIN
ENDbehav;信號定義和端口說明的語句一樣,應(yīng)有信號名和數(shù)據(jù)類型的說明。因它是內(nèi)部連接用的信號,故沒有也不需有方向的說明?!?.定義語句……323.并行處理語句并行處理語句處于語句BEGIN和END之間,這些語句具體地描述了構(gòu)造體的行為及其連接關(guān)系。例如,二選一的數(shù)據(jù)流方式描述可以如例2-8所示?!纠?-8】ENTITYmux2IS PORT(d0,d1:INBIT; sel:INBIT; q:OUTBIT);ENDmux2;ARCHITECTUREdataflowOFmux2ISBEGINq<=(d0ANDsel)OR(NOTselANDd1);ENDdataflow;3.并行處理語句33一個異或門實體對應(yīng)的3種描述方式的構(gòu)造體【例2-8】異或門構(gòu)造體的數(shù)據(jù)流方式描述:
ARCHITECTUREdata_flowOFxor_gateISBEGINc<=(aand(notb))or((nota)andb);ENDdata_flow;
【例2-9】異或門構(gòu)造體的行為描述:
ARCHITECTUREbehavioralOFxor_gateISPROCESS(a,b)BEGINIF(a=‘0’ANDb=‘1’)THENc<=‘1’;ELSIF(a=‘1’ANDb=‘0’)THENc<=‘1’;ELSEc<=‘0’;ENDIF;ENDPROCESS;ENDbehavioral;一個異或門實體對應(yīng)的3種描述方式的構(gòu)造體【例2-8】異或門34【例2-10】異或門構(gòu)造體的結(jié)構(gòu)描述:ARCHITECTUREstructureOFxor_gateISCOMPONENTnot_gatePORT(a:INBIT;b:OUTBIT);ENDCOMPONENT;COMPONENTand_gatePORT(a,b:INBIT;c:OUTBIT);ENDCOMPONENT;COMPONENTor_gatePORT(a,b:INBIT;c:OUTBIT);ENDCOMPONENT;SIGNALna,nb:BIT;SIGNALc1,c2:BIT;
(二)VHDL語言程序的基本結(jié)構(gòu)課件35BEGINu1:not_gatePORTMAP(a,na);u2:not_gatePORTMAP(b,nb);u3:and_gatePORTMAP(a,nb,c1);u4:and_gatePORTMAP(b,na,c2);u5:or_gatePORTMAP(c1,c2,c);ENDstructure;BEGIN362.2.2VHDL語言構(gòu)造體的子結(jié)構(gòu)描述在規(guī)模較大的電路設(shè)計中,全部電路都用惟一的一個模塊來描述是非常不方便的。為此,電路設(shè)計者總希望將整個電路分成若干個相對比較獨立的模塊來進(jìn)行電路的描述。這樣,一個構(gòu)造體可以用幾個子結(jié)構(gòu),即相對比較獨立的幾個模塊來構(gòu)成。VHDL語言可以有以下3種形式的子結(jié)構(gòu)描述語句:●BLOCK語句結(jié)構(gòu);●PROCESS語句結(jié)構(gòu);●SUBPROGRAMS結(jié)構(gòu)。2.2.2VHDL語言構(gòu)造體的子結(jié)構(gòu)描述371.BLOCK語句結(jié)構(gòu)描述
1)BLOCK語句的結(jié)構(gòu)
采用BLOCK語句描述局部電路的書寫格式如下所示:
塊結(jié)構(gòu)名:BLOCKBEGIN
ENDBLOCK塊結(jié)構(gòu)名;
如果采用BLOCK語句來描述二選一電路,那么用VHDL語言就可以書寫為例2-12形式?!?.BLOCK語句結(jié)構(gòu)描述如果采用BLOCK38【例2-12】用VHDL語言描述二選一電路ENTITYmuxISPORT(d0,d1,sel:INBIT; q:OUTBIT);ENDmux;ARCHITECTUREconnectOFmuxISSIGNALtmp1,tmp2,tmp3:BIT;BEGINcale:BLOCK BEGINtmp1<=d0ANDsel;tmp2<=d1AND(NOTsel);tmp3<=tmp1ORtmp2;q<=tmp3;ENDBLOCKcale;ENDconnect;【例2-12】用VHDL語言描述二選一電路392)BLOCK塊和子原理圖的關(guān)系人們在用計算機(jī)電路輔助設(shè)計工具輸入電原理圖時,往往將一個大規(guī)模的電原理圖分割成多張子原理圖進(jìn)行輸入和存檔。同樣在VHDL語句中也不例外,電路的構(gòu)造體對應(yīng)整個電原理圖,而構(gòu)造體可以由多個BLOCK塊構(gòu)成,每一個BLOCK塊對應(yīng)一張子原理圖。這樣電原理圖的分割關(guān)系和VHDL語言程序中用BLOCK分割構(gòu)造體的關(guān)系是一一對應(yīng)的。一個具體實例如圖2-3所示。
2)BLOCK塊和子原理圖的關(guān)系40圖2-3BLOCK塊和子原理圖的關(guān)系圖2-3BLOCK塊和子原理圖的關(guān)系413)BLOCK中語句的并發(fā)性在對程序進(jìn)行仿真時,BLOCK語句中所描述的各個語句是可以并行執(zhí)行的,它和書寫順序無關(guān)。在VHDL語言中將這樣可以并行執(zhí)行的語句稱為并發(fā)語句(ConcurrentStatement)。當(dāng)然,在構(gòu)造體內(nèi)直接書寫的語句也是并發(fā)的。在VHDL語言中也存在只能順序執(zhí)行的語句,這一點將在后面介紹。3)BLOCK中語句的并發(fā)性424)衛(wèi)式BLOCK(GuardedBLOCK)在圖2-3中使用BLOCK語句,僅僅是將構(gòu)造體劃分成幾個獨立的程序模塊,這和執(zhí)行控制沒有直接關(guān)系。如前所述,在系統(tǒng)仿真時BLOCK語句將被無條件地執(zhí)行。但是,在實際電路設(shè)計中,往往會碰到這樣的情況:當(dāng)某一種條件得到滿足時,BLOCK語句才可以被執(zhí)行;而條件不滿足時,該BLOCK語句將不能被執(zhí)行。這就是衛(wèi)式BLOCK,它可以實現(xiàn)BLOCK的執(zhí)行控制。例如,現(xiàn)在用BLOCK語句來描述一個鎖存器的結(jié)構(gòu)。該鎖存器是一個D觸發(fā)器,它具有一個數(shù)據(jù)輸入端d,時鐘輸入端clk,輸出端q和反相輸出端qb。眾所周知,只有clk有效時(clk='1'),輸出端q和qb才會隨d端輸入數(shù)據(jù)的變化而變化(電平觸發(fā)方式)。此時,用衛(wèi)式BLOCK語句描述該鎖存器結(jié)構(gòu)的VHDL語言程序如例2-13所示。4)衛(wèi)式BLOCK(GuardedBLOCK)43【例2-13】
ENTITYlatchISPORT(d,clk:INBIT; q,qb:OUTBIT);ENDlatch;ARCHITECTURElatch_guardOFlatchISBEGING1:BLOCK(clk='1')BEGINq<=GUARDEDdAFTER5ns;qb<=GUARDEDNOT(d)AFTER7ns;ENDBLOCKG1;ENDlatch_guard;
【例2-13】44
如上述程序所示,衛(wèi)式BLOCK語句的格式為:
BLOCK[衛(wèi)式布爾表達(dá)式]當(dāng)衛(wèi)式布爾表達(dá)式為真時(例中clk='1'為真時),該BLOCK語句被啟動執(zhí)行;而當(dāng)衛(wèi)式表達(dá)式為假時,該BLOCK語句將不被執(zhí)行。在BLOCK塊中的兩個信號傳送語句都寫有前衛(wèi)關(guān)鍵詞GUARDED,這表明只有衛(wèi)式布爾表達(dá)式為真時,這兩個語句才被執(zhí)行。如上述程序所示,衛(wèi)式BLOCK語句的格式為:45
現(xiàn)在根據(jù)程序,描述一下鎖存器的工作過程。當(dāng)端口clk的值為“1”時,衛(wèi)式布爾表達(dá)式為真。d端的輸入值經(jīng)5ns延遲以后從q端輸出,并且對d端的值取反,經(jīng)7ns后從qb端輸出。當(dāng)端口clk的值為“0”時,d端到q、qb端的信號傳遞通道將被切斷,q端和qb端的輸出保持原狀,不隨d端值的變化而改變?,F(xiàn)在根據(jù)程序,描述一下鎖存器的工作過程。462.進(jìn)程(PROCESS)語句結(jié)構(gòu)描述
1)PROCESS語句的結(jié)構(gòu)采用PROCESS語句描述電路結(jié)構(gòu)的書寫格式如下:
[進(jìn)程名]:PROCESS(敏感信號1,敏感信號2,…) BEGIN
ENDPROCESS;進(jìn)程名可以有,也可省略。PROCESS語句從PROCESS開始至ENDPROCESS結(jié)束。執(zhí)行PROCESS語句時,通常帶有若干個敏感信號量。這些信號量將在PROCESS結(jié)構(gòu)的語句中被使用。用PROCESS語句結(jié)構(gòu)描述的程序如例2-14所示。…2.進(jìn)程(PROCESS)語句結(jié)構(gòu)描述…47ENTITYmuxISPORT(d0,d1,sel:INBIT; q:OUTBIT);ENDmux;ARCHITECTUREconnectOFmuxISBEGINcale:PROCESS(d0,d1,sel)VARIABLEtmp1,tmp2,tmp3:BIT;BEGINtmp1:=d0ANDsel;tmp2:=d1AND(NOTsel);tmp3:=tmp1ORtmp2;q<=tmp3;ENDPROCESS;ENDconnect;【例2-14】ENTITYmuxIS【例2-14】482)進(jìn)程(PROCESS)中語句的順序性在VHDL中,與BLOCK語句一樣,某一個功能獨立的電路,在設(shè)計時也可以用一個PROCESS語句結(jié)構(gòu)來描述。與BLOCK語句不同的是,在系統(tǒng)仿真時,PROCESS結(jié)構(gòu)中的語句是按順序一條一條向下執(zhí)行的,而不像BLOCK中的語句可以并行執(zhí)行。這一點與單處理機(jī)上執(zhí)行C語言和Pascal語言的語句是完全一樣的。在后面還會提到,在VHDL語言中,這種順序執(zhí)行的語句只在PROCESS和SUBPROGRAMS的結(jié)構(gòu)中使用。2)進(jìn)程(PROCESS)中語句的順序性493)PROCESS的啟動在PROCESS的語句中總是帶有1個或幾個信號量。這些信號量是PROCESS的輸入信號,在書寫時跟在“PROCESS”后面的括號中。例如,PROCESS(d0,d1,sel)。該語句中d0,d1、sel都是信號量,在VHDL語言中也稱敏感量。這些信號無論哪一個發(fā)生變化(如由“0”變?yōu)椤?”或者由“1”變?yōu)椤?”)都將啟動該PROCESS語句。一旦啟動以后,PROCESS中的語句將從上到下逐句執(zhí)行一遍。當(dāng)最后一個語句執(zhí)行完畢以后,就返回到開始的PROCESS語句,等待下一次變化的出現(xiàn)。這樣,只要PROCESS中指定的信號變化一次,該PROCESS語句就會執(zhí)行一遍。
3)PROCESS的啟動504)進(jìn)程(PROCESS)的同步描述在例2-14用PROCESS結(jié)構(gòu)描述的二選一電路程序中,構(gòu)造體內(nèi)部只存在一個PROCESS。但是在實際的程序設(shè)計中,同一個構(gòu)造體中可以有多個進(jìn)程存在,而且各PROCESS之間還可以一邊進(jìn)行通信,一邊并行地同步執(zhí)行。下面以圖2-4為例作一說明。4)進(jìn)程(PROCESS)的同步描述51圖2-4進(jìn)程的同步描述圖2-4進(jìn)程的同步描述52
如圖2-4左邊框圖所示,在一個構(gòu)造體中存在著兩個進(jìn)程A和B。A進(jìn)程處理結(jié)束,有了一個B進(jìn)程啟動所需要的數(shù)據(jù),就使信號量to_b='1'。to_b是B進(jìn)程的輸入信號,當(dāng)B進(jìn)程敏感到to_b有變化,且to_b='1'時,則B進(jìn)程被啟動。同樣,B進(jìn)程處理結(jié)束,有了一個A進(jìn)程啟動所需的數(shù)據(jù),就使信號量to_a='1'。to_a是A進(jìn)程的輸入信號,當(dāng)A進(jìn)程敏感到to_a有變化,且to_a='1'時,則A進(jìn)程被啟動。如此循環(huán)工作,使A進(jìn)程和B進(jìn)程能并行地同步工作。如圖2-4左邊框圖所示,在一個構(gòu)造體中存在533.子程序(SUBPROGRAM)語句結(jié)構(gòu)描述
所謂子程序,就是在主程序調(diào)用它以后能將處理結(jié)果返回主程序的程序模塊,其含義和其他高級語言中的子程序概念相當(dāng)。它可以反復(fù)調(diào)用,使用非常方便。子程序在調(diào)用時首先要進(jìn)行初始化,執(zhí)行結(jié)束后子程序就終止。再調(diào)用時,要再進(jìn)行初始化,因此子程序內(nèi)部的值不能保持,子程序返回以后才能被再調(diào)用,它是一個非重入的程序。在VHDL中子程序有兩種類型:過程(Procedure)、函數(shù)(Function)。其中“過程”與其他高級語言中的子程序相當(dāng);而“函數(shù)”與其他高級語言中的函數(shù)相當(dāng)。
3.子程序(SUBPROGRAM)語句結(jié)構(gòu)描述541)過程語句過程語句的結(jié)構(gòu)。在VHDL語言中,過程語句的書寫格式如下:PROCEDURE過程名(參數(shù)1;參數(shù)2;…)IS[定義語句];(變量等的定義)BEGIN[順序處理語句];(過程的語句)END過程名;
在PROCEDURE結(jié)構(gòu)中,參數(shù)可以是輸入也可以是輸出參數(shù)。也就是說,過程中的輸入輸出參數(shù)都應(yīng)列在緊跟過程名的括號內(nèi)。例如,在VHDL語言中,將位矢量轉(zhuǎn)換為整數(shù)的程序可以由一個過程語句來實現(xiàn)。1)過程語句在PROCEDURE結(jié)構(gòu)中,參數(shù)可以是輸入也可55【例2-15】位矢量轉(zhuǎn)換為整數(shù)的程序PROCEDUREvector_to_int(z:INSTD_LOGIC_VECTOR;x_f1ag:OUTBOOLEAN;q:INOUTINTEGER)ISBEGINq:=0;x_f1ag:=FALSE;FORiINz′RANGELOOP q:=q*2;IF(z(i)=1)THEN q:=q+1;ELSIF(z(i)/=0)THEN x_f1ag:=TRUE;ENDIF;ENDLOOP;ENDvector_to_int;【例2-15】位矢量轉(zhuǎn)換為整數(shù)的程序56該過程調(diào)用后,如果x_flag=TRUE,則說明轉(zhuǎn)換失敗,不能得到正確的轉(zhuǎn)換整數(shù)值。在上例中,z是輸入,x_flag是輸出,q為輸入輸出。在沒有特別指定的情況下,“IN”作為常數(shù);而“OUT”和“INOUT”則看作“變量”進(jìn)行拷貝。當(dāng)過程的語句執(zhí)行結(jié)束以后,在過程內(nèi)所傳遞的輸出和輸入輸出參數(shù)值,將拷貝到調(diào)用者的信號或變量中。此時輸入輸出參數(shù)如沒有特別指定則按變量對待,將值傳遞給變量。如果調(diào)用者需要將輸出和輸入輸出作為信號使用,則在過程參數(shù)定義時要指明是信號,請參看例2-16。該過程調(diào)用后,如果x_flag=TRUE,則說明轉(zhuǎn)換失敗,不57【例2-16】PROCEDUREshift( din:INSTD_LOGIC_VECTOR; SIGNALdou:OUTSTD_LOGIC_VECTOR);
ENDshift;…【例2-16】…58(2)過程結(jié)構(gòu)中語句的順序性。
前面已經(jīng)提到,PROCESS結(jié)構(gòu)中的語句是順序執(zhí)行的,那么在過程結(jié)構(gòu)中的語句也是順序執(zhí)行的。調(diào)用者在調(diào)用過程前應(yīng)先將初始值傳遞給過程的輸入?yún)?shù),然后過程語句啟動,按順序自上而下執(zhí)行過程結(jié)構(gòu)中的語句,執(zhí)行結(jié)束,將輸出值拷貝到調(diào)用者的“OUT”和“INOUT”所定義的變量或信號中。(2)過程結(jié)構(gòu)中語句的順序性。592)函數(shù)語句函數(shù)語句的結(jié)構(gòu)。在VHDL語言中,函數(shù)語句的書寫格式如下:FUNCTION函數(shù)名(參數(shù)1;參數(shù)2;…) RETURN數(shù)據(jù)類型名IS[定義語句];BEGIN[順序處理語句];RETURN[返回變量名];END[函數(shù)名];2)函數(shù)語句60
在VHDL語言中,F(xiàn)UNCTION語句中括號內(nèi)的所有參數(shù)都是輸入?yún)?shù)或稱輸入信號。因此在括號內(nèi)指定端口方向的“IN”可以省略。FUNCTION的輸入值由調(diào)用者拷貝到輸入?yún)?shù)中,如果沒有特別指定,在FUNCTION語句中按常數(shù)處理。通常各種功能的FUNCTION語句的程序都被集中在包集合(Package)中,請參看例2-17。在VHDL語言中,F(xiàn)UNCTION語句中括61【例2-17】
LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;PACKAGEbpacISFUNCTIONmax(a:STD_LOGIC_VECTOR;b:STD_LOGIC_VECTOR) RETURNSTD_LOGIC_VECTOR;ENDbpac;PACKAGEBODYbpacISFUNCTIONmax(a:STD_LOGIC_VECTOR;b:STD_LOGIC_VECTOR)RETURNSTD_LOGIC_VECTORISVARIABLEtmp:STD_LOGIC_VECTOR(a’RANGE);BEGINIF(a>b)THENtmp:=a;ELSEtmp:=b;ENDIF;RETURNtmp;ENDmax;ENDbpac;
【例2-17】LIBRARYIEEE;623)過程語句和函數(shù)語句的使用(1)過程語句使用。例2-15定義的過程語句在進(jìn)程中可以用以下形式書寫:PROCESS(...)BEGIN;
vector_to_int(z,x_flag,q);
ENDPROCESS;過程用于描述電路設(shè)計中經(jīng)常出現(xiàn)的可以共享的某一功能電路。它可以在構(gòu)造體、BLOCK、PROCESS和子程序中使用。……3)過程語句和函數(shù)語句的使用……63(2)函數(shù)語句的使用。函數(shù)語句與過程語句類同,它也可以在構(gòu)造體、BLOCK、PROCESS和子程序中使用,如下例為函數(shù)在構(gòu)造體中調(diào)用的格式如下:用FUNCTION語句描述最大值檢出的程序:
LIBRARYIEEE.NEWLIB;USEIEEE.STD_LOGIC_1164.ALL;USENEWLIB.bpac.ALL;ENTITYpeakdetectISPORT(data:INSTD_LOGIC_VECTOR(5DOWNTO0);clk,set:INSTD_LOGIC;dataout:OUTSTD_LOGIC_VECTOR(5DOWNTO0));ENDpeakdetectARCHITECTURErtlOFpeakdetectISSIGNALpeak:STD_LOGIC_VECTOR(5DOWNTO0);BEGINdataout<=peak;PROCESS(clk)BEGINIF(clk’EVENTANDclk=‘1’)THENIF(SET=‘1’)THEN(2)函數(shù)語句的使用。函數(shù)語句與過程語句類同,它也可以在構(gòu)64peak<=data;ELSE
peak<=MAX(data,peak);ENDIF;ENDIF;ENDPROCESS;ENDrtl;在上述程序中,peak<=MAX(data,peak)就是調(diào)用FUNCTION的語句。在上例2-17包集合中的參數(shù)a和b,在這里用data和peak所代替。函數(shù)的返回值tmp被賦予peak。在MAX(a,b)函數(shù)的定義中,返回值tmp可以賦予信號或者變量,在本例中被賦予信號peak。無論是過程還是函數(shù),在VHDL語言中常常用于描述多次使用的公共單元電路,以使設(shè)計者能方便地共享。為了能重復(fù)使用這些過程和函數(shù),這些程序通常組織在包集合、庫中。它們與包集合和庫的關(guān)系是:多個過程和函數(shù)匯集在一起構(gòu)成包集合(Package),而幾個包集合匯集在一起就形成一個庫(Library)。有關(guān)包集合和庫后面介紹,注意不同公司發(fā)布的包集合和庫的登記方法是各不相同的。pea65子程序重載子程序重載(SubprogramsOverload)的語言特性使得能夠聲明多個名字相同但參數(shù)表不同的函數(shù)和過程。在具有不同數(shù)據(jù)類型操作數(shù)構(gòu)成的同名函數(shù)中,以運算符重載式函數(shù)最為常見,它為不同數(shù)據(jù)類型間的運算帶來了極大的方便。例:子程序重載舉例。●運算符重載式函數(shù)FUNCTION“+”(L:STD_LOGIC_VECTOR;R:INTEGER)RETURNSTD_LOGIC_VECTOR;FUNCTION“+”(L:INTEGER;R:STD_LOGIC_VECTOR)RETURNSTD_LOGIC_VECTOR;FUNCTION“+”(L:STD_LOGIC_VECTOR;R:STD_LOGIC)RETURNSTD_LOGIC_VECTOR;。。。。。。q<=q+1;。。。。。。在程序中,首先對重載操作符進(jìn)行了聲明,使用雙引號“”將需要聲明的操作符括起來。這樣,在執(zhí)行q<=q+1;時,如果q的類型為STD_LOGIC_VECTOR,1為整數(shù),程序就自動調(diào)用第一個函數(shù)?!襁^程重載子程序重載66PROCEDUREswap(a1,a2:INreal;q1:OUTINTEGER);PROCEDUREswap(a1,a2:ININTEGER;q1:OUTBIT);……swap(1.5,2.1,out1);swap(4,6,out2);……程序中聲明了兩個過程名、參數(shù)數(shù)目和模式相同,而各參數(shù)的數(shù)據(jù)類型不同的過程。程序執(zhí)行時可以自動根據(jù)參量的數(shù)據(jù)類型來調(diào)用相應(yīng)的過程,例如語句1:swap(1.5,2.1,out1);將調(diào)用第一個過程,而語句2:swap(4,6,out2);將調(diào)用另外一個過程。(二)VHDL語言程序的基本結(jié)構(gòu)課件672.3庫、包集合及配置2.3.1庫庫(Library)是經(jīng)編譯后的數(shù)據(jù)的集合,它存放包集合定義、實體定義、構(gòu)造體定義和配置定義。庫的功能類似于UNIX和MS-DOS操作系統(tǒng)中的目錄,庫中存放設(shè)計的數(shù)據(jù)。在VHDL語言中,庫的說明總是放在設(shè)計單元的最前面:
LIBRARY庫名;這樣在設(shè)計單元內(nèi)的語句就可使用庫中的數(shù)據(jù)。由此可見,庫的好處就在于使設(shè)計者可以共享已經(jīng)編譯過的設(shè)計結(jié)果。在VHDL語言中可以存在多個不同的庫,但是庫和庫之間是獨立的,不能互相嵌套。
2.3庫、包集合及配置681.庫的種類當(dāng)前在VHDL語言中存在的庫大致可以歸納為5種:IEEE庫、STD庫、ASIC矢量庫、WORK庫和用戶定義的庫。
1)
IEEE庫。在IEEE庫中有一個“STD_LOGIC_1164”的包集合,它是IEEE正式認(rèn)可的標(biāo)準(zhǔn)包集合?,F(xiàn)在有些公司,如SYNOPSYS公司也提供一些包集合“STD_LOGIC_ARITH”、“STD_LOGIC_UNSIGNED”,盡管它們沒有得到IEEE的承認(rèn),但是仍匯集在IEEE庫中。1.庫的種類69
2)STD庫。STD庫是VHDL的標(biāo)準(zhǔn)庫,在庫中存放有稱為“STANDARD”的包集合。由于它是VHDL的標(biāo)準(zhǔn)配置,因此設(shè)計者如要調(diào)用“STANDARD”中的數(shù)據(jù),可以不按標(biāo)準(zhǔn)格式說明。STD庫中還包含有稱作“TEXTIO”的包集合。在使用“TEXTIO”包集合中的數(shù)據(jù)時,應(yīng)先說明庫和包集合名,然后才可使用該包集合中的數(shù)據(jù),例如,LIBRARYSTD;USESTD.TEXTIO.ALL;該包集合在測試時使用。2)STD庫。STD庫是VHDL的標(biāo)準(zhǔn)庫70
3)面向ASIC的庫。在VHDL中,為了進(jìn)行門級仿真,各公司可提供面向ASIC的邏輯門庫。在該庫中存放著與邏輯門一一對應(yīng)的實體。為了使用面向ASIC的庫,對庫進(jìn)行說明是必要的。
4)WORK庫。WORK庫是現(xiàn)行作業(yè)庫。設(shè)計者所描述的VHDL語句不需要任何說明,都將存放在WORK庫中。在使用該庫時無需進(jìn)行任何說明。
5)用戶定義庫。用戶為自身設(shè)計需要所開發(fā)的共用包集合和實體等,也可以匯集在一起定義成一個庫,這就是用戶定義庫或稱用戶庫。在使用時同樣要首先說明庫名。3)面向ASIC的庫。在VHDL中,為了進(jìn)712.庫的使用1)庫的說明。前面提到的5類庫除WORK庫和STD庫之外,其他3類庫在使用前都需要先作說明,第一個語句是“LIBRARY庫名;”,表明使用什么庫。另外還要說明設(shè)計者要使用的是庫中哪一個包集合以及包集合中的項目名(如過程名、函數(shù)名等)。這樣第二個語句的格式可以是:
USELIBRARY_name.package_name.ITEM.name;所以,一般在使用庫時首先要用兩條語句對庫進(jìn)行說明,例如:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;2.庫的使用72
2)庫說明作用范圍。庫說明語句的作用范圍從一個實體說明開始到它所屬的構(gòu)造體、配置為止。當(dāng)一個源程序中出現(xiàn)兩個以上的實體時,兩條作為使用庫的說明語句應(yīng)在每個實體說明語句前重復(fù)書寫,請參看例2-18?!纠?-18】LIBRARYIEEE; USEIEEE.STD_LOGIC_1164.ALL; ENTITYand1ISENDand1;ARCHITECTURErtlofand1IS…庫使用說明2)庫說明作用范圍。庫說明語句的作用范圍從一個實體說明開73ENDrtl;CONFIGURATIONs1OFand1IS
ENDs1;LIBRARYIEEE; USEIEEE.STD_LOGIC_1164.ALL; ENTITYor1IS
CONFIGURATIONs2OFor1IS
ENDs2;…………庫使用說明ENDrtl;…………庫使用說明742.3.2包集合
包集合(Package)的說明像C語言中include語句一樣,用來單純地羅列VHDL語言中所要用到的信號定義、常數(shù)定義、數(shù)據(jù)類型、元件語句、函數(shù)定義和過程定義等,它是一個可編譯的設(shè)計單元,也是庫結(jié)構(gòu)中的一個層次。在使用包集合時可以用USE語句說明。例如:
USEIEEE.STD_LOGIC_1164.ALL;該語句表示在VHDL程序中要使用名為STD_LOGIC_1164的包集合中的所有定義或說明項。2.3.2包集合75包集合的結(jié)構(gòu)如下所示:PACKAGE包集合名IS[說明語句];END包集合名;PACKAGEBODY包集合名IS[說明語句];END包集合名;
包集合標(biāo)題
包集合體
包集合的結(jié)構(gòu)如下所示:包集合標(biāo)題包集合體76一個包集合由兩大部分組成:包集合標(biāo)題(Header)和包集合體。(PackageBody)包集合體是一個可選項,也就是說,包集合可以只由包集合標(biāo)題構(gòu)成。一般包集合標(biāo)題列出所有項的名稱,而包集合體具體給出各項的細(xì)節(jié)。例如,在例2-16中,包集合由包集合標(biāo)題和包集合兩部分組成。在包集合標(biāo)題中,定義了數(shù)據(jù)類型和函數(shù)的調(diào)用關(guān)系,而在包集合體中,具體地描述了實現(xiàn)該函數(shù)功能的語句和數(shù)據(jù)的賦值。這種分開描述的好處是,當(dāng)函數(shù)的功能需要作某些調(diào)整或數(shù)據(jù)賦值需要變化時,只要改變包集合體的相關(guān)語句就行了,而無需改變包標(biāo)題的說明,這樣可以使重新編譯的單元數(shù)目盡可能少。一個包集合由兩大部分組成:包集合標(biāo)題(Hea77【例2-19】LIBRARYIEEE;USEIEEESTD_LOGIC_1164.ALL;PACKAGEupacISCONSTANTk:INTEGER:=4;TYPEinstructionIS(add,sub,adc,inc,srf,slf);SUBTYPEcpu_busISSTD_LOGIC_VECTOR(k-1DOWNTO0);ENDupac;【例2-19】78
上述的包集合是用戶自定義的。在該包集合中定義了CPU的指令這一數(shù)據(jù)類型和cpu_bus為一個4位的位矢量。由于它是用戶自己定義的,因此編譯以后就會自動地加到WORK庫中,如要使用該包集合,則可用如下格式調(diào)用:
USEWORK.upac.instruction;
上述的包集合是用戶自定義的。在該包集合中定義792.3.3配置
配置(Configuration)語句描述了層與層之間的連接關(guān)系以及實體與結(jié)構(gòu)之間的連接關(guān)系。設(shè)計者可以利用這種配置語句來選擇不同的構(gòu)造體,使其與要設(shè)計的實體相對應(yīng)。在仿真某一個實體時,可以利用配置來選擇不同的構(gòu)造體,進(jìn)行性能對比試驗以得到性能最佳的構(gòu)造體。例如,要設(shè)計一個二輸入四輸出的譯碼器,如果一種結(jié)構(gòu)中的基本元件采用反相器和三輸入與門,而另一種結(jié)構(gòu)中的基本元件都采用與非門,且它們各自的構(gòu)造體是不一樣的,并且都放在各自不同的庫中,那么現(xiàn)在要設(shè)計的譯碼器,就可以利用配置語句實現(xiàn)對兩種不同構(gòu)造體的選擇。2.3.3配置80配置語句的基本書寫格式如下:CONFIGURATION配置名OF實體名IS [語句說明];END配置名;配置語句根據(jù)不同情況,其說明語句有簡有繁,下面舉例進(jìn)行說明。最簡單的缺省配置格式結(jié)構(gòu)(默認(rèn)配置)如下:CONFIGURATION配置名OF實體名ISFOR選配構(gòu)造體名ENDFOR;END配置名;配置語句的基本書寫格式如下:81【例2-20】一個計數(shù)器實體的兩個不同構(gòu)造體的配置LIBRARYSTD;USESTD.STD_LOGIC.ALL;ENTITYcounterISPORT(load,clear,clk:INT_WLOGIC;Data_in:ININTEGER;Data_out:OUTINTEGER);ENDcounter;ARCHITECTUREcount_255OFcounterISBEGINPROCESS(clk) VARIABLEcount:INTEGER:=0;BEGIN【例2-20】一個計數(shù)器實體的兩個不同構(gòu)造體的配置82IFclear='1'THEN Count:=0;ELSIFload='1'THEN Count:=data_in;ELSIF(clk′EVENT)AND(clk='1')AND (clk'LAST_VALUE='0')THEN IF(count=255)THEN Count:=0; ELSE Count:=count+1; ENDIF; ENDIF;data_out<=count;ENDPROCESS;ENDcount_255;IFclear='1'THEN83ARCHITECTUREcount_64KOFcounterISBEGINPROCESS(clk)VARIABLEcount:INTEGER:=0;BEGINIF(clear='1')THNEcount:=0;ELSIFload='1'THENcount:=data_in;ELSIF(clk′EVENT)AND(clk='1')AND (clk'LAST_VALUE='0')THEN IF(count=65535)THEN count:=0; ELSEARCHITECTUREcount_64KOFcoun84
count:=count+1; ENDIF; ENDIF;data_out<=count;ENDPROCESS;ENDcount_64K;CONFIGURATIONsmall_countOFcounterISFORcount_255ENDFOR;ENDsmall_count;CONFIGURATIONbig_countOFcounterISFORcount_64KENDFOR;ENDbig_count; count:=count+1;85
在例2-20中,一個計數(shù)器實體可以實現(xiàn)兩個不同構(gòu)造體的配置。需要注意的是,為達(dá)到這個目的,計數(shù)器實體中對裝入計數(shù)器和構(gòu)成計數(shù)器的數(shù)據(jù)位寬度不應(yīng)作具體說明,只將輸入和輸出數(shù)據(jù)作為INTEGER(整型)數(shù)據(jù)來對待。這樣就可以支持多種形式的計數(shù)器(如例中的8位計數(shù)器和16位計數(shù)器),以便在宿主機(jī)上方便地進(jìn)行仿真。
在例2-20中,一個計數(shù)器實體可以實現(xiàn)兩個不86VHDL硬件描述語言
第二章VHDL語言程序的基本結(jié)構(gòu)第三章VHDL語言的數(shù)據(jù)類型及運算操作符第四章VHDL語言構(gòu)造體的描述方式第五章VHDL語言的主要描述語句
第七章基本邏輯電路設(shè)計VHDL硬件描述語言第二章VHDL語言程序的基本結(jié)構(gòu)87VHDL語言描述數(shù)字系統(tǒng)的基本方法
在電原理圖中,如果要描述一個“與門”,那么在圖上畫出一個“與門”的邏輯符號就行了,如圖1所示。
圖1“與門”的邏輯符號描述VHDL語言描述數(shù)字系統(tǒng)的基本方法圖1“與門”的邏輯符號88人們看到了這個邏輯符號(如圖1所示),就會聯(lián)想到兩件事:(1)確定該邏輯有兩個輸入信號a和b,有一個輸出信號c,而且都是位信號(每個信號占二進(jìn)制位1位)。(2)根據(jù)邏輯符號形狀判斷,它是一個“與門”,在電路中實現(xiàn)“與”操作,即c=a·b。知道了這兩點,該電路的功能就一目了然了。由此我們可推論,要完整地描述一個系統(tǒng)或電路,就必須對輸入和輸出以及電路的功能這兩部分作詳細(xì)說明,從大規(guī)模的CPU到最簡單的邏輯門都適用這一法則。從這個認(rèn)識出發(fā),用VHDL語言描述電路,就是要用相應(yīng)的語句將電路的輸入和輸出及電路的功能描述清楚,那么其結(jié)果是完全和電原理圖描述等效的。人們看到了這個邏輯符號(如圖1所示),就會聯(lián)想89
在用VHDL語言描述一個“與門”時,其語言描述與電原理圖描述的對應(yīng)關(guān)系如圖2所示。圖2VHDL語言描述與電原理圖描述的對應(yīng)關(guān)系在用VHDL語言描述一個“與門”時,其語言描90第二章:VHDL語言程序的基本結(jié)構(gòu)
2.1VHDL語言的基本設(shè)計單元構(gòu)成
VHDL語言程序的完整設(shè)計單元應(yīng)由5部分構(gòu)成:庫(Library)說明、包集合(Package)說明、實體(Entity)描述、構(gòu)造體(Architecture)描述和配置(Configuration)描述。1.最基本的設(shè)計單元構(gòu)成一個最基本的設(shè)計單元由實體和構(gòu)造體兩部分組成,如例2-1所示。第二章:VHDL語言程序的基本結(jié)構(gòu)2.1VHDL語言的91【例2-1】
ENTITYmux2ISPROT(d0,d1,sel:INBIT; q:OUTBIT);ENDmux2;ARCHITECTURErtlOFmux2ISBEGIN; PROCESS(d0,d1,sel) VARIABLEtmp1,tmp2,tmp3:BIT; BEGIN tmp1:=d0ANDsel; tmp2:=d1AND(NOTsel); tmp3:=tmp1ORtmp2; q<=tmp3; ENDPROCESS;ENDrtl;【例2-1】92例2-1是一個最基本的設(shè)計單元,只有實體和構(gòu)造體就行了。如前所述,它描述的是一個二選一選擇器電路。利用EDA工具可以對它進(jìn)行編譯、綜合生成TTL的器件。該設(shè)計單元僅由實體和構(gòu)造體這兩個描述部分組成。這是有條件的:第一,在實體和構(gòu)造體中所使用的數(shù)據(jù)類型一定是在STD庫中定義的,如BIT類型。STD庫已自動掛接在VHDL語言的編譯器中,因而無需在設(shè)計單元描述中進(jìn)行獨立的庫聲明。第二,設(shè)計單元的實體只與一個構(gòu)造體對應(yīng)。如前所述,一個實體可以對應(yīng)多個構(gòu)造體。在編譯時一個實體只能選擇某一個構(gòu)造體進(jìn)行設(shè)計單元編譯,這種選擇應(yīng)由配置語句描述。例2-1是一個最基本的設(shè)計單元,只有實體和構(gòu)932.一個完整的設(shè)計單元構(gòu)成一個完整的設(shè)計單元構(gòu)成的實例如例2-2所示?!纠?-2】
LIBRARYIEEE; --庫說明USEIEEE.STD_LOGIC_1164.ALL; --包集合說明ENTITYmux2IS --實體說明PORT(d0,d1,sel:INSTD_LOGIC; q:OUTSTD_LOGIC);ENDmux2;ARCHITECTURErtl1OFmux2IS --構(gòu)造體說明
2.一個完整的設(shè)計單元構(gòu)成94BEGIN PROCESS(d0,d1,sel) VARIABLEtmp1,tmp2,tmp3:STD_LOGIC; BEGINtmp1:=d0ANDsel;tmp2:=d1AND(NOTsel);tmp3:=tmp1ORtmp2; ENDPROCESS;ENDrtl1;ARCHITECTURErtl2OFmux2IS --構(gòu)造體說明
BEGIN95ENDrtl2;CONFIGURATIONrtl_mux2OFmux2IS --配置說明FORrtl1ENDFOR;ENDrtl_mux2;ENDrtl2;96
例2-2中的第一行是對設(shè)計單元所使用的庫進(jìn)行的描述和說明,這是因為該設(shè)計單元使用了IEEE庫中定義的包集合。第二行說明使用了IEEE庫中定義的1164包集合。這是因為STD_LOGIC數(shù)據(jù)類型等在該1164包集合中定義。例2-2中包含了一個實體和兩個構(gòu)造體,配置說明編譯時應(yīng)選中rtl1構(gòu)造體。當(dāng)然,如果只有一個構(gòu)造體,配置說明也就可以省略了。例2-2中的第一行是對設(shè)計單元所使用的庫進(jìn)行97
2.1.1.實體描述實體在電路描述中主要是說明該電路的輸入和輸出關(guān)系。此外,實體還定義電路名稱及構(gòu)造體中所用參數(shù)等。實體描述的一般書寫格式如下:ENTITY實體名IS[類屬參數(shù)說明];[端口說明];END實體名;2.1.1.實體描述98實體描述從“ENTITY實體名IS”開始,至“END實體名”結(jié)束。例如在例2-2中,實體描述可從“ENTITYmux2IS”開始,至“ENDmux2”結(jié)束。這里的大寫字母表示實體描述的框架,所用的詞都是VHDL語言的保留用詞,用戶在編程中一般不能將其用作它用。每個實
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年石家莊貨運從業(yè)資格考試模擬考試題目及答案
- 茉莉花茶代理合同7篇
- 古箏采購合同范本
- 廠區(qū)道路修路合同范本
- 企業(yè)經(jīng)營貸款服務(wù)合同范本
- 上半年工作總結(jié)開頭
- 儒學(xué)大師邀請合同范本
- 動物防疫練習(xí)題庫與答案
- 病理學(xué)與病理生理學(xué)習(xí)題庫與參考答案
- 一年級法制教育教案
- 礦山機(jī)械傷害安全培訓(xùn)
- 2025貴州省黔東南州直屬事業(yè)單位招聘202人易考易錯模擬試題(共500題)試卷后附參考答案
- 2025年語文高考復(fù)習(xí)計劃解析
- 新生兒腸道病毒感染
- 2025年度專業(yè)酒店裝修承攬合同
- 2025年度5G基站建設(shè)勞務(wù)合同范本
- (完整版)班主任量化考核細(xì)則
- 2025年中國鐵路鄭州局集團(tuán)有限公司招聘筆試參考題庫含答案解析
- 2025年上半年永春縣農(nóng)文旅發(fā)展集團(tuán)限公司公開招聘若干名工作人員易考易錯模擬試題(共500題)試卷后附參考答案
- 家庭康復(fù)服務(wù)的商業(yè)價值與發(fā)展趨勢
- 2025年危化企業(yè)安全教育培訓(xùn)計劃
評論
0/150
提交評論