




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第5章VHDL硬件描述語言第5章VHDL硬件描述語言5.1
VHDL程序結(jié)構(gòu)一個(gè)完整的VHDL程序基本結(jié)構(gòu)通常應(yīng)包含:庫(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)成最簡單的VHDL程序。實(shí)體是設(shè)計(jì)實(shí)體的組成部分,它包含了對設(shè)計(jì)實(shí)體輸入和輸出的定義與說明,而設(shè)計(jì)實(shí)體則包含了實(shí)體和結(jié)構(gòu)體這兩個(gè)在VHDL程序中的最基本的部分。VHDL程序結(jié)構(gòu)的一個(gè)顯著特點(diǎn)就是,任何一個(gè)完整的設(shè)計(jì)實(shí)體都可以分成內(nèi)外兩個(gè)部分,外面的部分稱為可視部分,它由實(shí)體名和端口組成;里面的部分稱為不可視部分,由實(shí)際的功能描述組成。一旦對已完成的設(shè)計(jì)實(shí)體定義了可視界面后,其他的設(shè)計(jì)實(shí)體就可以將其作為已開發(fā)好的成果直接調(diào)用,這正是一種基于自頂向下的多層次的系統(tǒng)設(shè)計(jì)概念的實(shí)現(xiàn)途徑。5.1.1庫(LIBRARY)
為了提高設(shè)計(jì)效率以及使設(shè)計(jì)遵循統(tǒng)一的語言標(biāo)準(zhǔn)或數(shù)據(jù)格式,有必要將一些有用的信息匯集在一個(gè)或幾個(gè)庫中以供調(diào)用。這些信息可以是預(yù)先定義好的數(shù)據(jù)類型、子程序等設(shè)計(jì)單元的集合體(程序包),也可以是預(yù)先設(shè)計(jì)好的各種設(shè)計(jì)實(shí)體(元件庫程序包)。如果要在一項(xiàng)VHDL設(shè)計(jì)中用到某一程序包,就必須在這項(xiàng)設(shè)計(jì)中預(yù)先打開這個(gè)程序包,使此設(shè)計(jì)能隨時(shí)使用這一程序包中的內(nèi)容。為此,必須在這一設(shè)計(jì)實(shí)體前使用庫語句和USE語句。一般地,在VHDL程序中被聲明打開的庫和程序包,對于本項(xiàng)設(shè)計(jì)是可視的,這些庫中的內(nèi)容可以在設(shè)計(jì)中調(diào)用。通常,庫中放置不同數(shù)量的程序包,而程序包中又可放置不同數(shù)量的子程序,子程序中又含有函數(shù)、過程、設(shè)計(jì)實(shí)體(元件)等基礎(chǔ)設(shè)計(jì)單元。VHDL庫分為兩類:一類是設(shè)計(jì)庫,如在具體設(shè)計(jì)項(xiàng)目中設(shè)定的目錄所對應(yīng)的WORK庫;另一類是資源庫,資源庫是常規(guī)元件和標(biāo)準(zhǔn)模塊存放的庫,如IEEE庫。設(shè)計(jì)庫對當(dāng)前項(xiàng)目是默認(rèn)可視的,無需用LIBRARY和USE等語句以顯式聲明。聲明庫(LIBRARY)的語句格式如下:
LIBRARY庫名;
這一語句即相當(dāng)于為其后的設(shè)計(jì)實(shí)體打開指定的庫,以便設(shè)計(jì)實(shí)體可以利用其中的程序包。如語句“LIBRARYIEEE;”表示打開IEEE庫。1.庫的種類VHDL程序設(shè)計(jì)中常用的庫有以下幾種:
1)?IEEE庫
IEEE庫是VHDL設(shè)計(jì)中最為常見的庫。IEEE庫中的標(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庫。最常用的是Synopsy公司的STD_LOGIC_ARITH、STD_LOGIC_SIGNED和STD_LOGIC_UNSIGNED程序包。2)?STD庫VHDL語言標(biāo)準(zhǔn)定義了兩個(gè)標(biāo)準(zhǔn)程序包,即STANDARD和TEXTIO程序包(文件輸入/輸出程序包),它們都被收入在STD庫中,只要在VHDL應(yīng)用環(huán)境中,即可隨時(shí)調(diào)用這兩個(gè)程序包中的所有內(nèi)容,即在編譯和綜合過程中VHDL的每一項(xiàng)設(shè)計(jì)都自動(dòng)地將其包含進(jìn)去了。由于STD庫符合VHDL語言標(biāo)準(zhǔn),在應(yīng)用中不必如IEEE庫那樣一定要顯式聲明之,如在程序中,以下的庫語句是不必要的:
LIBRARYSTD;
USESTD.STANDARD.ALL;3)?WORK庫WORK庫是用戶的VHDL設(shè)計(jì)的現(xiàn)行工作庫,用于存放用戶設(shè)計(jì)和定義的一些設(shè)計(jì)單元和程序包,用戶設(shè)計(jì)項(xiàng)目的成品、半成品模塊以及先期已設(shè)計(jì)好的元件都放在其中。WORK庫自動(dòng)滿足VHDL語言標(biāo)準(zhǔn),在實(shí)際調(diào)用中,也不以顯式方式預(yù)先說明?;赩HDL所要求的WORK庫的基本概念,在PC或工作站上利用VHDL進(jìn)行項(xiàng)目設(shè)計(jì),不允許在根目錄下進(jìn)行,必須設(shè)定一個(gè)專門的目錄,用于保存項(xiàng)目的所有設(shè)計(jì)文件,VHDL綜合器將此目錄默認(rèn)為WORK庫。但必須注意,工作庫并不是這個(gè)目錄的目錄名,而是一個(gè)邏輯名。綜合器將指示器指向該目錄的路徑。VHDL標(biāo)準(zhǔn)規(guī)定工作庫總是可見的,因此,不必在VHDL程序中明確指定。4)?VITAL庫VITAL庫因而只在VHDL仿真器中使用,可以用于提高VHDL門級時(shí)序模擬的精度。庫中包含時(shí)序程序包VITAL_TIMING和VITAL_PRIMITIVES。VITAL庫已經(jīng)成為IEEE標(biāo)準(zhǔn),在當(dāng)前的VHDL仿真器的庫中,VITAL庫中的程序包都已經(jīng)并到了IEEE庫中。在VHDL設(shè)計(jì)中,有的EDA工具將一些程序包和設(shè)計(jì)單元放在一個(gè)目錄下,而將此目錄名(如“WORK”)作為庫名,如Synplicity公司的Synplify。有的EDA工具是通過配置語句結(jié)構(gòu)來指定庫和庫中的程序包,這時(shí)的配置即成為一個(gè)設(shè)計(jì)實(shí)體中最頂層的設(shè)計(jì)單元。此外,用戶還可以自己定義一些庫,將自己的設(shè)計(jì)內(nèi)容或通過交流獲得的程序包設(shè)計(jì)實(shí)體并入這些庫中。2.庫的用法
在VHDL語言中,庫的說明語句總是放在實(shí)體單元前面。這樣,在設(shè)計(jì)實(shí)體內(nèi)的語句時(shí)就可以使用庫中的數(shù)據(jù)和文件。由此可見,庫的用處在于使設(shè)計(jì)者可以共享已經(jīng)編譯過的設(shè)計(jì)成果。VHDL允許在一個(gè)設(shè)計(jì)實(shí)體中同時(shí)打開多個(gè)不同的庫,但庫之間必須是相互獨(dú)立的。例如:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;表示打開IEEE庫,再打開此庫中的STD_LOGIC_1164和STD_LOGIC_UNSIGNED程序包的所有內(nèi)容。由此可見,在實(shí)際使用中,庫是以程序包集合的方式存在的,具體調(diào)用的是程序包中的內(nèi)容。因此對于任一VHDL設(shè)計(jì),所需從庫中調(diào)用的程序包在設(shè)計(jì)中應(yīng)是可見的,可調(diào)出的,即以明確的語句表達(dá)方式加以定義,庫語句指明庫中的程序包以及包中的待調(diào)用文件。對于必須以顯式表達(dá)的庫及其程序包的語言表達(dá)式,應(yīng)放在每一項(xiàng)設(shè)計(jì)實(shí)體最前面,成為這項(xiàng)設(shè)計(jì)的最高層次的設(shè)計(jì)單元。庫語句一般必須與USE語句同時(shí)使用。庫語句關(guān)鍵詞LIBRARY指明所使用的庫名,USE語句指明庫中的程序包。一旦說明了庫和程序包,整個(gè)設(shè)計(jì)實(shí)體都可進(jìn)入訪問或調(diào)用,但其作用范圍僅限于所說明的設(shè)計(jì)實(shí)體。VHDL要求一項(xiàng)含有多個(gè)設(shè)計(jì)實(shí)體的更大的系統(tǒng)中,每一個(gè)設(shè)計(jì)實(shí)體都必須有自己完整的庫說明語句和USE語句。USE語句的使用將使所說明的程序包對本設(shè)計(jì)實(shí)體部分或全部開放??梢暤腢SE語句的使用有兩種常用格式:
USE庫名.程序包名.項(xiàng)目名;
USE庫名.程序包名.ALL;第一語句格式的作用是向本設(shè)計(jì)實(shí)體開放指定庫中的特定程序包內(nèi)所選定的項(xiàng)目。第二語句格式的作用是向本設(shè)計(jì)實(shí)體開放指定庫中的特定程序包內(nèi)所有的內(nèi)容。合法的USE語句的使用方法是,將USE語句說明中所要開放的設(shè)計(jì)實(shí)體對象緊跟在USE語句之后。例如,語句
USEIEEE.STD_LOGIC_1164.ALL;
表明打開IEEE庫中的STD_LOGIC_1164程序包,并使程序包中所有的公共資源對于本語句后面的VHDL設(shè)計(jì)實(shí)體程序全部開放,即該語句后的程序可任意使用程序包中的公共資源,這里用到了關(guān)鍵詞“ALL”,代表程序包中所有的資源。5.1.2程序包(PACKAGE)已在設(shè)計(jì)實(shí)體中定義的數(shù)據(jù)類型、子程序或數(shù)據(jù)對象對于其他設(shè)計(jì)實(shí)體是不可用的,或者說是不可見的,為了使已定義的常數(shù)、數(shù)據(jù)類型、元件調(diào)用說明以及子程序能被更多的VHDL設(shè)計(jì)實(shí)體方便地訪問和共享,可以將它們收集在一個(gè)VHDL程序包中。多個(gè)程序包可以并入一個(gè)VHDL庫中,使之適用于更一般的訪問和調(diào)用范圍。這一點(diǎn)對于大系統(tǒng)開發(fā),多個(gè)或多組開發(fā)人員同步并行工作顯得尤為重要。程序包的內(nèi)容主要由如下四種基本結(jié)構(gòu)組成,因此一個(gè)程序包至少應(yīng)包含以下結(jié)構(gòu)中的一種。(1)常數(shù)說明:在程序包中的常數(shù)說明結(jié)構(gòu)用于預(yù)定義系統(tǒng)的寬度,如數(shù)據(jù)總線通道的寬度。(2)VHDL數(shù)據(jù)類型說明:這是在整個(gè)設(shè)計(jì)中通用的數(shù)據(jù)類型,例如通用的地址總線數(shù)據(jù)類型定義等。(3)元件定義:規(guī)定在VHDL設(shè)計(jì)中參與文件例化的文件對外的接口界面。(4)子程序:并入程序包的子程序有利于在設(shè)計(jì)中任一處被方便地調(diào)用。通常程序包中的內(nèi)容應(yīng)具有更大的適用面和良好的獨(dú)立性,以供各種不同設(shè)計(jì)需求的調(diào)用,一旦定義了一個(gè)程序包,各種獨(dú)立的設(shè)計(jì)就能方便地調(diào)用。定義程序包的一般語句結(jié)構(gòu)如下:
PACKAGE程序包名IS--程序包首
程序包首說明部分
END程序包名;
PACKAGEBODY程序包名IS--程序包體
程序包體說明部分以及包體內(nèi)容
END程序包名;
程序包的結(jié)構(gòu)由程序包的說明部分(即程序包首)和程序包的內(nèi)容部分(即程序包體)兩部分組成。一個(gè)完整的程序包中,程序包首的程序包名與程序包體的程序包名是同一個(gè)名字。1.程序包首
程序包首的說明部分可收集多個(gè)不同的VHDL設(shè)計(jì)所需的公共信息,其中包括數(shù)據(jù)類型說明、信號說明、子程序說明及元件說明等。所有這些信息雖然也可以在每一個(gè)設(shè)計(jì)實(shí)體中進(jìn)行逐一單獨(dú)的定義和說明,但如果將這些經(jīng)常用到的并具有一般性的說明定義放在程序包中供隨時(shí)調(diào)用,顯然可以提高設(shè)計(jì)的效率和程序的可讀性。2.程序包體程序包體將包括在程序包首中已定義的子程序的子程序體。程序包體說明部分的組成內(nèi)容可以包括USE語句(允許對其他程序包的調(diào)用)、子程序定義、子程序體、數(shù)據(jù)類型說明、子類型說明和常數(shù)說明等。對于沒有具體子程序說明的程序包體,則可以省去。程序包常用來封裝屬于多個(gè)設(shè)計(jì)單元共同分享的信息。常用的預(yù)定義的程序包有以下幾種:
1)?STD_LOGIC_1164程序包
STD_LOGIC_1164程序包是IEEE庫中最常用的程序包,是IEEE的標(biāo)準(zhǔn)程序包,其中包含了一些數(shù)據(jù)類型、子類型和函數(shù)的定義,這些定義將VHDL擴(kuò)展為一個(gè)能描述多值邏輯(0、1、高阻態(tài)“Z”、不定態(tài)“X”等)的硬件描述語言,很好地滿足了實(shí)際數(shù)字系統(tǒng)的設(shè)計(jì)需求。STD_LOGIC_1164程序包中用得最多和最廣的是定義了滿足工業(yè)標(biāo)準(zhǔn)的兩個(gè)數(shù)據(jù)類型STD_LOGIC和STD_LOGIC_VECTOR,它們非常適合于FPGA/CPLD器件中多值邏輯設(shè)計(jì)結(jié)構(gòu)。2)?STD_LOGIC_ARITH程序包STD_LOGIC_ARITH預(yù)先編譯在IEEE庫中,是Synopsys公司的程序包。此程序包在STD_LOGIC_1164程序包的基礎(chǔ)上,擴(kuò)展了三個(gè)數(shù)據(jù)類型,分別是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庫中。這些程序包重載了可用于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)算符考慮到了符號,是有符號數(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庫中的預(yù)編譯程序包。STANDARD程序包中定義了許多基本的數(shù)據(jù)類型、子類型和函數(shù)。由于STANDARD程序包是VHDL標(biāo)準(zhǔn)程序包,實(shí)際應(yīng)用中已隱性地打開了,所以不必再用USE語句另作聲明。TEXTIO程序包定義了支持文本文件操作的許多類型和子程序,在使用本程序包之前,需加語句USESTD.TEXTIO.ALL。TEXTIO程序包主要僅供仿真器使用,可以用文本編輯器建立一個(gè)數(shù)據(jù)文件,文件中包含仿真時(shí)需要的數(shù)據(jù),然后仿真時(shí)用TEXTIO程序包中的子程序存取這些數(shù)據(jù)。5.1.3實(shí)體(ENTITY)
實(shí)體作為一個(gè)設(shè)計(jì)實(shí)體的組成部分,其功能是對這個(gè)設(shè)計(jì)實(shí)體與外部電路進(jìn)行接口描述。實(shí)體是設(shè)計(jì)實(shí)體的表層設(shè)計(jì)單元,實(shí)體說明部分規(guī)定了設(shè)計(jì)單元的輸入輸出接口信號或引腳,它是設(shè)計(jì)實(shí)體對外的一個(gè)通信界面。就一個(gè)設(shè)計(jì)實(shí)體而言,外界所看到的僅僅是它的界面上的各種接口。設(shè)計(jì)實(shí)體可以擁有一個(gè)或多個(gè)結(jié)構(gòu)體,用于描述此設(shè)計(jì)實(shí)體的邏輯結(jié)構(gòu)和邏輯功能。對于外界來說,這一部分是不可見的。不同邏輯功能的設(shè)計(jì)實(shí)體可以擁有相同的實(shí)體描述,這是因?yàn)閷?shí)體類似于原理圖中的一個(gè)部件符號,而其具體的邏輯功能是由設(shè)計(jì)實(shí)體中結(jié)構(gòu)體的描述確定的。實(shí)體是VHDL的基本設(shè)計(jì)單元,它可以對一個(gè)門電路、一個(gè)芯片、一塊電路板乃至整個(gè)系統(tǒng)進(jìn)行接口描述。1.實(shí)體語句結(jié)構(gòu)
實(shí)體說明單元的常用語句結(jié)構(gòu)為
ENTITY實(shí)體名IS[GENERIC(類屬表)PORT(端口表)]ENDENTITY實(shí)體名
實(shí)體說明單元必須按照這一結(jié)構(gòu)來編寫,實(shí)體應(yīng)以語句“ENTITY實(shí)體名IS”開始,以語句“ENDENTITY實(shí)體名;”結(jié)束,其中的實(shí)體名可以由設(shè)計(jì)者自己添加。方括號中間的語句描述,在特定的情況下并非是必需的,程序文字的大小寫是不加區(qū)分的。2.實(shí)體名在實(shí)體中定義的實(shí)體名即為這個(gè)設(shè)計(jì)實(shí)體的名稱。MAX
+
plusⅡ軟件對VHDL文件的取名有特殊要求,要求文件名必須與實(shí)體名一致。3.?GENERIC類屬說明語句
類屬GENERIC參量是一種端口界面常數(shù),常以一種說明的形式放在實(shí)體或塊結(jié)構(gòu)體前的說明部分。類屬為所說明的環(huán)境提供了一種靜態(tài)信息通道。類屬與常數(shù)不同,常數(shù)只能從設(shè)計(jì)實(shí)體的內(nèi)部得到賦值,且不能再改變,而類屬的值可以由設(shè)計(jì)實(shí)體外部提供。因此,設(shè)計(jì)者可以從外面通過類屬參量的重新設(shè)定而容易地改變一個(gè)設(shè)計(jì)實(shí)體或一個(gè)元件的內(nèi)部電路結(jié)構(gòu)和規(guī)模。類屬說明的一般書寫格式如下:
GENERIC(常數(shù)名:數(shù)據(jù)類型:設(shè)定值;
常數(shù)名:數(shù)據(jù)類型:設(shè)定值);
類屬參量以關(guān)鍵詞GENERIC引導(dǎo)一個(gè)類屬參量表,在表中提供時(shí)間參數(shù)或總線寬度等靜態(tài)信息。類屬表說明用于設(shè)計(jì)實(shí)體和其外部環(huán)境通信的參數(shù),傳遞靜態(tài)的信息。類屬在所定義的環(huán)境中的地位與常數(shù)十分接近,但卻能從環(huán)境(如設(shè)計(jì)實(shí)體)外部動(dòng)態(tài)地接受賦值,其行為又有點(diǎn)類似于端口PORT。因此,常如以上的實(shí)體定義語句那樣,將類屬說明放在其中,且放在端口說明語句的前面。例5.1
2輸入與門的實(shí)體描述如下:
ENTITYPGAND2ISGENERIC(trise:TIME:=1ns;
tfall:TIME:=1ns);
PORT(a1:INSTD_LOGIC;
a0:INSTD_LOGIC;
z0:OUTSTD_LOGIC);
ENDENTITYPGAND2;這是一個(gè)準(zhǔn)備作為2輸入與門的設(shè)計(jì)實(shí)體的實(shí)體描述,在類屬說明中定義參數(shù)trise為上沿寬度,tfall為下沿寬度,它們分別為1?ns,這兩個(gè)參數(shù)用于仿真模塊的設(shè)計(jì)。4.?PORT端口說明
由PORT引導(dǎo)的端口說明語句是對一個(gè)設(shè)計(jì)實(shí)體界面的說明。其端口表部分對設(shè)計(jì)實(shí)體與外部電路的接口通道進(jìn)行了說明,其中包括對每一接口的輸入輸出模式(MODE或稱端口模式)和數(shù)據(jù)類型(TYPE)進(jìn)行了定義。在實(shí)體說明的前面,可以有庫的說明,即由關(guān)鍵詞“LIBRARY”和“USE”引導(dǎo)一些對庫和程序包使用的說明語句,其中的一些內(nèi)容可以為實(shí)體端口數(shù)據(jù)類型的定義所用。實(shí)體端口說明的一般書寫格式如下:
PORT(端口名:端口模式數(shù)據(jù)類型;
端口名:端口模式數(shù)據(jù)類型);
其中的端口名是設(shè)計(jì)者為實(shí)體的每一個(gè)對外通道所取的名字,端口模式是指這些通道上的數(shù)據(jù)流動(dòng)方式,如輸入或輸出等。數(shù)據(jù)類型是指端口上流動(dòng)的數(shù)據(jù)的表達(dá)格式或取值類型,這是由于VHDL是一種強(qiáng)類型語言,即對語句中的所有的端口信號、內(nèi)部信號和操作數(shù)的數(shù)據(jù)類型有嚴(yán)格的規(guī)定,只有相同數(shù)據(jù)類型的端口信號和操作數(shù)才能相互作用。例5.2
2輸入與非門的實(shí)體描述如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYnand2ISPORT(a:INSTD_LOGIC;b:INSTD_LOGIC;c:OUTSTD_LOGIC);ENDnand2;...IEEE1076標(biāo)準(zhǔn)程序包中定義了以下的常用端口模式(見表5.1):(1)?IN模式。IN定義的通道確定為輸入端口,并規(guī)定為單向只讀模式,可以通過此端口將變量(Variable)信息或信號(Signal)信息讀入設(shè)計(jì)實(shí)體中。(2)?OUT模式。OUT定義的通道確定為輸出端口,并規(guī)定為單向輸出模式,可以通過此端口將信號輸出設(shè)計(jì)實(shí)體,或者說可以將設(shè)計(jì)實(shí)體中的信號向此端口賦值。(3)?INOUT模式。INOUT定義的通道確定為輸入輸出雙向端口,即從端口的內(nèi)部看,可以對此端口進(jìn)行賦值,也可以通過此端口讀入外部的數(shù)據(jù)信息;而從端口的外部看,信號既可以從此端口流出,也可以向此端口輸入信號。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)中具有將輸出至外端口的信號回讀的功能,即允許內(nèi)部回讀輸出的信號,亦即允許反饋。如計(jì)數(shù)器的設(shè)計(jì),可將計(jì)數(shù)器輸出的計(jì)數(shù)信號回讀,以作下一計(jì)數(shù)值的初值。與INOUT模式相比,顯然,BUFFER的區(qū)別在于回讀(輸入)的信號不是由外部輸入的,而是由內(nèi)部產(chǎn)生,向外輸出的信號,有時(shí)往往在時(shí)序上有所差異。
端口模式
端口模式說明(以設(shè)計(jì)實(shí)體為主體)IN輸入端口,只讀模式OUT輸出端口,單向賦值模式BUFFER具有讀功能的輸出模式,(從內(nèi)部看)可以讀或?qū)懀荒苡幸粋€(gè)驅(qū)動(dòng)源INOUT雙向端口,(從內(nèi)部或外部看)都可以讀或?qū)懕?.1端口模式說明在實(shí)用中,端口描述中的數(shù)據(jù)類型主要有兩類:位(BIT)和位矢量(BIT_VECTOR)。若端口的數(shù)據(jù)類型定義為BIT,則其信號值是一個(gè)1位的二進(jìn)制數(shù),取值只能是0或1;若端口的數(shù)據(jù)類型定義為BIT_VECTOR,則其信號值是一組二進(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)對數(shù)據(jù)類型、常數(shù)、信號、子程序和元件等元素的說明部分。(2)描述實(shí)體邏輯行為,并以各種不同的描述風(fēng)格表達(dá)的功能描述語句,包括各種形式的順序描述語句和并行描述語句。(3)以元件例化語句為特征的外部元件(設(shè)計(jì)實(shí)體)端口間的連接方式。(4)結(jié)構(gòu)體將具體實(shí)現(xiàn)一個(gè)實(shí)體,每個(gè)實(shí)體可以有多個(gè)結(jié)構(gòu)體,其中每個(gè)結(jié)構(gòu)體對應(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è)界面說明。對于具有多個(gè)結(jié)構(gòu)體的實(shí)體,必須用CONFIGURATION配置語句指明用于綜合的結(jié)構(gòu)體和用于仿真的結(jié)構(gòu)體,即在綜合后的可映射于硬件電路的設(shè)計(jì)實(shí)體中,一個(gè)實(shí)體只能對應(yīng)一個(gè)結(jié)構(gòu)體。在電路中,如果實(shí)體代表一個(gè)器件符號,則結(jié)構(gòu)體描述了這個(gè)符號的內(nèi)部行為。當(dāng)把這個(gè)符號例化成一個(gè)實(shí)際的器件安裝到電路上時(shí),則需配置語句為這個(gè)例化的器件指定一個(gè)結(jié)構(gòu)體(即指定一種實(shí)現(xiàn)方案),或由編譯器自動(dòng)選擇一個(gè)結(jié)構(gòu)體。1.結(jié)構(gòu)體的一般語言格式
結(jié)構(gòu)體的語句格式如下:
ARCHITECTURE結(jié)構(gòu)體名OF實(shí)體名IS[說明語句]BEGIN[功能描述語句]ENDARCHITECTURE結(jié)構(gòu)體名;在書寫格式上,實(shí)體名必須是所在設(shè)計(jì)實(shí)體的名字,而結(jié)構(gòu)體名可以由設(shè)計(jì)者自己選擇,但當(dāng)一個(gè)實(shí)體具有多個(gè)結(jié)構(gòu)體時(shí),結(jié)構(gòu)體的取名不可相重。結(jié)構(gòu)體的說明語句部分必須放在關(guān)鍵詞“ARCHITECTURE”和“BEGIN”之間,結(jié)構(gòu)體必須以“ENDARCHITECTURE結(jié)構(gòu)體名;”作為結(jié)束句。2.結(jié)構(gòu)體說明語句
結(jié)構(gòu)體中的說明語句用于對結(jié)構(gòu)體的功能描述語句中用到的信號(SIGNAL)、數(shù)據(jù)類型(TYPE)、常數(shù)(CONSTANT)、元件(COMPONENT)、函數(shù)(FUNCTION)和過程(PROCEDURE)等加以說明。在一個(gè)結(jié)構(gòu)體中說明和定義的數(shù)據(jù)類型、常數(shù)、元件、函數(shù)和過程只能用于這個(gè)結(jié)構(gòu)體中。如果希望這些定義也能用于其他的實(shí)體或結(jié)構(gòu)體中,則需要將其作為程序包來處理。3.功能描述語句結(jié)構(gòu)
功能描述語句結(jié)構(gòu)可以含有五種不同類型的以并行方式工作的語句結(jié)構(gòu)。這可以看成是結(jié)構(gòu)體的五個(gè)子結(jié)構(gòu)。在每一語句結(jié)構(gòu)的內(nèi)部可含有并行運(yùn)行的邏輯描述語句或順序運(yùn)行的邏輯描述語句。這就是說,這五種語句結(jié)構(gòu)本身是并行語句,但它們內(nèi)部所包含的語句并不一定是并行語句,如進(jìn)程語句內(nèi)所包含的是順序語句。五種語句結(jié)構(gòu)的基本組成和功能分別介紹如下:
(1)塊語句是由一系列并行執(zhí)行語句構(gòu)成的組合體,它的功能是將結(jié)構(gòu)體中的并行語句組成一個(gè)或多個(gè)子模塊。(2)進(jìn)程語句定義順序語句模塊,用以將外部獲得的信號值或內(nèi)部的運(yùn)算數(shù)據(jù)向其他的信號進(jìn)行賦值。(3)信號賦值語句將設(shè)計(jì)實(shí)體內(nèi)的處理結(jié)果向定義的信號或界面端口進(jìn)行賦值。(4)子程序調(diào)用語句用以調(diào)用過程或函數(shù),并將獲得的結(jié)果賦值于信號。(5)元件例化語句對其他的設(shè)計(jì)實(shí)體作元件調(diào)用說明,并將此元件的端口與其他的元件、信號或高層次實(shí)體的界面端口進(jìn)行連接。5.1.5塊語句結(jié)構(gòu)(BLOCK)塊(BLOCK)的應(yīng)用類似于畫一個(gè)大的電路原理圖時(shí),可以將一個(gè)總的原理圖分成多個(gè)子模塊,則這個(gè)總的原理圖成為一個(gè)由多個(gè)子模塊原理圖連接而成的頂層模塊圖,其中每一個(gè)子模塊可以是一個(gè)具體的電路原理圖。但是,如果子模塊的原理圖仍然太大,還可將它變成更低層次的連接圖(BLOCK嵌套)。顯然,按照這種方式劃分結(jié)構(gòu)體僅是形式上的,而非功能上的改變。事實(shí)上,將結(jié)構(gòu)體以模塊方式劃分的方法有多種,例如使用元件例化語句就是一種將結(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ū)域中都能對其局部信號、數(shù)據(jù)類型和常量加以描述和定義。任何能在結(jié)構(gòu)體的說明部分進(jìn)行說明的對象都能在BLOCK說明部分中進(jìn)行說明。BLOCK語句應(yīng)用只是一種將結(jié)構(gòu)體中的并行描述語句進(jìn)行組合的方法,它的主要目的是改善并行語句及其結(jié)構(gòu)的可讀性,或是利用BLOCK的保護(hù)表達(dá)式關(guān)閉某些信號。1.?BLOCK語句的格式
BLOCK語句的表達(dá)格式如下:
塊標(biāo)號:BLOCK[(塊保護(hù)表達(dá)式)]接口說明
類屬說明
BEGIN并行語句
ENDBLOCK塊標(biāo)號;一個(gè)BLOCK語句結(jié)構(gòu),在關(guān)鍵詞“BLOCK”的前面必須設(shè)置一個(gè)塊標(biāo)號,并在結(jié)尾語句“ENDBLOCK”右側(cè)也寫上此標(biāo)號(但此處的塊標(biāo)號不是必需的)。接口說明部分類似于實(shí)體的定義部分,可包含由關(guān)鍵詞PORT、GENERIC、PORTMAP和GENERICMAP引導(dǎo)的接口說明等語句,用于對BLOCK的接口設(shè)置以及與外界信號的連接狀況加以說明。這類似于原理圖間的圖示接口說明。類屬說明部分和接口說明部分的適用范圍僅限于當(dāng)前BLOCK,所有這些在BLOCK內(nèi)部的說明對于這個(gè)塊的外部來說是完全不透明的,即不能適用于外部環(huán)境,或由外部環(huán)境所調(diào)用,但對于嵌套于更內(nèi)層的塊卻是透明的,即可將信息向內(nèi)部傳遞。塊的說明部分可以定義的項(xiàng)目主要有:USE語句、子程序、數(shù)據(jù)類型、子類型、常數(shù)、信號和元件。塊中的并行語句部分可包含結(jié)構(gòu)體中允許的任何并行語句結(jié)構(gòu)。BLOCK語句本身屬并行語句,BLOCK語句中所包含的語句也是并行語句。2.?BLOCK的應(yīng)用
BLOCK的應(yīng)用可使結(jié)構(gòu)體層次鮮明,結(jié)構(gòu)明確。利用BLOCK語句可以將結(jié)構(gòu)體中的并行語句劃分成多個(gè)并列的BLOCK,每一個(gè)BLOCK都像一個(gè)獨(dú)立的設(shè)計(jì)實(shí)體,具有自己的類屬參數(shù)說明和界面端口,以及與外部環(huán)境的銜接描述。在較大的VHDL程序的編程中,恰當(dāng)應(yīng)用塊語句對于技術(shù)交流、程序移植、排錯(cuò)和仿真都是有益的。3.?BLOCK語句在綜合中的地位
與大部分的VHDL語句不同,BLOCK語句的應(yīng)用,包括其中的類屬說明和端口定義,都不會(huì)影響對原結(jié)構(gòu)體的邏輯功能的仿真結(jié)果。5.1.6進(jìn)程(PROCESS)PROCESS語句結(jié)構(gòu)包含用獨(dú)立的順序語句描述的進(jìn)程,該進(jìn)程描述了設(shè)計(jì)實(shí)體中的部分邏輯行為。與并行語句的同時(shí)執(zhí)行方式不同,順序語句運(yùn)行的順序是同程序語句書寫的順序相一致的。一個(gè)結(jié)構(gòu)體中可以有多個(gè)并行運(yùn)行的進(jìn)程結(jié)構(gòu),而每一個(gè)進(jìn)程的內(nèi)部結(jié)構(gòu)卻是由一系列順序語句來構(gòu)成的。需要注意的是,在VHDL中,所謂順序,僅僅是指語句按序執(zhí)行上的順序性,但這并不意味著PROCESS語句結(jié)構(gòu)所對應(yīng)的硬件邏輯行為也具有相同的順序性。PROCESS結(jié)構(gòu)中的順序語句,及其所謂的順序執(zhí)行過程只是相對于計(jì)算機(jī)中的軟件行為仿真的模擬過程而言的,這個(gè)過程與硬件結(jié)構(gòu)中實(shí)現(xiàn)的對應(yīng)的邏輯行為可能是不相同的。PROCESS結(jié)構(gòu)中既可以有時(shí)序邏輯的描述,也可以有組合邏輯的描述,它們都可以用順序語句來表達(dá)。然而,硬件中的組合邏輯具有典型的并行邏輯功能,而硬件中的時(shí)序邏輯也并非都是以順序方式工作的。1.PROCESS語句格式
PROCESS語句的表達(dá)格式如下:
[進(jìn)程標(biāo)號:]PROCESS[(敏感信號參數(shù)表)][IS][進(jìn)程說明部分]BEGIN順序描述語句
ENDPROCESS[進(jìn)程標(biāo)號];每一個(gè)PROCESS語句結(jié)構(gòu)可以賦予一個(gè)進(jìn)程標(biāo)號,但這個(gè)標(biāo)號不是必需的。進(jìn)程說明部分定義該進(jìn)程所需的局部數(shù)據(jù)環(huán)境。順序描述語句部分是一段順序執(zhí)行的語句,描述該進(jìn)程的行為。PROCESS中規(guī)定了每個(gè)進(jìn)程語句在當(dāng)它的某個(gè)敏感信號(由敏感信號參量表列出)的值改變時(shí)都必須立即完成某一功能行為,這個(gè)行為由進(jìn)程語句中的順序語句定義,行為的結(jié)果可以賦給信號,并通過信號被其他的PROCESS或BLOCK讀取或賦值。當(dāng)進(jìn)程中定義的任一敏感信號發(fā)生更新時(shí),由順序語句定義的行為就要重復(fù)執(zhí)行一次,當(dāng)進(jìn)程中最后一個(gè)語句執(zhí)行完成后,執(zhí)行過程將返回到進(jìn)程的第一個(gè)語句,以等待下一次敏感信號變化。如此循環(huán)往復(fù)以至無限。但當(dāng)遇到WAIT語句時(shí),執(zhí)行過程將被有條件地終止,即所謂的掛起(Suspention)。一個(gè)結(jié)構(gòu)體中可以含有多個(gè)PROCESS結(jié)構(gòu),每一PROCESS結(jié)構(gòu)對應(yīng)于其敏感信號參數(shù)表中定義的任一敏感參量的變化,每個(gè)進(jìn)程可以在任何時(shí)刻被激活或者稱為啟動(dòng)。而在一個(gè)結(jié)構(gòu)體中,所有被激活的進(jìn)程都是并行運(yùn)行的,這就是為什么PROCESS結(jié)構(gòu)本身是并行語句的道理。PROCESS語句必須以語句“ENDPROCESS[進(jìn)程標(biāo)號];”結(jié)尾,對于目前常用的綜合器來說,其中進(jìn)程標(biāo)號不是必須的,敏感表旁的[IS]也不是必須的。2.?PROCESS組成
如上所述,PROCESS語句結(jié)構(gòu)是由三個(gè)部分組成的,即進(jìn)程說明部分、順序描述語句部分和敏感信號參數(shù)表。(1)進(jìn)程說明部分主要定義一些局部量,可包括數(shù)據(jù)類型、常數(shù)、變量、屬性、子程序等。但需注意,在進(jìn)程說明部分中不允許定義信號和共享變量。(2)順序描述語句部分可分為賦值語句、進(jìn)程啟動(dòng)語句、子程序調(diào)用語句、順序描述語句和進(jìn)程跳出語句等,它們包括:
信號賦值語句:即在進(jìn)程中將計(jì)算或處理的結(jié)果向信號(SIGNAL)賦值。
變量賦值語句:即在進(jìn)程中以變量(VARIABLE)的形式存儲(chǔ)計(jì)算的中間值。
進(jìn)程啟動(dòng)語句:當(dāng)PROCESS的敏感信號參數(shù)表中沒有列出任何敏感量時(shí),進(jìn)程的啟動(dòng)只能通過進(jìn)程啟動(dòng)語句WAIT語句實(shí)現(xiàn)。這時(shí)可以利用WAIT語句監(jiān)視信號的變化情況,以便決定是否啟動(dòng)進(jìn)程。WAIT語句可以看成是一種隱式的敏感信號表。子程序調(diào)用語句:對已定義的過程和函數(shù)進(jìn)行調(diào)用,并參與計(jì)算。
順序描述語句:包括IF語句、CASE語句、LOOP語句、NULL語句等。進(jìn)程跳出語句:包括NEXT語句、EXIT語句,用于控制進(jìn)程的運(yùn)行方向。(3)敏感信號參數(shù)表需列出用于啟動(dòng)本進(jìn)程可讀入的信號名(當(dāng)有WAIT語句時(shí)例外)。例5.3中所給程序是一個(gè)含有進(jìn)程的結(jié)構(gòu)體,進(jìn)程標(biāo)號是p1(進(jìn)程標(biāo)號不是必須的),進(jìn)程的敏感信號參數(shù)表中未列出敏感信號,所以進(jìn)程的啟動(dòng)需靠WAIT語句。在此,信號clock即為該進(jìn)程的敏感信號。每當(dāng)出現(xiàn)一個(gè)時(shí)鐘脈沖clock時(shí),即進(jìn)入WAIT語句以下的順序語句執(zhí)行進(jìn)程中,且當(dāng)driver為高電平時(shí)進(jìn)入CASE語句結(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è)模塊中只能利用順序語句來定義和完成算法,這一點(diǎn)與進(jìn)程十分相似。所不同的是,子程序不能像進(jìn)程那樣可以從本結(jié)構(gòu)體的其他塊或進(jìn)程結(jié)構(gòu)中直接讀取信號值或者向信號賦值。子程序只能通過調(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ù)類型及返回值數(shù)據(jù)類型是不同的。子程序的可重載性是一個(gè)非常有用的特性。子程序有兩種類型,即過程(PROCEDURE)和函數(shù)(FUNCTION)。過程可通過其界面提供多個(gè)返回值,或不提供任何值,而函數(shù)只能返回一個(gè)值。在函數(shù)入口中,所有參數(shù)都是輸入?yún)?shù),而過程則有輸入?yún)?shù)、輸出參數(shù)和雙向參數(shù)之分。過程一般被看作一種語句結(jié)構(gòu),常在結(jié)構(gòu)體或進(jìn)程中以獨(dú)立語句的形式存在,而函數(shù)通常是表達(dá)式的一部分,常在賦值語句或表達(dá)式中使用。過程可以單獨(dú)存在,其行為類似于進(jìn)程,而函數(shù)通常作為語句的一部分被調(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的行為仿真),無論對程序中的子程序調(diào)用多少次,都不會(huì)發(fā)生計(jì)算機(jī)資源如存儲(chǔ)資源不夠用的情況,但在面向VHDL的綜合中,每調(diào)用一次子程序都意味著增加了一個(gè)硬件電路模塊。因此,在實(shí)用中,要密切關(guān)注和嚴(yán)格控制子程序的調(diào)用次數(shù)。1.函數(shù)FUNCTION在VHDL中有多種函數(shù)形式,如用于不同目的的用戶自定義函數(shù)和在庫中現(xiàn)成的預(yù)定義函數(shù)。例如轉(zhuǎn)換函數(shù)和決斷函數(shù)。轉(zhuǎn)換函數(shù)用于從一種數(shù)據(jù)類型到另一種數(shù)據(jù)類型的轉(zhuǎn)換,如在元件例化語句中利用轉(zhuǎn)換函數(shù)可允許不同數(shù)據(jù)類型的信號和端口間進(jìn)行映射;決斷函數(shù)用于在多驅(qū)動(dòng)信號時(shí)解決信號競爭問題。函數(shù)的語言表達(dá)格式如下:
FUNCTION函數(shù)名(參數(shù)表)RETURN數(shù)據(jù)類型--函數(shù)首
FUNCTION函數(shù)名(參數(shù)表)RETURN數(shù)據(jù)類型IS--函數(shù)體
[說明部分]BEGIN順序語句;ENDFUNCTION函數(shù)名;一般地,函數(shù)定義應(yīng)由兩部分組成,即函數(shù)首和函數(shù)體,在進(jìn)程或結(jié)構(gòu)體中不必定義函數(shù)首,而在程序包中必須定義函數(shù)首。1)函數(shù)首函數(shù)首由函數(shù)名、參數(shù)表和返回值的數(shù)據(jù)類型三部分組成。如果要將所定義的函數(shù)組織成程序包放入庫中的話,定義函數(shù)首是必需的,這時(shí)的函數(shù)首就相當(dāng)于一個(gè)入庫貨物名稱與貨物位置表,實(shí)際入庫的是函數(shù)體。函數(shù)首的名稱即為函數(shù)的名稱,需放在關(guān)鍵詞FUNCTION之后,此名稱可以是普通的標(biāo)識符,也可以是運(yùn)算符,運(yùn)算符必須加上雙引號,這就是所謂的運(yùn)算符重載。運(yùn)算符重載就是對VHDL中現(xiàn)存的運(yùn)算符進(jìn)行重新定義,以獲得新的功能。新功能的定義是靠函數(shù)體來完成的。函數(shù)的參數(shù)表用來定義輸出值,所以不必以顯式表示參數(shù)的方向,函數(shù)參數(shù)表中可以是信號或常數(shù),參數(shù)名需放在關(guān)鍵詞CONSTANT或SIGNAL之后。如果沒有特別說明,則參數(shù)被默認(rèn)為常數(shù)。如果要將一個(gè)已編制好的函數(shù)并入程序包,函數(shù)首必須放在程序包的說明部分,而函數(shù)體需放在程序包的包體內(nèi)。如果只是在一個(gè)結(jié)構(gòu)體中定義并調(diào)用函數(shù),則僅需函數(shù)體即可。由此可見,函數(shù)首的作用只是作為程序包的有關(guān)此函數(shù)的一個(gè)接口界面。2)函數(shù)體函數(shù)體包含一個(gè)對數(shù)據(jù)類型、常數(shù)、變量等的局部說明,以及用以完成規(guī)定算法或轉(zhuǎn)換的順序語句部分。一旦函數(shù)被調(diào)用,就將執(zhí)行這部分語句。在函數(shù)體中,需以關(guān)鍵詞ENDFUNCTION及函數(shù)名結(jié)尾。2.過程(PROCEDURE)VHDL中,子程序的另外一種形式是過程PROCEDURE,過程的語句格式是:
PROCEDURE過程名(參數(shù)表)
--過程首
PROCEDURE過程名(參數(shù)表)IS[說明部分]BIGIN--過程體
順序語句
ENDPROCEDURE過程名與函數(shù)一樣,過程也由兩部分構(gòu)成,即過程首和過程體,其中過程首也不是必需的,過程體可以獨(dú)立存在和使用,即在進(jìn)程或結(jié)構(gòu)體中不必定義過程首。但與函數(shù)一樣,要將過程并入程序包中時(shí),必須定義過程首。1)過程首過程首由過程名和參數(shù)表組成。參數(shù)表用于對過程的參數(shù)進(jìn)行說明,指明其類型和工作模式。常數(shù)、變量和信號三類數(shù)據(jù)對象可用作過程的參數(shù),關(guān)鍵詞IN、OUT和INOUT定義了這些參數(shù)的工作模式,即信息的流向。如果沒有指定模式,則默認(rèn)為IN。以下是三個(gè)過程首的定義示例。例5.4過程首定義示例。代碼如下:PROCEDUREpro1(VARIABLEa,b:INOUTREAL);PROCEDUREpro2(CONSTANTa1:ININTEGERVARIABLEb1:OUTINTEGER);PROCEDUREpro3(SIGNALsig:INOUTBIT);在例5.4中,過程pro1定義了兩個(gè)實(shí)數(shù)雙向變量a和b;過程pro2定義了兩個(gè)參量,第一個(gè)是常數(shù),它的數(shù)據(jù)類型為整數(shù),流向模式是IN,第二個(gè)參量是變量,工作模式和數(shù)據(jù)類型分別是OUT和整數(shù);過程pro3中只定義了一個(gè)信號參量,即sig,它的工作模式是雙向INOUT,數(shù)據(jù)類型是BIT。一般地,可在參量表中定義三種流向模式,即IN、OUT和INOUT。如果只定義了IN模式而未定義目標(biāo)參量類型,則默認(rèn)為常量;若只定義了INOUT或OUT,則默認(rèn)目標(biāo)參量類型是變量。2)過程體過程體是由順序語句組成的,過程的調(diào)用即啟動(dòng)了對過程體的順序語句的執(zhí)行。與函數(shù)一樣,過程體中的說明部分只是局部的,其中的各種定義只能適用于過程體內(nèi)部。過程體的順序語句部分可以包含任何順序執(zhí)行的語句,包括WAIT語句。但需注意,如果一個(gè)過程是在進(jìn)程中調(diào)用的,且這個(gè)進(jìn)程已列出了敏感參量表,則不能在此過程中使用WAIT語句。在不同的調(diào)用環(huán)境中,可以有兩種不同的語句方式對過程進(jìn)行調(diào)用,即順序語句方式或并行語句方式。在一般的順序語句自然執(zhí)行過程中,一個(gè)過程被調(diào)用執(zhí)行,則屬于順序語句方式,因?yàn)檫@時(shí)它只相當(dāng)于一條順序語句的執(zhí)行;當(dāng)過程處于并行語句環(huán)境中時(shí),其過程體中定義的任一IN或INOUT的目標(biāo)參量(即數(shù)據(jù)對象:變量、信號、常數(shù))發(fā)生改變時(shí),將啟動(dòng)過程的調(diào)用,這時(shí)的調(diào)用是屬于并行語句方式的。過程與函數(shù)一樣可以重復(fù)調(diào)用或嵌套式調(diào)用。綜合器一般不支持含有Wait語句的過程。例5.5過程體使用示例。程序如下:PROCEDUREprg1(VARIABLEvalue:INOUTBIT_VECTOR(0TO7))ISBEGINCASEvalueISWHEN"0000"=>value:"0101";WHEN"0101"=>value:"0000";WHENOTHERS=>value:"1111";ENDCASE;ENDPROCEDUREprg1;這個(gè)過程對具有雙向模式變量的值value作了一個(gè)數(shù)據(jù)轉(zhuǎn)換運(yùn)算。
5.1.8配置(CONFIGURATION)配置語句是用來為較大的系統(tǒng)設(shè)計(jì)提供管理和工程組織的,可以把特定的結(jié)構(gòu)體關(guān)聯(lián)到(指定給)一個(gè)確定的實(shí)體。通常在大而復(fù)雜的VHDL工程設(shè)計(jì)中,配置語句可以為實(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è)基本單元。在綜合或仿真中,可以利用配置語句為確定整個(gè)設(shè)計(jì)提供許多有用信息。例如對以元件的層次方式構(gòu)成的VHDL設(shè)計(jì)實(shí)體,就可以把配置語句的設(shè)置看成是一個(gè)元件表,以配置語句指定在頂層設(shè)計(jì)中的每一元件與一特定結(jié)構(gòu)體相銜接,或賦予特定屬性。配置語句還能用于對元件的端口連接進(jìn)行重新安排等。VHDL綜合器允許將配置規(guī)定為針對一個(gè)設(shè)計(jì)實(shí)體中的最高層設(shè)計(jì)單元,但只支持對最頂層的實(shí)體進(jìn)行配置,通常情況下,配置主要用在VHDL的行為仿真中。配置語句的一般格式如下:
CONFIGURATION配置名OF實(shí)體名IS配置說明
END配置名;配置主要為頂層設(shè)計(jì)實(shí)體指定結(jié)構(gòu)體,或?yàn)閰⑴c例化的元件實(shí)體指定所希望的結(jié)構(gòu)體,以層次方式來對元件例化作結(jié)構(gòu)配置。如前所述,每個(gè)實(shí)體可以擁有多個(gè)不同的結(jié)構(gòu)體,而每個(gè)結(jié)構(gòu)體的地位是相同的,在這種情況下,可以利用配置說明為這個(gè)實(shí)體指定一個(gè)結(jié)構(gòu)體。5.2
VHDL語言要素VHDL的語言要素主要有數(shù)據(jù)對象(DataObjects,Objects),其中包括變量(Variables)、信號(Signals)和常數(shù)(Constants),數(shù)據(jù)類型(DataTypes,Types)和各類操作數(shù)(Operands)及運(yùn)算操作符(Operators)。準(zhǔn)確無誤地理解和掌握VHDL語言要素的基本含義和用法,對于正確地完成VHDL程序設(shè)計(jì)十分重要。5.2.1
VHDL文字規(guī)則
VHDL文字(Literal)主要包括數(shù)值和標(biāo)識符。數(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ù)制隔離符號“#”;第三部分,表達(dá)的數(shù);第四部分,指數(shù)隔離符號“#”;第五部分,用十進(jìn)制表示的指數(shù)部分,這一部分的數(shù)如果為0,則可以省去不寫。如:
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綜合器不接受此類文字)。如:20?s(20秒),50?m(50米),kΩ(千歐姆),100A(100安培)。2.字符串型文字
字符是用單引號引起來的ASCII字符,可以是數(shù)值,也可以是符號或字母,如:'R','a','*','Z','U','0','11'。(1)文字字符串。文字字符串是用雙引號引起來的一串文字,如:“ERROR”,“BothSandQequalto1”,“X”,“BB$CC”。(2)數(shù)位字符串。數(shù)位字符串也稱位矢量,是預(yù)定義數(shù)據(jù)類型為bit的數(shù)組。數(shù)位字符串與文字字符串相似,但所代表的是二進(jìn)制、八進(jìn)制或十六進(jìn)制的數(shù)組。數(shù)位字符串所代表的位矢量的長度即為等值的二進(jìn)制數(shù)的位數(shù)。數(shù)字字符串?dāng)?shù)值的數(shù)據(jù)類型是一維的枚舉型數(shù)組。與文字字符串的表示不同,數(shù)位字符串的表示首先要有計(jì)算基數(shù),然后將該基數(shù)表示的值放在雙引號中,基數(shù)符以“B”、“O”和“X”表示,并放在字符串的前面。它們的含義分別是:
B:二進(jìn)制基數(shù)符號,表示二進(jìn)制位0或1,在字符串中的每一個(gè)位表示一個(gè)bit。O:八進(jìn)制基數(shù)符號,在字符串中的每一個(gè)數(shù)代表一個(gè)八進(jìn)制數(shù),即代表一個(gè)3位(bit)的二進(jìn)制數(shù)。X:十六進(jìn)制基數(shù)符號(0~F),代表一個(gè)十六進(jìn)制數(shù),即代表一個(gè)4位的二進(jìn)制數(shù)。例如:
data1<=B"1_1101_1110"——二進(jìn)制數(shù)數(shù)組位矢數(shù)組長度是9data2<=O"15"——八進(jìn)制數(shù)數(shù)組位矢數(shù)組長度是63.標(biāo)識符
標(biāo)識符是最常用的操作符,標(biāo)識符可以是常數(shù)、變量、信號、端口、子程序或參數(shù)的名字。VHDL基本標(biāo)識符的書寫遵守如下規(guī)則:(1)有效的字符:英文字母,包括大小寫字母a~z,A~Z;數(shù)字,包括0~9以及下劃線“_”。(2)任何標(biāo)識符必須以英文字母開頭,標(biāo)識符中的英語字母不區(qū)分大小寫。(3)下劃線“_”前后都必須有英文字母或數(shù)字,同時(shí),一個(gè)標(biāo)識符中只能使用一個(gè)下劃線。(4)VHDL'93標(biāo)準(zhǔn)支持?jǐn)U展標(biāo)識符,擴(kuò)展標(biāo)識符以反斜杠來界定,可以以數(shù)字打頭,如\74LS373\、\HelloWorld\都是合法的標(biāo)識符。在擴(kuò)展標(biāo)識符中,允許包含圖形符號(如回車符換行符等),也允許包含空格符,如?\IRDY#\、\C/BE\、\AorB\等都是合法的標(biāo)識符。兩個(gè)反斜杠之前允許有多個(gè)下劃線相鄰,擴(kuò)展標(biāo)識符要分大小寫,擴(kuò)展標(biāo)識符與短標(biāo)識符不同,擴(kuò)展標(biāo)識符如果含有一個(gè)反斜杠,則用兩個(gè)反斜杠來代替它。支持?jǐn)U展標(biāo)識符的目的是免受1987標(biāo)準(zhǔn)中的短標(biāo)識符的限制,描述起來更為直觀和方便。但是目前仍有許多VHDL工具不支持?jǐn)U展標(biāo)識符。4.下標(biāo)名
下標(biāo)名用于指示數(shù)組型變量或信號的某一元素。下標(biāo)段名則用于指示數(shù)組型變量或信號的某一段元素。下標(biāo)名的語句格式如下:
標(biāo)識符(表達(dá)式)標(biāo)識符必須是數(shù)組型的變量或信號的名字,表達(dá)式所代表的值必須是數(shù)組下標(biāo)范圍中的一個(gè)值,這個(gè)值對應(yīng)數(shù)組中的一個(gè)元素。如果下標(biāo)名中的表達(dá)式是一個(gè)可計(jì)算的值,則此下名可很容易地進(jìn)行綜合。如果是不可計(jì)算的,則只能在特定的情況下綜合,且耗費(fèi)資源較大。5.段名
段名即多個(gè)下標(biāo)名的組合,段名對應(yīng)數(shù)組中某一段的元素。段名的表達(dá)形式是:標(biāo)識符(表達(dá)式方向表達(dá)式)這里的標(biāo)識符必須是數(shù)組類型的信號名或變量名,每一個(gè)表達(dá)式的數(shù)值必須在數(shù)組元素下標(biāo)號范圍以內(nèi),并且必須是可計(jì)算的(立即數(shù))。數(shù)據(jù)下標(biāo)的變化方向用TO或者DOWNTO來表示。TO表示數(shù)組下標(biāo)序列由低到高,如(2TO8);DOWNTO表示數(shù)組下標(biāo)序列由高到低,如(8DOWNTO2)。所以段中兩表達(dá)式值的方向必須與原數(shù)組一致。5.2.2
VHDL數(shù)據(jù)對象在VHDL中,數(shù)據(jù)對象(DataObjects)類似于一種容器,可接受不同數(shù)據(jù)類型的賦值。數(shù)據(jù)對象有三類,即變量(VARIABLE)、常量(CONSTANT)和信號(SIGNAL)。前兩種可以從傳統(tǒng)的計(jì)算機(jī)高級語言中找到對應(yīng)的數(shù)據(jù)類型,其語言行為與高級語言中的變量和常量十分相似。但信號這一數(shù)據(jù)對象比較特殊,它具有更多的硬件特征,是VHDL中最有特色的語言要素之一。從硬件電路系統(tǒng)來看,變量和信號相當(dāng)于組合電路系統(tǒng)中門與門間的連線及其連線上的信號值;常量相當(dāng)于電路中的恒定電平,如GND或VCC接口的電平。從行為仿真和VHD語句功能上看,信號與變量具有比較明顯的區(qū)別,其差異主要表現(xiàn)在接受和保持信號的方式及信息保持與轉(zhuǎn)遞的區(qū)域大小上。例如信號可以設(shè)置傳輸延遲量,而變量則不能;變量只能作為局部的信息載體,如只能在所定義的進(jìn)程中有效,而信號則可作為模塊間的信息載體,如在結(jié)構(gòu)體中各進(jìn)程間傳遞信息。變量的設(shè)置有時(shí)只是一種過渡,最后的信息傳輸和界面間的通信都靠信號來完成。綜合后的VHDL文件中信號將對應(yīng)更多的硬件結(jié)構(gòu)。但需注意的是,對于信號和變量的認(rèn)識單從行為仿真和語法要求的角度去認(rèn)識是不完整的。事實(shí)上,在許多情況下,綜合后所對應(yīng)的硬件電路結(jié)構(gòu)中信號和變量并沒有什么區(qū)別,例如在滿足一定條件的進(jìn)程中,綜合后它們都能引入寄存器。其關(guān)鍵在于,它們都具有能夠接受賦值這一重要的共性,而VHDL綜合器并不理會(huì)它們在接受賦值時(shí)存在的延時(shí)特性(只有VHDL行為仿真器才會(huì)考慮這一特性差異)。1.變量(VARIABLE)在VHDL語法規(guī)則中,變量是一個(gè)局部量,只能在進(jìn)程和子程序中使用。變量不能將信息帶出定義它的當(dāng)前設(shè)計(jì)單元。變量的賦值是一種理想化的數(shù)據(jù)傳輸,是立即發(fā)生,不存在任何延時(shí)的行為。VHDL語言規(guī)則不支持變量附加延時(shí)語句。變量常用在實(shí)現(xiàn)某種算法的賦值語句中。定義變量的語法格式如下:
VARIABLE變量名數(shù)據(jù)類型:=初始值
例如,下列變量定義語句分別定義a為整數(shù)型變量;b和c也為整數(shù)型變量,初始值為2;d為標(biāo)準(zhǔn)位變量:VARIABLEa:INTEGER;VARIABLEb,c:INTEGER:=2;VARIABLEd:STD_LOGIC;如前所述,變量作為局部量,其適用范圍僅限于定義了變量的進(jìn)程或子程序中。但仿真過程中唯一的例外是共享變量。共享變量的值將隨變量賦值語句的運(yùn)算結(jié)果而改變。變量定義語句中的初始值可以是一個(gè)與變量具有相同數(shù)據(jù)類型的常數(shù)值,也可以是一個(gè)全局靜態(tài)表達(dá)式,這個(gè)表達(dá)式的數(shù)據(jù)類型必須與所賦值的變量一致。此初始值不是必需的,綜合過程中綜合器將略去所有的初始值。變量賦值語句的語法格式如下:
目標(biāo)變量名:=表達(dá)式
變量賦值符號是“:=”,變量數(shù)值的改變是通過變量賦值來實(shí)現(xiàn)的。賦值語句右方的表達(dá)式必須是一個(gè)與目標(biāo)變量具有相同數(shù)據(jù)類型的數(shù)值,這個(gè)表達(dá)式可以是一個(gè)運(yùn)算表達(dá)式,也可以是一個(gè)數(shù)值。通過賦值操作,新的變量值的獲得是立刻發(fā)生的。變量賦值語句左邊的目標(biāo)變量可以是單值變量,也可以是一個(gè)變量的集合,即數(shù)組型變量。2.信號(SIGNAL)信號是描述硬件系統(tǒng)的基本數(shù)據(jù)對象,它類似于連接線。信號可以作為設(shè)計(jì)實(shí)體中并行語句模塊間的信息交流通道(交流來自順序語句結(jié)構(gòu)中的信息)。在VHDL中,信號及其相關(guān)的信號賦值語句、決斷函數(shù)、延時(shí)語句等很好地描述了硬件系統(tǒng)的許多基本特征,如硬件系統(tǒng)運(yùn)行的并行性、信號傳輸過程中的延遲特性、多驅(qū)動(dòng)源的總線行為等。信號作為一種數(shù)值容器,不但可以容納當(dāng)前值,也可以保持歷史值。這一屬性與觸發(fā)器的記憶功能有很好的對應(yīng)關(guān)系,信號定義的語句格式與變量非常相似,信號定義也可以設(shè)置初始值,它的定義格式如下:SIGNAL信號名:數(shù)據(jù)類型:=初始值;同樣,信號初始值的設(shè)置不是必需的,而且初始值僅在VHDL的行為仿真中有效。與變量相比,信號的硬件特征更為明顯,它具有全局性特征。例如,在程序包中定義的信號,對于所有調(diào)用此程序包的設(shè)計(jì)實(shí)體都是可見(可直接調(diào)用)的;在實(shí)體中定義的信號,在其對應(yīng)的結(jié)構(gòu)體中都是可見的。事實(shí)上。除了沒有方向說明以外,信號與實(shí)體的端口(Port)概念是一致的。對于端口來說,其區(qū)別只是輸出端口不能讀入數(shù)據(jù),輸入端口不能被賦值。信號可以看成是實(shí)體內(nèi)部的端口。反之,實(shí)體的端口只是一種隱形的信號,端口的定義實(shí)質(zhì)上是作了隱式的信號定義,并附加了數(shù)據(jù)流動(dòng)的方向。信號本身的定義是一種顯式的定義。因此,在實(shí)體中定義的端口,在其結(jié)構(gòu)體中都可以看成是一個(gè)信號并加以使用,而不必另作定義。以下是信號的定義示例:
SIGNALtemp:STD_LOGIC:=0;SIGNALflagaflagb:BIT;SIGNALdata:STD_LOGIC_VECTOR(15DOWNTO0);SIGNALa:INTEGERRANGE0TO15;此外,需要注意,信號的使用和定義范圍是實(shí)體、結(jié)構(gòu)體和程序包。在進(jìn)程和子程序中,不允許定義信號。信號可以有多個(gè)驅(qū)動(dòng)源,或者說是賦值信號源,但必須將此信號的數(shù)據(jù)類型定義為決斷性數(shù)據(jù)類型。需要特別注意的是,在進(jìn)程中,只能將信號列入敏感表,而不能將變量列入敏感表。可見進(jìn)程只對信號敏感,而對變量不敏感,這是因?yàn)?,只有信號才能把進(jìn)程外的信息帶入進(jìn)程內(nèi)部。當(dāng)信號定義了數(shù)據(jù)類型和表達(dá)方式后,在VHDL設(shè)計(jì)中就能對信號進(jìn)行賦值了。信號的賦值語句表達(dá)式如下:目標(biāo)信號名<=表達(dá)式;
其中,這里的表達(dá)式可以是一個(gè)運(yùn)算表達(dá)式,也可以是數(shù)據(jù)對象(變量、信號或常量)。符號“<=”表示賦值操作,即將數(shù)據(jù)信息傳入。數(shù)據(jù)信息的傳入可以設(shè)置延時(shí)量。因此目標(biāo)信號獲得傳入的數(shù)據(jù)并不是即時(shí)的。即使是零延時(shí)(不作任何顯式的延時(shí)設(shè)置),也要經(jīng)歷一個(gè)特定的延時(shí)過程。因此,符號“<=”兩邊的數(shù)值并不總是一致的,這與實(shí)際器件的傳播延遲特性十分接近,顯然這與變量的賦值過程有很大差別。所以,賦值符號用“<=”而非“:=”。但須注意,信號的初始賦值符號仍是“:=”,這是因?yàn)榉抡娴臅r(shí)間坐標(biāo)是從初始賦值開始的,在此之前無所謂延時(shí)時(shí)間。以下是三個(gè)賦值語句示例:x<=9;y<=x;Z<=xAFTER5ns;第三句信號的賦值是在5ns后將x賦予z的,關(guān)鍵詞AFTER后是延遲時(shí)間值,在這一點(diǎn)上,與變量的賦值很不相同,盡管如前所述,綜合器在綜合過程中將略去所設(shè)的延時(shí)值,但是即使沒有利用AFTER關(guān)鍵詞設(shè)置信號的賦值延時(shí)值,任何信號賦值都是存在延時(shí)的。在綜合后的功能仿真中,信號或變量間的延時(shí)是被看成零延時(shí)的,但為了給信息傳輸?shù)南群笞鞒龇线壿嫷呐判?,將自?dòng)設(shè)置一個(gè)小的延時(shí)量,即所謂的延時(shí)量。延時(shí)量在仿真中即為一個(gè)VHDL模擬器的最小分辯時(shí)間。信號的賦值可以出現(xiàn)在一個(gè)進(jìn)程中,也可以直接出現(xiàn)在結(jié)構(gòu)體中的并行語句結(jié)構(gòu)中,但它們運(yùn)行的含義是不一樣的。前者屬順序信號賦值,這時(shí)的信號賦值操作要視進(jìn)程是否已被啟動(dòng)而定,后者屬并行信號賦值,其賦值操作是各自獨(dú)立并行地發(fā)生的。3.常數(shù)(CONSTANT)常數(shù)的定義和設(shè)置主要是為了使設(shè)計(jì)實(shí)體中的常數(shù)更容易閱讀和修改。例如,將位矢的寬度定義為一個(gè)常量,只要修改這個(gè)常量就能很容易地改變寬度,從而改變硬件結(jié)構(gòu)。在程序中,常量是一個(gè)恒定不變的值,一旦作了數(shù)據(jù)類型和賦值定義后,在程序中不能再改變,因而具有全局性意義。常量的定義形式與變量十分相似,其形式如下:CONSTANT常數(shù)名數(shù)據(jù)類型:=表達(dá)式;例如:CONSTANTfbus:BIT_VECTOR:="010115";--位矢數(shù)據(jù)類型CONSTANTVcc:REAL:=5.0;--實(shí)數(shù)數(shù)據(jù)類型CONSTANTdely:TIME:=25ns;--時(shí)間數(shù)據(jù)類型
VHDL要求所定義的常量數(shù)據(jù)類型必須與表達(dá)式的數(shù)據(jù)類型一致。常量的數(shù)據(jù)類型可以是標(biāo)量類型或復(fù)合類型,但不能是文件類型(file)或存取類型(Access)。常量定義語句所允許的設(shè)計(jì)單元有實(shí)體、結(jié)構(gòu)體、程序包、塊、進(jìn)程和子程序。5.2.3
VHDL數(shù)據(jù)類型在數(shù)據(jù)對象的定義中,必不可少的就是設(shè)定所定義的數(shù)據(jù)對象的數(shù)據(jù)類型(TYPES),并且要求此對象的賦值源也必須是相同的數(shù)據(jù)類型。這是因?yàn)閂HDL是一種強(qiáng)類型語言,對運(yùn)算關(guān)系與賦值關(guān)系中各量(操作數(shù))的數(shù)據(jù)類型有嚴(yán)格要求。VHDL要求設(shè)計(jì)實(shí)體中的每一個(gè)常數(shù)、信號、變量、函數(shù)以及設(shè)定的各種參量都必須具有確定的數(shù)據(jù)類型,并且相同數(shù)據(jù)類型的量才能互相傳遞和作用。VHDL作為強(qiáng)類型語言的好處是使VHDL編譯或綜合工具很容易地找出設(shè)計(jì)中的各種常見錯(cuò)誤。VHDL中的各種預(yù)定義數(shù)據(jù)類型大多數(shù)體現(xiàn)了硬件電路的不同特性,因此也為其他大多數(shù)硬件描述語言所采納。例如BIT,可以描述電路中的開關(guān)信號。VHDL中的數(shù)據(jù)類型可以分成四大類。(1)標(biāo)量型(ScalarType),屬單元素的最基本的數(shù)據(jù)類,即不可能再有更小、更基本的數(shù)據(jù)類型。它們通常用于描述一個(gè)單值數(shù)據(jù)對象。標(biāo)量類型包括:實(shí)數(shù)類型、整數(shù)類型、枚舉類型、時(shí)間類型。(2)復(fù)合類型(CompositeType),可以由更細(xì)小的數(shù)據(jù)類型復(fù)合而成,如可由標(biāo)量型復(fù)合而成。復(fù)合類型主要有數(shù)組型(Array)和記錄型(Record)。(3)存取類型(AccessType),為給定的數(shù)據(jù)類型的數(shù)據(jù)對象提供存取方式。(4)文件類型(FilesType),用于提供多值存取類型。這四大數(shù)據(jù)類型又可分成在現(xiàn)成程序包中可以隨時(shí)獲得的預(yù)定義數(shù)據(jù)類型和用戶自定義數(shù)據(jù)類型兩大類別。預(yù)定義的VHDL數(shù)據(jù)類型是VHDL最常用,最基本的數(shù)據(jù)類型。這些數(shù)據(jù)類型都已在VHDL的標(biāo)準(zhǔn)程序包STANDARD和STD_LOGIC_1164及其他的標(biāo)準(zhǔn)程序包中作了定義,并可在設(shè)計(jì)中隨時(shí)調(diào)用。VHDL允許用戶自己定義其他的數(shù)據(jù)類型以及子類型。通常,新定義的數(shù)據(jù)類型和子類型的基本元素一般仍屬VHDL的預(yù)定義數(shù)據(jù)類型,盡管VHDL仿真器支持所有的數(shù)據(jù)類型,但VHDL綜合器并不支持所有的預(yù)定義數(shù)據(jù)類型和用戶定義的數(shù)據(jù)類型,如不支持REAL、TIME、FILE等數(shù)據(jù)類型。在綜合中,它們將被忽略或宣布為不支持,這意味著,不是所有的數(shù)據(jù)類型都能在目前的數(shù)字系統(tǒng)硬件中實(shí)現(xiàn)。由于在綜合后,所有進(jìn)入綜合的數(shù)據(jù)類型都轉(zhuǎn)換成二進(jìn)制類型和高阻態(tài)類型(只有部分芯片支持內(nèi)部高阻態(tài)),即電路網(wǎng)表中的二進(jìn)制信號,綜合器通常會(huì)忽略不能綜合的數(shù)據(jù)類型,并給出警告信息。1.?VHDL的預(yù)定義數(shù)據(jù)類型VHDL的預(yù)定義數(shù)據(jù)類型都是在VHDL標(biāo)準(zhǔn)程序包STANDARD中定義的,在實(shí)際使用中,已自動(dòng)包含進(jìn)VHDL的源文件中,因而不必通過USE語句以顯式調(diào)用。1)布爾(BOOLEAN)數(shù)據(jù)類型
布爾數(shù)據(jù)類型實(shí)際上是一個(gè)二值枚舉型數(shù)據(jù)類型。布爾量不屬于數(shù)值,因此不能用于運(yùn)算,它只能通過關(guān)系運(yùn)算符獲得。2)位(BIT)數(shù)據(jù)類型
位數(shù)據(jù)類型也屬于枚舉型,取值只能是1或者0。位數(shù)據(jù)類型的數(shù)據(jù)對象,如變量、信號等,可以參與邏輯運(yùn)算,運(yùn)算結(jié)果仍是位的數(shù)據(jù)類型。3)位矢量(BIT_VECTOR)數(shù)據(jù)類型位矢量是基于BIT數(shù)據(jù)類型的數(shù)組,使用位矢量必須注明位寬,即數(shù)組中的元素個(gè)數(shù)和排列方式,例如:SIGNALa:BIT_VECTOR(7TO0);其中,信號a被定義為一個(gè)具有8位位寬的矢量,它的最左位是a(7),最右位是a(0)。4)字符(CHARACTER)數(shù)據(jù)類型
字符類型通常用單引號引起來,如'A'。字符類型要區(qū)分大小寫,如'B'
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 辦公室租賃合同范本
- 農(nóng)業(yè)種植包工合同范本
- 農(nóng)田施工工程合同范本
- 共同承包協(xié)議工程合同范本
- 會(huì)林租賃合同范本
- 勞動(dòng)關(guān)系聯(lián)營合同范本
- 現(xiàn)澆橋面板腳手架施工方案
- 陜西涼亭廊架施工方案
- 2025四川內(nèi)江川豫汽車銷售服務(wù)有限公司招聘15人筆試參考題庫附帶答案詳解
- 農(nóng)村拆遷土地合同范本
- 2025年江蘇揚(yáng)州市儀征市眾鑫建設(shè)開發(fā)有限公司招聘筆試參考題庫附帶答案詳解
- 大象版四年級下冊《科學(xué)》全套教學(xué)課件
- 期末考試質(zhì)量分析教學(xué)成績匯報(bào)模板
- 應(yīng)急指揮調(diào)度與指揮中心建設(shè)
- 2025年三方運(yùn)輸合作協(xié)議經(jīng)典版(三篇)
- 2025年《贏在執(zhí)行》心得體會(huì)(4篇)
- 核心素養(yǎng)導(dǎo)向下的小學(xué)語文跨學(xué)科學(xué)習(xí)研究
- 小紅書搜索推廣營銷師認(rèn)證考試題(附答案)
- T-GDSAIA 001-2024 非充氣彈性支撐輪 術(shù)語及其定義
- 湖南省長沙市2024年七年級上學(xué)期期末數(shù)學(xué)試卷【附答案】
- 護(hù)苗行動(dòng)課件
評論
0/150
提交評論