《Xilinx FPGA設(shè)計(jì)基礎(chǔ)》課件第3章_第1頁(yè)
《Xilinx FPGA設(shè)計(jì)基礎(chǔ)》課件第3章_第2頁(yè)
《Xilinx FPGA設(shè)計(jì)基礎(chǔ)》課件第3章_第3頁(yè)
《Xilinx FPGA設(shè)計(jì)基礎(chǔ)》課件第3章_第4頁(yè)
《Xilinx FPGA設(shè)計(jì)基礎(chǔ)》課件第3章_第5頁(yè)
已閱讀5頁(yè),還剩326頁(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)介

第3章VHDL硬件描述語(yǔ)言3.1VHDL的歷史和概況

3.2VHDL基本設(shè)計(jì)思想

3.3VHDL語(yǔ)言設(shè)計(jì)的基本單元

3.4VHDL語(yǔ)言的對(duì)象和數(shù)據(jù)類型3.5VHDL語(yǔ)言運(yùn)算操作符3.6VHDL語(yǔ)言的描述語(yǔ)句3.7VHDL的層次結(jié)構(gòu)設(shè)計(jì)3.8有限狀態(tài)機(jī)(FSM)

3.1VHDL的歷史和概況

VHDL是VHSIC硬件描述語(yǔ)言(VHSICHardwareDescriptionLanguage)的縮寫,而VHSIC又是超高速集成電路(VeryHigh-SpeedIntegratedCircuit)的縮寫。從這個(gè)縮寫我們大致可以看出VHDL語(yǔ)言的起源和目的。

VHDL是1980年在美國(guó)國(guó)防部的指導(dǎo)下開發(fā)的,于1983年完成。1987年被美國(guó)國(guó)防部和IEEE確定為標(biāo)準(zhǔn)的硬件描述語(yǔ)言,形成的標(biāo)準(zhǔn)為IEEE1076。當(dāng)初開發(fā)這種語(yǔ)言是出于美國(guó)國(guó)防部采購(gòu)電子設(shè)備的需要。美國(guó)軍隊(duì)的裝備是向私人企業(yè)采購(gòu)的,如果武器大量裝備部隊(duì),而其中某個(gè)供應(yīng)商在幾年后倒閉了,那這種武器的維修保養(yǎng)和再生產(chǎn)就會(huì)出現(xiàn)大問題。而這些電子設(shè)備,尤其是超高速集成電路的內(nèi)部結(jié)構(gòu)很復(fù)雜,如果出現(xiàn)了這種問題要找其他公司生產(chǎn)代用品就非常困難。因此,美國(guó)國(guó)防部希望供應(yīng)商能留下其產(chǎn)品的信息,以保證其一旦破產(chǎn)能由其他廠商迅速生產(chǎn)出代用品。由于涉及商業(yè)機(jī)密和知識(shí)產(chǎn)權(quán)的問題,供應(yīng)商不會(huì)提供最初的設(shè)計(jì)文檔,于是美國(guó)國(guó)防部就提出了一種折中的方法,即硬件描述語(yǔ)言,也就是VHDL。供應(yīng)商要用VHDL把自己生產(chǎn)的集成電路芯片的行為描述出來(lái),例如從芯片的哪個(gè)管腳輸入什么樣的信號(hào),過(guò)多長(zhǎng)時(shí)間能輸出什么樣的信號(hào)等。這樣,如果需要其他廠商生產(chǎn)代用品,只需要按照VHDL文檔,設(shè)計(jì)行為與其相同的芯片即可。

VHDL當(dāng)初是為了描述芯片的行為,而并不是為了設(shè)計(jì)硬件而開發(fā)的,因此IEEE1076-1987標(biāo)準(zhǔn)在模型描述方面非常詳盡,但在綜合方面它只定義了一些很寬泛的參數(shù),在工程實(shí)現(xiàn)中有很大的難度。1993年,IEEE修訂了VHDL標(biāo)準(zhǔn),新標(biāo)準(zhǔn)相對(duì)于87版本有了很大的改進(jìn)。93版本的VHDL是目前應(yīng)用最廣泛的版本,很多廠商的綜合工具都支持這一標(biāo)準(zhǔn)。IEEE規(guī)定其標(biāo)準(zhǔn)必須每五年修訂一次,因此VHDL還有很多后續(xù)版本,如2000版,但這些版本并沒有修訂多少內(nèi)容。 3.2VHDL基本設(shè)計(jì)思想

從VHDL的字面含義可以看出,VHDL語(yǔ)言著重于描述。通過(guò)描述芯片的輸入/輸出、結(jié)構(gòu)和行為等,使工程師能從概念上對(duì)芯片有一個(gè)完整的了解。描述的目的是要傳遞信息,通常意義下的描述是一個(gè)非常靈活的過(guò)程,例如口述、打手勢(shì)、書面陳述等,但每個(gè)人的表達(dá)方式和理解方式不同,這些方法都無(wú)法或很難準(zhǔn)確無(wú)誤地傳遞要表達(dá)的信息。因此,工程化的描述都采用規(guī)范的語(yǔ)言形式,用嚴(yán)格的語(yǔ)法結(jié)構(gòu)限定描述的內(nèi)容,VHDL也不例外。

VHDL只是給工程師提供了一個(gè)描述規(guī)范,用這種規(guī)范進(jìn)行描述可以使眾多工程師之間傳遞信息更加簡(jiǎn)潔、準(zhǔn)確。學(xué)習(xí)VHDL就是學(xué)習(xí)如何利用這些規(guī)范進(jìn)行描述,因此,我們?cè)趯W(xué)習(xí)VHDL之前,要在思維中假想一個(gè)現(xiàn)成的芯片,學(xué)習(xí)的過(guò)程中,對(duì)照芯片不斷完善對(duì)芯片的描述。

VHDL不僅可以對(duì)芯片的接口和行為參數(shù)做詳盡的描述,而且可以作為一門編程語(yǔ)言對(duì)可編程邏輯器件進(jìn)行編程配置。目前,可編程邏輯器件的EDA工具都支持以VHDL代碼作為工程設(shè)計(jì)的輸入。

VHDL語(yǔ)言語(yǔ)法簡(jiǎn)單,結(jié)構(gòu)明晰,可以滿足工程設(shè)計(jì)中的各種需求。

1)用編程的方式描述設(shè)計(jì)的功能

在2.2節(jié)的實(shí)驗(yàn)中,我們已經(jīng)初步接觸了VHDL語(yǔ)言程序。VHDL程序的設(shè)計(jì)方法與其他編程語(yǔ)言的設(shè)計(jì)方法很相似,工程師可以用編程的思想完成FPGA的電路設(shè)計(jì)。這對(duì)于熟悉Pascal或C語(yǔ)言的工程師來(lái)說(shuō)相當(dāng)方便。

2)?VHDL支持工程設(shè)計(jì)的結(jié)構(gòu)化描述

一般在硬件電路設(shè)計(jì)中,采用自底向上的設(shè)計(jì)方式,即先設(shè)計(jì)構(gòu)成系統(tǒng)的各個(gè)組成模塊,明確模塊的端口和時(shí)序,然后設(shè)計(jì)模塊之間的互聯(lián)關(guān)系,組成整個(gè)系統(tǒng)。

VHDL不僅支持自底向上的設(shè)計(jì)方式,而且支持如圖3.1所示的自頂向下的設(shè)計(jì)輸入模式,這種輸入模式更符合一般設(shè)計(jì)者對(duì)工程的認(rèn)知過(guò)程。首先根據(jù)工程設(shè)計(jì)需要完成的功能、芯片的輸入/輸出信號(hào)的定義等信息,對(duì)設(shè)計(jì)的頂層模塊進(jìn)行描述。然后,將頂層模塊的功能實(shí)現(xiàn)劃分為幾個(gè)二級(jí)功能模塊,對(duì)二級(jí)模塊的端口和互聯(lián)關(guān)系進(jìn)行描述。如此,由頂向下逐步將系統(tǒng)模塊劃分為底層的模塊實(shí)現(xiàn)。圖3.1自頂向下的設(shè)計(jì)輸入方式

3)?VHDL支持多層次抽象描述

FPGA電路設(shè)計(jì)一般抽象為四個(gè)層次,即行為層次(Behavioral)、寄存器傳輸層次(RTL,RegisterTransferLevel)、邏輯門層次(Logic)和布圖層次(Layout),如圖3.2所示。

行為層次主要關(guān)注模塊的功能描述和仿真驗(yàn)證,寄存器傳輸層次要關(guān)注模塊的可綜合電路的實(shí)現(xiàn),邏輯門層次考慮如何用門級(jí)電路實(shí)現(xiàn)給定功能,布圖層次考慮如何將電路適配到FPGA的資源中。

抽象層次越高,設(shè)計(jì)和仿真用的時(shí)間越少,但對(duì)電路細(xì)節(jié)的描述也越少;抽象層次越低,與器件相關(guān)的細(xì)節(jié)描述越多,但設(shè)計(jì)和仿真難度越大,花費(fèi)時(shí)間越長(zhǎng)。圖3.2FPGA設(shè)計(jì)的抽象層次通常做基于FPGA的工程設(shè)計(jì),工程師只需要用VHDL語(yǔ)言設(shè)計(jì)RTL以上的層次實(shí)現(xiàn),電路的FPGA底層實(shí)現(xiàn)通過(guò)綜合工具和實(shí)現(xiàn)工具完成。

4)用仿真工具對(duì)設(shè)計(jì)進(jìn)行仿真

仿真是驗(yàn)證工程設(shè)計(jì)的必要步驟,VHDL語(yǔ)言有專用的仿真工具,可以對(duì)FPGA設(shè)計(jì)的各個(gè)層次做仿真驗(yàn)證,包括行為層次和寄存器傳輸層次的功能仿真,邏輯門層次的綜合后的仿真和布圖層次的布局布線后的仿真。每個(gè)層次的仿真有其各自的特點(diǎn),靈活使用各層次的仿真,可以使工程驗(yàn)證得心應(yīng)手。

