《EDA技術(shù)與應(yīng)用》課件第5章VHDL硬件描述語(yǔ)言_第1頁(yè)
《EDA技術(shù)與應(yīng)用》課件第5章VHDL硬件描述語(yǔ)言_第2頁(yè)
《EDA技術(shù)與應(yīng)用》課件第5章VHDL硬件描述語(yǔ)言_第3頁(yè)
《EDA技術(shù)與應(yīng)用》課件第5章VHDL硬件描述語(yǔ)言_第4頁(yè)
《EDA技術(shù)與應(yīng)用》課件第5章VHDL硬件描述語(yǔ)言_第5頁(yè)
已閱讀5頁(yè),還剩177頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第5章VHDL硬件描述語(yǔ)言第5章VHDL硬件描述語(yǔ)言5.1

VHDL程序結(jié)構(gòu)一個(gè)完整的VHDL程序基本結(jié)構(gòu)通常應(yīng)包含:庫(kù)(LIBRARY)、程序包(PACKAGE)、實(shí)體(ENTITY)、結(jié)構(gòu)體(ARCHITECTURE)、進(jìn)程或其他并行結(jié)構(gòu)、配置(CONFIGURATION)等。在VHDL程序中,實(shí)體(ENTITY)和結(jié)構(gòu)體(ARCHITECTURE)這兩個(gè)基本結(jié)構(gòu)是必需的,它們可以構(gòu)成最簡(jiǎn)單的VHDL程序。實(shí)體是設(shè)計(jì)實(shí)體的組成部分,它包含了對(duì)設(shè)計(jì)實(shí)體輸入和輸出的定義與說(shuō)明,而設(shè)計(jì)實(shí)體則包含了實(shí)體和結(jié)構(gòu)體這兩個(gè)在VHDL程序中的最基本的部分。VHDL程序結(jié)構(gòu)的一個(gè)顯著特點(diǎn)就是,任何一個(gè)完整的設(shè)計(jì)實(shí)體都可以分成內(nèi)外兩個(gè)部分,外面的部分稱(chēng)為可視部分,它由實(shí)體名和端口組成;里面的部分稱(chēng)為不可視部分,由實(shí)際的功能描述組成。一旦對(duì)已完成的設(shè)計(jì)實(shí)體定義了可視界面后,其他的設(shè)計(jì)實(shí)體就可以將其作為已開(kāi)發(fā)好的成果直接調(diào)用,這正是一種基于自頂向下的多層次的系統(tǒng)設(shè)計(jì)概念的實(shí)現(xiàn)途徑。5.1.1庫(kù)(LIBRARY)

為了提高設(shè)計(jì)效率以及使設(shè)計(jì)遵循統(tǒng)一的語(yǔ)言標(biāo)準(zhǔn)或數(shù)據(jù)格式,有必要將一些有用的信息匯集在一個(gè)或幾個(gè)庫(kù)中以供調(diào)用。這些信息可以是預(yù)先定義好的數(shù)據(jù)類(lèi)型、子程序等設(shè)計(jì)單元的集合體(程序包),也可以是預(yù)先設(shè)計(jì)好的各種設(shè)計(jì)實(shí)體(元件庫(kù)程序包)。如果要在一項(xiàng)VHDL設(shè)計(jì)中用到某一程序包,就必須在這項(xiàng)設(shè)計(jì)中預(yù)先打開(kāi)這個(gè)程序包,使此設(shè)計(jì)能隨時(shí)使用這一程序包中的內(nèi)容。為此,必須在這一設(shè)計(jì)實(shí)體前使用庫(kù)語(yǔ)句和USE語(yǔ)句。一般地,在VHDL程序中被聲明打開(kāi)的庫(kù)和程序包,對(duì)于本項(xiàng)設(shè)計(jì)是可視的,這些庫(kù)中的內(nèi)容可以在設(shè)計(jì)中調(diào)用。通常,庫(kù)中放置不同數(shù)量的程序包,而程序包中又可放置不同數(shù)量的子程序,子程序中又含有函數(shù)、過(guò)程、設(shè)計(jì)實(shí)體(元件)等基礎(chǔ)設(shè)計(jì)單元。VHDL庫(kù)分為兩類(lèi):一類(lèi)是設(shè)計(jì)庫(kù),如在具體設(shè)計(jì)項(xiàng)目中設(shè)定的目錄所對(duì)應(yīng)的WORK庫(kù);另一類(lèi)是資源庫(kù),資源庫(kù)是常規(guī)元件和標(biāo)準(zhǔn)模塊存放的庫(kù),如IEEE庫(kù)。設(shè)計(jì)庫(kù)對(duì)當(dāng)前項(xiàng)目是默認(rèn)可視的,無(wú)需用LIBRARY和USE等語(yǔ)句以顯式聲明。聲明庫(kù)(LIBRARY)的語(yǔ)句格式如下:

LIBRARY庫(kù)名;

這一語(yǔ)句即相當(dāng)于為其后的設(shè)計(jì)實(shí)體打開(kāi)指定的庫(kù),以便設(shè)計(jì)實(shí)體可以利用其中的程序包。如語(yǔ)句“LIBRARYIEEE;”表示打開(kāi)IEEE庫(kù)。1.庫(kù)的種類(lèi)VHDL程序設(shè)計(jì)中常用的庫(kù)有以下幾種:

1)?IEEE庫(kù)

IEEE庫(kù)是VHDL設(shè)計(jì)中最為常見(jiàn)的庫(kù)。IEEE庫(kù)中的標(biāo)準(zhǔn)程序包主要包括:STD_LOGIC_1164、NUMERIC_BIT、NUMERIC_STD等。其中的STD_LOGIC_1164是最重要和最常用的程序包。此外,還有一些程序包雖非IEEE標(biāo)準(zhǔn),但由于其已成事實(shí)上的工業(yè)標(biāo)準(zhǔn),也都并入了IEEE庫(kù)。最常用的是Synopsy公司的STD_LOGIC_ARITH、STD_LOGIC_SIGNED和STD_LOGIC_UNSIGNED程序包。2)?STD庫(kù)VHDL語(yǔ)言標(biāo)準(zhǔn)定義了兩個(gè)標(biāo)準(zhǔn)程序包,即STANDARD和TEXTIO程序包(文件輸入/輸出程序包),它們都被收入在STD庫(kù)中,只要在VHDL應(yīng)用環(huán)境中,即可隨時(shí)調(diào)用這兩個(gè)程序包中的所有內(nèi)容,即在編譯和綜合過(guò)程中VHDL的每一項(xiàng)設(shè)計(jì)都自動(dòng)地將其包含進(jìn)去了。由于STD庫(kù)符合VHDL語(yǔ)言標(biāo)準(zhǔn),在應(yīng)用中不必如IEEE庫(kù)那樣一定要顯式聲明之,如在程序中,以下的庫(kù)語(yǔ)句是不必要的:

LIBRARYSTD;

USESTD.STANDARD.ALL;3)?WORK庫(kù)WORK庫(kù)是用戶(hù)的VHDL設(shè)計(jì)的現(xiàn)行工作庫(kù),用于存放用戶(hù)設(shè)計(jì)和定義的一些設(shè)計(jì)單元和程序包,用戶(hù)設(shè)計(jì)項(xiàng)目的成品、半成品模塊以及先期已設(shè)計(jì)好的元件都放在其中。WORK庫(kù)自動(dòng)滿(mǎn)足VHDL語(yǔ)言標(biāo)準(zhǔn),在實(shí)際調(diào)用中,也不以顯式方式預(yù)先說(shuō)明?;赩HDL所要求的WORK庫(kù)的基本概念,在PC或工作站上利用VHDL進(jìn)行項(xiàng)目設(shè)計(jì),不允許在根目錄下進(jìn)行,必須設(shè)定一個(gè)專(zhuān)門(mén)的目錄,用于保存項(xiàng)目的所有設(shè)計(jì)文件,VHDL綜合器將此目錄默認(rèn)為WORK庫(kù)。但必須注意,工作庫(kù)并不是這個(gè)目錄的目錄名,而是一個(gè)邏輯名。綜合器將指示器指向該目錄的路徑。VHDL標(biāo)準(zhǔn)規(guī)定工作庫(kù)總是可見(jiàn)的,因此,不必在VHDL程序中明確指定。4)?VITAL庫(kù)VITAL庫(kù)因而只在VHDL仿真器中使用,可以用于提高VHDL門(mén)級(jí)時(shí)序模擬的精度。庫(kù)中包含時(shí)序程序包VITAL_TIMING和VITAL_PRIMITIVES。VITAL庫(kù)已經(jīng)成為IEEE標(biāo)準(zhǔn),在當(dāng)前的VHDL仿真器的庫(kù)中,VITAL庫(kù)中的程序包都已經(jīng)并到了IEEE庫(kù)中。在VHDL設(shè)計(jì)中,有的EDA工具將一些程序包和設(shè)計(jì)單元放在一個(gè)目錄下,而將此目錄名(如“WORK”)作為庫(kù)名,如Synplicity公司的Synplify。有的EDA工具是通過(guò)配置語(yǔ)句結(jié)構(gòu)來(lái)指定庫(kù)和庫(kù)中的程序包,這時(shí)的配置即成為一個(gè)設(shè)計(jì)實(shí)體中最頂層的設(shè)計(jì)單元。此外,用戶(hù)還可以自己定義一些庫(kù),將自己的設(shè)計(jì)內(nèi)容或通過(guò)交流獲得的程序包設(shè)計(jì)實(shí)體并入這些庫(kù)中。2.庫(kù)的用法

在VHDL語(yǔ)言中,庫(kù)的說(shuō)明語(yǔ)句總是放在實(shí)體單元前面。這樣,在設(shè)計(jì)實(shí)體內(nèi)的語(yǔ)句時(shí)就可以使用庫(kù)中的數(shù)據(jù)和文件。由此可見(jiàn),庫(kù)的用處在于使設(shè)計(jì)者可以共享已經(jīng)編譯過(guò)的設(shè)計(jì)成果。VHDL允許在一個(gè)設(shè)計(jì)實(shí)體中同時(shí)打開(kāi)多個(gè)不同的庫(kù),但庫(kù)之間必須是相互獨(dú)立的。例如:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;表示打開(kāi)IEEE庫(kù),再打開(kāi)此庫(kù)中的STD_LOGIC_1164和STD_LOGIC_UNSIGNED程序包的所有內(nèi)容。由此可見(jiàn),在實(shí)際使用中,庫(kù)是以程序包集合的方式存在的,具體調(diào)用的是程序包中的內(nèi)容。因此對(duì)于任一VHDL設(shè)計(jì),所需從庫(kù)中調(diào)用的程序包在設(shè)計(jì)中應(yīng)是可見(jiàn)的,可調(diào)出的,即以明確的語(yǔ)句表達(dá)方式加以定義,庫(kù)語(yǔ)句指明庫(kù)中的程序包以及包中的待調(diào)用文件。對(duì)于必須以顯式表達(dá)的庫(kù)及其程序包的語(yǔ)言表達(dá)式,應(yīng)放在每一項(xiàng)設(shè)計(jì)實(shí)體最前面,成為這項(xiàng)設(shè)計(jì)的最高層次的設(shè)計(jì)單元。庫(kù)語(yǔ)句一般必須與USE語(yǔ)句同時(shí)使用。庫(kù)語(yǔ)句關(guān)鍵詞LIBRARY指明所使用的庫(kù)名,USE語(yǔ)句指明庫(kù)中的程序包。一旦說(shuō)明了庫(kù)和程序包,整個(gè)設(shè)計(jì)實(shí)體都可進(jìn)入訪(fǎng)問(wèn)或調(diào)用,但其作用范圍僅限于所說(shuō)明的設(shè)計(jì)實(shí)體。VHDL要求一項(xiàng)含有多個(gè)設(shè)計(jì)實(shí)體的更大的系統(tǒng)中,每一個(gè)設(shè)計(jì)實(shí)體都必須有自己完整的庫(kù)說(shuō)明語(yǔ)句和USE語(yǔ)句。USE語(yǔ)句的使用將使所說(shuō)明的程序包對(duì)本設(shè)計(jì)實(shí)體部分或全部開(kāi)放??梢暤腢SE語(yǔ)句的使用有兩種常用格式:

USE庫(kù)名.程序包名.項(xiàng)目名;

USE庫(kù)名.程序包名.ALL;第一語(yǔ)句格式的作用是向本設(shè)計(jì)實(shí)體開(kāi)放指定庫(kù)中的特定程序包內(nèi)所選定的項(xiàng)目。第二語(yǔ)句格式的作用是向本設(shè)計(jì)實(shí)體開(kāi)放指定庫(kù)中的特定程序包內(nèi)所有的內(nèi)容。合法的USE語(yǔ)句的使用方法是,將USE語(yǔ)句說(shuō)明中所要開(kāi)放的設(shè)計(jì)實(shí)體對(duì)象緊跟在USE語(yǔ)句之后。例如,語(yǔ)句

USEIEEE.STD_LOGIC_1164.ALL;

表明打開(kāi)IEEE庫(kù)中的STD_LOGIC_1164程序包,并使程序包中所有的公共資源對(duì)于本語(yǔ)句后面的VHDL設(shè)計(jì)實(shí)體程序全部開(kāi)放,即該語(yǔ)句后的程序可任意使用程序包中的公共資源,這里用到了關(guān)鍵詞“ALL”,代表程序包中所有的資源。5.1.2程序包(PACKAGE)已在設(shè)計(jì)實(shí)體中定義的數(shù)據(jù)類(lèi)型、子程序或數(shù)據(jù)對(duì)象對(duì)于其他設(shè)計(jì)實(shí)體是不可用的,或者說(shuō)是不可見(jiàn)的,為了使已定義的常數(shù)、數(shù)據(jù)類(lèi)型、元件調(diào)用說(shuō)明以及子程序能被更多的VHDL設(shè)計(jì)實(shí)體方便地訪(fǎng)問(wèn)和共享,可以將它們收集在一個(gè)VHDL程序包中。多個(gè)程序包可以并入一個(gè)VHDL庫(kù)中,使之適用于更一般的訪(fǎng)問(wèn)和調(diào)用范圍。這一點(diǎn)對(duì)于大系統(tǒng)開(kāi)發(fā),多個(gè)或多組開(kāi)發(fā)人員同步并行工作顯得尤為重要。程序包的內(nèi)容主要由如下四種基本結(jié)構(gòu)組成,因此一個(gè)程序包至少應(yīng)包含以下結(jié)構(gòu)中的一種。(1)常數(shù)說(shuō)明:在程序包中的常數(shù)說(shuō)明結(jié)構(gòu)用于預(yù)定義系統(tǒng)的寬度,如數(shù)據(jù)總線(xiàn)通道的寬度。(2)VHDL數(shù)據(jù)類(lèi)型說(shuō)明:這是在整個(gè)設(shè)計(jì)中通用的數(shù)據(jù)類(lèi)型,例如通用的地址總線(xiàn)數(shù)據(jù)類(lèi)型定義等。(3)元件定義:規(guī)定在VHDL設(shè)計(jì)中參與文件例化的文件對(duì)外的接口界面。(4)子程序:并入程序包的子程序有利于在設(shè)計(jì)中任一處被方便地調(diào)用。通常程序包中的內(nèi)容應(yīng)具有更大的適用面和良好的獨(dú)立性,以供各種不同設(shè)計(jì)需求的調(diào)用,一旦定義了一個(gè)程序包,各種獨(dú)立的設(shè)計(jì)就能方便地調(diào)用。定義程序包的一般語(yǔ)句結(jié)構(gòu)如下:

PACKAGE程序包名IS--程序包首

程序包首說(shuō)明部分

END程序包名;

PACKAGEBODY程序包名IS--程序包體

程序包體說(shuō)明部分以及包體內(nèi)容

END程序包名;

程序包的結(jié)構(gòu)由程序包的說(shuō)明部分(即程序包首)和程序包的內(nèi)容部分(即程序包體)兩部分組成。一個(gè)完整的程序包中,程序包首的程序包名與程序包體的程序包名是同一個(gè)名字。1.程序包首

程序包首的說(shuō)明部分可收集多個(gè)不同的VHDL設(shè)計(jì)所需的公共信息,其中包括數(shù)據(jù)類(lèi)型說(shuō)明、信號(hào)說(shuō)明、子程序說(shuō)明及元件說(shuō)明等。所有這些信息雖然也可以在每一個(gè)設(shè)計(jì)實(shí)體中進(jìn)行逐一單獨(dú)的定義和說(shuō)明,但如果將這些經(jīng)常用到的并具有一般性的說(shuō)明定義放在程序包中供隨時(shí)調(diào)用,顯然可以提高設(shè)計(jì)的效率和程序的可讀性。2.程序包體程序包體將包括在程序包首中已定義的子程序的子程序體。程序包體說(shuō)明部分的組成內(nèi)容可以包括USE語(yǔ)句(允許對(duì)其他程序包的調(diào)用)、子程序定義、子程序體、數(shù)據(jù)類(lèi)型說(shuō)明、子類(lèi)型說(shuō)明和常數(shù)說(shuō)明等。對(duì)于沒(méi)有具體子程序說(shuō)明的程序包體,則可以省去。程序包常用來(lái)封裝屬于多個(gè)設(shè)計(jì)單元共同分享的信息。常用的預(yù)定義的程序包有以下幾種:

1)?STD_LOGIC_1164程序包

STD_LOGIC_1164程序包是IEEE庫(kù)中最常用的程序包,是IEEE的標(biāo)準(zhǔn)程序包,其中包含了一些數(shù)據(jù)類(lèi)型、子類(lèi)型和函數(shù)的定義,這些定義將VHDL擴(kuò)展為一個(gè)能描述多值邏輯(0、1、高阻態(tài)“Z”、不定態(tài)“X”等)的硬件描述語(yǔ)言,很好地滿(mǎn)足了實(shí)際數(shù)字系統(tǒng)的設(shè)計(jì)需求。STD_LOGIC_1164程序包中用得最多和最廣的是定義了滿(mǎn)足工業(yè)標(biāo)準(zhǔn)的兩個(gè)數(shù)據(jù)類(lèi)型STD_LOGIC和STD_LOGIC_VECTOR,它們非常適合于FPGA/CPLD器件中多值邏輯設(shè)計(jì)結(jié)構(gòu)。2)?STD_LOGIC_ARITH程序包STD_LOGIC_ARITH預(yù)先編譯在IEEE庫(kù)中,是Synopsys公司的程序包。此程序包在STD_LOGIC_1164程序包的基礎(chǔ)上,擴(kuò)展了三個(gè)數(shù)據(jù)類(lèi)型,分別是UNSIGNED、SIGNED和SMALL_INT,并為其定義了相關(guān)的算術(shù)運(yùn)算符和轉(zhuǎn)換函數(shù)。3)?STD_LOGIC_UNSIGNED和STD_LOGIC_SIGNED程序包

STD_LOGIC_UNSIGNED和STD_LOGIC_SIGNED程序包都是Synopsys公司的程序包,都預(yù)先編譯在IEEE庫(kù)中。這些程序包重載了可用于INTEGER型及STD_LOGIC和STD_LOGIC_VECTOR型混合運(yùn)算的運(yùn)算符,并定義了一個(gè)由STD_LOGIC_VECTOR型到INTEGER型的轉(zhuǎn)換函數(shù)。這兩個(gè)程序包的區(qū)別是STD_LOGIC_SIGNED中定義的運(yùn)算符考慮到了符號(hào),是有符號(hào)數(shù)的運(yùn)算。程序包STD_LOGIC_ARITH、STD_LOGIC_UNSIGNED和STD_LOGIC_SIGNED雖然未成為IEEE標(biāo)準(zhǔn),但已經(jīng)成為事實(shí)上的工業(yè)標(biāo)準(zhǔn),絕大多數(shù)的VHDL綜合器和VHDL仿真器都支持它們。4)?STANDARD和TEXTIO程序包以上已經(jīng)提到了STANDARD和TEXTIO程序包,它們都是STD庫(kù)中的預(yù)編譯程序包。STANDARD程序包中定義了許多基本的數(shù)據(jù)類(lèi)型、子類(lèi)型和函數(shù)。由于STANDARD程序包是VHDL標(biāo)準(zhǔn)程序包,實(shí)際應(yīng)用中已隱性地打開(kāi)了,所以不必再用USE語(yǔ)句另作聲明。TEXTIO程序包定義了支持文本文件操作的許多類(lèi)型和子程序,在使用本程序包之前,需加語(yǔ)句USESTD.TEXTIO.ALL。TEXTIO程序包主要僅供仿真器使用,可以用文本編輯器建立一個(gè)數(shù)據(jù)文件,文件中包含仿真時(shí)需要的數(shù)據(jù),然后仿真時(shí)用TEXTIO程序包中的子程序存取這些數(shù)據(jù)。5.1.3實(shí)體(ENTITY)

實(shí)體作為一個(gè)設(shè)計(jì)實(shí)體的組成部分,其功能是對(duì)這個(gè)設(shè)計(jì)實(shí)體與外部電路進(jìn)行接口描述。實(shí)體是設(shè)計(jì)實(shí)體的表層設(shè)計(jì)單元,實(shí)體說(shuō)明部分規(guī)定了設(shè)計(jì)單元的輸入輸出接口信號(hào)或引腳,它是設(shè)計(jì)實(shí)體對(duì)外的一個(gè)通信界面。就一個(gè)設(shè)計(jì)實(shí)體而言,外界所看到的僅僅是它的界面上的各種接口。設(shè)計(jì)實(shí)體可以擁有一個(gè)或多個(gè)結(jié)構(gòu)體,用于描述此設(shè)計(jì)實(shí)體的邏輯結(jié)構(gòu)和邏輯功能。對(duì)于外界來(lái)說(shuō),這一部分是不可見(jiàn)的。不同邏輯功能的設(shè)計(jì)實(shí)體可以擁有相同的實(shí)體描述,這是因?yàn)閷?shí)體類(lèi)似于原理圖中的一個(gè)部件符號(hào),而其具體的邏輯功能是由設(shè)計(jì)實(shí)體中結(jié)構(gòu)體的描述確定的。實(shí)體是VHDL的基本設(shè)計(jì)單元,它可以對(duì)一個(gè)門(mén)電路、一個(gè)芯片、一塊電路板乃至整個(gè)系統(tǒng)進(jìn)行接口描述。1.實(shí)體語(yǔ)句結(jié)構(gòu)

實(shí)體說(shuō)明單元的常用語(yǔ)句結(jié)構(gòu)為

ENTITY實(shí)體名IS[GENERIC(類(lèi)屬表)PORT(端口表)]ENDENTITY實(shí)體名

實(shí)體說(shuō)明單元必須按照這一結(jié)構(gòu)來(lái)編寫(xiě),實(shí)體應(yīng)以語(yǔ)句“ENTITY實(shí)體名IS”開(kāi)始,以語(yǔ)句“ENDENTITY實(shí)體名;”結(jié)束,其中的實(shí)體名可以由設(shè)計(jì)者自己添加。方括號(hào)中間的語(yǔ)句描述,在特定的情況下并非是必需的,程序文字的大小寫(xiě)是不加區(qū)分的。2.實(shí)體名在實(shí)體中定義的實(shí)體名即為這個(gè)設(shè)計(jì)實(shí)體的名稱(chēng)。MAX

