版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第5章VHDL硬件描述語言第5章VHDL硬件描述語言5.1
VHDL程序結(jié)構(gòu)一個完整的VHDL程序基本結(jié)構(gòu)通常應(yīng)包含:庫(LIBRARY)、程序包(PACKAGE)、實體(ENTITY)、結(jié)構(gòu)體(ARCHITECTURE)、進程或其他并行結(jié)構(gòu)、配置(CONFIGURATION)等。在VHDL程序中,實體(ENTITY)和結(jié)構(gòu)體(ARCHITECTURE)這兩個基本結(jié)構(gòu)是必需的,它們可以構(gòu)成最簡單的VHDL程序。實體是設(shè)計實體的組成部分,它包含了對設(shè)計實體輸入和輸出的定義與說明,而設(shè)計實體則包含了實體和結(jié)構(gòu)體這兩個在VHDL程序中的最基本的部分。VHDL程序結(jié)構(gòu)的一個顯著特點就是,任何一個完整的設(shè)計實體都可以分成內(nèi)外兩個部分,外面的部分稱為可視部分,它由實體名和端口組成;里面的部分稱為不可視部分,由實際的功能描述組成。一旦對已完成的設(shè)計實體定義了可視界面后,其他的設(shè)計實體就可以將其作為已開發(fā)好的成果直接調(diào)用,這正是一種基于自頂向下的多層次的系統(tǒng)設(shè)計概念的實現(xiàn)途徑。5.1.1庫(LIBRARY)
為了提高設(shè)計效率以及使設(shè)計遵循統(tǒng)一的語言標準或數(shù)據(jù)格式,有必要將一些有用的信息匯集在一個或幾個庫中以供調(diào)用。這些信息可以是預(yù)先定義好的數(shù)據(jù)類型、子程序等設(shè)計單元的集合體(程序包),也可以是預(yù)先設(shè)計好的各種設(shè)計實體(元件庫程序包)。如果要在一項VHDL設(shè)計中用到某一程序包,就必須在這項設(shè)計中預(yù)先打開這個程序包,使此設(shè)計能隨時使用這一程序包中的內(nèi)容。為此,必須在這一設(shè)計實體前使用庫語句和USE語句。一般地,在VHDL程序中被聲明打開的庫和程序包,對于本項設(shè)計是可視的,這些庫中的內(nèi)容可以在設(shè)計中調(diào)用。通常,庫中放置不同數(shù)量的程序包,而程序包中又可放置不同數(shù)量的子程序,子程序中又含有函數(shù)、過程、設(shè)計實體(元件)等基礎(chǔ)設(shè)計單元。VHDL庫分為兩類:一類是設(shè)計庫,如在具體設(shè)計項目中設(shè)定的目錄所對應(yīng)的WORK庫;另一類是資源庫,資源庫是常規(guī)元件和標準模塊存放的庫,如IEEE庫。設(shè)計庫對當前項目是默認可視的,無需用LIBRARY和USE等語句以顯式聲明。聲明庫(LIBRARY)的語句格式如下:
LIBRARY庫名;
這一語句即相當于為其后的設(shè)計實體打開指定的庫,以便設(shè)計實體可以利用其中的程序包。如語句“LIBRARYIEEE;”表示打開IEEE庫。1.庫的種類VHDL程序設(shè)計中常用的庫有以下幾種:
1)?IEEE庫
IEEE庫是VHDL設(shè)計中最為常見的庫。IEEE庫中的標準程序包主要包括:STD_LOGIC_1164、NUMERIC_BIT、NUMERIC_STD等。其中的STD_LOGIC_1164是最重要和最常用的程序包。此外,還有一些程序包雖非IEEE標準,但由于其已成事實上的工業(yè)標準,也都并入了IEEE庫。最常用的是Synopsy公司的STD_LOGIC_ARITH、STD_LOGIC_SIGNED和STD_LOGIC_UNSIGNED程序包。2)?STD庫VHDL語言標準定義了兩個標準程序包,即STANDARD和TEXTIO程序包(文件輸入/輸出程序包),它們都被收入在STD庫中,只要在VHDL應(yīng)用環(huán)境中,即可隨時調(diào)用這兩個程序包中的所有內(nèi)容,即在編譯和綜合過程中VHDL的每一項設(shè)計都自動地將其包含進去了。由于STD庫符合VHDL語言標準,在應(yīng)用中不必如IEEE庫那樣一定要顯式聲明之,如在程序中,以下的庫語句是不必要的:
LIBRARYSTD;
USESTD.STANDARD.ALL;3)?WORK庫WORK庫是用戶的VHDL設(shè)計的現(xiàn)行工作庫,用于存放用戶設(shè)計和定義的一些設(shè)計單元和程序包,用戶設(shè)計項目的成品、半成品模塊以及先期已設(shè)計好的元件都放在其中。WORK庫自動滿足VHDL語言標準,在實際調(diào)用中,也不以顯式方式預(yù)先說明?;赩HDL所要求的WORK庫的基本概念,在PC或工作站上利用VHDL進行項目設(shè)計,不允許在根目錄下進行,必須設(shè)定一個專門的目錄,用于保存項目的所有設(shè)計文件,VHDL綜合器將此目錄默認為WORK庫。但必須注意,工作庫并不是這個目錄的目錄名,而是一個邏輯名。綜合器將指示器指向該目錄的路徑。VHDL標準規(guī)定工作庫總是可見的,因此,不必在VHDL程序中明確指定。4)?VITAL庫VITAL庫因而只在VHDL仿真器中使用,可以用于提高VHDL門級時序模擬的精度。庫中包含時序程序包VITAL_TIMING和VITAL_PRIMITIVES。VITAL庫已經(jīng)成為IEEE標準,在當前的VHDL仿真器的庫中,VITAL庫中的程序包都已經(jīng)并到了IEEE庫中。在VHDL設(shè)計中,有的EDA工具將一些程序包和設(shè)計單元放在一個目錄下,而將此目錄名(如“WORK”)作為庫名,如Synplicity公司的Synplify。有的EDA工具是通過配置語句結(jié)構(gòu)來指定庫和庫中的程序包,這時的配置即成為一個設(shè)計實體中最頂層的設(shè)計單元。此外,用戶還可以自己定義一些庫,將自己的設(shè)計內(nèi)容或通過交流獲得的程序包設(shè)計實體并入這些庫中。2.庫的用法
在VHDL語言中,庫的說明語句總是放在實體單元前面。這樣,在設(shè)計實體內(nèi)的語句時就可以使用庫中的數(shù)據(jù)和文件。由此可見,庫的用處在于使設(shè)計者可以共享已經(jīng)編譯過的設(shè)計成果。VHDL允許在一個設(shè)計實體中同時打開多個不同的庫,但庫之間必須是相互獨立的。例如:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;表示打開IEEE庫,再打開此庫中的STD_LOGIC_1164和STD_LOGIC_UNSIGNED程序包的所有內(nèi)容。由此可見,在實際使用中,庫是以程序包集合的方式存在的,具體調(diào)用的是程序包中的內(nèi)容。因此對于任一VHDL設(shè)計,所需從庫中調(diào)用的程序包在設(shè)計中應(yīng)是可見的,可調(diào)出的,即以明確的語句表達方式加以定義,庫語句指明庫中的程序包以及包中的待調(diào)用文件。對于必須以顯式表達的庫及其程序包的語言表達式,應(yīng)放在每一項設(shè)計實體最前面,成為這項設(shè)計的最高層次的設(shè)計單元。庫語句一般必須與USE語句同時使用。庫語句關(guān)鍵詞LIBRARY指明所使用的庫名,USE語句指明庫中的程序包。一旦說明了庫和程序包,整個設(shè)計實體都可進入訪問或調(diào)用,但其作用范圍僅限于所說明的設(shè)計實體。VHDL要求一項含有多個設(shè)計實體的更大的系統(tǒng)中,每一個設(shè)計實體都必須有自己完整的庫說明語句和USE語句。USE語句的使用將使所說明的程序包對本設(shè)計實體部分或全部開放??梢暤腢SE語句的使用有兩種常用格式:
USE庫名.程序包名.項目名;
USE庫名.程序包名.ALL;第一語句格式的作用是向本設(shè)計實體開放指定庫中的特定程序包內(nèi)所選定的項目。第二語句格式的作用是向本設(shè)計實體開放指定庫中的特定程序包內(nèi)所有的內(nèi)容。合法的USE語句的使用方法是,將USE語句說明中所要開放的設(shè)計實體對象緊跟在USE語句之后。例如,語句
USEIEEE.STD_LOGIC_1164.ALL;
表明打開IEEE庫中的STD_LOGIC_1164程序包,并使程序包中所有的公共資源對于本語句后面的VHDL設(shè)計實體程序全部開放,即該語句后的程序可任意使用程序包中的公共資源,這里用到了關(guān)鍵詞“ALL”,代表程序包中所有的資源。5.1.2程序包(PACKAGE)已在設(shè)計實體中定義的數(shù)據(jù)類型、子程序或數(shù)據(jù)對象對于其他設(shè)計實體是不可用的,或者說是不可見的,為了使已定義的常數(shù)、數(shù)據(jù)類型、元件調(diào)用說明以及子程序能被更多的VHDL設(shè)計實體方便地訪問和共享,可以將它們收集在一個VHDL程序包中。多個程序包可以并入一個VHDL庫中,使之適用于更一般的訪問和調(diào)用范圍。這一點對于大系統(tǒng)開發(fā),多個或多組開發(fā)人員同步并行工作顯得尤為重要。程序包的內(nèi)容主要由如下四種基本結(jié)構(gòu)組成,因此一個程序包至少應(yīng)包含以下結(jié)構(gòu)中的一種。(1)常數(shù)說明:在程序包中的常數(shù)說明結(jié)構(gòu)用于預(yù)定義系統(tǒng)的寬度,如數(shù)據(jù)總線通道的寬度。(2)VHDL數(shù)據(jù)類型說明:這是在整個設(shè)計中通用的數(shù)據(jù)類型,例如通用的地址總線數(shù)據(jù)類型定義等。(3)元件定義:規(guī)定在VHDL設(shè)計中參與文件例化的文件對外的接口界面。(4)子程序:并入程序包的子程序有利于在設(shè)計中任一處被方便地調(diào)用。通常程序包中的內(nèi)容應(yīng)具有更大的適用面和良好的獨立性,以供各種不同設(shè)計需求的調(diào)用,一旦定義了一個程序包,各種獨立的設(shè)計就能方便地調(diào)用。定義程序包的一般語句結(jié)構(gòu)如下:
PACKAGE程序包名IS--程序包首
程序包首說明部分
END程序包名;
PACKAGEBODY程序包名IS--程序包體
程序包體說明部分以及包體內(nèi)容
END程序包名;
程序包的結(jié)構(gòu)由程序包的說明部分(即程序包首)和程序包的內(nèi)容部分(即程序包體)兩部分組成。一個完整的程序包中,程序包首的程序包名與程序包體的程序包名是同一個名字。1.程序包首
程序包首的說明部分可收集多個不同的VHDL設(shè)計所需的公共信息,其中包括數(shù)據(jù)類型說明、信號說明、子程序說明及元件說明等。所有這些信息雖然也可以在每一個設(shè)計實體中進行逐一單獨的定義和說明,但如果將這些經(jīng)常用到的并具有一般性的說明定義放在程序包中供隨時調(diào)用,顯然可以提高設(shè)計的效率和程序的可讀性。2.程序包體程序包體將包括在程序包首中已定義的子程序的子程序體。程序包體說明部分的組成內(nèi)容可以包括USE語句(允許對其他程序包的調(diào)用)、子程序定義、子程序體、數(shù)據(jù)類型說明、子類型說明和常數(shù)說明等。對于沒有具體子程序說明的程序包體,則可以省去。程序包常用來封裝屬于多個設(shè)計單元共同分享的信息。常用的預(yù)定義的程序包有以下幾種:
1)?STD_LOGIC_1164程序包
STD_LOGIC_1164程序包是IEEE庫中最常用的程序包,是IEEE的標準程序包,其中包含了一些數(shù)據(jù)類型、子類型和函數(shù)的定義,這些定義將VHDL擴展為一個能描述多值邏輯(0、1、高阻態(tài)“Z”、不定態(tài)“X”等)的硬件描述語言,很好地滿足了實際數(shù)字系統(tǒng)的設(shè)計需求。STD_LOGIC_1164程序包中用得最多和最廣的是定義了滿足工業(yè)標準的兩個數(shù)據(jù)類型STD_LOGIC和STD_LOGIC_VECTOR,它們非常適合于FPGA/CPLD器件中多值邏輯設(shè)計結(jié)構(gòu)。2)?STD_LOGIC_ARITH程序包STD_LOGIC_ARITH預(yù)先編譯在IEEE庫中,是Synopsys公司的程序包。此程序包在STD_LOGIC_1164程序包的基礎(chǔ)上,擴展了三個數(shù)據(jù)類型,分別是UNSIGNED、SIGNED和SMALL_INT,并為其定義了相關(guān)的算術(shù)運算符和轉(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型混合運算的運算符,并定義了一個由STD_LOGIC_VECTOR型到INTEGER型的轉(zhuǎn)換函數(shù)。這兩個程序包的區(qū)別是STD_LOGIC_SIGNED中定義的運算符考慮到了符號,是有符號數(shù)的運算。程序包STD_LOGIC_ARITH、STD_LOGIC_UNSIGNED和STD_LOGIC_SIGNED雖然未成為IEEE標準,但已經(jīng)成為事實上的工業(yè)標準,絕大多數(shù)的VHDL綜合器和VHDL仿真器都支持它們。4)?STANDARD和TEXTIO程序包以上已經(jīng)提到了STANDARD和TEXTIO程序包,它們都是STD庫中的預(yù)編譯程序包。STANDARD程序包中定義了許多基本的數(shù)據(jù)類型、子類型和函數(shù)。由于STANDARD程序包是VHDL標準程序包,實際應(yīng)用中已隱性地打開了,所以不必再用USE語句另作聲明。TEXTIO程序包定義了支持文本文件操作的許多類型和子程序,在使用本程序包之前,需加語句USESTD.TEXTIO.ALL。TEXTIO程序包主要僅供仿真器使用,可以用文本編輯器建立一個數(shù)據(jù)文件,文件中包含仿真時需要的數(shù)據(jù),然后仿真時用TEXTIO程序包中的子程序存取這些數(shù)據(jù)。5.1.3實體(ENTITY)
實體作為一個設(shè)計實體的組成部分,其功能是對這個設(shè)計實體與外部電路進行接口描述。實體是設(shè)計實體的表層設(shè)計單元,實體說明部分規(guī)定了設(shè)計單元的輸入輸出接口信號或引腳,它是設(shè)計實體對外的一個通信界面。就一個設(shè)計實體而言,外界所看到的僅僅是它的界面上的各種接口。設(shè)計實體可以擁有一個或多個結(jié)構(gòu)體,用于描述此設(shè)計實體的邏輯結(jié)構(gòu)和邏輯功能。對于外界來說,這一部分是不可見的。不同邏輯功能的設(shè)計實體可以擁有相同的實體描述,這是因為實體類似于原理圖中的一個部件符號,而其具體的邏輯功能是由設(shè)計實體中結(jié)構(gòu)體的描述確定的。實體是VHDL的基本設(shè)計單元,它可以對一個門電路、一個芯片、一塊電路板乃至整個系統(tǒng)進行接口描述。1.實體語句結(jié)構(gòu)
實體說明單元的常用語句結(jié)構(gòu)為
ENTITY實體名IS[GENERIC(類屬表)PORT(端口表)]ENDENTITY實體名
實體說明單元必須按照這一結(jié)構(gòu)來編寫,實體應(yīng)以語句“ENTITY實體名IS”開始,以語句“ENDENTITY實體名;”結(jié)束,其中的實體名可以由設(shè)計者自己添加。方括號中間的語句描述,在特定的情況下并非是必需的,程序文字的大小寫是不加區(qū)分的。2.實體名在實體中定義的實體名即為這個設(shè)計實體的名稱。MAX
+
plusⅡ軟件對VHDL文件的取名有特殊要求,要求文件名必須與實體名一致。3.?GENERIC類屬說明語句
類屬GENERIC參量是一種端口界面常數(shù),常以一種說明的形式放在實體或塊結(jié)構(gòu)體前的說明部分。類屬為所說明的環(huán)境提供了一種靜態(tài)信息通道。類屬與常數(shù)不同,常數(shù)只能從設(shè)計實體的內(nèi)部得到賦值,且不能再改變,而類屬的值可以由設(shè)計實體外部提供。因此,設(shè)計者可以從外面通過類屬參量的重新設(shè)定而容易地改變一個設(shè)計實體或一個元件的內(nèi)部電路結(jié)構(gòu)和規(guī)模。類屬說明的一般書寫格式如下:
GENERIC(常數(shù)名:數(shù)據(jù)類型:設(shè)定值;
常數(shù)名:數(shù)據(jù)類型:設(shè)定值);
類屬參量以關(guān)鍵詞GENERIC引導(dǎo)一個類屬參量表,在表中提供時間參數(shù)或總線寬度等靜態(tài)信息。類屬表說明用于設(shè)計實體和其外部環(huán)境通信的參數(shù),傳遞靜態(tài)的信息。類屬在所定義的環(huán)境中的地位與常數(shù)十分接近,但卻能從環(huán)境(如設(shè)計實體)外部動態(tài)地接受賦值,其行為又有點類似于端口PORT。因此,常如以上的實體定義語句那樣,將類屬說明放在其中,且放在端口說明語句的前面。例5.1
2輸入與門的實體描述如下:
ENTITYPGAND2ISGENERIC(trise:TIME:=1ns;
tfall:TIME:=1ns);
PORT(a1:INSTD_LOGIC;
a0:INSTD_LOGIC;
z0:OUTSTD_LOGIC);
ENDENTITYPGAND2;這是一個準備作為2輸入與門的設(shè)計實體的實體描述,在類屬說明中定義參數(shù)trise為上沿寬度,tfall為下沿寬度,它們分別為1?ns,這兩個參數(shù)用于仿真模塊的設(shè)計。4.?PORT端口說明
由PORT引導(dǎo)的端口說明語句是對一個設(shè)計實體界面的說明。其端口表部分對設(shè)計實體與外部電路的接口通道進行了說明,其中包括對每一接口的輸入輸出模式(MODE或稱端口模式)和數(shù)據(jù)類型(TYPE)進行了定義。在實體說明的前面,可以有庫的說明,即由關(guān)鍵詞“LIBRARY”和“USE”引導(dǎo)一些對庫和程序包使用的說明語句,其中的一些內(nèi)容可以為實體端口數(shù)據(jù)類型的定義所用。實體端口說明的一般書寫格式如下:
PORT(端口名:端口模式數(shù)據(jù)類型;
端口名:端口模式數(shù)據(jù)類型);
其中的端口名是設(shè)計者為實體的每一個對外通道所取的名字,端口模式是指這些通道上的數(shù)據(jù)流動方式,如輸入或輸出等。數(shù)據(jù)類型是指端口上流動的數(shù)據(jù)的表達格式或取值類型,這是由于VHDL是一種強類型語言,即對語句中的所有的端口信號、內(nèi)部信號和操作數(shù)的數(shù)據(jù)類型有嚴格的規(guī)定,只有相同數(shù)據(jù)類型的端口信號和操作數(shù)才能相互作用。例5.2
2輸入與非門的實體描述如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYnand2ISPORT(a:INSTD_LOGIC;b:INSTD_LOGIC;c:OUTSTD_LOGIC);ENDnand2;...IEEE1076標準程序包中定義了以下的常用端口模式(見表5.1):(1)?IN模式。IN定義的通道確定為輸入端口,并規(guī)定為單向只讀模式,可以通過此端口將變量(Variable)信息或信號(Signal)信息讀入設(shè)計實體中。(2)?OUT模式。OUT定義的通道確定為輸出端口,并規(guī)定為單向輸出模式,可以通過此端口將信號輸出設(shè)計實體,或者說可以將設(shè)計實體中的信號向此端口賦值。(3)?INOUT模式。INOUT定義的通道確定為輸入輸出雙向端口,即從端口的內(nèi)部看,可以對此端口進行賦值,也可以通過此端口讀入外部的數(shù)據(jù)信息;而從端口的外部看,信號既可以從此端口流出,也可以向此端口輸入信號。INOUT模式包含了IN、OUT和BUFFER三種模式,因此可用INOUT模式替代其中任何一種模式,但為了明確程序中各端口的實際任務(wù),一般不作這種替代。(4)BUFFER模式。BUFFER定義的通道確定為具有數(shù)據(jù)讀入功能的輸出端口,它與雙向端口的區(qū)別在于只能接受一個驅(qū)動源。BUFFER模式從本質(zhì)上看仍是OUT模式,只是在內(nèi)部結(jié)構(gòu)中具有將輸出至外端口的信號回讀的功能,即允許內(nèi)部回讀輸出的信號,亦即允許反饋。如計數(shù)器的設(shè)計,可將計數(shù)器輸出的計數(shù)信號回讀,以作下一計數(shù)值的初值。與INOUT模式相比,顯然,BUFFER的區(qū)別在于回讀(輸入)的信號不是由外部輸入的,而是由內(nèi)部產(chǎn)生,向外輸出的信號,有時往往在時序上有所差異。
端口模式
端口模式說明(以設(shè)計實體為主體)IN輸入端口,只讀模式OUT輸出端口,單向賦值模式BUFFER具有讀功能的輸出模式,(從內(nèi)部看)可以讀或?qū)?,只能有一個驅(qū)動源INOUT雙向端口,(從內(nèi)部或外部看)都可以讀或?qū)懕?.1端口模式說明在實用中,端口描述中的數(shù)據(jù)類型主要有兩類:位(BIT)和位矢量(BIT_VECTOR)。若端口的數(shù)據(jù)類型定義為BIT,則其信號值是一個1位的二進制數(shù),取值只能是0或1;若端口的數(shù)據(jù)類型定義為BIT_VECTOR,則其信號值是一組二進制數(shù)。5.1.4結(jié)構(gòu)體(ARCHITECTURE)結(jié)構(gòu)體是設(shè)計實體中的一個組成部分,主要描述設(shè)計實體的內(nèi)部結(jié)構(gòu)和/或外部設(shè)計實體端口間的邏輯關(guān)系。結(jié)構(gòu)體由以下部分組成:
(1)對數(shù)據(jù)類型、常數(shù)、信號、子程序和元件等元素的說明部分。(2)描述實體邏輯行為,并以各種不同的描述風(fēng)格表達的功能描述語句,包括各種形式的順序描述語句和并行描述語句。(3)以元件例化語句為特征的外部元件(設(shè)計實體)端口間的連接方式。(4)結(jié)構(gòu)體將具體實現(xiàn)一個實體,每個實體可以有多個結(jié)構(gòu)體,其中每個結(jié)構(gòu)體對應(yīng)著實體不同的結(jié)構(gòu)和算法實現(xiàn)方案,這些結(jié)構(gòu)體的地位是同等的,它們完整地實現(xiàn)了實體的行為。但同一結(jié)構(gòu)體不能為不同的實體所擁有。結(jié)構(gòu)體不能單獨存在,必須有一個界面說明。對于具有多個結(jié)構(gòu)體的實體,必須用CONFIGURATION配置語句指明用于綜合的結(jié)構(gòu)體和用于仿真的結(jié)構(gòu)體,即在綜合后的可映射于硬件電路的設(shè)計實體中,一個實體只能對應(yīng)一個結(jié)構(gòu)體。在電路中,如果實體代表一個器件符號,則結(jié)構(gòu)體描述了這個符號的內(nèi)部行為。當把這個符號例化成一個實際的器件安裝到電路上時,則需配置語句為這個例化的器件指定一個結(jié)構(gòu)體(即指定一種實現(xiàn)方案),或由編譯器自動選擇一個結(jié)構(gòu)體。1.結(jié)構(gòu)體的一般語言格式
結(jié)構(gòu)體的語句格式如下:
ARCHITECTURE結(jié)構(gòu)體名OF實體名IS[說明語句]BEGIN[功能描述語句]ENDARCHITECTURE結(jié)構(gòu)體名;在書寫格式上,實體名必須是所在設(shè)計實體的名字,而結(jié)構(gòu)體名可以由設(shè)計者自己選擇,但當一個實體具有多個結(jié)構(gòu)體時,結(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)等加以說明。在一個結(jié)構(gòu)體中說明和定義的數(shù)據(jù)類型、常數(shù)、元件、函數(shù)和過程只能用于這個結(jié)構(gòu)體中。如果希望這些定義也能用于其他的實體或結(jié)構(gòu)體中,則需要將其作為程序包來處理。3.功能描述語句結(jié)構(gòu)
功能描述語句結(jié)構(gòu)可以含有五種不同類型的以并行方式工作的語句結(jié)構(gòu)。這可以看成是結(jié)構(gòu)體的五個子結(jié)構(gòu)。在每一語句結(jié)構(gòu)的內(nèi)部可含有并行運行的邏輯描述語句或順序運行的邏輯描述語句。這就是說,這五種語句結(jié)構(gòu)本身是并行語句,但它們內(nèi)部所包含的語句并不一定是并行語句,如進程語句內(nèi)所包含的是順序語句。五種語句結(jié)構(gòu)的基本組成和功能分別介紹如下:
(1)塊語句是由一系列并行執(zhí)行語句構(gòu)成的組合體,它的功能是將結(jié)構(gòu)體中的并行語句組成一個或多個子模塊。(2)進程語句定義順序語句模塊,用以將外部獲得的信號值或內(nèi)部的運算數(shù)據(jù)向其他的信號進行賦值。(3)信號賦值語句將設(shè)計實體內(nèi)的處理結(jié)果向定義的信號或界面端口進行賦值。(4)子程序調(diào)用語句用以調(diào)用過程或函數(shù),并將獲得的結(jié)果賦值于信號。(5)元件例化語句對其他的設(shè)計實體作元件調(diào)用說明,并將此元件的端口與其他的元件、信號或高層次實體的界面端口進行連接。5.1.5塊語句結(jié)構(gòu)(BLOCK)塊(BLOCK)的應(yīng)用類似于畫一個大的電路原理圖時,可以將一個總的原理圖分成多個子模塊,則這個總的原理圖成為一個由多個子模塊原理圖連接而成的頂層模塊圖,其中每一個子模塊可以是一個具體的電路原理圖。但是,如果子模塊的原理圖仍然太大,還可將它變成更低層次的連接圖(BLOCK嵌套)。顯然,按照這種方式劃分結(jié)構(gòu)體僅是形式上的,而非功能上的改變。事實上,將結(jié)構(gòu)體以模塊方式劃分的方法有多種,例如使用元件例化語句就是一種將結(jié)構(gòu)體的并行描述分成多個層次的方法,區(qū)別只是后者涉及到多個實體和結(jié)構(gòu)體,且綜合后硬件結(jié)構(gòu)的邏輯層次有所增加。BLOCK是VHDL中具有的一種劃分機制,這種機制允許設(shè)計者合理地將一個模塊分為數(shù)個區(qū)域,在每個區(qū)域中都能對其局部信號、數(shù)據(jù)類型和常量加以描述和定義。任何能在結(jié)構(gòu)體的說明部分進行說明的對象都能在BLOCK說明部分中進行說明。BLOCK語句應(yīng)用只是一種將結(jié)構(gòu)體中的并行描述語句進行組合的方法,它的主要目的是改善并行語句及其結(jié)構(gòu)的可讀性,或是利用BLOCK的保護表達式關(guān)閉某些信號。1.?BLOCK語句的格式
BLOCK語句的表達格式如下:
塊標號:BLOCK[(塊保護表達式)]接口說明
類屬說明
BEGIN并行語句
ENDBLOCK塊標號;一個BLOCK語句結(jié)構(gòu),在關(guān)鍵詞“BLOCK”的前面必須設(shè)置一個塊標號,并在結(jié)尾語句“ENDBLOCK”右側(cè)也寫上此標號(但此處的塊標號不是必需的)。接口說明部分類似于實體的定義部分,可包含由關(guān)鍵詞PORT、GENERIC、PORTMAP和GENERICMAP引導(dǎo)的接口說明等語句,用于對BLOCK的接口設(shè)置以及與外界信號的連接狀況加以說明。這類似于原理圖間的圖示接口說明。類屬說明部分和接口說明部分的適用范圍僅限于當前BLOCK,所有這些在BLOCK內(nèi)部的說明對于這個塊的外部來說是完全不透明的,即不能適用于外部環(huán)境,或由外部環(huán)境所調(diào)用,但對于嵌套于更內(nèi)層的塊卻是透明的,即可將信息向內(nèi)部傳遞。塊的說明部分可以定義的項目主要有: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)體中的并行語句劃分成多個并列的BLOCK,每一個BLOCK都像一個獨立的設(shè)計實體,具有自己的類屬參數(shù)說明和界面端口,以及與外部環(huán)境的銜接描述。在較大的VHDL程序的編程中,恰當應(yīng)用塊語句對于技術(shù)交流、程序移植、排錯和仿真都是有益的。3.?BLOCK語句在綜合中的地位
與大部分的VHDL語句不同,BLOCK語句的應(yīng)用,包括其中的類屬說明和端口定義,都不會影響對原結(jié)構(gòu)體的邏輯功能的仿真結(jié)果。5.1.6進程(PROCESS)PROCESS語句結(jié)構(gòu)包含用獨立的順序語句描述的進程,該進程描述了設(shè)計實體中的部分邏輯行為。與并行語句的同時執(zhí)行方式不同,順序語句運行的順序是同程序語句書寫的順序相一致的。一個結(jié)構(gòu)體中可以有多個并行運行的進程結(jié)構(gòu),而每一個進程的內(nèi)部結(jié)構(gòu)卻是由一系列順序語句來構(gòu)成的。需要注意的是,在VHDL中,所謂順序,僅僅是指語句按序執(zhí)行上的順序性,但這并不意味著PROCESS語句結(jié)構(gòu)所對應(yīng)的硬件邏輯行為也具有相同的順序性。PROCESS結(jié)構(gòu)中的順序語句,及其所謂的順序執(zhí)行過程只是相對于計算機中的軟件行為仿真的模擬過程而言的,這個過程與硬件結(jié)構(gòu)中實現(xiàn)的對應(yīng)的邏輯行為可能是不相同的。PROCESS結(jié)構(gòu)中既可以有時序邏輯的描述,也可以有組合邏輯的描述,它們都可以用順序語句來表達。然而,硬件中的組合邏輯具有典型的并行邏輯功能,而硬件中的時序邏輯也并非都是以順序方式工作的。1.PROCESS語句格式
PROCESS語句的表達格式如下:
[進程標號:]PROCESS[(敏感信號參數(shù)表)][IS][進程說明部分]BEGIN順序描述語句
ENDPROCESS[進程標號];每一個PROCESS語句結(jié)構(gòu)可以賦予一個進程標號,但這個標號不是必需的。進程說明部分定義該進程所需的局部數(shù)據(jù)環(huán)境。順序描述語句部分是一段順序執(zhí)行的語句,描述該進程的行為。PROCESS中規(guī)定了每個進程語句在當它的某個敏感信號(由敏感信號參量表列出)的值改變時都必須立即完成某一功能行為,這個行為由進程語句中的順序語句定義,行為的結(jié)果可以賦給信號,并通過信號被其他的PROCESS或BLOCK讀取或賦值。當進程中定義的任一敏感信號發(fā)生更新時,由順序語句定義的行為就要重復(fù)執(zhí)行一次,當進程中最后一個語句執(zhí)行完成后,執(zhí)行過程將返回到進程的第一個語句,以等待下一次敏感信號變化。如此循環(huán)往復(fù)以至無限。但當遇到WAIT語句時,執(zhí)行過程將被有條件地終止,即所謂的掛起(Suspention)。一個結(jié)構(gòu)體中可以含有多個PROCESS結(jié)構(gòu),每一PROCESS結(jié)構(gòu)對應(yīng)于其敏感信號參數(shù)表中定義的任一敏感參量的變化,每個進程可以在任何時刻被激活或者稱為啟動。而在一個結(jié)構(gòu)體中,所有被激活的進程都是并行運行的,這就是為什么PROCESS結(jié)構(gòu)本身是并行語句的道理。PROCESS語句必須以語句“ENDPROCESS[進程標號];”結(jié)尾,對于目前常用的綜合器來說,其中進程標號不是必須的,敏感表旁的[IS]也不是必須的。2.?PROCESS組成
如上所述,PROCESS語句結(jié)構(gòu)是由三個部分組成的,即進程說明部分、順序描述語句部分和敏感信號參數(shù)表。(1)進程說明部分主要定義一些局部量,可包括數(shù)據(jù)類型、常數(shù)、變量、屬性、子程序等。但需注意,在進程說明部分中不允許定義信號和共享變量。(2)順序描述語句部分可分為賦值語句、進程啟動語句、子程序調(diào)用語句、順序描述語句和進程跳出語句等,它們包括:
信號賦值語句:即在進程中將計算或處理的結(jié)果向信號(SIGNAL)賦值。
變量賦值語句:即在進程中以變量(VARIABLE)的形式存儲計算的中間值。
進程啟動語句:當PROCESS的敏感信號參數(shù)表中沒有列出任何敏感量時,進程的啟動只能通過進程啟動語句WAIT語句實現(xiàn)。這時可以利用WAIT語句監(jiān)視信號的變化情況,以便決定是否啟動進程。WAIT語句可以看成是一種隱式的敏感信號表。子程序調(diào)用語句:對已定義的過程和函數(shù)進行調(diào)用,并參與計算。
順序描述語句:包括IF語句、CASE語句、LOOP語句、NULL語句等。進程跳出語句:包括NEXT語句、EXIT語句,用于控制進程的運行方向。(3)敏感信號參數(shù)表需列出用于啟動本進程可讀入的信號名(當有WAIT語句時例外)。例5.3中所給程序是一個含有進程的結(jié)構(gòu)體,進程標號是p1(進程標號不是必須的),進程的敏感信號參數(shù)表中未列出敏感信號,所以進程的啟動需靠WAIT語句。在此,信號clock即為該進程的敏感信號。每當出現(xiàn)一個時鐘脈沖clock時,即進入WAIT語句以下的順序語句執(zhí)行進程中,且當driver為高電平時進入CASE語句結(jié)構(gòu)。例5.3含有進程的結(jié)構(gòu)體示例。代碼如下:ARCHITECUREs_modeOFstat
ISBEGINp1PROCESSBEGINWAITUNTILclock;--等待clock激活進程
IF(driver='1')THENCASEoutputISWHENs1=>output<=s2;WHENs2=>output<=s3;WHENs3=>output<=s4;WHENs4=>output<=s1;ENDCASEENDIFENDPROCESSp1ENDARCHITECUREs_mode;5.1.7子程序(SUBPROGRAM)子程序是一個VHDL程序模塊,這個模塊中只能利用順序語句來定義和完成算法,這一點與進程十分相似。所不同的是,子程序不能像進程那樣可以從本結(jié)構(gòu)體的其他塊或進程結(jié)構(gòu)中直接讀取信號值或者向信號賦值。子程序只能通過調(diào)用方式使用,與子程序的界面端口進行通信。子程序的應(yīng)用與元件例化(元件調(diào)用)是不同的,如在一個設(shè)計實體或另一個子程序中調(diào)用子程序后,并不像元件例化那樣會產(chǎn)生一個新的設(shè)計層次。子程序可以在VHDL程序的三個不同位置進行定義,即在程序包、結(jié)構(gòu)體和進程中定義。但由于只有在程序包中定義的子程序可被幾個不同的設(shè)計所調(diào)用,所以一般應(yīng)該將子程序放在程序包中。VHDL子程序具有可重載性的特點,即允許同時有許多重名的子程序,但這些子程序的參數(shù)類型及返回值數(shù)據(jù)類型是不同的。子程序的可重載性是一個非常有用的特性。子程序有兩種類型,即過程(PROCEDURE)和函數(shù)(FUNCTION)。過程可通過其界面提供多個返回值,或不提供任何值,而函數(shù)只能返回一個值。在函數(shù)入口中,所有參數(shù)都是輸入?yún)?shù),而過程則有輸入?yún)?shù)、輸出參數(shù)和雙向參數(shù)之分。過程一般被看作一種語句結(jié)構(gòu),常在結(jié)構(gòu)體或進程中以獨立語句的形式存在,而函數(shù)通常是表達式的一部分,常在賦值語句或表達式中使用。過程可以單獨存在,其行為類似于進程,而函數(shù)通常作為語句的一部分被調(diào)用。在實用中必須注意,綜合后的子程序?qū)⒂成錇槟繕诵酒械囊粋€相應(yīng)的電路模塊,且每一次調(diào)用都將在硬件結(jié)構(gòu)中產(chǎn)生具有相同結(jié)構(gòu)的不同的模塊,這一點與在普通的軟件中調(diào)用子程序有很大的不同。在PC機或單片機軟件程序執(zhí)行中(包括VHDL的行為仿真),無論對程序中的子程序調(diào)用多少次,都不會發(fā)生計算機資源如存儲資源不夠用的情況,但在面向VHDL的綜合中,每調(diào)用一次子程序都意味著增加了一個硬件電路模塊。因此,在實用中,要密切關(guā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ù)類型的信號和端口間進行映射;決斷函數(shù)用于在多驅(qū)動信號時解決信號競爭問題。函數(shù)的語言表達格式如下:
FUNCTION函數(shù)名(參數(shù)表)RETURN數(shù)據(jù)類型--函數(shù)首
FUNCTION函數(shù)名(參數(shù)表)RETURN數(shù)據(jù)類型IS--函數(shù)體
[說明部分]BEGIN順序語句;ENDFUNCTION函數(shù)名;一般地,函數(shù)定義應(yīng)由兩部分組成,即函數(shù)首和函數(shù)體,在進程或結(jié)構(gòu)體中不必定義函數(shù)首,而在程序包中必須定義函數(shù)首。1)函數(shù)首函數(shù)首由函數(shù)名、參數(shù)表和返回值的數(shù)據(jù)類型三部分組成。如果要將所定義的函數(shù)組織成程序包放入庫中的話,定義函數(shù)首是必需的,這時的函數(shù)首就相當于一個入庫貨物名稱與貨物位置表,實際入庫的是函數(shù)體。函數(shù)首的名稱即為函數(shù)的名稱,需放在關(guān)鍵詞FUNCTION之后,此名稱可以是普通的標識符,也可以是運算符,運算符必須加上雙引號,這就是所謂的運算符重載。運算符重載就是對VHDL中現(xiàn)存的運算符進行重新定義,以獲得新的功能。新功能的定義是靠函數(shù)體來完成的。函數(shù)的參數(shù)表用來定義輸出值,所以不必以顯式表示參數(shù)的方向,函數(shù)參數(shù)表中可以是信號或常數(shù),參數(shù)名需放在關(guān)鍵詞CONSTANT或SIGNAL之后。如果沒有特別說明,則參數(shù)被默認為常數(shù)。如果要將一個已編制好的函數(shù)并入程序包,函數(shù)首必須放在程序包的說明部分,而函數(shù)體需放在程序包的包體內(nèi)。如果只是在一個結(jié)構(gòu)體中定義并調(diào)用函數(shù),則僅需函數(shù)體即可。由此可見,函數(shù)首的作用只是作為程序包的有關(guān)此函數(shù)的一個接口界面。2)函數(shù)體函數(shù)體包含一個對數(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)成,即過程首和過程體,其中過程首也不是必需的,過程體可以獨立存在和使用,即在進程或結(jié)構(gòu)體中不必定義過程首。但與函數(shù)一樣,要將過程并入程序包中時,必須定義過程首。1)過程首過程首由過程名和參數(shù)表組成。參數(shù)表用于對過程的參數(shù)進行說明,指明其類型和工作模式。常數(shù)、變量和信號三類數(shù)據(jù)對象可用作過程的參數(shù),關(guān)鍵詞IN、OUT和INOUT定義了這些參數(shù)的工作模式,即信息的流向。如果沒有指定模式,則默認為IN。以下是三個過程首的定義示例。例5.4過程首定義示例。代碼如下:PROCEDUREpro1(VARIABLEa,b:INOUTREAL);PROCEDUREpro2(CONSTANTa1:ININTEGERVARIABLEb1:OUTINTEGER);PROCEDUREpro3(SIGNALsig:INOUTBIT);在例5.4中,過程pro1定義了兩個實數(shù)雙向變量a和b;過程pro2定義了兩個參量,第一個是常數(shù),它的數(shù)據(jù)類型為整數(shù),流向模式是IN,第二個參量是變量,工作模式和數(shù)據(jù)類型分別是OUT和整數(shù);過程pro3中只定義了一個信號參量,即sig,它的工作模式是雙向INOUT,數(shù)據(jù)類型是BIT。一般地,可在參量表中定義三種流向模式,即IN、OUT和INOUT。如果只定義了IN模式而未定義目標參量類型,則默認為常量;若只定義了INOUT或OUT,則默認目標參量類型是變量。2)過程體過程體是由順序語句組成的,過程的調(diào)用即啟動了對過程體的順序語句的執(zhí)行。與函數(shù)一樣,過程體中的說明部分只是局部的,其中的各種定義只能適用于過程體內(nèi)部。過程體的順序語句部分可以包含任何順序執(zhí)行的語句,包括WAIT語句。但需注意,如果一個過程是在進程中調(diào)用的,且這個進程已列出了敏感參量表,則不能在此過程中使用WAIT語句。在不同的調(diào)用環(huán)境中,可以有兩種不同的語句方式對過程進行調(diào)用,即順序語句方式或并行語句方式。在一般的順序語句自然執(zhí)行過程中,一個過程被調(diào)用執(zhí)行,則屬于順序語句方式,因為這時它只相當于一條順序語句的執(zhí)行;當過程處于并行語句環(huán)境中時,其過程體中定義的任一IN或INOUT的目標參量(即數(shù)據(jù)對象:變量、信號、常數(shù))發(fā)生改變時,將啟動過程的調(diào)用,這時的調(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;這個過程對具有雙向模式變量的值value作了一個數(shù)據(jù)轉(zhuǎn)換運算。
5.1.8配置(CONFIGURATION)配置語句是用來為較大的系統(tǒng)設(shè)計提供管理和工程組織的,可以把特定的結(jié)構(gòu)體關(guān)聯(lián)到(指定給)一個確定的實體。通常在大而復(fù)雜的VHDL工程設(shè)計中,配置語句可以為實體指定或配屬一個結(jié)構(gòu)體。如可以利用配置使仿真器為同一實體配置不同的結(jié)構(gòu)體以使設(shè)計者比較不同結(jié)構(gòu)體的仿真差別,或者為實例化的各元件實體配置指定的結(jié)構(gòu)體,從而形成一個所希望的實例化元件層次構(gòu)成的設(shè)計實體。配置也是VHDL設(shè)計實體中的一個基本單元。在綜合或仿真中,可以利用配置語句為確定整個設(shè)計提供許多有用信息。例如對以元件的層次方式構(gòu)成的VHDL設(shè)計實體,就可以把配置語句的設(shè)置看成是一個元件表,以配置語句指定在頂層設(shè)計中的每一元件與一特定結(jié)構(gòu)體相銜接,或賦予特定屬性。配置語句還能用于對元件的端口連接進行重新安排等。VHDL綜合器允許將配置規(guī)定為針對一個設(shè)計實體中的最高層設(shè)計單元,但只支持對最頂層的實體進行配置,通常情況下,配置主要用在VHDL的行為仿真中。配置語句的一般格式如下:
CONFIGURATION配置名OF實體名IS配置說明
END配置名;配置主要為頂層設(shè)計實體指定結(jié)構(gòu)體,或為參與例化的元件實體指定所希望的結(jié)構(gòu)體,以層次方式來對元件例化作結(jié)構(gòu)配置。如前所述,每個實體可以擁有多個不同的結(jié)構(gòu)體,而每個結(jié)構(gòu)體的地位是相同的,在這種情況下,可以利用配置說明為這個實體指定一個結(jié)構(gòu)體。5.2
VHDL語言要素VHDL的語言要素主要有數(shù)據(jù)對象(DataObjects,Objects),其中包括變量(Variables)、信號(Signals)和常數(shù)(Constants),數(shù)據(jù)類型(DataTypes,Types)和各類操作數(shù)(Operands)及運算操作符(Operators)。準確無誤地理解和掌握VHDL語言要素的基本含義和用法,對于正確地完成VHDL程序設(shè)計十分重要。5.2.1
VHDL文字規(guī)則
VHDL文字(Literal)主要包括數(shù)值和標識符。數(shù)值型文字所描述的值主要有數(shù)字型、字符串型、位串型。1.數(shù)字型文字
數(shù)字型文字的值有多種表達方式,現(xiàn)列舉如下:
(1)整數(shù)文字。整數(shù)文字都是十進制的數(shù),如:4,512,0,248E2(?=?24800),57_141_352(?=?57141352)。(2)實數(shù)文字。實數(shù)文字也都是十進制的數(shù),但必須帶有小數(shù)點,如:188.993,88_670_551.453_909(?=?88670551.453909),1.0,44.99E?-?2(?=?0.4499),1.335。(3)以數(shù)制基數(shù)表示的文字。用這種方式表示的數(shù)由五個部分組成。第一部分,用十進制數(shù)標明數(shù)制進位的基數(shù);第二部分,數(shù)制隔離符號“#”;第三部分,表達的數(shù);第四部分,指數(shù)隔離符號“#”;第五部分,用十進制表示的指數(shù)部分,這一部分的數(shù)如果為0,則可以省去不寫。如:
SIGNALd1,d2,d3,d4,:INTEGERRANGE0TO255;d1<=10#170#;
--(十進制表示等于170)d2<=16#FE#;--(十六進制表示等于254)d3<=2#1111_1110#;--(二進制表示等于254)d4<=8#376#;--(八進制表示等于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ù)位字符串與文字字符串相似,但所代表的是二進制、八進制或十六進制的數(shù)組。數(shù)位字符串所代表的位矢量的長度即為等值的二進制數(shù)的位數(shù)。數(shù)字字符串數(shù)值的數(shù)據(jù)類型是一維的枚舉型數(shù)組。與文字字符串的表示不同,數(shù)位字符串的表示首先要有計算基數(shù),然后將該基數(shù)表示的值放在雙引號中,基數(shù)符以“B”、“O”和“X”表示,并放在字符串的前面。它們的含義分別是:
B:二進制基數(shù)符號,表示二進制位0或1,在字符串中的每一個位表示一個bit。O:八進制基數(shù)符號,在字符串中的每一個數(shù)代表一個八進制數(shù),即代表一個3位(bit)的二進制數(shù)。X:十六進制基數(shù)符號(0~F),代表一個十六進制數(shù),即代表一個4位的二進制數(shù)。例如:
data1<=B"1_1101_1110"——二進制數(shù)數(shù)組位矢數(shù)組長度是9data2<=O"15"——八進制數(shù)數(shù)組位矢數(shù)組長度是63.標識符
標識符是最常用的操作符,標識符可以是常數(shù)、變量、信號、端口、子程序或參數(shù)的名字。VHDL基本標識符的書寫遵守如下規(guī)則:(1)有效的字符:英文字母,包括大小寫字母a~z,A~Z;數(shù)字,包括0~9以及下劃線“_”。(2)任何標識符必須以英文字母開頭,標識符中的英語字母不區(qū)分大小寫。(3)下劃線“_”前后都必須有英文字母或數(shù)字,同時,一個標識符中只能使用一個下劃線。(4)VHDL'93標準支持擴展標識符,擴展標識符以反斜杠來界定,可以以數(shù)字打頭,如\74LS373\、\HelloWorld\都是合法的標識符。在擴展標識符中,允許包含圖形符號(如回車符換行符等),也允許包含空格符,如?\IRDY#\、\C/BE\、\AorB\等都是合法的標識符。兩個反斜杠之前允許有多個下劃線相鄰,擴展標識符要分大小寫,擴展標識符與短標識符不同,擴展標識符如果含有一個反斜杠,則用兩個反斜杠來代替它。支持擴展標識符的目的是免受1987標準中的短標識符的限制,描述起來更為直觀和方便。但是目前仍有許多VHDL工具不支持擴展標識符。4.下標名
下標名用于指示數(shù)組型變量或信號的某一元素。下標段名則用于指示數(shù)組型變量或信號的某一段元素。下標名的語句格式如下:
標識符(表達式)標識符必須是數(shù)組型的變量或信號的名字,表達式所代表的值必須是數(shù)組下標范圍中的一個值,這個值對應(yīng)數(shù)組中的一個元素。如果下標名中的表達式是一個可計算的值,則此下名可很容易地進行綜合。如果是不可計算的,則只能在特定的情況下綜合,且耗費資源較大。5.段名
段名即多個下標名的組合,段名對應(yīng)數(shù)組中某一段的元素。段名的表達形式是:標識符(表達式方向表達式)這里的標識符必須是數(shù)組類型的信號名或變量名,每一個表達式的數(shù)值必須在數(shù)組元素下標號范圍以內(nèi),并且必須是可計算的(立即數(shù))。數(shù)據(jù)下標的變化方向用TO或者DOWNTO來表示。TO表示數(shù)組下標序列由低到高,如(2TO8);DOWNTO表示數(shù)組下標序列由高到低,如(8DOWNTO2)。所以段中兩表達式值的方向必須與原數(shù)組一致。5.2.2
VHDL數(shù)據(jù)對象在VHDL中,數(shù)據(jù)對象(DataObjects)類似于一種容器,可接受不同數(shù)據(jù)類型的賦值。數(shù)據(jù)對象有三類,即變量(VARIABLE)、常量(CONSTANT)和信號(SIGNAL)。前兩種可以從傳統(tǒng)的計算機高級語言中找到對應(yīng)的數(shù)據(jù)類型,其語言行為與高級語言中的變量和常量十分相似。但信號這一數(shù)據(jù)對象比較特殊,它具有更多的硬件特征,是VHDL中最有特色的語言要素之一。從硬件電路系統(tǒng)來看,變量和信號相當于組合電路系統(tǒng)中門與門間的連線及其連線上的信號值;常量相當于電路中的恒定電平,如GND或VCC接口的電平。從行為仿真和VHD語句功能上看,信號與變量具有比較明顯的區(qū)別,其差異主要表現(xiàn)在接受和保持信號的方式及信息保持與轉(zhuǎn)遞的區(qū)域大小上。例如信號可以設(shè)置傳輸延遲量,而變量則不能;變量只能作為局部的信息載體,如只能在所定義的進程中有效,而信號則可作為模塊間的信息載體,如在結(jié)構(gòu)體中各進程間傳遞信息。變量的設(shè)置有時只是一種過渡,最后的信息傳輸和界面間的通信都靠信號來完成。綜合后的VHDL文件中信號將對應(yīng)更多的硬件結(jié)構(gòu)。但需注意的是,對于信號和變量的認識單從行為仿真和語法要求的角度去認識是不完整的。事實上,在許多情況下,綜合后所對應(yīng)的硬件電路結(jié)構(gòu)中信號和變量并沒有什么區(qū)別,例如在滿足一定條件的進程中,綜合后它們都能引入寄存器。其關(guān)鍵在于,它們都具有能夠接受賦值這一重要的共性,而VHDL綜合器并不理會它們在接受賦值時存在的延時特性(只有VHDL行為仿真器才會考慮這一特性差異)。1.變量(VARIABLE)在VHDL語法規(guī)則中,變量是一個局部量,只能在進程和子程序中使用。變量不能將信息帶出定義它的當前設(shè)計單元。變量的賦值是一種理想化的數(shù)據(jù)傳輸,是立即發(fā)生,不存在任何延時的行為。VHDL語言規(guī)則不支持變量附加延時語句。變量常用在實現(xiàn)某種算法的賦值語句中。定義變量的語法格式如下:
VARIABLE變量名數(shù)據(jù)類型:=初始值
例如,下列變量定義語句分別定義a為整數(shù)型變量;b和c也為整數(shù)型變量,初始值為2;d為標準位變量:VARIABLEa:INTEGER;VARIABLEb,c:INTEGER:=2;VARIABLEd:STD_LOGIC;如前所述,變量作為局部量,其適用范圍僅限于定義了變量的進程或子程序中。但仿真過程中唯一的例外是共享變量。共享變量的值將隨變量賦值語句的運算結(jié)果而改變。變量定義語句中的初始值可以是一個與變量具有相同數(shù)據(jù)類型的常數(shù)值,也可以是一個全局靜態(tài)表達式,這個表達式的數(shù)據(jù)類型必須與所賦值的變量一致。此初始值不是必需的,綜合過程中綜合器將略去所有的初始值。變量賦值語句的語法格式如下:
目標變量名:=表達式
變量賦值符號是“:=”,變量數(shù)值的改變是通過變量賦值來實現(xiàn)的。賦值語句右方的表達式必須是一個與目標變量具有相同數(shù)據(jù)類型的數(shù)值,這個表達式可以是一個運算表達式,也可以是一個數(shù)值。通過賦值操作,新的變量值的獲得是立刻發(fā)生的。變量賦值語句左邊的目標變量可以是單值變量,也可以是一個變量的集合,即數(shù)組型變量。2.信號(SIGNAL)信號是描述硬件系統(tǒng)的基本數(shù)據(jù)對象,它類似于連接線。信號可以作為設(shè)計實體中并行語句模塊間的信息交流通道(交流來自順序語句結(jié)構(gòu)中的信息)。在VHDL中,信號及其相關(guān)的信號賦值語句、決斷函數(shù)、延時語句等很好地描述了硬件系統(tǒng)的許多基本特征,如硬件系統(tǒng)運行的并行性、信號傳輸過程中的延遲特性、多驅(qū)動源的總線行為等。信號作為一種數(shù)值容器,不但可以容納當前值,也可以保持歷史值。這一屬性與觸發(fā)器的記憶功能有很好的對應(yīng)關(guān)系,信號定義的語句格式與變量非常相似,信號定義也可以設(shè)置初始值,它的定義格式如下:SIGNAL信號名:數(shù)據(jù)類型:=初始值;同樣,信號初始值的設(shè)置不是必需的,而且初始值僅在VHDL的行為仿真中有效。與變量相比,信號的硬件特征更為明顯,它具有全局性特征。例如,在程序包中定義的信號,對于所有調(diào)用此程序包的設(shè)計實體都是可見(可直接調(diào)用)的;在實體中定義的信號,在其對應(yīng)的結(jié)構(gòu)體中都是可見的。事實上。除了沒有方向說明以外,信號與實體的端口(Port)概念是一致的。對于端口來說,其區(qū)別只是輸出端口不能讀入數(shù)據(jù),輸入端口不能被賦值。信號可以看成是實體內(nèi)部的端口。反之,實體的端口只是一種隱形的信號,端口的定義實質(zhì)上是作了隱式的信號定義,并附加了數(shù)據(jù)流動的方向。信號本身的定義是一種顯式的定義。因此,在實體中定義的端口,在其結(jié)構(gòu)體中都可以看成是一個信號并加以使用,而不必另作定義。以下是信號的定義示例:
SIGNALtemp:STD_LOGIC:=0;SIGNALflagaflagb:BIT;SIGNALdata:STD_LOGIC_VECTOR(15DOWNTO0);SIGNALa:INTEGERRANGE0TO15;此外,需要注意,信號的使用和定義范圍是實體、結(jié)構(gòu)體和程序包。在進程和子程序中,不允許定義信號。信號可以有多個驅(qū)動源,或者說是賦值信號源,但必須將此信號的數(shù)據(jù)類型定義為決斷性數(shù)據(jù)類型。需要特別注意的是,在進程中,只能將信號列入敏感表,而不能將變量列入敏感表??梢娺M程只對信號敏感,而對變量不敏感,這是因為,只有信號才能把進程外的信息帶入進程內(nèi)部。當信號定義了數(shù)據(jù)類型和表達方式后,在VHDL設(shè)計中就能對信號進行賦值了。信號的賦值語句表達式如下:目標信號名<=表達式;
其中,這里的表達式可以是一個運算表達式,也可以是數(shù)據(jù)對象(變量、信號或常量)。符號“<=”表示賦值操作,即將數(shù)據(jù)信息傳入。數(shù)據(jù)信息的傳入可以設(shè)置延時量。因此目標信號獲得傳入的數(shù)據(jù)并不是即時的。即使是零延時(不作任何顯式的延時設(shè)置),也要經(jīng)歷一個特定的延時過程。因此,符號“<=”兩邊的數(shù)值并不總是一致的,這與實際器件的傳播延遲特性十分接近,顯然這與變量的賦值過程有很大差別。所以,賦值符號用“<=”而非“:=”。但須注意,信號的初始賦值符號仍是“:=”,這是因為仿真的時間坐標是從初始賦值開始的,在此之前無所謂延時時間。以下是三個賦值語句示例:x<=9;y<=x;Z<=xAFTER5ns;第三句信號的賦值是在5ns后將x賦予z的,關(guān)鍵詞AFTER后是延遲時間值,在這一點上,與變量的賦值很不相同,盡管如前所述,綜合器在綜合過程中將略去所設(shè)的延時值,但是即使沒有利用AFTER關(guān)鍵詞設(shè)置信號的賦值延時值,任何信號賦值都是存在延時的。在綜合后的功能仿真中,信號或變量間的延時是被看成零延時的,但為了給信息傳輸?shù)南群笞鞒龇线壿嫷呐判?,將自動設(shè)置一個小的延時量,即所謂的延時量。延時量在仿真中即為一個VHDL模擬器的最小分辯時間。信號的賦值可以出現(xiàn)在一個進程中,也可以直接出現(xiàn)在結(jié)構(gòu)體中的并行語句結(jié)構(gòu)中,但它們運行的含義是不一樣的。前者屬順序信號賦值,這時的信號賦值操作要視進程是否已被啟動而定,后者屬并行信號賦值,其賦值操作是各自獨立并行地發(fā)生的。3.常數(shù)(CONSTANT)常數(shù)的定義和設(shè)置主要是為了使設(shè)計實體中的常數(shù)更容易閱讀和修改。例如,將位矢的寬度定義為一個常量,只要修改這個常量就能很容易地改變寬度,從而改變硬件結(jié)構(gòu)。在程序中,常量是一個恒定不變的值,一旦作了數(shù)據(jù)類型和賦值定義后,在程序中不能再改變,因而具有全局性意義。常量的定義形式與變量十分相似,其形式如下:CONSTANT常數(shù)名數(shù)據(jù)類型:=表達式;例如:CONSTANTfbus:BIT_VECTOR:="010115";--位矢數(shù)據(jù)類型CONSTANTVcc:REAL:=5.0;--實數(shù)數(shù)據(jù)類型CONSTANTdely:TIME:=25ns;--時間數(shù)據(jù)類型
VHDL要求所定義的常量數(shù)據(jù)類型必須與表達式的數(shù)據(jù)類型一致。常量的數(shù)據(jù)類型可以是標量類型或復(fù)合類型,但不能是文件類型(file)或存取類型(Access)。常量定義語句所允許的設(shè)計單元有實體、結(jié)構(gòu)體、程序包、塊、進程和子程序。5.2.3
VHDL數(shù)據(jù)類型在數(shù)據(jù)對象的定義中,必不可少的就是設(shè)定所定義的數(shù)據(jù)對象的數(shù)據(jù)類型(TYPES),并且要求此對象的賦值源也必須是相同的數(shù)據(jù)類型。這是因為VHDL是一種強類型語言,對運算關(guān)系與賦值關(guān)系中各量(操作數(shù))的數(shù)據(jù)類型有嚴格要求。VHDL要求設(shè)計實體中的每一個常數(shù)、信號、變量、函數(shù)以及設(shè)定的各種參量都必須具有確定的數(shù)據(jù)類型,并且相同數(shù)據(jù)類型的量才能互相傳遞和作用。VHDL作為強類型語言的好處是使VHDL編譯或綜合工具很容易地找出設(shè)計中的各種常見錯誤。VHDL中的各種預(yù)定義數(shù)據(jù)類型大多數(shù)體現(xiàn)了硬件電路的不同特性,因此也為其他大多數(shù)硬件描述語言所采納。例如BIT,可以描述電路中的開關(guān)信號。VHDL中的數(shù)據(jù)類型可以分成四大類。(1)標量型(ScalarType),屬單元素的最基本的數(shù)據(jù)類,即不可能再有更小、更基本的數(shù)據(jù)類型。它們通常用于描述一個單值數(shù)據(jù)對象。標量類型包括:實數(shù)類型、整數(shù)類型、枚舉類型、時間類型。(2)復(fù)合類型(CompositeType),可以由更細小的數(shù)據(jù)類型復(fù)合而成,如可由標量型復(fù)合而成。復(fù)合類型主要有數(shù)組型(Array)和記錄型(Record)。(3)存取類型(AccessType),為給定的數(shù)據(jù)類型的數(shù)據(jù)對象提供存取方式。(4)文件類型(FilesType),用于提供多值存取類型。這四大數(shù)據(jù)類型又可分成在現(xiàn)成程序包中可以隨時獲得的預(yù)定義數(shù)據(jù)類型和用戶自定義數(shù)據(jù)類型兩大類別。預(yù)定義的VHDL數(shù)據(jù)類型是VHDL最常用,最基本的數(shù)據(jù)類型。這些數(shù)據(jù)類型都已在VHDL的標準程序包STANDARD和STD_LOGIC_1164及其他的標準程序包中作了定義,并可在設(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)硬件中實現(xiàn)。由于在綜合后,所有進入綜合的數(shù)據(jù)類型都轉(zhuǎn)換成二進制類型和高阻態(tài)類型(只有部分芯片支持內(nèi)部高阻態(tài)),即電路網(wǎng)表中的二進制信號,綜合器通常會忽略不能綜合的數(shù)據(jù)類型,并給出警告信息。1.?VHDL的預(yù)定義數(shù)據(jù)類型VHDL的預(yù)定義數(shù)據(jù)類型都是在VHDL標準程序包STANDARD中定義的,在實際使用中,已自動包含進VHDL的源文件中,因而不必通過USE語句以顯式調(diào)用。1)布爾(BOOLEAN)數(shù)據(jù)類型
布爾數(shù)據(jù)類型實際上是一個二值枚舉型數(shù)據(jù)類型。布爾量不屬于數(shù)值,因此不能用于運算,它只能通過關(guān)系運算符獲得。2)位(BIT)數(shù)據(jù)類型
位數(shù)據(jù)類型也屬于枚舉型,取值只能是1或者0。位數(shù)據(jù)類型的數(shù)據(jù)對象,如變量、信號等,可以參與邏輯運算,運算結(jié)果仍是位的數(shù)據(jù)類型。3)位矢量(BIT_VECTOR)數(shù)據(jù)類型位矢量是基于BIT數(shù)據(jù)類型的數(shù)組,使用位矢量必須注明位寬,即數(shù)組中的元素個數(shù)和排列方式,例如:SIGNALa:BIT_VECTOR(7TO0);其中,信號a被定義為一個具有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)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 電力行業(yè)助理的工作職責簡述
- 高校人才培養(yǎng)方案的更新
- 2025年全球及中國石油和天然氣行業(yè)用有機緩蝕劑行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報告
- 2025-2030全球桶形立銑刀行業(yè)調(diào)研及趨勢分析報告
- 2025年全球及中國醫(yī)療推車液晶顯示器行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報告
- 2025-2030全球輪胎式破碎機行業(yè)調(diào)研及趨勢分析報告
- 2025年全球及中國劇場動作自動化設(shè)備行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報告
- 2025年全球及中國單線金剛石線切割機行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報告
- 2025-2030全球履帶調(diào)節(jié)器行業(yè)調(diào)研及趨勢分析報告
- 2025-2030全球防水低光雙筒望遠鏡行業(yè)調(diào)研及趨勢分析報告
- 安全生產(chǎn)網(wǎng)格員培訓(xùn)
- 小學(xué)數(shù)學(xué)分數(shù)四則混合運算300題帶答案
- 林下野雞養(yǎng)殖建設(shè)項目可行性研究報告
- 心肺復(fù)蘇術(shù)課件2024新版
- 2024年內(nèi)蒙古呼和浩特市中考文科綜合試題卷(含答案)
- 大型商場招商招租方案(2篇)
- 會陰擦洗課件
- 2024年交管12123學(xué)法減分考試題庫和答案
- 臨床下肢深靜脈血栓的預(yù)防和護理新進展
- 動物生產(chǎn)與流通環(huán)節(jié)檢疫(動物防疫檢疫課件)
- 2024年山東泰安市泰山財金投資集團有限公司招聘筆試參考題庫含答案解析
評論
0/150
提交評論