另外,需要注意,VHDL語(yǔ)言在建模方面有很多描述語(yǔ)句,但并不是所有的描述語(yǔ)句都是可以綜合的,可綜合語(yǔ)句只是VHDL建模語(yǔ)句的一個(gè)子集,它們的關(guān)系如圖3.3所示。圖3.3建模語(yǔ)句與可綜合語(yǔ)句的關(guān)系行為層次的VHDL描述是用于仿真的,全部的建模語(yǔ)言都可以使用;寄存器傳輸層次的VHDL描述只能用可綜合的語(yǔ)句。一般的工程設(shè)計(jì)文件都要用寄存器傳輸層次的描述,而測(cè)試平臺(tái)文件則用行為級(jí)的描述。 3.3VHDL語(yǔ)言設(shè)計(jì)的基本單元

VHDL是由設(shè)計(jì)單元組成的,基本的設(shè)計(jì)單元包括:

●實(shí)體Entity;

●構(gòu)造體Architecture;

●配置Configuration;

●包集合Package;

●庫(kù)Library。

芯片中的一個(gè)模塊可以是芯片的頂層模塊,即芯片本身,也可以是芯片內(nèi)的任意模塊。讀者在學(xué)習(xí)本節(jié)內(nèi)容的過(guò)程中可以參照2.2節(jié)實(shí)驗(yàn)中的內(nèi)容,以加深對(duì)VHDL設(shè)計(jì)單元的理解。3.3.1實(shí)體

設(shè)計(jì)一個(gè)模塊,首先要給模塊起一個(gè)名字作為這個(gè)模塊的標(biāo)識(shí),稱為實(shí)體名稱。這個(gè)名字通常與模塊的功能有密切關(guān)系,例如2.2節(jié)實(shí)驗(yàn)中的AND_OR。

模塊命名后,就要確定這個(gè)模塊的外部接口參數(shù),即模塊有哪些輸入信號(hào),有哪些輸出信號(hào),信號(hào)的名稱和類型是什么,在確定了這些參數(shù)之后,我們就完成了對(duì)實(shí)體的描述。

實(shí)體描述了模塊的外部接口和接口的相關(guān)參數(shù)。

在VHDL中實(shí)體描述的結(jié)構(gòu)如圖3.4所示。圖3.4實(shí)體描述結(jié)構(gòu)圖中,“entity實(shí)體名稱is”標(biāo)識(shí)實(shí)體說(shuō)明的開始,“end實(shí)體名稱”標(biāo)識(shí)實(shí)體說(shuō)明的結(jié)束,“entity”是實(shí)體聲明的關(guān)鍵字。

端口聲明是實(shí)體說(shuō)明的主要部分,用于說(shuō)明模塊實(shí)體與外部接口的信號(hào)傳遞關(guān)系。模塊的端口聲明與芯片的管腳說(shuō)明類似,只有定義了端口,模塊才能通過(guò)端口信號(hào)與外部互相傳遞信息。

實(shí)體中所有的端口信號(hào)都要在“port();”語(yǔ)句的括號(hào)內(nèi)聲明。端口的聲明包含三個(gè)部分:端口名稱、端口模式和數(shù)據(jù)類型。相同端口模式和數(shù)據(jù)類型的端口信號(hào)可以作為一組信號(hào)聯(lián)合聲明,信號(hào)之間用逗號(hào)“,”隔開,不同組的信號(hào)聲明之間用分號(hào)“;”隔開,但是要注意聲明最后一組信號(hào)后不需要再加分號(hào),端口聲明的結(jié)構(gòu)如下:

1.端口名稱

一般一個(gè)模塊實(shí)體包含不止一個(gè)端口,為了區(qū)別不同的端口,給端口命名時(shí)通常不會(huì)采用上面例子中的方式,而會(huì)將端口的含義包含在名稱中。例如,常用的端口名稱“clk”表示時(shí)鐘信號(hào)等。

2.端口模式

端口模式用于定義模塊端口的數(shù)據(jù)傳輸模式。VHDL的端口模式有五種,如表3.1所示。表3.1端口模式說(shuō)明

in模式的端口只能用作實(shí)體的輸入端口,外部信號(hào)只能通過(guò)端口輸入,而實(shí)體內(nèi)部的信號(hào)不能通過(guò)端口輸出,如圖3.5(a)所示。

與此相反,out模式的端口只能用作實(shí)體的輸出端口,實(shí)體內(nèi)部的信號(hào)可以通過(guò)端口輸出,但是外部信號(hào)不能通過(guò)端口輸入,如圖3.5(b)所示。圖3.5實(shí)體端口類型(a)?in端口;(b)?out端口;(c)?inout端口;(d)?buffer端口

inout端口是雙向端口,既可以用作內(nèi)部信號(hào)的輸出端口,也可以用作外部信號(hào)的輸入端口,但是輸入和輸出是分時(shí)復(fù)用的,輸入的信號(hào)值是外部信號(hào)驅(qū)動(dòng)的值,而不是內(nèi)部輸出時(shí)驅(qū)動(dòng)的值,如圖3.5(c)所示。

buffer是緩沖輸出端口,使用buffer輸出的信號(hào)值在實(shí)體內(nèi)部仍可以對(duì)其他信號(hào)進(jìn)行賦值。buffer與inout有明顯的不同,buffer不能用作信號(hào)的輸入。當(dāng)一個(gè)實(shí)體的端口用buffer模式時(shí),只能與其他實(shí)體的buffer類型的端口相連。

linkage類型的端口不指定信號(hào)傳輸方向,可以與任意類型的端口相連。

3.?dāng)?shù)據(jù)類型

IEEE1706/93VHDL語(yǔ)言參考手冊(cè)規(guī)定,EDA綜合工具支持的端口數(shù)據(jù)類型為布爾型(boolean)、位型(bit)、位矢量型(bit_vector)和整數(shù)型(integer)。

由IEEEstd_logic_1164所約定的、并由EDA工具支持和提供的數(shù)據(jù)類型為標(biāo)準(zhǔn)邏輯類型(StandardLogic)。標(biāo)準(zhǔn)邏輯類型也分為布爾型、位型、位矢量型和整數(shù)型。為了使EDA工具的仿真、綜合軟件能夠處理這些邏輯類型,這些庫(kù)必須用USE語(yǔ)句聲明。

我們會(huì)在后續(xù)內(nèi)容中對(duì)數(shù)據(jù)類型做詳細(xì)介紹。

一個(gè)典型的實(shí)體聲明如圖3.6所示。圖3.6實(shí)體聲明實(shí)例圖3.6實(shí)例中,一開始將“IEEE”庫(kù)包含進(jìn)來(lái),并聲明用“IEEE.STD_LOGIC_1164”包中的全部?jī)?nèi)容。端口的類型選用了STD_LOGIC和STD_LOGIC_VECTOR,STD_LOGIC類似于位型,說(shuō)明這些端口信號(hào)只能取邏輯“0”或邏輯“1”;STD_LOGIC_VECTOR類似于位矢量型,說(shuō)明這些端口的信號(hào)值可以取一組二進(jìn)制位值,位矢量的長(zhǎng)度在后面的括號(hào)中說(shuō)明,(7downto0)說(shuō)明該端口是一個(gè)8位的端口,比特位由左至右為從高到低的次序。

4.參數(shù)聲明

實(shí)體的聲明過(guò)程中還可以加入?yún)?shù)聲明,參數(shù)聲明類似于C++語(yǔ)言中的類屬參數(shù)聲明,在實(shí)體內(nèi)部可以將聲明的參數(shù)作為常數(shù)使用。參數(shù)聲明必須放在端口聲明之前,聲明的參數(shù)必須在generic();語(yǔ)句的括號(hào)內(nèi)。參數(shù)聲明包含三部分,參數(shù)名稱、參數(shù)類型和參數(shù)默認(rèn)值,其中參數(shù)的默認(rèn)值是可選的。參數(shù)聲明時(shí),多個(gè)參數(shù)之間用分號(hào)“;”隔開。參數(shù)聲明的結(jié)構(gòu)如下:

包含參數(shù)聲明的實(shí)體聲明結(jié)構(gòu)如圖3.7所示。圖3.7帶參數(shù)的實(shí)體描述結(jié)構(gòu)例如圖3.8的實(shí)例中,SETVALUE和COUNTOUT的端口位矢量長(zhǎng)度可以設(shè)置為參數(shù)。圖3.8帶參數(shù)的實(shí)體聲明實(shí)例3.3.2構(gòu)造體

通過(guò)實(shí)體聲明可以了解模塊的外部特征,但無(wú)法得知模塊內(nèi)部的功能實(shí)現(xiàn)。通常用構(gòu)造體對(duì)實(shí)體的內(nèi)部實(shí)現(xiàn)做更加詳細(xì)的描述。構(gòu)造體是一個(gè)從屬單元,不能獨(dú)立存在于模塊中,必須與實(shí)體聲明聯(lián)合使用。而一個(gè)實(shí)體聲明可以有多個(gè)構(gòu)造體。

構(gòu)造體描述了模塊的內(nèi)部功能、行為或結(jié)構(gòu)實(shí)現(xiàn)。

在VHDL中構(gòu)造體描述的結(jié)構(gòu)如圖3.9所示。圖3.9構(gòu)造體描述結(jié)構(gòu)

1.實(shí)體名稱

構(gòu)造體中的實(shí)體名稱必須與實(shí)體聲明中的實(shí)體名稱一致。

2.構(gòu)造體名稱

構(gòu)造體名稱是構(gòu)造體的標(biāo)識(shí),在命名時(shí)通常與構(gòu)造體的描述方式相關(guān)。構(gòu)造體在描述模塊的內(nèi)部實(shí)現(xiàn)時(shí)通常有三種方式,行為描述、數(shù)據(jù)流描述和結(jié)構(gòu)描述,不同的描述方式只在于其風(fēng)格不同,而功能實(shí)現(xiàn)是統(tǒng)一的。在比較復(fù)雜的構(gòu)造體描述中,通常不止用一種描述方式,而會(huì)靈活地搭配三種方式進(jìn)行描述。

1)行為描述

行為描述是抽象層最高的描述。主要使用電路的行為特性來(lái)描述設(shè)計(jì),通過(guò)EDA工具的綜合和優(yōu)化,實(shí)現(xiàn)實(shí)體的功能。采用這種描述方法設(shè)計(jì)的電路非常易于維護(hù)。在VHDL中通常用process的方式進(jìn)行行為描述。