+

plusⅡ軟件對(duì)VHDL文件的取名有特殊要求,要求文件名必須與實(shí)體名一致。3.?GENERIC類(lèi)屬說(shuō)明語(yǔ)句

類(lèi)屬GENERIC參量是一種端口界面常數(shù),常以一種說(shuō)明的形式放在實(shí)體或塊結(jié)構(gòu)體前的說(shuō)明部分。類(lèi)屬為所說(shuō)明的環(huán)境提供了一種靜態(tài)信息通道。類(lèi)屬與常數(shù)不同,常數(shù)只能從設(shè)計(jì)實(shí)體的內(nèi)部得到賦值,且不能再改變,而類(lèi)屬的值可以由設(shè)計(jì)實(shí)體外部提供。因此,設(shè)計(jì)者可以從外面通過(guò)類(lèi)屬參量的重新設(shè)定而容易地改變一個(gè)設(shè)計(jì)實(shí)體或一個(gè)元件的內(nèi)部電路結(jié)構(gòu)和規(guī)模。類(lèi)屬說(shuō)明的一般書(shū)寫(xiě)格式如下:

GENERIC(常數(shù)名:數(shù)據(jù)類(lèi)型:設(shè)定值;

常數(shù)名:數(shù)據(jù)類(lèi)型:設(shè)定值);

類(lèi)屬參量以關(guān)鍵詞GENERIC引導(dǎo)一個(gè)類(lèi)屬參量表,在表中提供時(shí)間參數(shù)或總線(xiàn)寬度等靜態(tài)信息。類(lèi)屬表說(shuō)明用于設(shè)計(jì)實(shí)體和其外部環(huán)境通信的參數(shù),傳遞靜態(tài)的信息。類(lèi)屬在所定義的環(huán)境中的地位與常數(shù)十分接近,但卻能從環(huán)境(如設(shè)計(jì)實(shí)體)外部動(dòng)態(tài)地接受賦值,其行為又有點(diǎn)類(lèi)似于端口PORT。因此,常如以上的實(shí)體定義語(yǔ)句那樣,將類(lèi)屬說(shuō)明放在其中,且放在端口說(shuō)明語(yǔ)句的前面。例5.1

2輸入與門(mén)的實(shí)體描述如下:

ENTITYPGAND2ISGENERIC(trise:TIME:=1ns;

tfall:TIME:=1ns);

PORT(a1:INSTD_LOGIC;

a0:INSTD_LOGIC;

z0:OUTSTD_LOGIC);

ENDENTITYPGAND2;這是一個(gè)準(zhǔn)備作為2輸入與門(mén)的設(shè)計(jì)實(shí)體的實(shí)體描述,在類(lèi)屬說(shuō)明中定義參數(shù)trise為上沿寬度,tfall為下沿寬度,它們分別為1?ns,這兩個(gè)參數(shù)用于仿真模塊的設(shè)計(jì)。4.?PORT端口說(shuō)明

由PORT引導(dǎo)的端口說(shuō)明語(yǔ)句是對(duì)一個(gè)設(shè)計(jì)實(shí)體界面的說(shuō)明。其端口表部分對(duì)設(shè)計(jì)實(shí)體與外部電路的接口通道進(jìn)行了說(shuō)明,其中包括對(duì)每一接口的輸入輸出模式(MODE或稱(chēng)端口模式)和數(shù)據(jù)類(lèi)型(TYPE)進(jìn)行了定義。在實(shí)體說(shuō)明的前面,可以有庫(kù)的說(shuō)明,即由關(guān)鍵詞“LIBRARY”和“USE”引導(dǎo)一些對(duì)庫(kù)和程序包使用的說(shuō)明語(yǔ)句,其中的一些內(nèi)容可以為實(shí)體端口數(shù)據(jù)類(lèi)型的定義所用。實(shí)體端口說(shuō)明的一般書(shū)寫(xiě)格式如下:

PORT(端口名:端口模式數(shù)據(jù)類(lèi)型;

端口名:端口模式數(shù)據(jù)類(lèi)型);

其中的端口名是設(shè)計(jì)者為實(shí)體的每一個(gè)對(duì)外通道所取的名字,端口模式是指這些通道上的數(shù)據(jù)流動(dòng)方式,如輸入或輸出等。數(shù)據(jù)類(lèi)型是指端口上流動(dòng)的數(shù)據(jù)的表達(dá)格式或取值類(lèi)型,這是由于VHDL是一種強(qiáng)類(lèi)型語(yǔ)言,即對(duì)語(yǔ)句中的所有的端口信號(hào)、內(nèi)部信號(hào)和操作數(shù)的數(shù)據(jù)類(lèi)型有嚴(yán)格的規(guī)定,只有相同數(shù)據(jù)類(lèi)型的端口信號(hào)和操作數(shù)才能相互作用。例5.2

2輸入與非門(mén)的實(shí)體描述如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYnand2ISPORT(a:INSTD_LOGIC;b:INSTD_LOGIC;c:OUTSTD_LOGIC);ENDnand2;...IEEE1076標(biāo)準(zhǔn)程序包中定義了以下的常用端口模式(見(jiàn)表5.1):(1)?IN模式。IN定義的通道確定為輸入端口,并規(guī)定為單向只讀模式,可以通過(guò)此端口將變量(Variable)信息或信號(hào)(Signal)信息讀入設(shè)計(jì)實(shí)體中。(2)?OUT模式。OUT定義的通道確定為輸出端口,并規(guī)定為單向輸出模式,可以通過(guò)此端口將信號(hào)輸出設(shè)計(jì)實(shí)體,或者說(shuō)可以將設(shè)計(jì)實(shí)體中的信號(hào)向此端口賦值。(3)?INOUT模式。INOUT定義的通道確定為輸入輸出雙向端口,即從端口的內(nèi)部看,可以對(duì)此端口進(jìn)行賦值,也可以通過(guò)此端口讀入外部的數(shù)據(jù)信息;而從端口的外部看,信號(hào)既可以從此端口流出,也可以向此端口輸入信號(hào)。INOUT模式包含了IN、OUT和BUFFER三種模式,因此可用INOUT模式替代其中任何一種模式,但為了明確程序中各端口的實(shí)際任務(wù),一般不作這種替代。(4)BUFFER模式。BUFFER定義的通道確定為具有數(shù)據(jù)讀入功能的輸出端口,它與雙向端口的區(qū)別在于只能接受一個(gè)驅(qū)動(dòng)源。BUFFER模式從本質(zhì)上看仍是OUT模式,只是在內(nèi)部結(jié)構(gòu)中具有將輸出至外端口的信號(hào)回讀的功能,即允許內(nèi)部回讀輸出的信號(hào),亦即允許反饋。如計(jì)數(shù)器的設(shè)計(jì),可將計(jì)數(shù)器輸出的計(jì)數(shù)信號(hào)回讀,以作下一計(jì)數(shù)值的初值。與INOUT模式相比,顯然,BUFFER的區(qū)別在于回讀(輸入)的信號(hào)不是由外部輸入的,而是由內(nèi)部產(chǎn)生,向外輸出的信號(hào),有時(shí)往往在時(shí)序上有所差異。

端口模式

端口模式說(shuō)明(以設(shè)計(jì)實(shí)體為主體)IN輸入端口,只讀模式OUT輸出端口,單向賦值模式BUFFER具有讀功能的輸出模式,(從內(nèi)部看)可以讀或?qū)?,只能有一個(gè)驅(qū)動(dòng)源INOUT雙向端口,(從內(nèi)部或外部看)都可以讀或?qū)懕?.1端口模式說(shuō)明在實(shí)用中,端口描述中的數(shù)據(jù)類(lèi)型主要有兩類(lèi):位(BIT)和位矢量(BIT_VECTOR)。若端口的數(shù)據(jù)類(lèi)型定義為BIT,則其信號(hào)值是一個(gè)1位的二進(jìn)制數(shù),取值只能是0或1;若端口的數(shù)據(jù)類(lèi)型定義為BIT_VECTOR,則其信號(hào)值是一組二進(jìn)制數(shù)。5.1.4結(jié)構(gòu)體(ARCHITECTURE)結(jié)構(gòu)體是設(shè)計(jì)實(shí)體中的一個(gè)組成部分,主要描述設(shè)計(jì)實(shí)體的內(nèi)部結(jié)構(gòu)和/或外部設(shè)計(jì)實(shí)體端口間的邏輯關(guān)系。結(jié)構(gòu)體由以下部分組成:

(1)對(duì)數(shù)據(jù)類(lèi)型、常數(shù)、信號(hào)、子程序和元件等元素的說(shuō)明部分。(2)描述實(shí)體邏輯行為,并以各種不同的描述風(fēng)格表達(dá)的功能描述語(yǔ)句,包括各種形式的順序描述語(yǔ)句和并行描述語(yǔ)句。(3)以元件例化語(yǔ)句為特征的外部元件(設(shè)計(jì)實(shí)體)端口間的連接方式。(4)結(jié)構(gòu)體將具體實(shí)現(xiàn)一個(gè)實(shí)體,每個(gè)實(shí)體可以有多個(gè)結(jié)構(gòu)體,其中每個(gè)結(jié)構(gòu)體對(duì)應(yīng)著實(shí)體不同的結(jié)構(gòu)和算法實(shí)現(xiàn)方案,這些結(jié)構(gòu)體的地位是同等的,它們完整地實(shí)現(xiàn)了實(shí)體的行為。但同一結(jié)構(gòu)體不能為不同的實(shí)體所擁有。結(jié)構(gòu)體不能單獨(dú)存在,必須有一個(gè)界面說(shuō)明。對(duì)于具有多個(gè)結(jié)構(gòu)體的實(shí)體,必須用CONFIGURATION配置語(yǔ)句指明用于綜合的結(jié)構(gòu)體和用于仿真的結(jié)構(gòu)體,即在綜合后的可映射于硬件電路的設(shè)計(jì)實(shí)體中,一個(gè)實(shí)體只能對(duì)應(yīng)一個(gè)結(jié)構(gòu)體。在電路中,如果實(shí)體代表一個(gè)器件符號(hào),則結(jié)構(gòu)體描述了這個(gè)符號(hào)的內(nèi)部行為。當(dāng)把這個(gè)符號(hào)例化成一個(gè)實(shí)際的器件安裝到電路上時(shí),則需配置語(yǔ)句為這個(gè)例化的器件指定一個(gè)結(jié)構(gòu)體(即指定一種實(shí)現(xiàn)方案),或由編譯器自動(dòng)選擇一個(gè)結(jié)構(gòu)體。1.結(jié)構(gòu)體的一般語(yǔ)言格式

結(jié)構(gòu)體的語(yǔ)句格式如下:

ARCHITECTURE結(jié)構(gòu)體名OF實(shí)體名IS[說(shuō)明語(yǔ)句]BEGIN[功能描述語(yǔ)句]ENDARCHITECTURE結(jié)構(gòu)體名;在書(shū)寫(xiě)格式上,實(shí)體名必須是所在設(shè)計(jì)實(shí)體的名字,而結(jié)構(gòu)體名可以由設(shè)計(jì)者自己選擇,但當(dāng)一個(gè)實(shí)體具有多個(gè)結(jié)構(gòu)體時(shí),結(jié)構(gòu)體的取名不可相重。結(jié)構(gòu)體的說(shuō)明語(yǔ)句部分必須放在關(guān)鍵詞“ARCHITECTURE”和“BEGIN”之間,結(jié)構(gòu)體必須以“ENDARCHITECTURE結(jié)構(gòu)體名;”作為結(jié)束句。2.結(jié)構(gòu)體說(shuō)明語(yǔ)句