例如,2.2節(jié)實(shí)驗(yàn)1中的模塊AND_OR,采用行為描述方式的代碼如圖3.10所示。圖3.10AND_OR的行為描述代碼

2)數(shù)據(jù)流描述

數(shù)據(jù)流的描述方式主要使用VHDL語(yǔ)言中的標(biāo)準(zhǔn)布爾函數(shù),將信號(hào)之間的布爾代數(shù)關(guān)系用布爾方程式來(lái)表示。采用數(shù)據(jù)流描述方式的AND_OR模塊代碼如圖3.11所示。圖3.11AND_OR的數(shù)據(jù)流描述代碼

3)結(jié)構(gòu)描述

結(jié)構(gòu)描述主要通過(guò)下層模塊的聲明和調(diào)用及端口映射將下層模塊相連,構(gòu)成電路的結(jié)構(gòu)性描述。AND_OR模塊的結(jié)構(gòu)描述代碼如圖3.12所示。圖3.12AND_OR的結(jié)構(gòu)描述代碼

3.聲明語(yǔ)句

聲明語(yǔ)句在構(gòu)造體的關(guān)鍵字“begin”之前,可用于聲明下列描述語(yǔ)句:

●?“use”語(yǔ)句;

●?子程序(subprogram)聲明;

●?子程序體(subprogrambody);

●?類型(type)聲明;

●?子類型(subtype)聲明;

●?常量(constant)聲明;

●?信號(hào)(signal)聲明;

●?元件(component)聲明;

●?并發(fā)(concurrent)語(yǔ)句。最典型的聲明語(yǔ)句如AND_OR的三種描述中都用到的SIG1和SIG2信號(hào)的聲明。在這里只將全部的聲明語(yǔ)句提出,后續(xù)的章節(jié)中將詳細(xì)介紹每一種聲明語(yǔ)句。

4.并發(fā)語(yǔ)句

構(gòu)造體中的每一個(gè)并發(fā)語(yǔ)句都定義了一個(gè)運(yùn)算單元,這個(gè)單元包括三個(gè)部分:

●讀取信號(hào)值;

●用讀取的信號(hào)值進(jìn)行運(yùn)算;

●將運(yùn)算的結(jié)果賦值給另外一個(gè)信號(hào)。構(gòu)造體中的所有并發(fā)語(yǔ)句都是同時(shí)進(jìn)行運(yùn)算的,與語(yǔ)句的書寫順序沒有任何關(guān)系。并發(fā)語(yǔ)句有五種類型:

●塊(block)語(yǔ)句;

●元件(component)例化;

●過(guò)程(procedure)調(diào)用;

●進(jìn)程(process);

●信號(hào)(signal)賦值。

我們可以在AND_OR的結(jié)構(gòu)體描述實(shí)例中找到用到的并發(fā)語(yǔ)句,這里也只將全部的并發(fā)語(yǔ)句提出,在后續(xù)的章節(jié)中將詳細(xì)介紹這些并發(fā)語(yǔ)句。3.3.3配置

上述構(gòu)造體內(nèi)容中提到,一個(gè)實(shí)體聲明可以有多個(gè)構(gòu)造體,但這個(gè)實(shí)體被上層模塊調(diào)用,并在最終形成電路時(shí),只能使用一種結(jié)構(gòu)體作為實(shí)體功能實(shí)現(xiàn)的描述。這時(shí)就需要使用配置結(jié)構(gòu)將實(shí)體與對(duì)應(yīng)的結(jié)構(gòu)體連接起來(lái)。配置不是所有VHDL代碼必備的一部分,它不是從屬單元,可以獨(dú)立存在。通常在使用時(shí)都會(huì)將配置單獨(dú)寫入一個(gè)文件中。

注意:雖然使用配置可以使VHDL代碼更加靈活,但目前很多綜合工具都不支持配置。

配置用于描述設(shè)計(jì)的層次之間的互聯(lián)關(guān)系,以及實(shí)體與結(jié)構(gòu)體之間的連接關(guān)系。

在VHDL中配置描述的結(jié)構(gòu)如圖3.13所示。圖3.13配置描述結(jié)構(gòu)配置描述以“configuration配置名稱of實(shí)體名稱is”開始,以“end配置名稱”結(jié)束,“configuration”是構(gòu)造體聲明的關(guān)鍵字。

1.實(shí)體名稱

配置中的實(shí)體名稱必須與實(shí)體聲明中的實(shí)體名稱一致。

2.配置名稱

配置名稱是配置的標(biāo)識(shí)。一個(gè)實(shí)體的配置可以在這個(gè)實(shí)體被上層模塊調(diào)用時(shí),作為上層模塊中的配置語(yǔ)句使用。

3.配置語(yǔ)句

根據(jù)使用情況不同,配置語(yǔ)句有簡(jiǎn)有繁。最簡(jiǎn)單的配置語(yǔ)句的結(jié)構(gòu)如下:庫(kù)包含3.3.4包集合

VHDL工程設(shè)計(jì)包含很多元素,不僅包含之前所涉及的實(shí)體、結(jié)構(gòu)體以及配置,還包含一些常量定義、數(shù)據(jù)類型定義、子類型定義、子程序和函數(shù)等元素,這些元素會(huì)在源文件設(shè)計(jì)中反復(fù)用到。

類似于C語(yǔ)言中,我們經(jīng)常將用戶定義的類型、常量、函數(shù)聲明等單獨(dú)寫入一個(gè)頭文件中,然后在C源文件中用include語(yǔ)句包含進(jìn)來(lái)一樣。VHDL語(yǔ)言中,也將這些內(nèi)容組織在一起,但不形成文件,而形成包集合。

包集合用于存儲(chǔ)在工程設(shè)計(jì)中需要反復(fù)用到的常量定義、數(shù)據(jù)類型定義、子類型定義、子程序和函數(shù)聲明等。在上述的代碼中,都會(huì)以“l(fā)ibraryIEEE”和“use……”開頭,其中“use……”部分代碼的含義就是對(duì)用到的包集合進(jìn)行聲明。

包集合由包集合聲明和包集合體兩部分構(gòu)成,包集合的描述結(jié)構(gòu)如圖3.14所示。圖3.14包集合描述結(jié)構(gòu)

1.包集合名稱

包集合名稱是包集合的標(biāo)識(shí),在使用包集合時(shí),可以作為參數(shù)使用。

2.包集合聲明語(yǔ)句

包集合聲明語(yǔ)句中包含了工程設(shè)計(jì)中常用的信息,這些信息包括數(shù)據(jù)類型聲明、信號(hào)聲明、子程序聲明和元件聲明。在聲明語(yǔ)句中,對(duì)子程序和元件只做聲明,具體的實(shí)現(xiàn)在包集合體描述語(yǔ)句中進(jìn)行描述。包集合聲明語(yǔ)句中聲明的這些定義對(duì)外界是可見的。

注意,包集合中聲明的信號(hào)在不同的實(shí)體中是不能共享的,如果多個(gè)實(shí)體都使用了包集合中的同一個(gè)信號(hào),則每個(gè)實(shí)體內(nèi)都會(huì)有一個(gè)獨(dú)立的該信號(hào)的復(fù)制信號(hào)。

3.包集合體描述語(yǔ)句

包集合體描述語(yǔ)句包含了子函數(shù)(Function)和過(guò)程(Prodecure)等的具體實(shí)現(xiàn),這些子函數(shù)或過(guò)程是在包集合聲明語(yǔ)句中已經(jīng)聲明的。

一個(gè)簡(jiǎn)單的包集合實(shí)例如下:3.3.5庫(kù)

所有的VHDL設(shè)計(jì)元素經(jīng)過(guò)編譯后最終都會(huì)包含在庫(kù)中,庫(kù)和包集合構(gòu)成了VHDL工程數(shù)據(jù)的管理結(jié)構(gòu),這個(gè)管理結(jié)構(gòu)類似于操作系統(tǒng)中文件夾和子文件夾的結(jié)構(gòu),如圖3.15所示。圖3.15庫(kù)和包集合構(gòu)成的管理結(jié)構(gòu)庫(kù)中包含了編譯后的數(shù)據(jù)的集合,這些數(shù)據(jù)包括實(shí)體定義、構(gòu)造體定義、配置定義和包集合定義。

我們?cè)谥暗氖纠a中經(jīng)常以“l(fā)ibraryIEEE;”開頭,這個(gè)語(yǔ)句的含義就是將IEEE庫(kù)包含到設(shè)計(jì)文件中。庫(kù)的描述結(jié)構(gòu)為:

library庫(kù)名稱;

將庫(kù)文件包含到設(shè)計(jì)文件中后,設(shè)計(jì)單元內(nèi)的語(yǔ)句就可以使用庫(kù)中的數(shù)據(jù),這一點(diǎn)和C語(yǔ)言中庫(kù)的概念是一致的。

VHDL設(shè)計(jì)中可以存在多個(gè)不同的庫(kù),這些庫(kù)大致可以歸為5類:IEEE庫(kù)、STD庫(kù)、ASIC庫(kù)、WORK庫(kù)和用戶自定義庫(kù)。●?IEEE庫(kù):包含了“STD_LOGIC_1164”、“STD_LOGIC_ARITH”和“STD_LOGIC_UNSIGNED”等包集合,這些包集合定義了一些工程設(shè)計(jì)中常用的數(shù)據(jù)類型等的定義。

●?STD庫(kù):VHDL的標(biāo)準(zhǔn)庫(kù),庫(kù)中有標(biāo)準(zhǔn)的“STANDARD”包集合。

●?ASIC庫(kù):各公司為了使用VHDL語(yǔ)言進(jìn)行門級(jí)仿真而提供的ASIC邏輯門庫(kù)。

●?WORK庫(kù):類似于項(xiàng)目管理文件夾,項(xiàng)目中設(shè)計(jì)的所有單元都存放于這個(gè)庫(kù)中。

●??用戶自定義庫(kù):用戶自行開發(fā)的庫(kù),用于包含多個(gè)實(shí)體中共用的包集合和實(shí)體等。

VHDL語(yǔ)言中,庫(kù)與庫(kù)之間是相互獨(dú)立的,不能互相嵌套。其中WORK庫(kù)和STD庫(kù)是工程設(shè)計(jì)中的每個(gè)設(shè)計(jì)單元都要用到的庫(kù),因此設(shè)計(jì)過(guò)程中可以不用標(biāo)準(zhǔn)格式說(shuō)明。

通常在工程設(shè)計(jì)中庫(kù)和包集合是聯(lián)合使用的,如在之前的VHDL代碼實(shí)例中經(jīng)常用到的開頭:

libraryIEEE;

useIEEE.STD_LOGIC_1164.all;

這個(gè)開頭中“l(fā)ibraryIEEE”聲明將IEEE庫(kù)包含進(jìn)來(lái),“useIEEE.STD_LOGIC_1164.all”表示使用IEEE庫(kù)中STD_LOGIC_1164包集合的所有(all)定義。另外一個(gè)簡(jiǎn)單的實(shí)例如圖3.16所示。圖3.16library和package使用實(shí)例

3.4VHDL語(yǔ)言的對(duì)象和數(shù)據(jù)類型

3.4.1VHDL語(yǔ)言的對(duì)象類型

在VHDL語(yǔ)言中,可以被賦值的都稱為對(duì)象(Object)。對(duì)象有很多種,常用的有端口(Port)、常量(Constant)、信號(hào)(Signal)、變量(Variable)。

這里,首先給出一個(gè)簡(jiǎn)單的例子,讀者可以對(duì)照例子中的代碼理解這些對(duì)象。

1.端口(Port)

端口定義了實(shí)體的信號(hào)傳遞接口,在3.3.1節(jié)介紹實(shí)體的定義時(shí),已經(jīng)對(duì)端口做了介紹。在端口的定義中,數(shù)據(jù)類型是必不可少的一部分。

常用的端口類型有輸入(Input)、輸出(Output)、雙向(Inout)和緩沖輸出(Buffer)四種,其中Input、Inout和Buffer端口可以對(duì)其他對(duì)象賦值,Output、Inout和Buffer可以被其他對(duì)象賦值。

2.常量(Constant)

常量是一個(gè)固定的值。常量在被創(chuàng)建時(shí)就被賦值為一個(gè)固定的值,并且常量的值在使用過(guò)程中只能對(duì)其他對(duì)象賦值,不能被修改。常量使代碼更容易閱讀和維護(hù)。常量可以在結(jié)構(gòu)體、包集合、實(shí)體、塊語(yǔ)句、過(guò)程語(yǔ)句和子函數(shù)中聲明,在結(jié)構(gòu)體中聲明的常量是本地常量,只能在結(jié)構(gòu)體內(nèi)部使用。

常量聲明的結(jié)構(gòu)為:

constant常量名稱:數(shù)據(jù)類型:=常量表達(dá)式

例如:

constantCPU_ADDR_MSB:integer:=32;

constantMASK:std_logic_vector:="00001111"

3.變量(Variable)

變量是用于存儲(chǔ)信息的一種對(duì)象。變量在被創(chuàng)建時(shí)也可以賦初始值,但與常量相反,變量在使用過(guò)程中既可以對(duì)其他對(duì)象賦值,也可以被修改。

變量是一個(gè)局部量,不能在結(jié)構(gòu)體中聲明,而只能在進(jìn)程語(yǔ)句(Process)、函數(shù)語(yǔ)句(Function)和過(guò)程語(yǔ)句(Procedure)中聲明。

變量聲明的結(jié)構(gòu)為:

variable變量名稱:數(shù)據(jù)類型[:=初始值表達(dá)式]

例如:

variableCOUNT:INTEGER;

variableV:STD_LOGIC_VECTOR(3downto0):="0101";

variableW:INTEGER

range0to7:=7;在VHDL中,變量在綜合后可以是一個(gè)連線(Wire),也可以是一個(gè)寄存器(register),綜合的結(jié)果取決于變量在時(shí)序電路中是否用于保存信號(hào)值。這一靈活性也使得變量在使用過(guò)程中經(jīng)常引發(fā)錯(cuò)誤,例如功能仿真的結(jié)果與綜合后的結(jié)果不一致的情況,所以在使用變量時(shí)要格外小心。

變量用“:=”符號(hào)進(jìn)行賦值操作,例如:

V:="0111";

W:=5;

COUNT:=W+16;

另外,雖然變量可以賦初始值,但是在綜合時(shí),綜合器會(huì)將初始值忽略掉,因此在使用過(guò)程中也要特別注意。

4.信號(hào)(Signal)

信號(hào)是電路底層硬件單元連接的抽象。在VHDL中,信號(hào)可以用于在結(jié)構(gòu)體中的不同并發(fā)語(yǔ)句之間傳遞信息,也可以通過(guò)端口與其他實(shí)體傳遞信息。從某種意義上講,端口也是信號(hào)的一種,但是被限定了輸入/輸出特性,因此也可以通過(guò)創(chuàng)建端口來(lái)創(chuàng)建一個(gè)信號(hào),而端口的賦值方式也與信號(hào)相同。

信號(hào)可以在實(shí)體(Entity)、結(jié)構(gòu)體(Architecture)和塊語(yǔ)句(Block)中聲明,不能在進(jìn)程(Process)語(yǔ)句、函數(shù)語(yǔ)句(Function)和過(guò)程語(yǔ)句(Procedure)中聲明,但可以在進(jìn)程(Process)、函數(shù)(Function)和過(guò)程(Procedure)中使用。信號(hào)的聲明結(jié)構(gòu)與變量類似:

signal信號(hào)名稱:數(shù)據(jù)類型[:=初始值表達(dá)式];

例如:

signalA,B:BIT;

signalLBUS:INTEGER:?=

8;

與變量相同,信號(hào)在聲明結(jié)構(gòu)中被賦予的初始值,在綜合時(shí)也會(huì)被忽略。

信號(hào)采用“<=”符號(hào)進(jìn)行賦值操作,例如:

A<='0';

LBUS<=16;由于信號(hào)本身是底層硬件單元連接的抽象,因此,類似于信號(hào)在連線上有傳輸時(shí)延,信號(hào)在數(shù)值傳遞的過(guò)程中也可以加入延時(shí),例如兩個(gè)信號(hào)A和B,B的值經(jīng)過(guò)5ns的延時(shí)后傳遞到A,賦值語(yǔ)句可以寫為:

A<=Bafter5ns;

但必須明白,像“after5ns”這樣的語(yǔ)句,在底層電路是根本無(wú)法實(shí)現(xiàn)的,因此,延時(shí)語(yǔ)句只在行為建模時(shí)起作用,而在綜合時(shí)也會(huì)被完全忽略。

從變量和信號(hào)的聲明和定義看,很容易將這兩種對(duì)象混淆,但實(shí)際上,這兩種對(duì)象有明顯的區(qū)別,這些區(qū)別在以后的工程實(shí)踐中可以慢慢體會(huì)。

1)聲明和使用位置不同

變量只能在進(jìn)程語(yǔ)句(Process)、函數(shù)語(yǔ)句(Function)和過(guò)程語(yǔ)句(Procedure)內(nèi)聲明,也只能在這些語(yǔ)句內(nèi)部使用,因此是一個(gè)局部對(duì)象。

信號(hào)可以在實(shí)體(Entity)、結(jié)構(gòu)體(Architecture)和塊語(yǔ)句(Block)中聲明,在進(jìn)程(Process)、函數(shù)(Function)和過(guò)程(Procedure)中使用,因此可以在不同的進(jìn)程之間傳遞信息,是一個(gè)全局對(duì)象。

2)賦值符號(hào)和延遲不同

變量用“:=”賦值,信號(hào)用“<=”賦值。

變量被賦值時(shí),可以被看做是賦值符號(hào)右側(cè)表達(dá)式的代名詞,在使用變量時(shí),可以直接用其所代的表達(dá)式替代。如果賦值的過(guò)程被分為獲取數(shù)據(jù)值、數(shù)值計(jì)算、用計(jì)算的結(jié)

果進(jìn)行賦值三個(gè)步驟,那么變量在賦值的過(guò)程中,第三步“用計(jì)算的結(jié)果進(jìn)行賦值”這個(gè)操作是即時(shí)的,沒有延時(shí)。而信號(hào)是物理單元的抽象,因此第三個(gè)步驟的操作是有時(shí)延的。3.4.2VHDL語(yǔ)言的數(shù)據(jù)類型

VHDL對(duì)類型的要求很嚴(yán)格,如上所述,所有的端口、常量、變量和信號(hào)在聲明時(shí)都要顯式地定義其對(duì)應(yīng)的數(shù)據(jù)類型。不同類型之間的數(shù)據(jù)不能直接賦值,數(shù)據(jù)類型相同,而位長(zhǎng)不同時(shí)也不能直接代入。因此,熟練掌握各種數(shù)據(jù)類型對(duì)于用VHDL語(yǔ)言編程至關(guān)重要。

VHDL中定義了很多種數(shù)據(jù)類型,這些數(shù)據(jù)類型大致可以分為五種:

●標(biāo)量類型(ScalarType)

●復(fù)合類型(CompositeType)

●存取類型(AccessType)

●文件類型(FilesType)

●用戶定義的子類型(SubTypes)

1.標(biāo)量類型

標(biāo)量類型是VHDL中最基本的類型,用于描述一個(gè)單值數(shù)據(jù)對(duì)象。屬于標(biāo)量類型的數(shù)據(jù)類型有以下幾種:

●位型(BIT)

●布爾型(BOOLEAN)

●整型(INTEGER)

●實(shí)型(REAL)

●物理型

●符號(hào)型(CHARACTER)

●標(biāo)準(zhǔn)邏輯類型(STD_LOGIC)

●枚舉類型(ENUMERATE)

●錯(cuò)誤等級(jí)(SEVERITY_LEVEL)

1)位(BIT)

BIT型是數(shù)字邏輯中最基本的邏輯形式,BIT型在STD庫(kù)中有明確定義,其定義如下:

typeBITis('0','1');

從上面的定義可以看出,BIT類型的數(shù)據(jù)只能取'0'和'1'兩個(gè)值,是二值系統(tǒng)中的最基本單元,分別表示低電平和高電平。

一個(gè)位型數(shù)據(jù)的實(shí)例如下:

signalX,Y,Z:BIT;

X<='0';

Y<='1';

Z<=XandY;

2)布爾(BOOLEAN)

BOOLEAN型相對(duì)于BIT型抽象層次更高,BOOLEAN型的定義如下:

typeBOOLEANis(FALSE,TRUE);

從定義上看,BOOLEAN類型類似于BIT類型,一個(gè)BOOLEAN量也具有兩種狀態(tài),F(xiàn)ALSE或者TRUE。但它和位型不同,它沒有數(shù)值的含義,也不能進(jìn)行算術(shù)運(yùn)算,只能作為關(guān)系運(yùn)算的結(jié)果,在判斷語(yǔ)句中判斷使用,例如:

ifSEL='1'…

ifF>=G…

這些語(yǔ)句都將產(chǎn)生BOOLEAN型的結(jié)果。一個(gè)BOOLEAN型數(shù)據(jù)的實(shí)例如下:

signalCOND:BOOLEAN;

ifCONDthen

3)整型(INTEGER)

VHDL中的INTEGER數(shù)據(jù)與C語(yǔ)言中的整型數(shù)據(jù)定義相同。VHDL中INTEGER數(shù)據(jù)的表示范圍為-(231-1)~231-1,即-2147483647~2147483647。INTEGER型的定義如下:

typeINTEGERisrange-2147483647to2147483647雖然INTEGER類型的數(shù)據(jù)在底層電路中也是用一系列二進(jìn)制位表示的,但是在使用INTEGER類型時(shí),不能直接對(duì)數(shù)據(jù)的比特位進(jìn)行操作,而必須使用轉(zhuǎn)換函數(shù)將INTEGER數(shù)據(jù)轉(zhuǎn)換為位矢量類型。不過(guò),目前一些公司的綜合器已經(jīng)不受這個(gè)約束的限制。

一個(gè)INTEGER類型數(shù)據(jù)的實(shí)例如下:

signalINT_S:INTEGER;

signalA:INTEGERrange0to7;

signalB:INTEGERrange15downto0;

A<=5;

B<=12;通常INTEGER類型的數(shù)據(jù)在定義時(shí),都要用“range”語(yǔ)句給出數(shù)據(jù)的取值范圍,數(shù)據(jù)在后續(xù)使用過(guò)程中不能超出此范圍?!皉ange”定義的范圍必須在-2147483647~2147483647范圍內(nèi)。

4)實(shí)型(REAL)

VHDL語(yǔ)言中,實(shí)型REAL也叫浮點(diǎn)型Floating,REAL數(shù)據(jù)是通常的數(shù)值運(yùn)算中浮點(diǎn)型的抽象,它的數(shù)值范圍為-1038~1038。在VHDL中沒有定義REAL數(shù)據(jù)的精度,但這個(gè)精度至少可以達(dá)到6個(gè)比特位。使用REAL類型數(shù)據(jù)時(shí)要注意,很多公司的綜合工具都不支持REAL類型的數(shù)據(jù)。在VHDL中,通常采用用戶自定義的方式來(lái)定義一個(gè)REAL類型的數(shù)據(jù),例如:

typeCAPACITYisrange-25.0to25.0;

signalSIG_1:CAPACITY:=3.0;

SIG_1<=5.6;

其中,CAPACITY是用戶自定義的一種REAL型的數(shù)據(jù)類型。

5)物理型

物理型數(shù)據(jù)用于表示一些物理量,如重量、長(zhǎng)度、時(shí)間或電壓值等等,用戶可以根據(jù)工程需要定義一些物理數(shù)據(jù)類型。完整的物理型數(shù)據(jù)包含數(shù)值和單位兩部分,在定義一個(gè)物理型數(shù)據(jù)類型時(shí),必須先給出一個(gè)基準(zhǔn)單位,其他的單位也必須是基準(zhǔn)單位的倍數(shù)。VHDL中只定義了一種物理類型TIME。TIME類型用于對(duì)延時(shí)等時(shí)間參數(shù)建模,VHDL中TIME類型的定義如下:

VHDL-93除了上述的字符外,還預(yù)定義了一些其他字符,共支持256個(gè)字符,這些字符中不能打印的字符用標(biāo)識(shí)符給出。

7)標(biāo)準(zhǔn)邏輯類型(STD_LOGIC)

在IEEE標(biāo)準(zhǔn)庫(kù)的STD_LOGIC_1164包集合中,定義了STD_LOGIC數(shù)據(jù)類型,與BIT類型相似,STD_LOGIC也是表示單個(gè)數(shù)字信號(hào)邏輯的。STD_LOGIC類型的定義如下:上述的定義中,首先定義了STD_ULOGIC類型,STD_LOGIC類型是經(jīng)過(guò)RESOLVED函數(shù)處理過(guò)的STD_ULOGIC類型,但STD_LOGIC和STD_ULOGIC可以取值的數(shù)值集合是相同的,這里我們不對(duì)這兩種類型做詳細(xì)介紹,可以簡(jiǎn)單地認(rèn)為兩種類型是一致的。

從類型的定義可以看出,STD_LOGIC表現(xiàn)的狀態(tài)就是實(shí)際的數(shù)字電路在輸入/輸出時(shí)所呈現(xiàn)的狀態(tài),它比BIT型所描述的邏輯狀態(tài)更完整。不過(guò),定義中的Don’tcare表示不重要的邏輯,是什么狀態(tài)都無(wú)所謂,這在真實(shí)邏輯中是不存在的。

8)枚舉類型(ENUMERATE)

在VHDL中,也支持類似于其他編程語(yǔ)言中常用的枚舉類型。使用枚舉類型可以使工程師在更高的抽象層次上進(jìn)行建模,也可以使程序代碼簡(jiǎn)便易懂,這一點(diǎn)在狀態(tài)機(jī)和復(fù)雜系統(tǒng)的描述中尤其有用。

枚舉類型的描述結(jié)構(gòu)為:

type類型名稱is(元素,元素,…);

事實(shí)上,在上述其他數(shù)據(jù)類型的介紹中已經(jīng)多次使用的枚舉類型,BIT型、BOOL型、CHARACTER型和STD_LOGIC型都是用這種結(jié)構(gòu)定義的。

9)錯(cuò)誤等級(jí)(SEVERITY_LEVEL)

錯(cuò)誤等級(jí)用于表征系統(tǒng)的運(yùn)行狀態(tài),有四種狀態(tài)可用:NOTE(注意)、WARNING(警告)、ERROR(錯(cuò)誤)和FAILURE(失敗)。

錯(cuò)誤等級(jí)的描述結(jié)構(gòu)為:

type

SEVERITY_LEVEL

is(NOTE,WARNING,ERROR,FAILURE);

錯(cuò)誤等級(jí)也是在標(biāo)準(zhǔn)庫(kù)中用枚舉類型的方式預(yù)定義的,在系統(tǒng)仿真過(guò)程中可以用這四種狀態(tài)來(lái)提示系統(tǒng)當(dāng)前的運(yùn)行狀態(tài)。

SEVERITY_LEVEL通常與ASSERT語(yǔ)句配合使用,讀者可以參照?qǐng)D3.33的實(shí)例了解SEVERITY_LEVEL類型數(shù)據(jù)的使用方法。

2.復(fù)合類型

復(fù)合型的數(shù)據(jù)是指由多個(gè)單值數(shù)據(jù)組合而成的數(shù)據(jù),復(fù)合型數(shù)據(jù)以向量、數(shù)組或記錄的形式存在。屬于復(fù)合類型的數(shù)據(jù)有以下幾種:

●位矢量型(BIT_VECTOR)

●標(biāo)準(zhǔn)邏輯矢量型(STG_LOGIC_VECTOR)

●字符串型(STRING)

●數(shù)組型(ARRAY)

●記錄型(RECORD)

1)位矢量型(BIT_VECTOR)

位矢量型是由多個(gè)位型數(shù)據(jù)組合起來(lái)的一組位數(shù)據(jù),在VHDL的標(biāo)準(zhǔn)STD包集合中,BIT_VECTOR的定義如下:

typeBIT_VECTORisARRAY(NATURALrange<>)ofBIT;

這里我們不需要關(guān)心NATURALrange<>的含義。

位矢量在定義和使用時(shí),用雙引號(hào)括起來(lái),例如:

signalA_WORD:bit_vector(7downto0):="01011100";

A_WORD<=X?"AC";其中,X"A"的前綴X表示后面的數(shù)是十六進(jìn)制數(shù),"A"表示十六進(jìn)制數(shù)的值。BIT_VECTOR可以用"_"符號(hào)來(lái)分隔數(shù)值位,例如上面例子中,A也可以這樣賦值:

A_WORD<="0101_1100";

這種賦值方法與上例中的賦值方法得到的效果是相同的。

2)標(biāo)準(zhǔn)邏輯矢量型(STD_LOGIC_VECTOR)

標(biāo)準(zhǔn)邏輯矢量型是由多個(gè)標(biāo)準(zhǔn)邏輯數(shù)據(jù)組合起來(lái)的,在STD_LOGIC_1164包集合中,STD_LOGIC_VECTOR的定義如下:

type

STD_LOGIC_VECTOR

is

ARRAY(NATURAL

range<>)of

STD_LOGIC;

STD_LOGIC_VECTOR的定義和使用方式與BIT_VECTOR的方式相同,也要用雙引號(hào)括起來(lái),例如:

signalB_DATA:STD_LOGIC_VECTOR(3downto0):="0011";

B_DATA<="1100";

3)字符串型(STRING)

字符串類型是由多個(gè)字符類型的數(shù)據(jù)組合起來(lái)的,在VHDL的標(biāo)準(zhǔn)STD包集合中,STRING的定義如下:

type

STRING

is

ARRAY?(POSITIVE

range<>)ofCHARACTER;

字符串型數(shù)據(jù)在定義和使用時(shí)也要用雙引號(hào)括起來(lái),例如:

variableMY_STRING:STRING?(1to11);

MY_STRING:="Test_string"

字符串類型常用于程序的提示或說(shuō)明,使用字符串時(shí)要注意,字符串類型的數(shù)據(jù)對(duì)大小寫是敏感的,“xxxx”和“XXXX”是不同的。

4)數(shù)組型(ARRAY)