結(jié)構(gòu)體中的說(shuō)明語(yǔ)句用于對(duì)結(jié)構(gòu)體的功能描述語(yǔ)句中用到的信號(hào)(SIGNAL)、數(shù)據(jù)類(lèi)型(TYPE)、常數(shù)(CONSTANT)、元件(COMPONENT)、函數(shù)(FUNCTION)和過(guò)程(PROCEDURE)等加以說(shuō)明。在一個(gè)結(jié)構(gòu)體中說(shuō)明和定義的數(shù)據(jù)類(lèi)型、常數(shù)、元件、函數(shù)和過(guò)程只能用于這個(gè)結(jié)構(gòu)體中。如果希望這些定義也能用于其他的實(shí)體或結(jié)構(gòu)體中,則需要將其作為程序包來(lái)處理。3.功能描述語(yǔ)句結(jié)構(gòu)

功能描述語(yǔ)句結(jié)構(gòu)可以含有五種不同類(lèi)型的以并行方式工作的語(yǔ)句結(jié)構(gòu)。這可以看成是結(jié)構(gòu)體的五個(gè)子結(jié)構(gòu)。在每一語(yǔ)句結(jié)構(gòu)的內(nèi)部可含有并行運(yùn)行的邏輯描述語(yǔ)句或順序運(yùn)行的邏輯描述語(yǔ)句。這就是說(shuō),這五種語(yǔ)句結(jié)構(gòu)本身是并行語(yǔ)句,但它們內(nèi)部所包含的語(yǔ)句并不一定是并行語(yǔ)句,如進(jìn)程語(yǔ)句內(nèi)所包含的是順序語(yǔ)句。五種語(yǔ)句結(jié)構(gòu)的基本組成和功能分別介紹如下:

(1)塊語(yǔ)句是由一系列并行執(zhí)行語(yǔ)句構(gòu)成的組合體,它的功能是將結(jié)構(gòu)體中的并行語(yǔ)句組成一個(gè)或多個(gè)子模塊。(2)進(jìn)程語(yǔ)句定義順序語(yǔ)句模塊,用以將外部獲得的信號(hào)值或內(nèi)部的運(yùn)算數(shù)據(jù)向其他的信號(hào)進(jìn)行賦值。(3)信號(hào)賦值語(yǔ)句將設(shè)計(jì)實(shí)體內(nèi)的處理結(jié)果向定義的信號(hào)或界面端口進(jìn)行賦值。(4)子程序調(diào)用語(yǔ)句用以調(diào)用過(guò)程或函數(shù),并將獲得的結(jié)果賦值于信號(hào)。(5)元件例化語(yǔ)句對(duì)其他的設(shè)計(jì)實(shí)體作元件調(diào)用說(shuō)明,并將此元件的端口與其他的元件、信號(hào)或高層次實(shí)體的界面端口進(jìn)行連接。5.1.5塊語(yǔ)句結(jié)構(gòu)(BLOCK)塊(BLOCK)的應(yīng)用類(lèi)似于畫(huà)一個(gè)大的電路原理圖時(shí),可以將一個(gè)總的原理圖分成多個(gè)子模塊,則這個(gè)總的原理圖成為一個(gè)由多個(gè)子模塊原理圖連接而成的頂層模塊圖,其中每一個(gè)子模塊可以是一個(gè)具體的電路原理圖。但是,如果子模塊的原理圖仍然太大,還可將它變成更低層次的連接圖(BLOCK嵌套)。顯然,按照這種方式劃分結(jié)構(gòu)體僅是形式上的,而非功能上的改變。事實(shí)上,將結(jié)構(gòu)體以模塊方式劃分的方法有多種,例如使用元件例化語(yǔ)句就是一種將結(jié)構(gòu)體的并行描述分成多個(gè)層次的方法,區(qū)別只是后者涉及到多個(gè)實(shí)體和結(jié)構(gòu)體,且綜合后硬件結(jié)構(gòu)的邏輯層次有所增加。BLOCK是VHDL中具有的一種劃分機(jī)制,這種機(jī)制允許設(shè)計(jì)者合理地將一個(gè)模塊分為數(shù)個(gè)區(qū)域,在每個(gè)區(qū)域中都能對(duì)其局部信號(hào)、數(shù)據(jù)類(lèi)型和常量加以描述和定義。任何能在結(jié)構(gòu)體的說(shuō)明部分進(jìn)行說(shuō)明的對(duì)象都能在BLOCK說(shuō)明部分中進(jìn)行說(shuō)明。BLOCK語(yǔ)句應(yīng)用只是一種將結(jié)構(gòu)體中的并行描述語(yǔ)句進(jìn)行組合的方法,它的主要目的是改善并行語(yǔ)句及其結(jié)構(gòu)的可讀性,或是利用BLOCK的保護(hù)表達(dá)式關(guān)閉某些信號(hào)。1.?BLOCK語(yǔ)句的格式

BLOCK語(yǔ)句的表達(dá)格式如下:

塊標(biāo)號(hào):BLOCK[(塊保護(hù)表達(dá)式)]接口說(shuō)明

類(lèi)屬說(shuō)明

BEGIN并行語(yǔ)句

ENDBLOCK塊標(biāo)號(hào);一個(gè)BLOCK語(yǔ)句結(jié)構(gòu),在關(guān)鍵詞“BLOCK”的前面必須設(shè)置一個(gè)塊標(biāo)號(hào),并在結(jié)尾語(yǔ)句“ENDBLOCK”右側(cè)也寫(xiě)上此標(biāo)號(hào)(但此處的塊標(biāo)號(hào)不是必需的)。接口說(shuō)明部分類(lèi)似于實(shí)體的定義部分,可包含由關(guān)鍵詞PORT、GENERIC、PORTMAP和GENERICMAP引導(dǎo)的接口說(shuō)明等語(yǔ)句,用于對(duì)BLOCK的接口設(shè)置以及與外界信號(hào)的連接狀況加以說(shuō)明。這類(lèi)似于原理圖間的圖示接口說(shuō)明。類(lèi)屬說(shuō)明部分和接口說(shuō)明部分的適用范圍僅限于當(dāng)前BLOCK,所有這些在BLOCK內(nèi)部的說(shuō)明對(duì)于這個(gè)塊的外部來(lái)說(shuō)是完全不透明的,即不能適用于外部環(huán)境,或由外部環(huán)境所調(diào)用,但對(duì)于嵌套于更內(nèi)層的塊卻是透明的,即可將信息向內(nèi)部傳遞。塊的說(shuō)明部分可以定義的項(xiàng)目主要有:USE語(yǔ)句、子程序、數(shù)據(jù)類(lèi)型、子類(lèi)型、常數(shù)、信號(hào)和元件。塊中的并行語(yǔ)句部分可包含結(jié)構(gòu)體中允許的任何并行語(yǔ)句結(jié)構(gòu)。BLOCK語(yǔ)句本身屬并行語(yǔ)句,BLOCK語(yǔ)句中所包含的語(yǔ)句也是并行語(yǔ)句。2.?BLOCK的應(yīng)用

BLOCK的應(yīng)用可使結(jié)構(gòu)體層次鮮明,結(jié)構(gòu)明確。利用BLOCK語(yǔ)句可以將結(jié)構(gòu)體中的并行語(yǔ)句劃分成多個(gè)并列的BLOCK,每一個(gè)BLOCK都像一個(gè)獨(dú)立的設(shè)計(jì)實(shí)體,具有自己的類(lèi)屬參數(shù)說(shuō)明和界面端口,以及與外部環(huán)境的銜接描述。在較大的VHDL程序的編程中,恰當(dāng)應(yīng)用塊語(yǔ)句對(duì)于技術(shù)交流、程序移植、排錯(cuò)和仿真都是有益的。3.?BLOCK語(yǔ)句在綜合中的地位

與大部分的VHDL語(yǔ)句不同,BLOCK語(yǔ)句的應(yīng)用,包括其中的類(lèi)屬說(shuō)明和端口定義,都不會(huì)影響對(duì)原結(jié)構(gòu)體的邏輯功能的仿真結(jié)果。5.1.6進(jìn)程(PROCESS)PROCESS語(yǔ)句結(jié)構(gòu)包含用獨(dú)立的順序語(yǔ)句描述的進(jìn)程,該進(jìn)程描述了設(shè)計(jì)實(shí)體中的部分邏輯行為。與并行語(yǔ)句的同時(shí)執(zhí)行方式不同,順序語(yǔ)句運(yùn)行的順序是同程序語(yǔ)句書(shū)寫(xiě)的順序相一致的。一個(gè)結(jié)構(gòu)體中可以有多個(gè)并行運(yùn)行的進(jìn)程結(jié)構(gòu),而每一個(gè)進(jìn)程的內(nèi)部結(jié)構(gòu)卻是由一系列順序語(yǔ)句來(lái)構(gòu)成的。需要注意的是,在VHDL中,所謂順序,僅僅是指語(yǔ)句按序執(zhí)行上的順序性,但這并不意味著PROCESS語(yǔ)句結(jié)構(gòu)所對(duì)應(yīng)的硬件邏輯行為也具有相同的順序性。PROCESS結(jié)構(gòu)中的順序語(yǔ)句,及其所謂的順序執(zhí)行過(guò)程只是相對(duì)于計(jì)算機(jī)中的軟件行為仿真的模擬過(guò)程而言的,這個(gè)過(guò)程與硬件結(jié)構(gòu)中實(shí)現(xiàn)的對(duì)應(yīng)的邏輯行為可能是不相同的。PROCESS結(jié)構(gòu)中既可以有時(shí)序邏輯的描述,也可以有組合邏輯的描述,它們都可以用順序語(yǔ)句來(lái)表達(dá)。然而,硬件中的組合邏輯具有典型的并行邏輯功能,而硬件中的時(shí)序邏輯也并非都是以順序方式工作的。1.PROCESS語(yǔ)句格式

PROCESS語(yǔ)句的表達(dá)格式如下:

[進(jìn)程標(biāo)號(hào):]PROCESS[(敏感信號(hào)參數(shù)表)][IS][進(jìn)程說(shuō)明部分]BEGIN順序描述語(yǔ)句

ENDPROCESS[進(jìn)程標(biāo)號(hào)];每一個(gè)PROCESS語(yǔ)句結(jié)構(gòu)可以賦予一個(gè)進(jìn)程標(biāo)號(hào),但這個(gè)標(biāo)號(hào)不是必需的。進(jìn)程說(shuō)明部分定義該進(jìn)程所需的局部數(shù)據(jù)環(huán)境。順序描述語(yǔ)句部分是一段順序執(zhí)行的語(yǔ)句,描述該進(jìn)程的行為。PROCESS中規(guī)定了每個(gè)進(jìn)程語(yǔ)句在當(dāng)它的某個(gè)敏感信號(hào)(由敏感信號(hào)參量表列出)的值改變時(shí)都必須立即完成某一功能行為,這個(gè)行為由進(jìn)程語(yǔ)句中的順序語(yǔ)句定義,行為的結(jié)果可以賦給信號(hào),并通過(guò)信號(hào)被其他的PROCESS或BLOCK讀取或賦值。當(dāng)進(jìn)程中定義的任一敏感信號(hào)發(fā)生更新時(shí),由順序語(yǔ)句定義的行為就要重復(fù)執(zhí)行一次,當(dāng)進(jìn)程中最后一個(gè)語(yǔ)句執(zhí)行完成后,執(zhí)行過(guò)程將返回到進(jìn)程的第一個(gè)語(yǔ)句,以等待下一次敏感信號(hào)變化。如此循環(huán)往復(fù)以至無(wú)限。但當(dāng)遇到WAIT語(yǔ)句時(shí),執(zhí)行過(guò)程將被有條件地終止,即所謂的掛起(Suspention)。一個(gè)結(jié)構(gòu)體中可以含有多個(gè)PROCESS結(jié)構(gòu),每一PROCESS結(jié)構(gòu)對(duì)應(yīng)于其敏感信號(hào)參數(shù)表中定義的任一敏感參量的變化,每個(gè)進(jìn)程可以在任何時(shí)刻被激活或者稱(chēng)為啟動(dòng)。而在一個(gè)結(jié)構(gòu)體中,所有被激活的進(jìn)程都是并行運(yùn)行的,這就是為什么PROCESS結(jié)構(gòu)本身是并行語(yǔ)句的道理。PROCESS語(yǔ)句必須以語(yǔ)句“ENDPROCESS[進(jìn)程標(biāo)號(hào)];”結(jié)尾,對(duì)于目前常用的綜合器來(lái)說(shuō),其中進(jìn)程標(biāo)號(hào)不是必須的,敏感表旁的[IS]也不是必須的。2.?PROCESS組成