數(shù)組型是由多個(gè)相同類型的數(shù)據(jù)組成的集合,組成集合的數(shù)據(jù)類型可以是任意的。VHDL支持多維數(shù)組,但有一些綜合器只支持一維數(shù)組。數(shù)組中的數(shù)據(jù)可以通過(guò)索引值獲取,索引值是INTEGER類型的,它的范圍取決于數(shù)組中元素的個(gè)數(shù)和順序。圖3.17數(shù)組賦值示意圖數(shù)組也可以采用一種便捷的方式進(jìn)行賦值,即聯(lián)合賦值。聯(lián)合賦值不僅在數(shù)組中可以使用,多個(gè)標(biāo)量對(duì)象在賦值時(shí)也可以采用這種方式。下面舉一個(gè)簡(jiǎn)單的例子說(shuō)明這種賦值方式:

signalH_BYTE,L_BYTE:STD_LOGIC_VECTOR(0to7);

signalQ_OUT:STD_LOGIC_VECTOR(31downto0);

signalA,B,C,D:STD_LOGIC;

signalWORD:STD_LOGIC_VECTOR(3downto0);

(A,B,C,D)<=WORD;

WORD<=(2=>'1',3=>D,others=>'0');

Q_OUT<=(others=>'0');

WORD<=(A,B,C,D);

H_BYTE<=(7|6|0|1=>'1',2to5=>'0');

使用聯(lián)合賦值時(shí),出現(xiàn)在賦值符號(hào)左側(cè)的聯(lián)合體只能由標(biāo)量類型組成,如上述例子中對(duì)A,B,C,D聯(lián)合賦值的情況,賦值符號(hào)兩側(cè)的元素個(gè)數(shù)必須相等,上例中“others”表示對(duì)所有未賦值的位賦予給定的默認(rèn)值。

在工程應(yīng)用中,大型的數(shù)組(即索引值范圍比較大的數(shù)組)一般用變量或常量定義,用信號(hào)定義時(shí),會(huì)影響仿真速度。圖3.18TX_PACKET的組成結(jié)構(gòu)

3.文件類型(File)

VHDL中的文件類型是由某種類型的數(shù)據(jù)組成的數(shù)據(jù)流,可以在仿真中讀入和寫出,類似于C語(yǔ)言中的文件類型。目前常用的文件類型只有TEXT類型,IEEE的TEXTIO包集合中包含了TEXT文件常用的一些讀寫函數(shù),方便設(shè)計(jì)者在開發(fā)時(shí)調(diào)用。

VHDL-87和VHDL-93中文件的描述結(jié)構(gòu)不同,例如:

4.用戶定義的子類型

除了上述VHDL中預(yù)定義的標(biāo)準(zhǔn)類型外,用戶可以根據(jù)工程設(shè)計(jì)的需要,修改已定義數(shù)據(jù)類型的范圍限定,形成新的數(shù)據(jù)類型,這種類型稱為子類型(subtype)。子類型的定義結(jié)構(gòu)如下:

subtype子類型名稱is已定義類型名稱;

例如:

subtypeMY_INTisintegerrange0to255;

subtypeSMALL_INTisMY_INTrange5to30;

再如:

typeMY_STATEis(

LOAD,JUMP,ADD,SUB,DIV,MULT,STORA,STORB);3.4.3不同數(shù)據(jù)類型之間的轉(zhuǎn)換

以上給出了多種VHDL中常用的數(shù)據(jù)類型,用這些數(shù)據(jù)類型定義的對(duì)象在賦值時(shí)都必須遵守?cái)?shù)據(jù)賦值的規(guī)范,不同類型之間的數(shù)據(jù)不能賦值,相同類型不同位長(zhǎng)的數(shù)據(jù)之間也不能相互賦值。但這樣會(huì)很不方便,因此IEEE的一些包集合中給出了一些數(shù)據(jù)類型之間的轉(zhuǎn)換函數(shù),不同類型之間的數(shù)據(jù)可以先經(jīng)過(guò)轉(zhuǎn)換函數(shù)轉(zhuǎn)換為相同類型,然后進(jìn)行賦值。

表3.2給出了一些常用的轉(zhuǎn)換函數(shù)名稱及其功能。表3.2VHDL中常用轉(zhuǎn)換函數(shù)下面舉幾個(gè)簡(jiǎn)單的例子:

signalA:STD_LOGIC_VECTOR(7downto0);

signalB:INTEGERrange0to200;

signalMY_ADDRESS:STD_LOGIC_VECTOR(31downto0);

A<=CONV_STD_LOGIC_VECTOR(B,8);

B<=CONV_INTEGER(A)

MY_ADDRESS<=CONV_STD_LOGIC_VECTOR(X"000027AC");

注意:在使用這些函數(shù)的時(shí)候,一定要在文件開始將IEEE庫(kù)和函數(shù)所在的包集合包含進(jìn)來(lái)。 3.5VHDL語(yǔ)言運(yùn)算操作符

VHDL中有5種運(yùn)算操作符,分別為邏輯運(yùn)算符(Logical)、關(guān)系運(yùn)算符(Relational)、算術(shù)運(yùn)算符(Arithmetic)、移位運(yùn)算符(Shift)和并置運(yùn)算符(Concatenation),其中移位運(yùn)算符是VHDL-93中新加的運(yùn)算符。在運(yùn)算過(guò)程中將操作符作用于操作數(shù),完成計(jì)算。操作符標(biāo)識(shí)需要進(jìn)行的計(jì)算,操作數(shù)標(biāo)識(shí)用于計(jì)算的數(shù)據(jù)。使用操作符的過(guò)程中要注意,所有的操作符都是對(duì)應(yīng)于確定的數(shù)據(jù)類型的,例如,VHDL內(nèi)嵌的算術(shù)操作符就不能對(duì)BIT_VECTOR和STD_LOGIC_VECTOR類型的數(shù)據(jù)進(jìn)行運(yùn)算。IEEE的STD_LOGIC_ARITH包集合對(duì)這類情況進(jìn)行了擴(kuò)展,加入了相應(yīng)的子程序,供設(shè)計(jì)者調(diào)用。因此,在程序中如果要對(duì)兩個(gè)BIT_VECTOR或STD_LOGIC_VECTOR的數(shù)據(jù)進(jìn)行算術(shù)運(yùn)算,就需要將STD_LOGIC_ARITH包集合包含進(jìn)來(lái)。

表3.3中列出了VHDL中支持的運(yùn)算操作符,與C語(yǔ)言類似,運(yùn)算操作符也有優(yōu)先級(jí)。表3.3操作符及優(yōu)先級(jí)

1.邏輯運(yùn)算符

VHDL中共有7種邏輯運(yùn)算符,其中xnor是在VHDL-93中新定義的,見表3.4。表3.4邏?輯?運(yùn)?算?符邏輯運(yùn)算符可對(duì)BOOLEAN、BIT、BIT_VECTOR、STD_LOGIC和STD_LOGIC_VECTOR的數(shù)據(jù)對(duì)象做運(yùn)算。其中,not是單目運(yùn)算符,其他為雙目運(yùn)算符。在計(jì)算時(shí),運(yùn)算符兩側(cè)的數(shù)據(jù)類型必須相同。

用邏輯運(yùn)算符運(yùn)算的實(shí)例如下:

signalA,B,C:BIT_VECTOR(3downto0);

signalD,E,F,G:STD_LOGIC_VECTOR(1downto0);

signalH,I,J,K:BIT;

signalL,M,N,O,P,Q:BOOLEAN;

A<=BandC;

D<=EorForG;

H<=(InandJ)nandK;

L<=(MxorN)and(OxorP);通常,在一個(gè)表達(dá)式中使用多個(gè)不同的操作符時(shí),要用括號(hào)標(biāo)明操作符的優(yōu)先級(jí)。而如果多個(gè)操作符相同,則可以不用括號(hào)標(biāo)明。上例中給出了對(duì)應(yīng)的實(shí)例。

2.關(guān)系運(yùn)算符

VHDL中有6種關(guān)系運(yùn)算符,所有的關(guān)系運(yùn)算符都返回BOOLEAN類型的結(jié)果,見表3.5。表3.5關(guān)?系?運(yùn)?算?符關(guān)系運(yùn)算符中,“=”和“/=”可以對(duì)所有類型的數(shù)據(jù)運(yùn)算,而其他的操作符只能對(duì)枚舉類型、整數(shù)類型、枚舉類型的一維數(shù)組或整數(shù)等類型的數(shù)據(jù)做運(yùn)算。在運(yùn)算時(shí),符號(hào)兩邊的數(shù)據(jù)類型必須相同,但數(shù)據(jù)的位數(shù)不一定相同。位數(shù)不同的兩個(gè)數(shù)據(jù)作比較時(shí)需要注意,VHDL中的數(shù)組類型(包括BIT_VECTOR和STD_LOGIC_VECTOR)的比較是按照類似于字母排序的方式進(jìn)行的,排序時(shí)從數(shù)組最左邊的元素開始對(duì)比,直至發(fā)現(xiàn)第一個(gè)不同的元素,排在前面的數(shù)小于排在后面的數(shù),舉一個(gè)簡(jiǎn)單的例子,如“101011”和“1011”的比較,兩個(gè)數(shù)的前3位都相同,因?yàn)椤?011”的第四位為“1”而“101011”的第四位為“0”,因此“1011”>“101011”成立,如圖3.19所示。圖3.19不同位長(zhǎng)數(shù)據(jù)的比較另外一種情況,如果短數(shù)組剛好是長(zhǎng)數(shù)組的前面一部分,那么短數(shù)組在排序時(shí)排在長(zhǎng)數(shù)組的前面,也就是短數(shù)組的值小于長(zhǎng)數(shù)組的值,例如“101”就小于“101000”。

3.移位運(yùn)算符

VHDL-93中新定義了6種移位運(yùn)算符,運(yùn)算符的含義及示意圖如表3.5所示。表3.5移?位?運(yùn)?算?符算術(shù)向左移位時(shí),填入的位值為最后一個(gè)位值;算術(shù)向右移位時(shí),填入的位值為第一個(gè)位值;邏輯向左和邏輯向右移位時(shí),默認(rèn)新填入的位值都為0;向左旋轉(zhuǎn)時(shí),填入的位值為第一個(gè)位值;向右旋轉(zhuǎn)時(shí),填入的位值為最后一個(gè)位值。

舉一個(gè)簡(jiǎn)單的例子,如果A?=?"10010101",則

Asll2