如上所述,PROCESS語(yǔ)句結(jié)構(gòu)是由三個(gè)部分組成的,即進(jìn)程說(shuō)明部分、順序描述語(yǔ)句部分和敏感信號(hào)參數(shù)表。(1)進(jìn)程說(shuō)明部分主要定義一些局部量,可包括數(shù)據(jù)類(lèi)型、常數(shù)、變量、屬性、子程序等。但需注意,在進(jìn)程說(shuō)明部分中不允許定義信號(hào)和共享變量。(2)順序描述語(yǔ)句部分可分為賦值語(yǔ)句、進(jìn)程啟動(dòng)語(yǔ)句、子程序調(diào)用語(yǔ)句、順序描述語(yǔ)句和進(jìn)程跳出語(yǔ)句等,它們包括:

信號(hào)賦值語(yǔ)句:即在進(jìn)程中將計(jì)算或處理的結(jié)果向信號(hào)(SIGNAL)賦值。

變量賦值語(yǔ)句:即在進(jìn)程中以變量(VARIABLE)的形式存儲(chǔ)計(jì)算的中間值。

進(jìn)程啟動(dòng)語(yǔ)句:當(dāng)PROCESS的敏感信號(hào)參數(shù)表中沒(méi)有列出任何敏感量時(shí),進(jìn)程的啟動(dòng)只能通過(guò)進(jìn)程啟動(dòng)語(yǔ)句WAIT語(yǔ)句實(shí)現(xiàn)。這時(shí)可以利用WAIT語(yǔ)句監(jiān)視信號(hào)的變化情況,以便決定是否啟動(dòng)進(jìn)程。WAIT語(yǔ)句可以看成是一種隱式的敏感信號(hào)表。子程序調(diào)用語(yǔ)句:對(duì)已定義的過(guò)程和函數(shù)進(jìn)行調(diào)用,并參與計(jì)算。

順序描述語(yǔ)句:包括IF語(yǔ)句、CASE語(yǔ)句、LOOP語(yǔ)句、NULL語(yǔ)句等。進(jìn)程跳出語(yǔ)句:包括NEXT語(yǔ)句、EXIT語(yǔ)句,用于控制進(jìn)程的運(yùn)行方向。(3)敏感信號(hào)參數(shù)表需列出用于啟動(dòng)本進(jìn)程可讀入的信號(hào)名(當(dāng)有WAIT語(yǔ)句時(shí)例外)。例5.3中所給程序是一個(gè)含有進(jìn)程的結(jié)構(gòu)體,進(jìn)程標(biāo)號(hào)是p1(進(jìn)程標(biāo)號(hào)不是必須的),進(jìn)程的敏感信號(hào)參數(shù)表中未列出敏感信號(hào),所以進(jìn)程的啟動(dòng)需靠WAIT語(yǔ)句。在此,信號(hào)clock即為該進(jìn)程的敏感信號(hào)。每當(dāng)出現(xiàn)一個(gè)時(shí)鐘脈沖clock時(shí),即進(jìn)入WAIT語(yǔ)句以下的順序語(yǔ)句執(zhí)行進(jìn)程中,且當(dāng)driver為高電平時(shí)進(jìn)入CASE語(yǔ)句結(jié)構(gòu)。例5.3含有進(jìn)程的結(jié)構(gòu)體示例。代碼如下:ARCHITECUREs_modeOFstat

ISBEGINp1PROCESSBEGINWAITUNTILclock;--等待clock激活進(jìn)程

IF(driver='1')THENCASEoutputISWHENs1=>output<=s2;WHENs2=>output<=s3;WHENs3=>output<=s4;WHENs4=>output<=s1;ENDCASEENDIFENDPROCESSp1ENDARCHITECUREs_mode;5.1.7子程序(SUBPROGRAM)子程序是一個(gè)VHDL程序模塊,這個(gè)模塊中只能利用順序語(yǔ)句來(lái)定義和完成算法,這一點(diǎn)與進(jìn)程十分相似。所不同的是,子程序不能像進(jìn)程那樣可以從本結(jié)構(gòu)體的其他塊或進(jìn)程結(jié)構(gòu)中直接讀取信號(hào)值或者向信號(hào)賦值。子程序只能通過(guò)調(diào)用方式使用,與子程序的界面端口進(jìn)行通信。子程序的應(yīng)用與元件例化(元件調(diào)用)是不同的,如在一個(gè)設(shè)計(jì)實(shí)體或另一個(gè)子程序中調(diào)用子程序后,并不像元件例化那樣會(huì)產(chǎn)生一個(gè)新的設(shè)計(jì)層次。子程序可以在VHDL程序的三個(gè)不同位置進(jìn)行定義,即在程序包、結(jié)構(gòu)體和進(jìn)程中定義。但由于只有在程序包中定義的子程序可被幾個(gè)不同的設(shè)計(jì)所調(diào)用,所以一般應(yīng)該將子程序放在程序包中。VHDL子程序具有可重載性的特點(diǎn),即允許同時(shí)有許多重名的子程序,但這些子程序的參數(shù)類(lèi)型及返回值數(shù)據(jù)類(lèi)型是不同的。子程序的可重載性是一個(gè)非常有用的特性。子程序有兩種類(lèi)型,即過(guò)程(PROCEDURE)和函數(shù)(FUNCTION)。過(guò)程可通過(guò)其界面提供多個(gè)返回值,或不提供任何值,而函數(shù)只能返回一個(gè)值。在函數(shù)入口中,所有參數(shù)都是輸入?yún)?shù),而過(guò)程則有輸入?yún)?shù)、輸出參數(shù)和雙向參數(shù)之分。過(guò)程一般被看作一種語(yǔ)句結(jié)構(gòu),常在結(jié)構(gòu)體或進(jìn)程中以獨(dú)立語(yǔ)句的形式存在,而函數(shù)通常是表達(dá)式的一部分,常在賦值語(yǔ)句或表達(dá)式中使用。過(guò)程可以單獨(dú)存在,其行為類(lèi)似于進(jìn)程,而函數(shù)通常作為語(yǔ)句的一部分被調(diào)用。在實(shí)用中必須注意,綜合后的子程序?qū)⒂成錇槟繕?biāo)芯片中的一個(gè)相應(yīng)的電路模塊,且每一次調(diào)用都將在硬件結(jié)構(gòu)中產(chǎn)生具有相同結(jié)構(gòu)的不同的模塊,這一點(diǎn)與在普通的軟件中調(diào)用子程序有很大的不同。在PC機(jī)或單片機(jī)軟件程序執(zhí)行中(包括VHDL的行為仿真),無(wú)論對(duì)程序中的子程序調(diào)用多少次,都不會(huì)發(fā)生計(jì)算機(jī)資源如存儲(chǔ)資源不夠用的情況,但在面向VHDL的綜合中,每調(diào)用一次子程序都意味著增加了一個(gè)硬件電路模塊。因此,在實(shí)用中,要密切關(guān)注和嚴(yán)格控制子程序的調(diào)用次數(shù)。1.函數(shù)FUNCTION在VHDL中有多種函數(shù)形式,如用于不同目的的用戶(hù)自定義函數(shù)和在庫(kù)中現(xiàn)成的預(yù)定義函數(shù)。例如轉(zhuǎn)換函數(shù)和決斷函數(shù)。轉(zhuǎn)換函數(shù)用于從一種數(shù)據(jù)類(lèi)型到另一種數(shù)據(jù)類(lèi)型的轉(zhuǎn)換,如在元件例化語(yǔ)句中利用轉(zhuǎn)換函數(shù)可允許不同數(shù)據(jù)類(lèi)型的信號(hào)和端口間進(jìn)行映射;決斷函數(shù)用于在多驅(qū)動(dòng)信號(hào)時(shí)解決信號(hào)競(jìng)爭(zhēng)問(wèn)題。函數(shù)的語(yǔ)言表達(dá)格式如下:

FUNCTION函數(shù)名(參數(shù)表)RETURN數(shù)據(jù)類(lèi)型--函數(shù)首

FUNCTION函數(shù)名(參數(shù)表)RETURN數(shù)據(jù)類(lèi)型IS--函數(shù)體

[說(shuō)明部分]BEGIN順序語(yǔ)句;ENDFUNCTION函數(shù)名;一般地,函數(shù)定義應(yīng)由兩部分組成,即函數(shù)首和函數(shù)體,在進(jìn)程或結(jié)構(gòu)體中不必定義函數(shù)首,而在程序包中必須定義函數(shù)首。1)函數(shù)首函數(shù)首由函數(shù)名、參數(shù)表和返回值的數(shù)據(jù)類(lèi)型三部分組成。如果要將所定義的函數(shù)組織成程序包放入庫(kù)中的話(huà),定義函數(shù)首是必需的,這時(shí)的函數(shù)首就相當(dāng)于一個(gè)入庫(kù)貨物名稱(chēng)與貨物位置表,實(shí)際入庫(kù)的是函數(shù)體。函數(shù)首的名稱(chēng)即為函數(shù)的名稱(chēng),需放在關(guān)鍵詞FUNCTION之后,此名稱(chēng)可以是普通的標(biāo)識(shí)符,也可以是運(yùn)算符,運(yùn)算符必須加上雙引號(hào),這就是所謂的運(yùn)算符重載。運(yùn)算符重載就是對(duì)VHDL中現(xiàn)存的運(yùn)算符進(jìn)行重新定義,以獲得新的功能。新功能的定義是靠函數(shù)體來(lái)完成的。函數(shù)的參數(shù)表用來(lái)定義輸出值,所以不必以顯式表示參數(shù)的方向,函數(shù)參數(shù)表中可以是信號(hào)或常數(shù),參數(shù)名需放在關(guān)鍵詞CONSTANT或SIGNAL之后。如果沒(méi)有特別說(shuō)明,則參數(shù)被默認(rèn)為常數(shù)。如果要將一個(gè)已編制好的函數(shù)并入程序包,函數(shù)首必須放在程序包的說(shuō)明部分,而函數(shù)體需放在程序包的包體內(nèi)。如果只是在一個(gè)結(jié)構(gòu)體中定義并調(diào)用函數(shù),則僅需函數(shù)體即可。由此可見(jiàn),函數(shù)首的作用只是作為程序包的有關(guān)此函數(shù)的一個(gè)接口界面。2)函數(shù)體函數(shù)體包含一個(gè)對(duì)數(shù)據(jù)類(lèi)型、常數(shù)、變量等的局部說(shuō)明,以及用以完成規(guī)定算法或轉(zhuǎn)換的順序語(yǔ)句部分。一旦函數(shù)被調(diào)用,就將執(zhí)行這部分語(yǔ)句。在函數(shù)體中,需以關(guān)鍵詞ENDFUNCTION及函數(shù)名結(jié)尾。2.過(guò)程(PROCEDURE)VHDL中,子程序的另外一種形式是過(guò)程PROCEDURE,過(guò)程的語(yǔ)句格式是:

PROCEDURE過(guò)程名(參數(shù)表)

--過(guò)程首

PROCEDURE過(guò)程名(參數(shù)表)IS[說(shuō)明部分]BIGIN--過(guò)程體

順序語(yǔ)句

ENDPROCEDURE過(guò)程名與函數(shù)一樣,過(guò)程也由兩部分構(gòu)成,即過(guò)程首和過(guò)程體,其中過(guò)程首也不是必需的,過(guò)程體可以獨(dú)立存在和使用,即在進(jìn)程或結(jié)構(gòu)體中不必定義過(guò)程首。但與函數(shù)一樣,要將過(guò)程并入程序包中時(shí),必須定義過(guò)程首。1)過(guò)程首過(guò)程首由過(guò)程名和參數(shù)表組成。參數(shù)表用于對(duì)過(guò)程的參數(shù)進(jìn)行說(shuō)明,指明其類(lèi)型和工作模式。常數(shù)、變量和信號(hào)三類(lèi)數(shù)據(jù)對(duì)象可用作過(guò)程的參數(shù),關(guān)鍵詞IN、OUT和INOUT定義了這些參數(shù)的工作模式,即信息的流向。如果沒(méi)有指定模式,則默認(rèn)為IN。以下是三個(gè)過(guò)程首的定義示例。例5.4過(guò)程首定義示例。代碼如下:PROCEDUREpro1(VARIABLEa,b:INOUTREAL);PROCEDUREpro2(CONSTANTa1:ININTEGERVARIABLEb1:OUTINTEGER);PROCEDUREpro3(SIGNALsig:INOUTBIT);在例5.4中,過(guò)程pro1定義了兩個(gè)實(shí)數(shù)雙向變量a和b;過(guò)程pro2定義了兩個(gè)參量,第一個(gè)是常數(shù),它的數(shù)據(jù)類(lèi)型為整數(shù),流向模式是IN,第二個(gè)參量是變量,工作模式和數(shù)據(jù)類(lèi)型分別是OUT和整數(shù);過(guò)程pro3中只定義了一個(gè)信號(hào)參量,即sig,它的工作模式是雙向INOUT,數(shù)據(jù)類(lèi)型是BIT。一般地,可在參量表中定義三種流向模式,即IN、OUT和INOUT。如果只定義了IN模式而未定義目標(biāo)參量類(lèi)型,則默認(rèn)為常量;若只定義了INOUT或OUT,則默認(rèn)目標(biāo)參量類(lèi)型是變量。2)過(guò)程體過(guò)程體是由順序語(yǔ)句組成的,過(guò)程的調(diào)用即啟動(dòng)了對(duì)過(guò)程體的順序語(yǔ)句的執(zhí)行。與函數(shù)一樣,過(guò)程體中的說(shuō)明部分只是局部的,其中的各種定義只能適用于過(guò)程體內(nèi)部。過(guò)程體的順序語(yǔ)句部分可以包含任何順序執(zhí)行的語(yǔ)句,包括WAIT語(yǔ)句。但需注意,如果一個(gè)過(guò)程是在進(jìn)程中調(diào)用的,且這個(gè)進(jìn)程已列出了敏感參量表,則不能在此過(guò)程中使用WAIT語(yǔ)句。在不同的調(diào)用環(huán)境中,可以有兩種不同的語(yǔ)句方式對(duì)過(guò)程進(jìn)行調(diào)用,即順序語(yǔ)句方式或并行語(yǔ)句方式。在一般的順序語(yǔ)句自然執(zhí)行過(guò)程中,一個(gè)過(guò)程被調(diào)用執(zhí)行,則屬于順序語(yǔ)句方式,因?yàn)檫@時(shí)它只相當(dāng)于一條順序語(yǔ)句的執(zhí)行;當(dāng)過(guò)程處于并行語(yǔ)句環(huán)境中時(shí),其過(guò)程體中定義的任一IN或INOUT的目標(biāo)參量(即數(shù)據(jù)對(duì)象:變量、信號(hào)、常數(shù))發(fā)生改變時(shí),將啟動(dòng)過(guò)程的調(diào)用,這時(shí)的調(diào)用是屬于并行語(yǔ)句方式的。過(guò)程與函數(shù)一樣可以重復(fù)調(diào)用或嵌套式調(diào)用。綜合器一般不支持含有Wait語(yǔ)句的過(guò)程。例5.5過(guò)程體使用示例。程序如下:PROCEDUREprg1(VARIABLEvalue:INOUTBIT_VECTOR(0TO7))ISBEGINCASEvalueISWHEN"0000"=>value:"0101";WHEN"0101"=>value:"0000";WHENOTHERS=>value:"1111";ENDCASE;ENDPROCEDUREprg1;這個(gè)過(guò)程對(duì)具有雙向模式變量的值value作了一個(gè)數(shù)據(jù)轉(zhuǎn)換運(yùn)算。

5.1.8配置(CONFIGURATION)配置語(yǔ)句是用來(lái)為較大的系統(tǒng)設(shè)計(jì)提供管理和工程組織的,可以把特定的結(jié)構(gòu)體關(guān)聯(lián)到(指定給)一個(gè)確定的實(shí)體。通常在大而復(fù)雜的VHDL工程設(shè)計(jì)中,配置語(yǔ)句可以為實(shí)體指定或配屬一個(gè)結(jié)構(gòu)體。如可以利用配置使仿真器為同一實(shí)體配置不同的結(jié)構(gòu)體以使設(shè)計(jì)者比較不同結(jié)構(gòu)體的仿真差別,或者為實(shí)例化的各元件實(shí)體配置指定的結(jié)構(gòu)體,從而形成一個(gè)所希望的實(shí)例化元件層次構(gòu)成的設(shè)計(jì)實(shí)體。配置也是VHDL設(shè)計(jì)實(shí)體中的一個(gè)基本單元。在綜合或仿真中,可以利用配置語(yǔ)句為確定整個(gè)設(shè)計(jì)提供許多有用信息。例如對(duì)以元件的層次方式構(gòu)成的VHDL設(shè)計(jì)實(shí)體,就可以把配置語(yǔ)句的設(shè)置看成是一個(gè)元件表,以配置語(yǔ)句指定在頂層設(shè)計(jì)中的每一元件與一特定結(jié)構(gòu)體相銜接,或賦予特定屬性。配置語(yǔ)句還能用于對(duì)元件的端口連接進(jìn)行重新安排等。VHDL綜合器允許將配置規(guī)定為針對(duì)一個(gè)設(shè)計(jì)實(shí)體中的最高層設(shè)計(jì)單元,但只支持對(duì)最頂層的實(shí)體進(jìn)行配置,通常情況下,配置主要用在VHDL的行為仿真中。配置語(yǔ)句的一般格式如下:

CONFIGURATION配置名OF實(shí)體名IS配置說(shuō)明

END配置名;配置主要為頂層設(shè)計(jì)實(shí)體指定結(jié)構(gòu)體,或?yàn)閰⑴c例化的元件實(shí)體指定所希望的結(jié)構(gòu)體,以層次方式來(lái)對(duì)元件例化作結(jié)構(gòu)配置。如前所述,每個(gè)實(shí)體可以擁有多個(gè)不同的結(jié)構(gòu)體,而每個(gè)結(jié)構(gòu)體的地位是相同的,在這種情況下,可以利用配置說(shuō)明為這個(gè)實(shí)體指定一個(gè)結(jié)構(gòu)體。5.2

VHDL語(yǔ)言要素VHDL的語(yǔ)言要素主要有數(shù)據(jù)對(duì)象(DataObjects,Objects),其中包括變量(Variables)、信號(hào)(Signals)和常數(shù)(Constants),數(shù)據(jù)類(lèi)型(DataTypes,Types)和各類(lèi)操作數(shù)(Operands)及運(yùn)算操作符(Operators)。準(zhǔn)確無(wú)誤地理解和掌握VHDL語(yǔ)言要素的基本含義和用法,對(duì)于正確地完成VHDL程序設(shè)計(jì)十分重要。5.2.1

VHDL文字規(guī)則

VHDL文字(Literal)主要包括數(shù)值和標(biāo)識(shí)符。數(shù)值型文字所描述的值主要有數(shù)字型、字符串型、位串型。1.數(shù)字型文字

數(shù)字型文字的值有多種表達(dá)方式,現(xiàn)列舉如下:

(1)整數(shù)文字。整數(shù)文字都是十進(jìn)制的數(shù),如:4,512,0,248E2(?=?24800),57_141_352(?=?57141352)。(2)實(shí)數(shù)文字。實(shí)數(shù)文字也都是十進(jìn)制的數(shù),但必須帶有小數(shù)點(diǎn),如:188.993,88_670_551.453_909(?=?88670551.453909),1.0,44.99E?-?2(?=?0.4499),1.335。(3)以數(shù)制基數(shù)表示的文字。用這種方式表示的數(shù)由五個(gè)部分組成。第一部分,用十進(jìn)制數(shù)標(biāo)明數(shù)制進(jìn)位的基數(shù);第二部分,數(shù)制隔離符號(hào)“#”;第三部分,表達(dá)的數(shù);第四部分,指數(shù)隔離符號(hào)“#”;第五部分,用十進(jìn)制表示的指數(shù)部分,這一部分的數(shù)如果為0,則可以省去不寫(xiě)。如:

SIGNALd1,d2,d3,d4,:INTEGERRANGE0TO255;d1<=10#170#;

--(十進(jìn)制表示等于170)d2<=16#FE#;--(十六進(jìn)制表示等于254)d3<=2#1111_1110#;--(二進(jìn)制表示等于254)d4<=8#376#;--(八進(jìn)制表示等于254)(4)物理量文字(VHDL綜合器不接受此類(lèi)文字)。如:20?s(20秒),50?m(50米),kΩ(千歐姆),100A(100安培)。2.字符串型文字

字符是用單引號(hào)引起來(lái)的ASCII字符,可以是數(shù)值,也可以是符號(hào)或字母,如:'R','a','*','Z','U','0','11'。(1)文字字符串。文字字符串是用雙引號(hào)引起來(lái)的一串文字,如:“ERROR”,“BothSandQequalto1”,“X”,“BB$CC”。(2)數(shù)位字符串。數(shù)位字符串也稱(chēng)位矢量,是預(yù)定義數(shù)據(jù)類(lèi)型為bit的數(shù)組。數(shù)位字符串與文字字符串相似,但所代表的是二進(jìn)制、八進(jìn)制或十六進(jìn)制的數(shù)組。數(shù)位字符串所代表的位矢量的長(zhǎng)度即為等值的二進(jìn)制數(shù)的位數(shù)。數(shù)字字符串?dāng)?shù)值的數(shù)據(jù)類(lèi)型是一維的枚舉型數(shù)組。與文字字符串的表示不同,數(shù)位字符串的表示首先要有計(jì)算基數(shù),然后將該基數(shù)表示的值放在雙引號(hào)中,基數(shù)符以“B”、“O”和“X”表示,并放在字符串的前面。它們的含義分別是:

B:二進(jìn)制基數(shù)符號(hào),表示二進(jìn)制位0或1,在字符串中的每一個(gè)位表示一個(gè)bit。O:八進(jìn)制基數(shù)符號(hào),在字符串中的每一個(gè)數(shù)代表一個(gè)八進(jìn)制數(shù),即代表一個(gè)3位(bit)的二進(jìn)制數(shù)。X:十六進(jìn)制基數(shù)符號(hào)(0~F),代表一個(gè)十六進(jìn)制數(shù),即代表一個(gè)4位的二進(jìn)制數(shù)。例如:

data1<=B"1_1101_1110"——二進(jìn)制數(shù)數(shù)組位矢數(shù)組長(zhǎng)度是9data2<=O"15"——八進(jìn)制數(shù)數(shù)組位矢數(shù)組長(zhǎng)度是63.標(biāo)識(shí)符