為 "01010100"

Asrl3

為 "00010010"

Asla3

為 "10101111"

Asra2為 "11100101"

Arol3

為 "10101100"

Aror5為 "10101100"移位運(yùn)算符在使用時(shí)要注意,雖然運(yùn)算符在VHDL-93中已經(jīng)定義,但在IEEE的包集合中,只定義了SIGNED和UNSIGNED類型的移位運(yùn)算操作符,對(duì)于其他數(shù)據(jù)類型,目前還沒有定義。如果在綜合器或仿真器中要對(duì)其他類型的數(shù)據(jù)使用移位操作符,可以嘗試換一種寫法描述移位,例如:

Asll2

描述為A<=A(5downto0)&"00";

Asrl3描述為A<=“000”&A(7downto3);

Asla3描述為A<=A(4downto0)&A(0)&A(0)A(0);

Asra2描述為A<=A(7)&A(7)&A(7downto2);

Arol3描述為A<=A(4downto0)&A(7downto5);

Aror5描述為A<=A(4downto0)&A(7downto5);

4.算術(shù)運(yùn)算符

VHDL中有10種算術(shù)運(yùn)算符,如表3.6。表3.6算?術(shù)?運(yùn)?算?符算術(shù)運(yùn)算符中正“+”和負(fù)“-”是單目運(yùn)算符,操作數(shù)可以為整數(shù)、實(shí)數(shù)和物理量等類型。

加法和減法操作符兩邊必須是相同類型的數(shù)據(jù),操作數(shù)也可以為整數(shù)、實(shí)數(shù)和物理量。乘除法的操作數(shù)可以同為整數(shù)或?qū)崝?shù),物理量可以被整數(shù)或?qū)崝?shù)相乘或相除,結(jié)果仍為一個(gè)物理量。物理量除以同一類型的物理量結(jié)果為一個(gè)整數(shù)量。求模和取余的操作數(shù)必須都為整數(shù)類型。指數(shù)運(yùn)算符的左側(cè)操作數(shù)可以是任意整數(shù)或?qū)崝?shù),右側(cè)操作數(shù)應(yīng)為整數(shù)。我們之前提到過(guò),VHDL并沒有預(yù)定義STD_LOGIC_VECTOR和BIT_VECTOR類型的加減法運(yùn)算操作符,而IEEE在STD_LOGIC_ARITH包集合中對(duì)數(shù)組的加減法運(yùn)算等操作符做了重載。因此,要在代碼中對(duì)這些數(shù)組類型的數(shù)據(jù)做加減運(yùn)算,必須聲明使用STD_LOGIC_ARITH包集合。而且在使用時(shí),運(yùn)算符兩端的數(shù)組位長(zhǎng)必須相等。

算術(shù)運(yùn)算符中真正能夠綜合的運(yùn)算符只有“+”、“-”和“*”,對(duì)于“/”、“mod”、“rem”,在分母為2的乘方次常數(shù)時(shí),可以將這些操作用位運(yùn)算實(shí)現(xiàn),因此是可以綜合的。

5.并置運(yùn)算符

并置運(yùn)算符“&”用于標(biāo)量和復(fù)合類型數(shù)據(jù)的并置連接,使用并置運(yùn)算符可以很靈活地將標(biāo)量或數(shù)組組織在一起,形成更大的數(shù)組。例如:

signalA_VEC,B_VEC:STD_LOGIC_VECTOR(7downto0);

signalZ_VEC:STD_LOGIC_VECTOR(15downto0);

signalA_BIT,B_BIT,C_BIT,D_BIT:STD_LOGIC;

signalX_VEC:STD_LOGIC_VECTOR(2downto0);

signalY_VEC:STD_LOGIC_VECTOR(8downto0);

Z_VEC<=A_VEC&B_VEC;

--A_VEC作為Z_VEC的高8位,B_VEC作為Z_VEC的低8位

X_VEC<=A_BIT&B_BIT&C_BIT;

--X_VEC從高到低的3個(gè)位的值分別用A_BIT、B_BIT和C_BIT賦值

Y_VEC<=B_VEC&D_BIT;

--B_VEC作為Y_VEC的高8位,D_BIT作為Y_VEC的最低位

在前面數(shù)組類型的介紹中曾提及,數(shù)組的賦值可以采用聯(lián)合賦值的方式,這種方式其實(shí)也可以認(rèn)為是并置運(yùn)算的另一種形式。 3.6VHDL語(yǔ)言的描述語(yǔ)句

為了能夠?qū)τ布男袨樽龈咝У亟#琕HDL采用兩類描述語(yǔ)句,一類稱為并發(fā)描述語(yǔ)句(Concurrent),另一類稱為順序描述語(yǔ)句(Sequential)。

并發(fā)描述語(yǔ)句具有共時(shí)性,一個(gè)模塊的結(jié)構(gòu)體描述中,所有的并發(fā)語(yǔ)句都是同時(shí)進(jìn)行的,與語(yǔ)句在程序中的位置無(wú)關(guān)。而順序語(yǔ)句具有順序性,它是按照語(yǔ)句在程序中的前后位置順序執(zhí)行的。下面舉一個(gè)簡(jiǎn)單的例子說(shuō)明結(jié)構(gòu)體描述中的并發(fā)描述語(yǔ)句與順序描述語(yǔ)句,如圖3.20所示。圖3.20并發(fā)語(yǔ)句與順序語(yǔ)句3.6.1有關(guān)規(guī)則和基本語(yǔ)句

1.VHDL命名規(guī)則

VHDL中使用的名稱,在命名時(shí)都需要符合VHDL的標(biāo)識(shí)符命名規(guī)范,如實(shí)體名稱、端口名稱、結(jié)構(gòu)體名稱、變量名稱和信號(hào)名稱。

VHDL-87的短標(biāo)識(shí)符命名規(guī)范為:

●標(biāo)識(shí)符可以由英文字母、數(shù)字及下劃線組成;

●標(biāo)識(shí)符必須以英文字母開頭;

●標(biāo)識(shí)符不允許連續(xù)出現(xiàn)兩個(gè)下劃線;

●標(biāo)識(shí)符最后一個(gè)字符不能是下劃線;

●標(biāo)識(shí)符中英文字母不區(qū)分大小寫;

●?VHDL中的保留關(guān)鍵字不能作為標(biāo)識(shí)符來(lái)使用。

VHDL的標(biāo)識(shí)符中,英文字母不區(qū)分大小寫,例如CURRENT_STATE、current_state和CURRENT_state等是相同的,表示同一個(gè)對(duì)象。但VHDL中的常量字符不屬于標(biāo)識(shí)符,因此大小寫是不同的。例如對(duì)STD_LOGIC類型或STD_LOGIC_VECTOR類型的信號(hào)代入高阻值“Z”時(shí)需要注意:

signalSIG_A:STD_LOGIC;

signalSIG_B:STD_LOGIC_VECTOR(2downto0);

SIG_A<='Z'; --正確

SIG_A<='z'; --錯(cuò)誤,小寫z沒有定義;

SIG_B<="ZZZ"; --正確

SIG_B<="zzz"; --錯(cuò)誤,小寫z沒有定義;

2.注釋標(biāo)記方法

VHDL的注釋標(biāo)記符為“--”,注釋的內(nèi)容為從“--”符號(hào)開始,一直到當(dāng)前行的結(jié)束。在之前的示例代碼中,我們已經(jīng)多次使用這一符號(hào)進(jìn)行注釋,這里不再舉例說(shuō)明。

需要注意,“--”對(duì)于VHDL程序是注釋符號(hào),但一些其他工具經(jīng)常使用這個(gè)符號(hào)作為參數(shù)傳遞的接口。如我們經(jīng)??吹降摹?-synopsystranslate_on”和“--synopsystranslate_off”等。

3.信號(hào)代入語(yǔ)句

信號(hào)代入的語(yǔ)法結(jié)構(gòu)為:

目標(biāo)信號(hào)名稱<=信號(hào)量表達(dá)式;信號(hào)的代入不是即時(shí)的。也就是說(shuō),即使信號(hào)量表達(dá)式發(fā)生了變化,最終賦予目標(biāo)信號(hào)的值也不一定就是信號(hào)量的值。分為三種情況:

(1)如果信號(hào)只在一個(gè)進(jìn)程中被賦值,而且在順序執(zhí)行一次Process中的語(yǔ)句時(shí),只被賦值一次,那么信號(hào)的值就是被執(zhí)行語(yǔ)句中信號(hào)量表達(dá)式計(jì)算的結(jié)果值。

(2)如果信號(hào)只在一個(gè)進(jìn)程中被賦值,但在進(jìn)程內(nèi)部被多次賦值,那么只有最后一條賦值語(yǔ)句是起作用的。即使這個(gè)信號(hào)在進(jìn)程中先被賦值,又被讀出,然后又被賦值,那么被讀出的信號(hào)的值仍是最后一次的賦值結(jié)果。

(3)如果信號(hào)在多個(gè)進(jìn)程中被賦值,這些驅(qū)動(dòng)器的結(jié)果將會(huì)被連接在一起,而形成多驅(qū)動(dòng)的情況。有一些綜合器在遇到這種情況時(shí)將會(huì)報(bào)錯(cuò)。信號(hào)在這種情況下的賦值情況與底層電路的實(shí)現(xiàn)方法有關(guān)。VHDL中給出了一種判決函數(shù),用于解決這種問題。我們將在并發(fā)描述語(yǔ)句的內(nèi)容中介紹這種判決函數(shù)。

所有在“ifCLK'eventandCLK='1'then…”或“ifrising_edge(CLK)then…”后描述的信號(hào)代入語(yǔ)句,在綜合后都會(huì)生成一個(gè)寄存器。上面例子綜合后的結(jié)果如圖3.21所示。圖3.21時(shí)序電路中信號(hào)代入的綜合結(jié)果前面講過(guò),實(shí)體的端口在結(jié)構(gòu)體描述時(shí)被默認(rèn)為信號(hào),只是對(duì)信號(hào)的輸入/輸出屬性做了限定。這里舉一個(gè)例子,說(shuō)明信號(hào)的賦值方法與最終綜合的電路之間的關(guān)系。