標(biāo)識(shí)符是最常用的操作符,標(biāo)識(shí)符可以是常數(shù)、變量、信號(hào)、端口、子程序或參數(shù)的名字。VHDL基本標(biāo)識(shí)符的書(shū)寫(xiě)遵守如下規(guī)則:(1)有效的字符:英文字母,包括大小寫(xiě)字母a~z,A~Z;數(shù)字,包括0~9以及下劃線(xiàn)“_”。(2)任何標(biāo)識(shí)符必須以英文字母開(kāi)頭,標(biāo)識(shí)符中的英語(yǔ)字母不區(qū)分大小寫(xiě)。(3)下劃線(xiàn)“_”前后都必須有英文字母或數(shù)字,同時(shí),一個(gè)標(biāo)識(shí)符中只能使用一個(gè)下劃線(xiàn)。(4)VHDL'93標(biāo)準(zhǔn)支持?jǐn)U展標(biāo)識(shí)符,擴(kuò)展標(biāo)識(shí)符以反斜杠來(lái)界定,可以以數(shù)字打頭,如\74LS373\、\HelloWorld\都是合法的標(biāo)識(shí)符。在擴(kuò)展標(biāo)識(shí)符中,允許包含圖形符號(hào)(如回車(chē)符換行符等),也允許包含空格符,如?\IRDY#\、\C/BE\、\AorB\等都是合法的標(biāo)識(shí)符。兩個(gè)反斜杠之前允許有多個(gè)下劃線(xiàn)相鄰,擴(kuò)展標(biāo)識(shí)符要分大小寫(xiě),擴(kuò)展標(biāo)識(shí)符與短標(biāo)識(shí)符不同,擴(kuò)展標(biāo)識(shí)符如果含有一個(gè)反斜杠,則用兩個(gè)反斜杠來(lái)代替它。支持?jǐn)U展標(biāo)識(shí)符的目的是免受1987標(biāo)準(zhǔn)中的短標(biāo)識(shí)符的限制,描述起來(lái)更為直觀和方便。但是目前仍有許多VHDL工具不支持?jǐn)U展標(biāo)識(shí)符。4.下標(biāo)名

下標(biāo)名用于指示數(shù)組型變量或信號(hào)的某一元素。下標(biāo)段名則用于指示數(shù)組型變量或信號(hào)的某一段元素。下標(biāo)名的語(yǔ)句格式如下:

標(biāo)識(shí)符(表達(dá)式)標(biāo)識(shí)符必須是數(shù)組型的變量或信號(hào)的名字,表達(dá)式所代表的值必須是數(shù)組下標(biāo)范圍中的一個(gè)值,這個(gè)值對(duì)應(yīng)數(shù)組中的一個(gè)元素。如果下標(biāo)名中的表達(dá)式是一個(gè)可計(jì)算的值,則此下名可很容易地進(jìn)行綜合。如果是不可計(jì)算的,則只能在特定的情況下綜合,且耗費(fèi)資源較大。5.段名

段名即多個(gè)下標(biāo)名的組合,段名對(duì)應(yīng)數(shù)組中某一段的元素。段名的表達(dá)形式是:標(biāo)識(shí)符(表達(dá)式方向表達(dá)式)這里的標(biāo)識(shí)符必須是數(shù)組類(lèi)型的信號(hào)名或變量名,每一個(gè)表達(dá)式的數(shù)值必須在數(shù)組元素下標(biāo)號(hào)范圍以?xún)?nèi),并且必須是可計(jì)算的(立即數(shù))。數(shù)據(jù)下標(biāo)的變化方向用TO或者DOWNTO來(lái)表示。TO表示數(shù)組下標(biāo)序列由低到高,如(2TO8);DOWNTO表示數(shù)組下標(biāo)序列由高到低,如(8DOWNTO2)。所以段中兩表達(dá)式值的方向必須與原數(shù)組一致。5.2.2

VHDL數(shù)據(jù)對(duì)象在VHDL中,數(shù)據(jù)對(duì)象(DataObjects)類(lèi)似于一種容器,可接受不同數(shù)據(jù)類(lèi)型的賦值。數(shù)據(jù)對(duì)象有三類(lèi),即變量(VARIABLE)、常量(CONSTANT)和信號(hào)(SIGNAL)。前兩種可以從傳統(tǒng)的計(jì)算機(jī)高級(jí)語(yǔ)言中找到對(duì)應(yīng)的數(shù)據(jù)類(lèi)型,其語(yǔ)言行為與高級(jí)語(yǔ)言中的變量和常量十分相似。但信號(hào)這一數(shù)據(jù)對(duì)象比較特殊,它具有更多的硬件特征,是VHDL中最有特色的語(yǔ)言要素之一。從硬件電路系統(tǒng)來(lái)看,變量和信號(hào)相當(dāng)于組合電路系統(tǒng)中門(mén)與門(mén)間的連線(xiàn)及其連線(xiàn)上的信號(hào)值;常量相當(dāng)于電路中的恒定電平,如GND或VCC接口的電平。從行為仿真和VHD語(yǔ)句功能上看,信號(hào)與變量具有比較明顯的區(qū)別,其差異主要表現(xiàn)在接受和保持信號(hào)的方式及信息保持與轉(zhuǎn)遞的區(qū)域大小上。例如信號(hào)可以設(shè)置傳輸延遲量,而變量則不能;變量只能作為局部的信息載體,如只能在所定義的進(jìn)程中有效,而信號(hào)則可作為模塊間的信息載體,如在結(jié)構(gòu)體中各進(jìn)程間傳遞信息。變量的設(shè)置有時(shí)只是一種過(guò)渡,最后的信息傳輸和界面間的通信都靠信號(hào)來(lái)完成。綜合后的VHDL文件中信號(hào)將對(duì)應(yīng)更多的硬件結(jié)構(gòu)。但需注意的是,對(duì)于信號(hào)和變量的認(rèn)識(shí)單從行為仿真和語(yǔ)法要求的角度去認(rèn)識(shí)是不完整的。事實(shí)上,在許多情況下,綜合后所對(duì)應(yīng)的硬件電路結(jié)構(gòu)中信號(hào)和變量并沒(méi)有什么區(qū)別,例如在滿(mǎn)足一定條件的進(jìn)程中,綜合后它們都能引入寄存器。其關(guān)鍵在于,它們都具有能夠接受賦值這一重要的共性,而VHDL綜合器并不理會(huì)它們?cè)诮邮苜x值時(shí)存在的延時(shí)特性(只有VHDL行為仿真器才會(huì)考慮這一特性差異)。1.變量(VARIABLE)在VHDL語(yǔ)法規(guī)則中,變量是一個(gè)局部量,只能在進(jìn)程和子程序中使用。變量不能將信息帶出定義它的當(dāng)前設(shè)計(jì)單元。變量的賦值是一種理想化的數(shù)據(jù)傳輸,是立即發(fā)生,不存在任何延時(shí)的行為。VHDL語(yǔ)言規(guī)則不支持變量附加延時(shí)語(yǔ)句。變量常用在實(shí)現(xiàn)某種算法的賦值語(yǔ)句中。定義變量的語(yǔ)法格式如下:

VARIABLE變量名數(shù)據(jù)類(lèi)型:=初始值

例如,下列變量定義語(yǔ)句分別定義a為整數(shù)型變量;b和c也為整數(shù)型變量,初始值為2;d為標(biāo)準(zhǔn)位變量:VARIABLEa:INTEGER;VARIABLEb,c:INTEGER:=2;VARIABLEd:STD_LOGIC;如前所述,變量作為局部量,其適用范圍僅限于定義了變量的進(jìn)程或子程序中。但仿真過(guò)程中唯一的例外是共享變量。共享變量的值將隨變量賦值語(yǔ)句的運(yùn)算結(jié)果而改變。變量定義語(yǔ)句中的初始值可以是一個(gè)與變量具有相同數(shù)據(jù)類(lèi)型的常數(shù)值,也可以是一個(gè)全局靜態(tài)表達(dá)式,這個(gè)表達(dá)式的數(shù)據(jù)類(lèi)型必須與所賦值的變量一致。此初始值不是必需的,綜合過(guò)程中綜合器將略去所有的初始值。變量賦值語(yǔ)句的語(yǔ)法格式如下:

目標(biāo)變量名:=表達(dá)式

變量賦值符號(hào)是“:=”,變量數(shù)值的改變是通過(guò)變量賦值來(lái)實(shí)現(xiàn)的。賦值語(yǔ)句右方的表達(dá)式必須是一個(gè)與目標(biāo)變量具有相同數(shù)據(jù)類(lèi)型的數(shù)值,這個(gè)表達(dá)式可以是一個(gè)運(yùn)算表達(dá)式,也可以是一個(gè)數(shù)值。通過(guò)賦值操作,新的變量值的獲得是立刻發(fā)生的。變量賦值語(yǔ)句左邊的目標(biāo)變量可以是單值變量,也可以是一個(gè)變量的集合,即數(shù)組型變量。2.信號(hào)(SIGNAL)信號(hào)是描述硬件系統(tǒng)的基本數(shù)據(jù)對(duì)象,它類(lèi)似于連接線(xiàn)。信號(hào)可以作為設(shè)計(jì)實(shí)體中并行語(yǔ)句模塊間的信息交流通道(交流來(lái)自順序語(yǔ)句結(jié)構(gòu)中的信息)。在VHDL中,信號(hào)及其相關(guān)的信號(hào)賦值語(yǔ)句、決斷函數(shù)、延時(shí)語(yǔ)句等很好地描述了硬件系統(tǒng)的許多基本特征,如硬件系統(tǒng)運(yùn)行的并行性、信號(hào)傳輸過(guò)程中的延遲特性、多驅(qū)動(dòng)源的總線(xiàn)行為等。信號(hào)作為一種數(shù)值容器,不但可以容納當(dāng)前值,也可以保持歷史值。這一屬性與觸發(fā)器的記憶功能有很好的對(duì)應(yīng)關(guān)系,信號(hào)定義的語(yǔ)句格式與變量非常相似,信號(hào)定義也可以設(shè)置初始值,它的定義格式如下:SIGNAL信號(hào)名:數(shù)據(jù)類(lèi)型:=初始值;同樣,信號(hào)初始值的設(shè)置不是必需的,而且初始值僅在VHDL的行為仿真中有效。與變量相比,信號(hào)的硬件特征更為明顯,它具有全局性特征。例如,在程序包中定義的信號(hào),對(duì)于所有調(diào)用此程序包的設(shè)計(jì)實(shí)體都是可見(jiàn)(可直接調(diào)用)的;在實(shí)體中定義的信號(hào),在其對(duì)應(yīng)的結(jié)構(gòu)體中都是可見(jiàn)的。事實(shí)上。除了沒(méi)有方向說(shuō)明以外,信號(hào)與實(shí)體的端口(Port)概念是一致的。對(duì)于端口來(lái)說(shuō),其區(qū)別只是輸出端口不能讀入數(shù)據(jù),輸入端口不能被賦值。信號(hào)可以看成是實(shí)體內(nèi)部的端口。反之,實(shí)體的端口只是一種隱形的信號(hào),端口的定義實(shí)質(zhì)上是作了隱式的信號(hào)定義,并附加了數(shù)據(jù)流動(dòng)的方向。信號(hào)本身的定義是一種顯式的定義。因此,在實(shí)體中定義的端口,在其結(jié)構(gòu)體中都可以看成是一個(gè)信號(hào)并加以使用,而不必另作定義。以下是信號(hào)的定義示例:

SIGNALtemp:STD_LOGIC:=0;SIGNALflagaflagb:BIT;SIGNALdata:STD_LOGIC_VECTOR(15DOWNTO0);SIGNALa:INTEGERRANGE0TO15;此外,需要注意,信號(hào)的使用和定義范圍是實(shí)體、結(jié)構(gòu)體和程序包。在進(jìn)程和子程序中,不允許定義信號(hào)。信號(hào)可以有多個(gè)驅(qū)動(dòng)源,或者說(shuō)是賦值信號(hào)源,但必須將此信號(hào)的數(shù)據(jù)類(lèi)型定義為決斷性數(shù)據(jù)類(lèi)型。需要特別注意的是,在進(jìn)程中,只能將信號(hào)列入敏感表,而不能將變量列入敏感表??梢?jiàn)進(jìn)程只對(duì)信號(hào)敏感,而對(duì)變量不敏感,這是因?yàn)?,只有信?hào)才能把進(jìn)程外的信息帶入進(jìn)程內(nèi)部。當(dāng)信號(hào)定義了數(shù)據(jù)類(lèi)型和表達(dá)方式后,在VHDL設(shè)計(jì)中就能對(duì)信號(hào)進(jìn)行賦值了。信號(hào)的賦值語(yǔ)句表達(dá)式如下:目標(biāo)信號(hào)名<=表達(dá)式;

其中,這里的表達(dá)式可以是一個(gè)運(yùn)算表達(dá)式,也可以是數(shù)據(jù)對(duì)象(變量、信號(hào)或常量)。符號(hào)“<=”表示賦值操作,即將數(shù)據(jù)信息傳入。數(shù)據(jù)信息的傳入可以設(shè)置延時(shí)量。因此目標(biāo)信號(hào)獲得傳入的數(shù)據(jù)并不是即時(shí)的。即使是零延時(shí)(不作任何顯式的延時(shí)設(shè)置),也要經(jīng)歷一個(gè)特定的延時(shí)過(guò)程。因此,符號(hào)“<=”兩邊的數(shù)值并不總是一致的,這與實(shí)際器件的傳播延遲特性十分接近,顯然這與變量的賦值過(guò)程有很大差別。所以,賦值符號(hào)用“<=”而非“:=”。但須注意,信號(hào)的初始賦值符號(hào)仍是“:=”,這是因?yàn)榉抡娴臅r(shí)間坐標(biāo)是從初始賦值開(kāi)始的,在此之前無(wú)所謂延時(shí)時(shí)間。以下是三個(gè)賦值語(yǔ)句示例:x<=9;y<=x;Z<=xAFTER5ns;第三句信號(hào)的賦值是在5ns后將x賦予z的,關(guān)鍵詞AFTER后是延遲時(shí)間值,在這一點(diǎn)上,與變量的賦值很不相同,盡管如前所述,綜合器在綜合過(guò)程中將略去所設(shè)的延時(shí)值,但是即使沒(méi)有利用AFTER關(guān)鍵詞設(shè)置信號(hào)的賦值延時(shí)值,任何信號(hào)賦值都是存在延時(shí)的。在綜合后的功能仿真中,信號(hào)或變量間的延時(shí)是被看成零延時(shí)的,但為了給信息傳輸?shù)南群笞鞒龇线壿嫷呐判?,將自?dòng)設(shè)置一個(gè)小的延時(shí)量,即所謂的延時(shí)量。延時(shí)量在仿真中即為一個(gè)VHDL模擬器的最小分辯時(shí)間。信號(hào)的賦值可以出現(xiàn)在一個(gè)進(jìn)程中,也可以直接出現(xiàn)在結(jié)構(gòu)體中的并行語(yǔ)句結(jié)構(gòu)中,但它們運(yùn)行的含義是不一樣的。前者屬順序信號(hào)賦值,這時(shí)的信號(hào)賦值操作要視進(jìn)程是否已被啟動(dòng)而定,后者屬并行信號(hào)賦值,其賦值操作是各自獨(dú)立并行地發(fā)生的。3.常數(shù)(CONSTANT)常數(shù)的定義和設(shè)置主要是為了使設(shè)計(jì)實(shí)體中的常數(shù)更容易閱讀和修改。例如,將位矢的寬度定義為一個(gè)常量,只要修改這個(gè)常量就能很容易地改變寬度,從而改變硬件結(jié)構(gòu)。在程序中,常量是一個(gè)恒定不變的值,一旦作了數(shù)據(jù)類(lèi)型和賦值定義后,在程序中不能再改變,因而具有全局性意義。常量的定義形式與變量十分相似,其形式如下:CONSTANT常數(shù)名數(shù)據(jù)類(lèi)型:=表達(dá)式;例如:CONSTANTfbus:BIT_VECTOR:="010115";--位矢數(shù)據(jù)類(lèi)型CONSTANTVcc:REAL:=5.0;--實(shí)數(shù)數(shù)據(jù)類(lèi)型CONSTANTdely:TIME:=25ns;--時(shí)間數(shù)據(jù)類(lèi)型

VHDL要求所定義的常量數(shù)據(jù)類(lèi)型必須與表達(dá)式的數(shù)據(jù)類(lèi)型一致。常量的數(shù)據(jù)類(lèi)型可以是標(biāo)量類(lèi)型或復(fù)合類(lèi)型,但不能是文件類(lèi)型(file)或存取類(lèi)型(Access)。常量定義語(yǔ)句所允許的設(shè)計(jì)單元有實(shí)體、結(jié)構(gòu)體、程序包、塊、進(jìn)程和子程序。5.2.3

VHDL數(shù)據(jù)類(lèi)型在數(shù)據(jù)對(duì)象的定義中,必不可少的就是設(shè)定所定義的數(shù)據(jù)對(duì)象的數(shù)據(jù)類(lèi)型(TYPES),并且要求此對(duì)象的賦值源也必須是相同的數(shù)據(jù)類(lèi)型。這是因?yàn)閂HDL是一種強(qiáng)類(lèi)型語(yǔ)言,對(duì)運(yùn)算關(guān)系與賦值關(guān)系中各量(操作數(shù))的數(shù)據(jù)類(lèi)型有嚴(yán)格要求。VHDL要求設(shè)計(jì)實(shí)體中的每一個(gè)常數(shù)、信號(hào)、變量、函數(shù)以及設(shè)定的各種參量都必須具有確定的數(shù)據(jù)類(lèi)型,并且相同數(shù)據(jù)類(lèi)型的量才能互相傳遞和作用。VHDL作為強(qiáng)類(lèi)型語(yǔ)言的好處是使VHDL編譯或綜合工具很容易地找出設(shè)計(jì)中的各種常見(jiàn)錯(cuò)誤。VHDL中的各種預(yù)定義數(shù)據(jù)類(lèi)型大多數(shù)體現(xiàn)了硬件電路的不同特性,因此也為其他大多數(shù)硬件描述語(yǔ)言所采納。例如BIT,可以描述電路中的開(kāi)關(guān)信號(hào)。VHDL中的數(shù)據(jù)類(lèi)型可以分成四大類(lèi)。(1)標(biāo)量型(ScalarType),屬單元素的最基本的數(shù)據(jù)類(lèi),即不可能再有更小、更基本的數(shù)據(jù)類(lèi)型。它們通常用于描述一個(gè)單值數(shù)據(jù)對(duì)象。標(biāo)量類(lèi)型包括:實(shí)數(shù)類(lèi)型、整數(shù)類(lèi)型、枚舉類(lèi)型、時(shí)間類(lèi)型。(2)復(fù)合類(lèi)型(CompositeType),可以由更細(xì)小的數(shù)據(jù)類(lèi)型復(fù)合而成,如可由標(biāo)量型復(fù)合而成。復(fù)合類(lèi)型主要有數(shù)組型(Array)和記錄型(Record)。(3)存取類(lèi)型(AccessType),為給定的數(shù)據(jù)類(lèi)型的數(shù)據(jù)對(duì)象提供存取方式。(4)文件類(lèi)型(FilesType),用于提供多值存取類(lèi)型。這四大數(shù)據(jù)類(lèi)型又可分成在現(xiàn)成程序包中可以隨時(shí)獲得的預(yù)定義數(shù)據(jù)類(lèi)型和用戶(hù)自定義數(shù)據(jù)類(lèi)型兩大類(lèi)別。預(yù)定義的VHDL數(shù)據(jù)類(lèi)型是VHDL最常用,最基本的數(shù)據(jù)類(lèi)型。這些數(shù)據(jù)類(lèi)型都已在VHDL的標(biāo)準(zhǔn)程序包STANDARD和STD_LOGIC_1164及其他的標(biāo)準(zhǔn)程序包中作了定義,并可在設(shè)計(jì)中隨時(shí)調(diào)用。VHDL允許用戶(hù)自己定義其他的數(shù)據(jù)類(lèi)型以及子類(lèi)型。通常,新定義的數(shù)據(jù)類(lèi)型和子類(lèi)型的基本元素一般仍屬VHDL的預(yù)定義數(shù)據(jù)類(lèi)型,盡管VHDL仿真器支持所有的數(shù)據(jù)類(lèi)型,但VHDL綜合器并不支持所有的預(yù)定義數(shù)據(jù)類(lèi)型和用戶(hù)定義的數(shù)據(jù)類(lèi)型,如不支持REAL、TIME、FILE等數(shù)據(jù)類(lèi)型。在綜合中,它們將被忽略或宣布為不支持,這意味著,不是所有的數(shù)據(jù)類(lèi)型都能在目前的數(shù)字系統(tǒng)硬件中實(shí)現(xiàn)。由于在綜合后,所有進(jìn)入綜合的數(shù)據(jù)類(lèi)型都轉(zhuǎn)換成二進(jìn)制類(lèi)型和高阻態(tài)類(lèi)型(只有部分芯片支持內(nèi)部高阻態(tài)),即電路網(wǎng)表中的二進(jìn)制信號(hào),綜合器通常會(huì)忽略不能綜合的數(shù)據(jù)類(lèi)型,并給出警告信息。1.?VHDL的預(yù)定義數(shù)據(jù)類(lèi)型VHDL的預(yù)定義數(shù)據(jù)類(lèi)型都是在VHDL標(biāo)準(zhǔn)程序包STANDARD中定義的,在實(shí)際使用中,已自動(dòng)包含進(jìn)VHDL的源文件中,因而不必通過(guò)USE語(yǔ)句以顯式調(diào)用。1)布爾(BOOLEAN)數(shù)據(jù)類(lèi)型

布爾數(shù)據(jù)類(lèi)型實(shí)際上是一個(gè)二值枚舉型數(shù)據(jù)類(lèi)型。布爾量不屬于數(shù)值,因此不能用于運(yùn)算,它只能通過(guò)關(guān)系運(yùn)算符獲得。2)位(BIT)數(shù)據(jù)類(lèi)型

位數(shù)據(jù)類(lèi)型也屬于枚舉型,取值只能是1或者0。位數(shù)據(jù)類(lèi)型的數(shù)據(jù)對(duì)象,如變量、信號(hào)等,可以參與邏輯運(yùn)算,運(yùn)算結(jié)果仍是位的數(shù)據(jù)類(lèi)型。3)位矢量(BIT_VECTOR)數(shù)據(jù)類(lèi)型位矢量是基于BIT數(shù)據(jù)類(lèi)型的數(shù)組,使用位矢量必須注明位寬,即數(shù)組中的元素個(gè)數(shù)和排列方式,例如:SIGNALa:BIT_VECTOR(7TO0);其中,信號(hào)a被定義為一個(gè)具有8位位寬的矢量,它的最左位是a(7),最右位是a(0)。4)字符(CHARACTER)數(shù)據(jù)類(lèi)型

字符類(lèi)型通常用單引號(hào)引起來(lái),如'A'。字符類(lèi)型要區(qū)分大小寫(xiě),如'B'

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論