假設(shè)要實(shí)現(xiàn)的電路圖如圖3.22所示。圖3.22綜合后的目標(biāo)電路通過(guò)分析可以得知,方法B的代碼與圖3.22中的電路是對(duì)應(yīng)的,方法A的實(shí)現(xiàn)明顯是錯(cuò)誤的,Q為輸出端口,不能用“Q<=Q+1”對(duì)Q進(jìn)行賦值。

那么方法C和方法D得到的綜合電路應(yīng)該是什么樣的?讀者可以對(duì)照?qǐng)D3.23所示的電路圖對(duì)代碼進(jìn)行分析。圖3.23綜合電路(a)方法C;(b)方法D

4.wait語(yǔ)句

wait語(yǔ)句是等待語(yǔ)句,?在進(jìn)程(Process)的順序描述語(yǔ)句中用于控制進(jìn)程狀態(tài)的變化。wait語(yǔ)句設(shè)定一定的條件,當(dāng)進(jìn)程執(zhí)行到wait語(yǔ)句時(shí),進(jìn)程就掛起,直到設(shè)定的條件滿足時(shí)再繼續(xù)執(zhí)行。

wait語(yǔ)句可以設(shè)定4種不同的條件,分別為:

●?waiton:等待敏感信號(hào)變化;

●?waituntil:等待條件滿足;

●?waitfor:等待限定的時(shí)間;

●?wait:無(wú)限等待。

1)?waiton

waiton語(yǔ)句的語(yǔ)法結(jié)構(gòu)為:

waiton敏感信號(hào)[,敏感信號(hào)];

當(dāng)進(jìn)程(Process)中的順序描述語(yǔ)句執(zhí)行到waiton語(yǔ)句時(shí)將會(huì)掛起,直到敏感信號(hào)中的任一信號(hào)發(fā)生變化,進(jìn)程將結(jié)束掛起,繼續(xù)執(zhí)行waiton后的語(yǔ)句。

2)?waituntil

waituntil語(yǔ)句的語(yǔ)法結(jié)構(gòu)為:

waituntil條件表達(dá)式;

語(yǔ)法結(jié)構(gòu)中,條件表達(dá)式的結(jié)果為布爾量,表達(dá)式滿足條件時(shí),返回“true”;不滿足時(shí),返回“false”。進(jìn)程在運(yùn)行到waituntil語(yǔ)句時(shí)將會(huì)掛起,當(dāng)表達(dá)式中任何一個(gè)信號(hào)發(fā)生變化時(shí),表達(dá)式的結(jié)果會(huì)被重新計(jì)算。如果計(jì)算結(jié)果為“true”,則繼續(xù)執(zhí)行后續(xù)語(yǔ)句;如果計(jì)算結(jié)果為“false”,則保持掛起狀態(tài)。

3)?waitfor

waitfor語(yǔ)句表示等待固定的時(shí)間,它的語(yǔ)法結(jié)構(gòu)為:

waitfor時(shí)間表達(dá)式;

時(shí)間表達(dá)式的含義是,表達(dá)式的運(yùn)算結(jié)果為一個(gè)時(shí)間值。如果時(shí)間表達(dá)式是一個(gè)常量,則waitfor語(yǔ)句將等待固定的時(shí)間;如果時(shí)間表達(dá)式是一個(gè)計(jì)算式,那么計(jì)算的結(jié)果應(yīng)該是一個(gè)時(shí)間值。進(jìn)程執(zhí)行到wait?for語(yǔ)句時(shí)將掛起,等待時(shí)間表達(dá)式所指示的時(shí)間長(zhǎng)度,然后繼續(xù)執(zhí)行后續(xù)語(yǔ)句。

4)?wait

單獨(dú)地使用wait語(yǔ)句表示無(wú)限等待。最后依據(jù)wait表示進(jìn)程將一直等待下去。

實(shí)際使用wait語(yǔ)句時(shí),可以將上述的wait語(yǔ)句混合使用,混合使用的語(yǔ)法結(jié)構(gòu)為:

wait[on敏感信號(hào)列表][until條件表達(dá)式][for時(shí)間表達(dá)式];

當(dāng)on語(yǔ)句的敏感信號(hào)列表中的任一信號(hào)發(fā)生變化時(shí),until語(yǔ)句的條件表達(dá)式將被重新計(jì)算。如果結(jié)果為“true”,則進(jìn)程繼續(xù)執(zhí)行wait后的語(yǔ)句;如果結(jié)果為“false”,則進(jìn)程保持掛起。

for語(yǔ)句相對(duì)比較獨(dú)立,只要wait語(yǔ)句已經(jīng)等待了時(shí)間表達(dá)式所指示的時(shí)間,則進(jìn)程結(jié)束掛起,繼續(xù)執(zhí)行wait后的語(yǔ)句。在使用wait語(yǔ)句進(jìn)行建模時(shí)需要注意,waiton、waitfor和wait語(yǔ)句是不可綜合的。waituntil語(yǔ)句只有在條件表達(dá)式為時(shí)鐘的邊緣時(shí),如waituntilCLOCK='1'時(shí),是可綜合的,否則也是不可綜合的??删C合的語(yǔ)句在行為層次建模和RTL建模時(shí)都可以使用,不可綜合的語(yǔ)句只有在行為層次建模時(shí)可以使用。但是有一些綜合器,例如ISE中的XST,不支持對(duì)所有wait語(yǔ)句的綜合。

5.變量賦值語(yǔ)句

變量賦值語(yǔ)句用于改變一個(gè)變量的值,其語(yǔ)法結(jié)構(gòu)為:

變量名稱:=表達(dá)式;

變量賦值符號(hào)兩側(cè)的數(shù)據(jù)類型必須相同,賦值符號(hào)右側(cè)的表達(dá)式可以是常量、變量或信號(hào)。例如:根據(jù)變量在程序中使用情況的不同,變量綜合后的結(jié)果可能是連線(Wire)、鎖存器(Latch)或寄存器(Register)。在時(shí)序電路的順序描述語(yǔ)句中,如果變量在被賦值之前被讀取,那么綜合后將會(huì)產(chǎn)生一個(gè)寄存器;如果這種情況發(fā)生在組合邏輯電路中,那么綜合后將會(huì)產(chǎn)生一個(gè)鎖存器。

例如,下面的代碼:圖3.24變量綜合后的電路圖圖3.25另一種變量綜合后的電路圖3.6.2并發(fā)描述語(yǔ)句

1.進(jìn)程語(yǔ)句(Process)

進(jìn)程表示一個(gè)處理過(guò)程,在一個(gè)結(jié)構(gòu)體中可以包含多個(gè)進(jìn)程。進(jìn)程與進(jìn)程之間是并行的,進(jìn)程內(nèi)部包含一組順序描述語(yǔ)句,進(jìn)程內(nèi)部的語(yǔ)句是按先后次序順序執(zhí)行的。

我們?cè)谥暗睦讨性啻斡玫竭M(jìn)程語(yǔ)句,它的語(yǔ)法結(jié)構(gòu)如下:敏感變量列表中列出將會(huì)觸發(fā)進(jìn)程執(zhí)行的所有信號(hào),這些信號(hào)可以包含實(shí)體的接口信號(hào),進(jìn)程的敏感變量列表用括號(hào)括起來(lái),如果進(jìn)程有多個(gè)敏感信號(hào);則信號(hào)之間用逗號(hào)隔開。如果process描述的是時(shí)序電路,則敏感列表中必須包含時(shí)鐘信號(hào),而如果process描述的是組合邏輯,則敏感變量列表中應(yīng)包含全部的敏感信號(hào),否則會(huì)引起行為仿真結(jié)果和綜合后結(jié)果不同的現(xiàn)象。

process的敏感信號(hào)列表與wait語(yǔ)句中的敏感信號(hào)是等價(jià)的,?process在執(zhí)行之前也要等待敏感信號(hào)的變化,因此process中對(duì)敏感信號(hào)的等待成為隱式等待,而wait語(yǔ)句的等待稱為顯式等待。VHDL中規(guī)定,如果進(jìn)程中使用了wait語(yǔ)句,則process后不允許使用敏感變量列表。進(jìn)程的聲明語(yǔ)句用于聲明在process內(nèi)部使用的函數(shù)、過(guò)程、類型定義、常量和變量。

順序描述語(yǔ)句是對(duì)進(jìn)程行為功能的描述,進(jìn)程每被觸發(fā)一次,進(jìn)程內(nèi)的順序描述語(yǔ)句順序執(zhí)行一次。

這里再舉一個(gè)簡(jiǎn)單的例子說(shuō)明進(jìn)程的用法:一個(gè)結(jié)構(gòu)體的多個(gè)進(jìn)程之間是通過(guò)信號(hào)來(lái)傳遞信息的,而且進(jìn)程之間只能用信號(hào)傳遞信息,因此通過(guò)信號(hào)連接的多個(gè)進(jìn)程通常也被稱為VHDL的連接模型。

進(jìn)程語(yǔ)句是可綜合VHDL語(yǔ)句中最有用的一條,但是并不是每個(gè)進(jìn)程語(yǔ)句都是可以綜合的,為了使代碼有較高的性能,通常process語(yǔ)句用以下限定的模板進(jìn)行編寫,設(shè)計(jì)者在工程設(shè)計(jì)中可以參考:

2.直接信號(hào)代入語(yǔ)句

直接信號(hào)代入語(yǔ)句即指信號(hào)代入語(yǔ)句。信號(hào)代入語(yǔ)句既可以在process語(yǔ)句中使用,作為順序描述語(yǔ)句的構(gòu)成部分,也可以在process外部使用,作為并發(fā)語(yǔ)句。例如:

3.條件式信號(hào)代入語(yǔ)句

條件式信號(hào)代入語(yǔ)句是if/else順序描述語(yǔ)句的并發(fā)表示形式。條件式信號(hào)代入語(yǔ)句的語(yǔ)法結(jié)構(gòu)為:●如果條件1滿足,則給目標(biāo)信號(hào)賦值為表達(dá)式1;

●如果條件1不滿足,而條件2滿足,則給目標(biāo)信號(hào)賦值為表達(dá)式2;

●如果條件1、2都不滿足,而條件3滿足,則給目標(biāo)信號(hào)賦值為表達(dá)式3;

●如果條件1、2、…、n都不滿足,則給目標(biāo)信號(hào)賦值

溫馨提示

  • 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論