




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第6章VHDL入門6.1VHDL的結(jié)構(gòu)6.2VHDL的詞法元素6.3VHDL的數(shù)據(jù)對象6.4VHDL的數(shù)據(jù)類型6.5VHDL的操作符6.6VHDL的語法基礎(chǔ)
6.1VHDL的結(jié)構(gòu)
一個(gè)完整的VHDL程序由實(shí)體(ENTITY)、結(jié)構(gòu)體(ARCHITECTURE)、配置(CONFIGURATION)、包(PACKAGE)和庫(LIBRARY)?5個(gè)部分組成。實(shí)體用于定義所設(shè)計(jì)的系統(tǒng)的外部接口信號;結(jié)構(gòu)體用于描述系統(tǒng)內(nèi)部的結(jié)構(gòu)和行為;配置用于從庫中選取所需單元來組成系統(tǒng)設(shè)計(jì)的不同版本,對于比較簡單只存在一個(gè)結(jié)構(gòu)單元的設(shè)計(jì),配置部分可以省略;包中存放各設(shè)計(jì)模塊能共享的數(shù)據(jù)類型、常數(shù)和子程序等;庫存放已經(jīng)編譯的實(shí)體、結(jié)構(gòu)體、包集合和配置。庫、包、實(shí)體和結(jié)構(gòu)體是一個(gè)硬件實(shí)體的VHDL描述中必不可少的部分。例6.1所示的就是一個(gè)最簡單的與門的VHDL完整描述。
[例6.1]
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;--庫和包調(diào)用語句
ENTITYand2IS
PORT(a:INBIT;
?b:INBIT;
?c:OUTBIT
);
ENDENTITYand2; --實(shí)體定義
ARCHITECTUREbehavOFand2IS
BEHIN
c<=aandb;
ENDARCHITECTUREbehav; --結(jié)構(gòu)體6.1.1實(shí)體
實(shí)體(ENTITY)是VHDL程序設(shè)計(jì)的基本單元,其表示的電路可以像微處理器那樣復(fù)雜,也可以像單個(gè)邏輯門那樣簡單。實(shí)體定義部分用于定義實(shí)體的名稱、輸入/輸出接口等實(shí)體與外部對象交互的信息。
實(shí)體定義是一個(gè)初級設(shè)計(jì)單元,可以單獨(dú)編譯并且可以被并入設(shè)計(jì)庫,它給實(shí)體命名并給實(shí)體定義一個(gè)接口,接口信息用于與其他模塊通信。實(shí)體定義描述了器件的外部視圖,即從外部看到的器件的外貌,包括該器件的名稱、端口。在實(shí)體定義部分也可以定義參數(shù),并把參數(shù)從外部傳入模塊內(nèi)部。實(shí)體定義的最簡表達(dá)式如下:
ENTITY[實(shí)體名]IS
[GENERIC(類屬參數(shù)說明)];
[PORT(端口說明)];
ENDENTITY[實(shí)體名];
或者
ENTITY[實(shí)體名]IS
[GENERIC(類屬參數(shù)說明)];
[PORT(端口說明)];
END[實(shí)體名];以上所示的格式中,前者為IEEEVHDL’93標(biāo)準(zhǔn),后者為IEEEVHDL’87標(biāo)準(zhǔn),建議采用IEEEVHDL’93標(biāo)準(zhǔn)的實(shí)體定義格式。
實(shí)體定義中“ENTITY”、“IS”、“GENERIC”、“PORT”和“ENDENTITY”是定義實(shí)體的關(guān)鍵詞,實(shí)體定義從“ENTITY?[實(shí)體名]?IS”開始,至“ENDENTITY[實(shí)體名];”結(jié)束。“;”符號表示一句語句的結(jié)束,是不可缺少和省略的,否則在編譯時(shí)會報(bào)錯,導(dǎo)致編譯失敗。VHDL對字母不區(qū)分大小寫,即“ENTITY”與“entity”是完全一樣的。例6.2是一個(gè)簡單實(shí)體定義的例子。
[例6.2]
ENTITYand2is
PORT(?a:INBIT;
b:INBIT;
c:OUTBIT
);
ENDENTITYand2;
該例中“[實(shí)體名]”為“and2”。定義中無類屬參數(shù)說明,“PORT(…);”為端口說明,定義了實(shí)體的輸入/輸出端口。
實(shí)體定義中各部分的意義及要求如下:
1.實(shí)體名
實(shí)體名由英文字母和數(shù)字組合而成,實(shí)體的名稱必須與描述該實(shí)體的.VHD文件的名稱相同,它表示設(shè)計(jì)電路的器件名稱。建議根據(jù)設(shè)計(jì)的電路的功能來命名實(shí)體。在定義實(shí)體名時(shí),不能用數(shù)字作為第一個(gè)字符,例如“74ls00”就是不允許的,在編譯時(shí)系統(tǒng)會報(bào)錯,導(dǎo)致編譯失敗。實(shí)體名中也不允許有中文字符。
2.類屬參數(shù)說明
類屬參數(shù)說明和端口說明是實(shí)體定義部分的第一個(gè)描述對象,說明設(shè)計(jì)實(shí)體和其外部環(huán)境通信的對象、通信的格式約定和通信通道的大小。類屬參數(shù)說明為設(shè)計(jì)實(shí)體與外部環(huán)境通信的靜態(tài)信息提供通道,用來規(guī)定端口的大小、實(shí)體中子元件的數(shù)目、實(shí)體的定時(shí)特性等。類屬參數(shù)說明必須放在端口說明之前,一般書寫格式如下:
GENERIC([CONSTANT]參數(shù)名稱:[IN]子類型標(biāo)識[:=靜態(tài)表達(dá)式],…);
其中:[]內(nèi)的內(nèi)容是可以省略的;參數(shù)名稱由英文字母和數(shù)字組合而成,其第一個(gè)字符必須是英文字母。例6.3所示為應(yīng)用類屬參數(shù)說明語句的一個(gè)位寬為“datawidth”的二輸入與門實(shí)體定義。
[例6.3]
ENTITYbus_andIS
GENERIC(datawidth:INTEGER:=8);
PORT(bus_a:INBIT_VECTOR(datawidth-1DOWNTO0);
bus_b:INBIT_VECTOR(datawidth-1DOWNTO0);
bus_c:OUTBIT_VECTOR(datawidth-1DOWNTO0)
);
ENDENTITYbus_and;實(shí)例中的“GENERIC(datawidth:INTEGER:=8);”定義了一個(gè)整數(shù)型的類屬參數(shù)“datawidth”,并給該參數(shù)賦初值“8”。在后續(xù)的定義中,字符“datawidth”就代表整數(shù)“8”。
3.端口說明
端口是設(shè)計(jì)實(shí)體與外部環(huán)境的動態(tài)通信通道,是對實(shí)體與外部接口的描述。端口由端口說明(即端口表)描述。端口表中每個(gè)端口定義由端口名、端口模式和數(shù)據(jù)類型3部分組成。端口名是該端口的標(biāo)識符;端口模式說明信號通過該端口的流動方向;數(shù)據(jù)類型說明流過該端口的數(shù)據(jù)的類型。端口表的格式如下:
PORT([SIGNAL]端口名:[模式]端口模式數(shù)據(jù)類型[:=?靜態(tài)表達(dá)式],…);
因?yàn)殛P(guān)鍵字PORT后必須是信號類,故可略去關(guān)鍵字“SIGNAL”。
(1)端口名。端口名是賦予每個(gè)外部引腳的名稱,通常用一個(gè)或幾個(gè)英文字母,或用英文字母加數(shù)字來命名。名稱滿足VHDL標(biāo)志符的要求即可,一般情況下,名稱的含義最好與慣例一致,例如用以“D”開頭的端口名表示數(shù)據(jù),用以“A”開頭的端口名表示地址。
(2)端口模式。端口模式用來說明數(shù)據(jù)和信號通過該端口的方向。VHDL提供了如下端口模式:
IN——定義端口通道為單向只讀模式,規(guī)定數(shù)據(jù)只能由該端口流入實(shí)體中,在實(shí)體內(nèi)部結(jié)構(gòu)的描述中只能讀取該端口中的值。
OUT——定義端口通道為單向輸出模式,規(guī)定數(shù)據(jù)只能由該端口從實(shí)體內(nèi)部向外輸出,在實(shí)體內(nèi)部結(jié)構(gòu)的描述中只能向該端口賦值。
INOUT——定義端口通道為輸入/輸出雙向模式,既可輸入數(shù)據(jù),又可輸出數(shù)據(jù),在實(shí)體內(nèi)部結(jié)構(gòu)的描述中既能讀取該端口的值,又能向該端口賦值;從實(shí)體外部看,既可以向該端口輸入數(shù)據(jù),又可以讀取該端口的輸出數(shù)據(jù)。在使用這種端口類型時(shí),還有很多需要考慮的因素。
BUFFER——類似于INOUT的雙向端口,但此類端口只能有一個(gè)源,即只能有一個(gè)數(shù)據(jù)源向該端口寫數(shù)據(jù),當(dāng)實(shí)體內(nèi)部向該端口輸出數(shù)據(jù)后,如果實(shí)體接著讀取該端口的數(shù)據(jù),則讀取的數(shù)據(jù)就是剛才輸出的數(shù)據(jù)。
(3)數(shù)據(jù)類型。VHDL作為一種強(qiáng)類型語言,任何一種數(shù)據(jù)對象(信號、變量、常數(shù))必須嚴(yán)格限定其取值范圍,即對其傳輸或存儲的數(shù)據(jù)的類型作明確的界定。這對于大規(guī)模電路描述的排錯是十分有益的。VHDL中提供了10種數(shù)據(jù)類型。IEEE1706—93標(biāo)準(zhǔn)規(guī)定的數(shù)據(jù)類型包括布爾型(BOOLEAN)、位型(BIT)、位矢量型(BIT_VECTOR)和整數(shù)型(INTEGER)等。當(dāng)用戶使用了IEEE庫中的標(biāo)準(zhǔn)程序包后,可以使用預(yù)先定義的標(biāo)準(zhǔn)邏輯位“STD_LOGIC”數(shù)據(jù)類型和標(biāo)準(zhǔn)邏輯矢量“STD_LOGIC_VECTOR”數(shù)據(jù)類型等。
位型數(shù)據(jù)規(guī)定的取值范圍是邏輯位“1”和“0”。在VHDL中,表示邏輯位“0”和“1”的表達(dá)必須加單引號,否則VHDL綜合器會將未加單引號的0和1解釋為整數(shù)數(shù)據(jù)類型(INTEGER)。
位型數(shù)據(jù)可以參與邏輯運(yùn)算或算術(shù)運(yùn)算,其結(jié)果仍是位型數(shù)據(jù)。VHDL綜合器用一個(gè)二進(jìn)制位表示位型。將例6.1中的端口信號a、b、s和y的數(shù)據(jù)類型都定義為BIT,即表示a、b、s和y的取值范圍,或者說數(shù)據(jù)范圍被限定在邏輯位“1”和“0”之間。6.1.2結(jié)構(gòu)體
結(jié)構(gòu)體是次級設(shè)計(jì)單元,在其對應(yīng)的初級設(shè)計(jì)單元實(shí)體說明被編譯并被并入設(shè)計(jì)庫之后,它就可以單獨(dú)地被編譯,并且被并入該設(shè)計(jì)庫之中。結(jié)構(gòu)體描述一個(gè)設(shè)計(jì)的結(jié)構(gòu)或行為,把一個(gè)設(shè)計(jì)的輸入與輸出之間的關(guān)系建立起來。一個(gè)設(shè)計(jì)實(shí)體可以有多個(gè)結(jié)構(gòu)體,分別代表該器件的不同實(shí)現(xiàn)方案。按照結(jié)構(gòu)體對結(jié)構(gòu)描述的層次來分,VHDL對結(jié)構(gòu)體的描述有以下3種層次。
(1)行為級描述:又稱算法級描述,即采用進(jìn)程語句順序描述設(shè)計(jì)實(shí)體的行為,這是最高層次的描述方法。
(2)數(shù)據(jù)流級描述:又稱寄存器級描述,即采用進(jìn)程語句順序描述數(shù)據(jù)流在控制流作用下被加工、處理和存儲的全過程。這種描述方式與采用原理圖輸入方式進(jìn)行電路設(shè)計(jì)處于同一個(gè)層次。
(3)結(jié)構(gòu)描述:又稱門級描述,即采用并行處理語句,使用最基本的邏輯門單元描述設(shè)計(jì)實(shí)體內(nèi)的結(jié)構(gòu)組織和元件互聯(lián)關(guān)系。
這3種描述方法通常也不是界限分明的,可以在一個(gè)結(jié)構(gòu)體中既有行為級描述,又有數(shù)據(jù)流級的描述。初學(xué)者常使用行為描述方法對實(shí)體結(jié)構(gòu)功能進(jìn)行描述,然后由系統(tǒng)自動生成低級的硬件配置文件。結(jié)構(gòu)體由結(jié)構(gòu)體名稱、信號定義語句、結(jié)構(gòu)和功能描述語句構(gòu)成,一般有如下兩種格式。
格式1:
ARCHITECTURE結(jié)構(gòu)體名OF實(shí)體名IS
說明語句
BEGIN
結(jié)構(gòu)描述語句
ENDARCHITECTURE[結(jié)構(gòu)體名];
格式2:
ARCHITECTURE結(jié)構(gòu)體名OF實(shí)體名IS說明語句
BEGIN
結(jié)構(gòu)描述語句
END[結(jié)構(gòu)體名];
這兩種描述分別對應(yīng)于IEEEVHDL’93標(biāo)準(zhǔn)和IEEEVHDL’87標(biāo)準(zhǔn),建議按照IEEEVHDL’93標(biāo)準(zhǔn)規(guī)定的格式描述結(jié)構(gòu)體。
“ARCHITECTURE”、“OF”、“IS”、“BEGIN”和“ENDARCHITECTURE”是結(jié)構(gòu)體描述中的關(guān)鍵詞。例6.4所示為一個(gè)多路選擇器的完整VHDL描述。
[例6.4]
ENTITYmux2IS
PORT(a,b:INBIT;
?s:INBIT;
?y:OUTBIT
);
ENDENTITYmux2;
ARCHITECTUREbehavOFmux2IS
BEGIN
y<=aWHENs='0'ELSEb;
ENDARCHITECTUREbehav;
1.結(jié)構(gòu)體名稱
結(jié)構(gòu)體的名稱可自由設(shè)定,建議根據(jù)結(jié)構(gòu)體中對實(shí)體描述的層次把結(jié)構(gòu)體的名稱命名為behav(行為級)、dataflow(數(shù)據(jù)流級)或者struc(門級)。這3個(gè)名稱實(shí)際上是3種結(jié)構(gòu)體描述方式的名稱。當(dāng)設(shè)計(jì)者采用某一種描述方式來描述結(jié)構(gòu)體時(shí),該結(jié)構(gòu)體的結(jié)構(gòu)名稱就命名為那個(gè)名稱。這樣,閱讀VHDL程序的人便能直接了解設(shè)計(jì)者采用的描述方式了。命名方式如下:
ARCHITECTUREbehavOFmux2IS——用結(jié)構(gòu)體的行為命名;
ARCHITECTUREdataflowOFmuxIS——用結(jié)構(gòu)體的數(shù)據(jù)流命名;
ARCHITECTUREstrucOFmuxIS——用門級命名。
2.說明語句
說明語句位于“ARCHITECTURE”和“BEGIN”關(guān)鍵詞之間,用于對結(jié)構(gòu)體內(nèi)部所使用的信號常數(shù)、數(shù)據(jù)類型和函數(shù)進(jìn)行定義。該定義的作用范圍局限于其所在的結(jié)構(gòu)體,一個(gè)實(shí)體中可能有幾個(gè)結(jié)構(gòu)體。實(shí)體定義中的端口表內(nèi)定義的I/O端口為外部信號,而結(jié)構(gòu)體定義的信號為內(nèi)部信號。結(jié)構(gòu)體內(nèi)的信號定義與實(shí)體的端口說明類似,由信號名稱和數(shù)據(jù)類型組成,但不需要定義信號模式,即不用說明信號的方向。
3.結(jié)構(gòu)描述語句
結(jié)構(gòu)描述語句用于描述實(shí)體內(nèi)部的結(jié)構(gòu),這部分是結(jié)構(gòu)體的主要部分。該部分由一個(gè)或多個(gè)并行的語句構(gòu)成,其中的每個(gè)并行語句又由其他并行或順序語句構(gòu)成。6.1.3VHDL庫
為了提高VHDL設(shè)計(jì)的效率,實(shí)現(xiàn)代碼的重復(fù)利用,我們將一些有用的代碼信息匯集在一起,形成一個(gè)VHDL庫,以供后續(xù)設(shè)計(jì)者調(diào)用。這樣也能使VHDL的設(shè)計(jì)遵循某些統(tǒng)一的語言標(biāo)準(zhǔn)或使其數(shù)據(jù)格式更加規(guī)范化。VHDL庫中的內(nèi)容包括程序包或者元件庫程序包。所謂程序包,是指預(yù)先定義好的數(shù)據(jù)類型、子程序等設(shè)計(jì)單元的集合體;元件庫程序包是指預(yù)先設(shè)計(jì)好的各種設(shè)計(jì)實(shí)體。通常,庫中放置不同數(shù)量的程序包,而程序包中又可放置不同數(shù)量的子程序,子程序中又含有函數(shù)、過程、設(shè)計(jì)實(shí)體(元件)等基礎(chǔ)設(shè)計(jì)單元。如果要在一項(xiàng)VHDL設(shè)計(jì)中用到某一預(yù)定的程序包,就必須在編譯綜合設(shè)計(jì)之前調(diào)用該程序包中的內(nèi)容。在綜合過程中,每當(dāng)綜合器在較高層次的VHDL源文件中遇到庫語言,就將隨庫指定的源文件讀入,并參與綜合。因此,必須在設(shè)計(jì)實(shí)體的描述語句之前,用庫語句和USE語句聲明所使用的庫。VHDL的庫分為兩類:一類是設(shè)計(jì)庫,如在具體設(shè)計(jì)項(xiàng)目中設(shè)定的目錄所對應(yīng)的WORK庫;另一類是資源庫,即存放常規(guī)元件和標(biāo)準(zhǔn)模塊的庫。VHDL程序設(shè)計(jì)中常用的庫有IEEE庫、STD庫和WORK庫。
1.IEEE庫
IEEE庫是VHDL設(shè)計(jì)中使用最普遍的庫,它包含IEEE標(biāo)準(zhǔn)的程序包和其他一些支持工業(yè)標(biāo)準(zhǔn)的程序包。IEEE庫中的標(biāo)準(zhǔn)程序包主要包括STD_LOGlC_1164、NUMERIC_BIT和NUMERIC_STD等程序包。其中STD_LOGIC_1164是最重要和最常用的程序包,大部分基于數(shù)字系統(tǒng)設(shè)計(jì)的程序包都是以此程序包中設(shè)定的標(biāo)準(zhǔn)為基礎(chǔ)的。
此外,還有一些程序包雖然不是IEEE標(biāo)準(zhǔn),但由于其已成事實(shí)上的工業(yè)標(biāo)準(zhǔn),因此也都并入了IEEE庫。這些程序包中,最常用的是Synopsys公司的STD_LOGIC_ARITH、STD_LOGIC_SIGNED和STD_LOGIC_UNSIGNED程序包。一般的基于FPGA/CPLD的開發(fā),IEEE庫中的4個(gè)程序包STD_LOGIC_1164、STD_LOGIC_ARITH、STD_LOGIC_
SIGNED和STD_LOGIC_UNSIGNED已足夠使用。另外需要注意的是,在IEEE庫中符合IEEE標(biāo)準(zhǔn)的程序包并非符合VHDL標(biāo)準(zhǔn),如STD_LOGIC_1164程序包。因此,在使用VHDL設(shè)計(jì)實(shí)體的前面必須使用如下語句顯式表達(dá)出要使用STD_LOGIC_
1164程序包:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
2.STD庫
STD庫中收錄了VHDL標(biāo)準(zhǔn)定義的兩個(gè)標(biāo)準(zhǔn)程序包,即STANDARD(標(biāo)準(zhǔn))程序包和TEXTIO(文件輸入/輸出)程序包。由于STD庫符合VHDL標(biāo)準(zhǔn),因此只要在VHDL應(yīng)用環(huán)境中,即可隨時(shí)調(diào)用這兩個(gè)程序包中的所有內(nèi)容,不必使用如下所示的庫使用聲明語句:
LIBRARYSTD;
USESTD.STANDARD.ALL;
3.WORK庫
WORK庫是由用戶的設(shè)計(jì)構(gòu)成的工作庫,用于存放用戶設(shè)計(jì)及自定義的一些設(shè)計(jì)單元和程序包,用戶先期設(shè)計(jì)完成的成品、模塊均自動存放在其中。WORK庫自動滿足VHDL標(biāo)準(zhǔn)。VHDL標(biāo)準(zhǔn)規(guī)定工作庫總是可見的,在實(shí)際調(diào)用中,不必預(yù)先聲明?;赩HDL所要求的WORK庫的基本概念,在PC或工作站上利用VHDL進(jìn)行項(xiàng)目設(shè)計(jì)時(shí),不允許在根目錄下進(jìn)行,而必須設(shè)定一個(gè)目錄,用于保存所有與此項(xiàng)目相關(guān)的設(shè)計(jì)文件,VHDL綜合器將此目錄默認(rèn)為WORK庫。但必須注意,工作庫并不是這個(gè)目錄的目錄名,而是一個(gè)邏輯名。綜合器將指示器指向該目錄的路徑。除以上這些常用的庫之外,用戶還可以在一個(gè)項(xiàng)目中自定義VHDL庫,便于重復(fù)使用自己的設(shè)計(jì)成果,以及與其他人共享設(shè)計(jì)成果,減小設(shè)計(jì)工作量。
在VHDL語言中,庫的說明語句總是放在實(shí)體單元前面。這樣,在設(shè)計(jì)實(shí)體內(nèi)的語句就可以使用庫中的數(shù)據(jù)和文件。由此可見,庫的作用在于使設(shè)計(jì)者可以共享已經(jīng)編譯過的設(shè)計(jì)成果。VHDL允許在一個(gè)設(shè)計(jì)實(shí)體中同時(shí)打開多個(gè)不同的庫,但庫之間必須是相互獨(dú)立的。對于必須以顯式表達(dá)的庫及其程序包的語言表達(dá)式,應(yīng)放在每一項(xiàng)設(shè)計(jì)實(shí)體的最前面,成為這項(xiàng)設(shè)計(jì)的最高層次的設(shè)計(jì)單元。庫語句一般必須與USE語句同用。庫語句關(guān)鍵詞LIBRARY指明所使用的庫名,USE語句指明庫中的程序包。一旦說明了庫和程序包,整個(gè)設(shè)計(jì)實(shí)體都可被訪問或調(diào)用,但其作用范圍僅限于所說明的設(shè)計(jì)實(shí)體。VHDL要求在每項(xiàng)含有多個(gè)設(shè)計(jì)實(shí)體的更大的系統(tǒng)中,每個(gè)設(shè)計(jì)實(shí)體都必須有自己完整的庫說明語句和USE語句。USE語句的使用將使所說明的程序包對本設(shè)計(jì)實(shí)體部分或全部開放,即是可視的。
USE語句的使用有兩種常用格式:
USE庫名.程序包名.項(xiàng)目名;
USE庫名.程序包名.ALL;
第一個(gè)語句的作用是向其所在設(shè)計(jì)實(shí)體開放指定庫中的特定程序包內(nèi)所選定的項(xiàng)目。
第二個(gè)語句的作用是向其所在設(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”,表示將使用程序包中的所有資源。又如:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.STD_ULOGIC;
USEIEEE.STD_LOGIC_1164.RISING_EDGE;
該例中向當(dāng)前設(shè)計(jì)實(shí)體開放了STD_LOGIC_1164程序包中的RISING_EDGE函數(shù),但由于此函數(shù)需要用到STD_ULOGIC數(shù)據(jù),因此在上一條USE語句中開放了同一程序包中的這一數(shù)據(jù)類型。6.1.4VHDL程序包
為了使已定義的常數(shù)、數(shù)據(jù)類型、元件調(diào)用說明以及子程序能被更多其他的設(shè)計(jì)實(shí)體方便地訪問和共享,使程序更加標(biāo)準(zhǔn)化,可以將它們收集在一個(gè)VHDL程序包中。多個(gè)程序包可以并入一個(gè)VHDL庫中,使之適用于更一般的訪問和調(diào)用。這一點(diǎn)對于大系統(tǒng)開發(fā)時(shí)多個(gè)或多組開發(fā)人員同步工作尤為重要。程序包主要由常數(shù)說明、VHDL數(shù)據(jù)類型說明、元件定義和子程序4種基本結(jié)構(gòu)組成,一個(gè)程序包中至少應(yīng)包含這些結(jié)構(gòu)中的一種。
(1)常數(shù)說明:定義在程序包中需要用到的常數(shù),類似于C語言中的宏定義,這些常數(shù)常用于描述系統(tǒng)數(shù)據(jù)總線通道的寬度。
(2)?VHDL數(shù)據(jù)類型說明:主要用于在整個(gè)設(shè)計(jì)中通用的數(shù)據(jù)類型,如通用的地址總線數(shù)據(jù)類型定義等。
(3)元件定義:主要規(guī)定在VHDL設(shè)計(jì)中參與文件例化的文件接口界面。
(4)子程序:并入程序包的子程序有利于在設(shè)計(jì)中對其進(jìn)行調(diào)用。通常程序包中的內(nèi)容應(yīng)具有更大的適用面和良好的獨(dú)立性,以供各種不同設(shè)計(jì)需求的調(diào)用,如STD_LOGIC_1164程序包定義的STD_LOGIC和STD_LOGIC_VECTOR型數(shù)據(jù)。一旦定義了一個(gè)程序包,各種獨(dú)立的設(shè)計(jì)就能方便地調(diào)用。定義程序包的一般語句結(jié)構(gòu)如下:
PACKAGE程序包名IS
--程序包首
程序包首說明部分
END程序包名;
PACKAGEBODY程序包名IS --程序包體
程序包體說明部分以及包體內(nèi)容
END程序包名;
程序包由說明部分(程序包首)和內(nèi)容部分(程序包體)兩部分組成。一個(gè)完整的程序包中,程序包首名與程序包體名是同一個(gè)名字。程序包首的說明部分可收集多個(gè)不同的VHDL設(shè)計(jì)所需的公共信息,其中包括數(shù)據(jù)類型說明、信號說明、子程序說明及元件說明等。這些信息雖然也可以在每一個(gè)設(shè)計(jì)實(shí)體中進(jìn)行逐一單獨(dú)的定義和說明,但如果將這些經(jīng)常用到并具有一般性的定義和說明放在程序包中供隨時(shí)調(diào)用,顯然可以提高設(shè)計(jì)的效率和程序的可讀性。
程序包結(jié)構(gòu)中,程序包體不是必需的。如果只需要共享定義的常數(shù)、數(shù)據(jù)類型等的聲明部分,則可以獨(dú)立定義和使用程序包首。例6.5所示就是一個(gè)可獨(dú)立使用的程序包首。
[例6.5]
PACKAGEmyPACKAGEIS
--程序包首,指定程序包名稱
TYPEbyteISRANGE0TO255;--定義數(shù)據(jù)類型byte
SUBTYPEhalf_byteISbyteRANGE0TO15;
--定義子類型4位數(shù)據(jù)類型half_byte
CONSTANTdatawidth:half_byte:=8;
--定義常數(shù)datawidth為8
SIGNALaddress:byte;--定義信號address
ENDmyPACKAGE; --程序包首結(jié)束例6.5定義了一個(gè)程序包首,其程序包名是“myPACKAGE”,在其中定義了一個(gè)新的數(shù)據(jù)類型“byte”和子類型“half_byte”,接著定義了一個(gè)“half_byte”類型的常數(shù)“datawidth”和一個(gè)“byte”類型的信號“address”,還定義了一個(gè)元件和函數(shù)。由于元件和函數(shù)必須有具體的內(nèi)容,因此將這些內(nèi)容安排在程序包體中。如果要使用這個(gè)程序包中的所有定義,則可利用USE語句按如下方式獲得訪問此程序包的方法:
LIBRARYWORK;
USEWORK.myPACKAGE.ALL;
ENTITY…
ARCHITHCYURE…
由于WORK庫是默認(rèn)打開的,因此在使用中可省去“LIBRARYWORK;”語句,只要加入相應(yīng)的USE語句即可。例6.6所示為在當(dāng)前WORK庫中定義程序包,并調(diào)用該程序包完成的3-8譯碼器VHDL描述的示例。
[例6.6]
PACKAGEmypakIS
TYPEoutput8ISBIT_VECTOR(0TO7);
TYPEdataISRANGE1TO8;
ENDmypak;
USEWORK.mypak.ALL;--省略WORK庫的調(diào)用語句
ENTITYcoderIS
PORT(datain:INdata;
signout:OUToutput8);
ENDcoder;
ARCHITECTUREbehavOFcoderIS
BEGIN
WITHdatainSELECT
signout<=?B"00000001",WHEN1,
B"00000010",WHEN2,
B"00000100",WHEN3,
B"00001000",WHEN4,
B"00010000",WHEN5,
B"00100000",WHEN6,
B"01000000",WHEN7,
B"10000000",WHEN8,
B"00000000",WHENOTHERS;
ENDARCHITECTUREbehav;此例是一個(gè)可以直接綜合的3-8譯碼器的VHDL描述。此例在程序包mypak中定義了兩個(gè)新的數(shù)據(jù)類型“data”和“output8”。在3-8譯碼器coder的實(shí)體描述中即使用了這兩個(gè)數(shù)據(jù)類型。
程序包體將包括在程序包首中已定義的子程序的子程序體中。程序包體說明部分的組成內(nèi)容可以是USE語句(允許對其他程序包進(jìn)行調(diào)用)、子程序定義、子程序體、數(shù)據(jù)類型說明、子類型說明和常數(shù)說明等。對于沒有具體子程序說明的程序包體可以省去。如例6.6所示,如果僅僅是定義數(shù)據(jù)類型或定義數(shù)據(jù)對象等內(nèi)容,則程序包體是不必要的,程序包首可以獨(dú)立地被使用;但在程序包中若有子程序說明時(shí),則必須有對應(yīng)的子程序包體。這時(shí),子程序體必須放在程序包體中。程序包常用來封裝屬于多個(gè)設(shè)計(jì)單元分享的信息。常用的預(yù)定義的程序包有STD_LOGIC_1164、STD_LOGIC_ARITH、STD_LOGIC_
UNSIGNED和STD_LOGlC_SIGNED等。下面分別進(jìn)行介紹。
1.STD_LOGIC_1164程序包
STD_LOGIC_1164程序包是IEEE庫中最常用的程序包,是IEEE的標(biāo)準(zhǔn)程序包。其中包含了一些數(shù)據(jù)類型、子類型和函數(shù)的定義,這些定義將VHDL擴(kuò)展為一個(gè)能描述多值邏輯的硬件描述語言。STD_LOGIC_1164程序包中用得最多和最廣的是定義了滿足工業(yè)標(biāo)準(zhǔn)的兩個(gè)數(shù)據(jù)類型STD_LOGIC和STD_LOGIC_VECTOR。新定義的數(shù)據(jù)類型除具有“0”和“1”邏輯量以外,還有其他的邏輯量,如高阻態(tài)“z”、不定態(tài)“x”等,更能滿足實(shí)際數(shù)字系統(tǒng)設(shè)計(jì)仿真的需求。
2.STD_LOGIC_ARITH程序包
STD_LOGIC_ARITH預(yù)先編譯在IEEE庫中,此程序包在STD_LOGIC_1164程序包的基礎(chǔ)上擴(kuò)展了3個(gè)數(shù)據(jù)類型,即UNSIGNED、SIGNED和SMALL_INT,并為其定義了相關(guān)的算術(shù)運(yùn)算符和轉(zhuǎn)換函數(shù)。UNSIGNED數(shù)據(jù)類型不包含符號位,無法參與有符號的運(yùn)算;SIGNED數(shù)據(jù)類型包含符號位,可以參與有符號的運(yùn)算。
3.STD_LOGIC_UNSIGNED和STD_LOGlC_SIGNED程序包
STD_LOGIC_UNSIGNED和STD_LOGIC_SIGNED程序包是由Synopsys公司提供的,它們都預(yù)先編譯在IEEE庫中。這些程序包重載了可用于INTEGER型、STD_LOGIC型和STD_
LOGIC_VECTOR型混合運(yùn)算的運(yùn)算符,并定義了由STD_
LOGIC_VECTOR型到INTEGER型的轉(zhuǎn)換函數(shù)。其中:STD_LOGIC_SIGNED中定義的運(yùn)算符考慮到了符號,是有符號數(shù)的運(yùn)算;STD_LOGIC_UNSIGNED程序包定義的運(yùn)算符沒有符號,為無符號運(yùn)算。6.1.5配置
由于對同一種實(shí)體可以采用多種結(jié)構(gòu)體描述,因此對擁有多種結(jié)構(gòu)體的實(shí)體,可以通過配置語句把特定的結(jié)構(gòu)體關(guān)聯(lián)到一個(gè)確定的實(shí)體。配置語句就是用來為較大的系統(tǒng)設(shè)計(jì)提供管理和工程組織的。通常在大而復(fù)雜的VHDL工程設(shè)計(jì)中,配置語句可以為實(shí)體指定或配屬一個(gè)結(jié)構(gòu)體,可以利用配置使仿真器為同一實(shí)體配置不同的結(jié)構(gòu)體,以使設(shè)計(jì)者比較不同結(jié)構(gòu)體之間的仿真差別,或者為例化的各元件實(shí)體配置指定的結(jié)構(gòu)體,從而形成一個(gè)所希望的例化元件層次構(gòu)成的設(shè)計(jì)實(shí)體。配置是VHDL設(shè)計(jì)實(shí)體中的一個(gè)基本單元。在綜合或仿真中,可以利用配置語句為確定整個(gè)設(shè)計(jì)提供許多有用信息。對以元件例化的層次方式構(gòu)成的VHDL設(shè)計(jì)實(shí)體,可以將其中的配置語句理解成一個(gè)為設(shè)計(jì)實(shí)體選擇合適元件結(jié)構(gòu)的表單,以配置語句指定在頂層設(shè)計(jì)中的某一元件與一特定結(jié)構(gòu)體相銜接,或賦予特定屬性。配置語句還能用于對元件的端口連接進(jìn)行重新安排等。配置語句的一般格式如下:
CONFIGURATION配置名OF實(shí)體名IS
FOR選配結(jié)構(gòu)體名
ENDFOR;
END配置名;
例6.7所示為擁有兩個(gè)結(jié)構(gòu)體的“1”計(jì)數(shù)器并對其進(jìn)行配置的完整VHDL描述。
[例6.7]
ENTITYones_cntIS
PORT(a:INBIT_VECTOR(2DOWNTO0);
c:OUTBIT_VECTOR(1DOWNTO0)
);
ARCHITECTUREalgorithmicOFones_cntIS
BEGIN
PROCESS(a)
VARIABLEnum:INTERGERRANGE0TO3;
BEGIN
NUM:=0;
FORIIN0TO2LOOP
IFA(I)='1'THEN
NUM:=NUM+1;
ENDIF
ENDLOOP;
CASENUMIS
WHEN0=>C<="00";
WHEN1=>C<="01";
WHEN2=>C<="10";
WHEN3=>C<="11";
ENDCASE;
ENDPROCESS;
ENDARCHITECTUREalgorithmic;--算法級描述
---------------------------------------------------------------------------
ARCHITECTUREdataflowOFones_cntIS
BEGIN
c(1)<=(a(1)ANDa(0))OR(a(2)ANDa(0))OR((a(2)ANDa(1));
c(0)<=(a(2)ANDNOTa(1)ANDNOTa(0))OR(NOTa(2))
ANDNOTa(1)ANDa(0))OR(a(2)ANDa(1)ANDa(0))
OR(NOTa(2)ANDa(1)ANDNOTa(0));
ENDARCHITECTUREdata_flow;--數(shù)據(jù)流級描述
-------------------------------------------------------------
CONFIGURATIONalgOFones_cntIS
FORalgorithmic
ENDFOR;
ENDalg; --配置算法級結(jié)構(gòu)體
--------------------------------------------------------------
CONFIGURATIONdfOFones_cntIS
FORdata_flow
ENDFOR;
ENDdf; --配置數(shù)據(jù)流結(jié)構(gòu)體
6.2VHDL的詞法元素
詞法元素指不可以拆分為其他更小元素的字符串,它是VHDL中的最小單位。VHDL設(shè)計(jì)文件可認(rèn)為是由詞法元素的序列和分隔符組成的。VHDL中的詞法元素的類型有分界符、標(biāo)識符、注釋和字符文字。
這些詞法元素是組成VHDL語句的基礎(chǔ)。詞法元素必須完全處于同一行中,下面分別進(jìn)行介紹。6.2.1分界符
相鄰的詞法元素通過任意數(shù)量的分界符分開,在某些情況下,當(dāng)兩個(gè)詞法元素連寫會被當(dāng)作一個(gè)詞法元素時(shí),兩個(gè)詞法元素之間必須加分隔符。常用空格來區(qū)分同一個(gè)語句中的兩個(gè)詞法元素,例如“ENTITYadderIS”。在一個(gè)完整的語句末尾,必須用“;”表示語句的結(jié)束。6.2.2標(biāo)識符
標(biāo)識符規(guī)則是VHDL中符號書寫的一般規(guī)則,用以表示VHDL語句中的變量、塊、進(jìn)程等對象和關(guān)鍵詞?;镜腣HDL文件就是由標(biāo)識符和分界符構(gòu)成的。VHDL有兩個(gè)標(biāo)識符標(biāo)準(zhǔn),分別是VHDL’87標(biāo)準(zhǔn)和VHDL’93標(biāo)準(zhǔn)。VHDL’93標(biāo)準(zhǔn)的標(biāo)識符是在VHDL’87標(biāo)準(zhǔn)的標(biāo)識符語法規(guī)則基礎(chǔ)上擴(kuò)展后形成的,因此又稱VHDL’93標(biāo)準(zhǔn)規(guī)定的標(biāo)識符為擴(kuò)展標(biāo)識符,稱VHDL’87標(biāo)準(zhǔn)規(guī)定的標(biāo)識符為短標(biāo)識符。
1.短標(biāo)識符
VHDL中的短標(biāo)識符是遵守以下規(guī)則的字符序列:
(1)短標(biāo)識符由有效字符構(gòu)成。
(2)有效字符為大、小寫英文字母(A~Z,a~z)、數(shù)字(0~9)和下劃線(_)。
(3)短標(biāo)識符必須以英文字母打頭。
(4)短標(biāo)識符中的下劃線前后必須都有英文字母或數(shù)字。
(5)短標(biāo)識符不區(qū)分大、小寫。
字母大寫與小寫沒有區(qū)別。在所有的語句中,字母大寫、小寫以及大小寫混合都可以。為使程序易于閱讀,建議VHDL的關(guān)鍵詞大寫,其他用戶定義的對象名小寫,規(guī)定所有關(guān)鍵詞不能由用戶聲明為對象名。
VHDL’87標(biāo)準(zhǔn)規(guī)定的關(guān)鍵詞如下:如下所示是合法的標(biāo)識符:
COUNTcout C_OUTBB2_5C
VHSIC WT FFTDecoder
A_B_C xyZ h333STORE_NEXTITEM
如表6.1所示是不合法的標(biāo)識符及其錯誤原因。
表6.1非法的標(biāo)識符及其錯誤原因非法標(biāo)識符錯誤原因My-name含有非法符號“-”H¥B含有非法符號“¥”LOOP為VHDL關(guān)鍵詞_ABC第一個(gè)字符不是英文字母Decoder_下劃線后沒有字母或數(shù)字A_?_C含有連續(xù)兩個(gè)下劃線,每個(gè)下劃線前后方都不完全是字母或數(shù)字alDha2含有非法的空格ABAC含有非法的空格
2.?dāng)U展標(biāo)識符
擴(kuò)展標(biāo)識符具有以下特性:
(1)擴(kuò)展標(biāo)識符兩端由反斜杠確定。例如,“\valid\”、“\_ABC\”等都是合法的擴(kuò)展標(biāo)識符。
(2)擴(kuò)展標(biāo)識符中間允許包含圖形符號和空格符。例如,“\&MyName\”、“\$l0ms\”、“\*L50ms\”等都是合法的擴(kuò)展標(biāo)識符。
(3)反斜杠之間的字符可以用保留字。例如,“\1abel\”、“\PORT\”和“\enitiy\”等都是合法的擴(kuò)展標(biāo)識符。
(4)每兩個(gè)反斜杠之間可以用數(shù)字打頭。例如,“\12mspulse\”、“\20_puls\”和“\50\”都是合法的擴(kuò)展標(biāo)識符。
(5)擴(kuò)展標(biāo)識符允許多個(gè)下劃線相連。例如,“\A_B\”、“\my_projects\”等都是合法的擴(kuò)展標(biāo)識符。
(6)擴(kuò)展標(biāo)識符區(qū)分大小寫。例如,“\CLK\”與“\clk\”分別表示兩個(gè)不同的標(biāo)識符。
(7)擴(kuò)展標(biāo)識符與短標(biāo)識符不同。例如,“\CLK\”與“CLK”分別表示兩個(gè)不同的標(biāo)識符。6.2.3注釋
注釋是用分界符“--”開頭,必須放在一行語句末的詞法元素。它可以跟在一行之中的合法詞法元素之后,也可以是該行唯一的詞法元素。注釋的內(nèi)容不影響編譯器和仿真程序,其目的是為了增加程序的可讀性。注釋中可包括所有特殊字符。表6.2所示的是注釋的一些例子。
表6.2注釋語句示例注釋格式解釋--注釋語句……該行只有一句注釋C<=A;--注釋語句……注釋詞法元素在VHDL賦值語句之后--較長的注釋語句第一行……--較長的注釋語句第二行……--……--較長的注釋語句最后一行……對于較長的注釋,可以采用分行注釋的方法,為便于閱讀,每行的分界符要對齊6.2.4字符文字
字符文字用來指定用于標(biāo)量對象初始化的常量值,包括單個(gè)字符文字、字符串文字、位串文字和數(shù)字。
1.單個(gè)字符文字
單個(gè)字符文字是僅包括一個(gè)字符的詞法元素,其格式為在兩個(gè)撇號之間插入一個(gè)字符。該字符可以是任何字符,包括空格和特殊符號。以下是單個(gè)字符文字的例子:
'A','B'、'!'、'1'、'0'、''
2.字符串文字
字符串文字是在兩個(gè)引號之間插入一串可顯示字符而得到的詞法元素。串中可以不包含任何字符。如果串中包含一個(gè)引號,則使用兩個(gè)相連的引號表示。注意,該約定排除了將兩個(gè)字符串文字寫在同一行,而中間沒有分隔符進(jìn)行分隔的情況。一個(gè)字符串文字的長度指的是串中字符的個(gè)數(shù)(將雙引號記為一個(gè)字符)。下面是一些例子:
"VHDLstudy"長度為10的字符串,包括一個(gè)空格
"" 長度為0的字符串,不包括任何內(nèi)容
"A" 長度為1的字符串,與‘A’不同
""" 長度為1,包括一個(gè)引號
"$,#,|" 長度為5的字符串,包含特殊字符$、#和?|
字符串文字詞法元素必須寫在一行中,長度超過一行的串在前一行的末尾必須使用連接符“&”將兩行連接起來。以下是一個(gè)連接示例:
Thisisalongstringliteralthatwillnotfitonone”&
linewhichrequiresusingtheconcatenationoperator.?"
3.位串文字
位串文字用來表示數(shù)碼矢量,它是由進(jìn)制標(biāo)志符和數(shù)字字符串組成的詞法元素。進(jìn)制標(biāo)志符及其對應(yīng)的數(shù)字串如表6.3所示。
表6.3位串文字進(jìn)制標(biāo)志符表示的意義對應(yīng)的數(shù)字串示例D二進(jìn)制0,1D"0100101"O八進(jìn)制0~7O"45"X十六進(jìn)制0~9,A~FX"1F"位串文字中的數(shù)字串的數(shù)字必須和進(jìn)位標(biāo)志符相符。類似“D"012"”是非法的位串。無論采用何種進(jìn)位標(biāo)志符,VHDL的變異過程中總是將位串解釋成一個(gè)二進(jìn)制的位串。例如,“X"A"”的值即為“1010”。在任何情況下,位串文字只表示一個(gè)位矢量,VHDL僅將它看做是一個(gè)位串,其數(shù)字值的定義取決于用戶對位串文字的定義。位串文字用于指定二進(jìn)制寄存器的內(nèi)容的初始狀態(tài)。位串文字也可被直接指定為位串,而不使用任何進(jìn)位標(biāo)志符。位串文字中可添加下劃線字符,以提高文字的可讀性,下劃線字符不會影響位串的值。位串文字的長度即位串中位的個(gè)數(shù),與進(jìn)位標(biāo)志符無關(guān)。下劃線不影響位串文字的長度。然而,在未指定字符文字的進(jìn)位標(biāo)志符時(shí),不允許使用下劃線。
4.?dāng)?shù)字
與位串文字不同之處在于,數(shù)字表示的是一個(gè)數(shù),是標(biāo)量,而位串文字所表示的是一串0、1位信號,是矢量。數(shù)字可分為實(shí)型和整型數(shù)字。實(shí)型數(shù)字含有一個(gè)小數(shù)點(diǎn);整型數(shù)字不包含小數(shù)點(diǎn)。根據(jù)進(jìn)制的不同,數(shù)字還可分為十進(jìn)制數(shù)字和基數(shù)字兩類。
十進(jìn)制數(shù)字的格式比較簡單。在十進(jìn)制的數(shù)字中添加下劃線可以提高數(shù)字的可讀性,對數(shù)字的大小不會有任何影響。例如“100_524”與“100524”就完全相等。十進(jìn)制數(shù)字必須以數(shù)字作為第一個(gè)字符。對于用科學(xué)計(jì)數(shù)法描述的十進(jìn)制數(shù),可以使用指數(shù)符號“E”或者“e”,只有實(shí)型十進(jìn)制數(shù)才允許指數(shù)為負(fù)。表6.4所示是一些十進(jìn)制整數(shù)的例子。表6.4十進(jìn)制整數(shù)及其意義十進(jìn)制整數(shù)表示的數(shù)量121225_450254505E25005e2500000151551e051表6.5所示的是十進(jìn)制實(shí)數(shù)的例子。
表6.5十進(jìn)制實(shí)數(shù)及其意義十進(jìn)制實(shí)數(shù)表示的數(shù)量1.21.25.0e05.05.25E25255.0e-20.050.000_12540.000125401.51.55.1e02510在數(shù)字中不允許有其他的字符出現(xiàn)。表6.6所示為非法十進(jìn)制數(shù)字及其錯誤原因。
表6.6非法十進(jìn)制數(shù)字及其錯誤原因非法十進(jìn)制數(shù)錯誤原因1e-2實(shí)數(shù)中未確定小數(shù)點(diǎn).25未用數(shù)字開頭5.25E2字符E前面有空格5.0e-2字符e后面有空格45,458出現(xiàn)非法字符“,”基數(shù)字用于表示其他進(jìn)制的數(shù)字?;鶖?shù)字包括一個(gè)基標(biāo)
志、數(shù)字位和可選的指數(shù)位,在數(shù)字位前后各有一個(gè)“#”分界符,為增加可讀性,可以在數(shù)字位中增加下劃線,下劃線不會對數(shù)值有任何影響。在基數(shù)字中不允許出現(xiàn)其他的非法字符。表6.7所示即為基數(shù)字的例子。
表6.7基數(shù)字及其意義基數(shù)字所表示的數(shù)值2#1_0110#十進(jìn)制的4610#46#十進(jìn)制的468#56#十進(jìn)制的4616#2E#十進(jìn)制的4616#8F#E1十進(jìn)制的2288,即十進(jìn)制的143×164#3#e2十進(jìn)制的48,即十進(jìn)制的3×422#1.1111_01#e8二進(jìn)制的111110100,即十進(jìn)制的5006.3VHDL的數(shù)據(jù)對象
1.常數(shù)
常數(shù)指在語句中內(nèi)容一直固定不變的數(shù)據(jù)對象,即對某一常數(shù)名賦予一個(gè)固定的值。常數(shù)的值在其定義過程中確定,通常賦值在程序開始前進(jìn)行,該值的數(shù)據(jù)類型則在常數(shù)定義語句中指明。
常數(shù)說明的一般格式如下:
CONSTANT常數(shù)名:數(shù)據(jù)類型:=表達(dá)式;
如:
CONSTANTdata:INTEGER:=50;
該語句定義了一個(gè)名為“data”的整數(shù)常數(shù),并且賦予初值50。
2.變量
變量是一種內(nèi)容會發(fā)生變化的數(shù)據(jù)對象,其應(yīng)用范圍僅限于串行語句,如進(jìn)程語句、函數(shù)語句和過程語句結(jié)構(gòu)。它是一個(gè)局部量,在仿真過程中執(zhí)行到變量賦值語句后,變量就被即時(shí)賦值。
變量說明語句的一般格式如下:
VARIABLE變量名:數(shù)據(jù)類型:=初值表達(dá)式;
如:
“VARIABLEt,m:INTEGER?;?”語句表示定義了兩
個(gè)名為t和m的整型變量?!癡ARIABLEa:INTEGER:=50;?”語句表示定義了一個(gè)名為a的整型變量,并且賦初值50。
變量賦值使用數(shù)字符號“:=”,如下所示為給一個(gè)名為temp的整數(shù)類型變量賦值的語句:
temp:=15;
3.信號
信號是電子電路內(nèi)部硬件連接的抽象,可認(rèn)為是電路中的連線,它除了沒有數(shù)據(jù)流動方向說明以外,其他性質(zhì)幾乎和前面所述的“端口”概念一致。信號的使用范圍是結(jié)構(gòu)體、包集合和實(shí)體說明。信號定義語句的一般格式如下:
SIGNAL信號名:數(shù)據(jù)類型約束條件:=表達(dá)式;
如:
SIGNALclk:BlT:='0';
在VHDL中對信號賦值采用“<=”作為賦值符號,以下所示為一個(gè)給名為data的8位位矢量信號賦值的語句:
data<="01001100";
信號賦值的時(shí)刻是按仿真時(shí)間,即信號值的改變需要按照仿真時(shí)間的計(jì)劃表行事,某一個(gè)正在進(jìn)行的進(jìn)程中對信號賦值的操作需要等到該進(jìn)程結(jié)束后才會生效。在接下來的示例中將會詳細(xì)介紹信號與變量的差別。
4.文件
文件數(shù)據(jù)類型定義于VHDL’93標(biāo)準(zhǔn)之中,文件可以作為參數(shù)向子程序傳遞,通過子程序?qū)ξ募M(jìn)行讀/寫操作,文件參數(shù)沒有輸入/輸出模式。其定義如下:
FILE文件名稱:類型約束條件
如:“FILEused_file:text”語句定義了一個(gè)名稱為“used_file”的文本型文件數(shù)據(jù)。6.4VHDL的數(shù)據(jù)類型
VHDL對信號、變量及常數(shù)等數(shù)據(jù)對象的定義中都需要指定數(shù)據(jù)類型,從而定義數(shù)據(jù)對象允許的值的范圍和對該數(shù)據(jù)對象進(jìn)行的運(yùn)算操作的限制。由于是硬件描述語言,所有的語句將對應(yīng)于硬件實(shí)現(xiàn),因此VHDL對運(yùn)算關(guān)系與賦值關(guān)系中各量(操作數(shù))的數(shù)據(jù)類型有嚴(yán)格要求。VHDL要求設(shè)計(jì)實(shí)體中的每一個(gè)常數(shù)、信號、變量、函數(shù)以及設(shè)定的各種參量都必須具有確定的數(shù)據(jù)類型。不同類型的數(shù)據(jù)間無法直接進(jìn)行操作,數(shù)據(jù)類型相同而位長不同時(shí),也不能直接代入。例如,整型的數(shù)據(jù)對象必須賦整型的值。在設(shè)置為整型的數(shù)據(jù)對象上進(jìn)行的操作必須是限定于整型操作的運(yùn)算,如加法、乘法等,這樣能使VHDL編譯或綜合工具更容易地找出設(shè)計(jì)中的各種語法錯誤。VHDL中的各種預(yù)定義數(shù)據(jù)類型大多數(shù)體現(xiàn)了硬件電路的不同特性。VHDL中的數(shù)據(jù)類型可以分成四大類,如表6.8所示。表6.8VHDL中的數(shù)據(jù)類型
數(shù)據(jù)類型說明標(biāo)量類型“ScalarType”枚舉類型整數(shù)類型物理類型,例如時(shí)間類型等浮點(diǎn)(或?qū)崝?shù))類型復(fù)合類型“CompositeType”數(shù)組“Array”,其中的所有元素具有相同類型記錄“Record”,其中的元素的類型可能不同存取類型“AccessType”為給定數(shù)據(jù)類型的數(shù)據(jù)對象提供存取方式文件類型“FilesType”用于提供多值的存取根據(jù)這些數(shù)據(jù)類型定義的位置,數(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)用。除了標(biāo)準(zhǔn)的預(yù)定義數(shù)據(jù)類型外,VHDL還允許用戶自己定義其他的數(shù)據(jù)類型以及子類型。通常,新定義的數(shù)據(jù)類型和子類型的基本元素一般仍屬VHDL的預(yù)定義類型。VHDL綜合器只支持部分可綜合的預(yù)定義或用戶自定義的數(shù)據(jù)類型,對于其他類型不予支持,如TIME、FILE等類型。6.4.1VHDL標(biāo)準(zhǔn)程序包STANDARD中定義的數(shù)據(jù)類型
VHDL標(biāo)準(zhǔn)程序包STANDARD中定義了10種標(biāo)準(zhǔn)數(shù)據(jù)類型。這10種數(shù)據(jù)類型分別為布爾(BOOLEAN)類型、位(BIT)類型、位矢量(BIT_VECTOR)類型、整數(shù)(INTEGER)類型、自然數(shù)(NATURAL)和正整數(shù)(POSITIVE)類型、實(shí)數(shù)(REAL)類型、字符(CHARACTER)類型、字符串(STRING)類型、時(shí)間(TIME)類型和錯誤等級(SEVERITY_LEVEL)類型。
下面對各數(shù)據(jù)類型作簡要說明。
1.布爾(BOOLEAN)類型
布爾類型在程序包STANDARD中定義的源代碼如下:
TYPEBOOLEANIS(FALSE,TRUE);
布爾類型實(shí)際上是一個(gè)二值枚舉數(shù)據(jù)類型。根據(jù)其定義,該數(shù)據(jù)類型的取值范圍為TRUE(真)和FALSE(偽)兩種。綜合器用一個(gè)二進(jìn)制位表示BOOLEAN型變量或信號。布爾量不屬于數(shù)值,因此不能應(yīng)用于計(jì)算操作,它只能通過關(guān)系運(yùn)算符獲得。例如,當(dāng)a=b時(shí),在IF語句中的關(guān)系運(yùn)算表達(dá)式(a=b)的結(jié)果是布爾量TRUE。綜合器將TRUE轉(zhuǎn)變?yōu)樾盘柫俊?”,將FALSE轉(zhuǎn)變?yōu)樾盘柫俊?”。布爾量常用來表示信號的狀態(tài)或者總線上的情況。如果某個(gè)信號或者變量被定義為布爾量,那么用EDA工具對設(shè)計(jì)進(jìn)行仿真時(shí),系統(tǒng)自動對其賦值進(jìn)行核查。一般布爾類型的數(shù)據(jù)對象的初始值為FALSE。
2.位(BIT)類型
與布爾類型相似,位類型屬于二值枚舉數(shù)據(jù)類型,程序包STANDARD中定義的源代碼如下:
TYPEBITIS('0','1');
根據(jù)定義,其取值也只能是“0”或者“1”,位通常用來表示一個(gè)信號值。位值的表示方法是,用字符“0”或者“1”表示之。位“1”和“0”與整數(shù)中的1和0不同,“1”和“0”僅表示一個(gè)位的兩種取值,沒有數(shù)值意義。位類型只能進(jìn)行邏輯運(yùn)算,運(yùn)算結(jié)果仍然是位。
3.位矢量(BIT_VECTOR)類型
位矢量只是基于位數(shù)據(jù)類型的數(shù)組,在程序包STANDARD中對位矢量定義的源代碼如下:
TYPEBIT_VECTORISARRAY(NaturalRange<>)OFBIT;
依照位矢量的定義,在聲明位矢量時(shí)必須注明位寬,即數(shù)組中的元素個(gè)數(shù)和排列。例如:
SIGNALdata:BIT_VECTOR(7?DOWNTO0);
該語句表示聲明一個(gè)名為data的位矢量信號,共有8位,各位的排列分別是data7,data6,…,data0。元素的排列必須為自然數(shù)。位矢量數(shù)字的格式為用雙引號括起來的一組位數(shù)據(jù)。例如,“01000010”表示一個(gè)8位的位矢量;x“FF”表示一個(gè)十六進(jìn)制的位矢量,VHDL編譯器將其等價(jià)為“11111111”。
4.整數(shù)(INTEGER)類型
整數(shù)類型的數(shù)包括正整數(shù)、負(fù)整數(shù)和零。整數(shù)類型與算術(shù)整數(shù)相似,可以使用預(yù)定義的運(yùn)算操作符,如加“+”、減“-”、乘“*”、除“/”等進(jìn)行算術(shù)運(yùn)算。在VHDL中,整數(shù)的取值范圍是-2147483647~+2147483647,即可用32位有符號的二進(jìn)制數(shù)表示。注意不要把一個(gè)實(shí)數(shù)(含小數(shù)點(diǎn)的數(shù))賦予一個(gè)整數(shù)變量,一般情況下用戶可以自定義整數(shù)的賦值范圍,綜合器按照用戶定義的范圍分配該信號或變量的位數(shù),VHDL綜合器無法綜合未限定范圍的整數(shù)類型的信號或變量。如下是一個(gè)定義整數(shù)類型變量的語句:
VARIABLEa:INTEGERRANGE-127TO127;
該語句中定義了一個(gè)名為a的整數(shù)類型變量,并且限制其范圍在(-127,127)區(qū)間內(nèi)。實(shí)際應(yīng)用中,VHDL仿真器通常將INTEGER類型作為有符號數(shù)處理,而VHDL綜合器則將INTEGER作為無符號數(shù)處理。
5.自然數(shù)(NATURAL)和正整數(shù)(POSITIVE)類型
自然數(shù)和正整數(shù)都是整數(shù)的子集。自然數(shù)包括零和正整數(shù);而正整數(shù)是大于零的整數(shù),是自然數(shù)的子集。
6.實(shí)數(shù)(REAL)類型
VHDL的實(shí)數(shù)類型也稱浮點(diǎn)類型,類似于數(shù)學(xué)上的實(shí)數(shù)。其取值范圍為-1.0E38~+1.0E38。在書寫時(shí)需要加上小數(shù)點(diǎn),否則會與整數(shù)混淆。通常情況下,由于直接通過硬件實(shí)現(xiàn)浮點(diǎn)類型的表達(dá)是相當(dāng)復(fù)雜的,在電路規(guī)模上難以承受,應(yīng)用極少,因此VHDL綜合器不支持實(shí)數(shù),實(shí)數(shù)類型僅能在VHDL仿真器中使用。實(shí)數(shù)常量的格式在6.2節(jié)中有過介紹。
7.字符(CHARACTER)類型
字符類型通常用單引號引起來,如'A'。字符類型的格式在6.2節(jié)中有詳細(xì)的介紹。字符類型已在STANDARD程序包中作了定義,與標(biāo)識符不同,字符類型是區(qū)分大小寫的,如'B'不同于'b'。當(dāng)要明確指出1的字符數(shù)據(jù)時(shí),可寫為CHARACTER(‘1’)。
8.字符串(STRING)類型
字符串(或稱為字符串?dāng)?shù)組)類型是字符類型的一個(gè)非約束型數(shù)組,它必須用雙引號標(biāo)明。VHDL綜合器支持字符串類型。字符串類型的格式在6.2節(jié)中有詳細(xì)的介紹。
9.時(shí)間(TIME)類型
時(shí)間類型數(shù)據(jù)是VHDL中定義的一個(gè)物理量數(shù)據(jù)。時(shí)間類型數(shù)據(jù)一般用于仿真,而不用于邏輯綜合。完整的時(shí)間類型數(shù)據(jù)包含整數(shù)和物理量單位兩部分,而且整數(shù)和物理量單位之間至少應(yīng)留一個(gè)空格的位置,如55ms,2min。
10.錯誤等級(SEVERITY_LEVEL)類型
錯誤等級類型數(shù)據(jù)用來表示系統(tǒng)的狀態(tài)。它分為4種:NOTE(注意)、WARNING(警告)、ERROR(出錯)和FAILURE(失敗)。在仿真過程中可以用這4種狀態(tài)來提示系統(tǒng)當(dāng)前的工作情況。6.4.2用戶定義的數(shù)據(jù)類型
VHDL允許用戶自己定義數(shù)據(jù)類型??捎捎脩糇约憾x的數(shù)據(jù)類型有枚舉(ENUMERATED)類型、整數(shù)(INTEGER)類型和實(shí)數(shù)(REAL)類型、數(shù)組(ARRAY)類型、存取(ACCESS)類型、文件(FILE)類型、記錄(RECORD)類型和時(shí)間(TIME)類型(物理類型)。
下面對常用的幾種用戶定義的數(shù)據(jù)類型作簡要說明。
1.枚舉(ENUMERATED)類型
枚舉類型是把類型中的各個(gè)可能的取值都列舉出來,這種定義數(shù)據(jù)的方式方便、直觀。使用枚舉類型的數(shù)據(jù)可提高程序的可閱讀性。在使用狀態(tài)機(jī)時(shí)常采用枚舉類型來定義狀態(tài)參數(shù)。枚舉類型的一般書寫格式如下:
TYPE數(shù)據(jù)類型名IS(元素,元素,…);
例如:
TYPEDoor?IS(open,close);
VARIABLEdoor1:Door:=open;
該例子的第一個(gè)語句中定義了一個(gè)名為Door的數(shù)據(jù)類型,Door數(shù)據(jù)類型中有兩個(gè)元素,分別是open和close;在第二個(gè)語句中,用戶定義了一個(gè)名為door1的Door類型的變量,并且賦初值為open。
2.整數(shù)(INTEGER)類型和實(shí)數(shù)(REAL)類型
在標(biāo)準(zhǔn)程序包中已經(jīng)定義了整數(shù)類型和實(shí)數(shù)類型,這里所說的是用戶根據(jù)特殊用途需要再定義的整數(shù)和實(shí)數(shù)的數(shù)據(jù)類型。
用戶自定義整數(shù)或?qū)崝?shù)類型的一般格式如下:
TYPE數(shù)據(jù)類型名IS數(shù)據(jù)類型定義的約束范圍;
例如:
TYPEintISINTEGERRANGE0TO255;
VARIABLEnum:int;
該例子的第一行語句定義了一個(gè)名為int的整數(shù)類型,該類型的數(shù)據(jù)取值范圍為0~255;第二行語句定義了一個(gè)名為num的int型變量。
3.?dāng)?shù)組(ARRAY)類型
數(shù)組類型是將相同類型的數(shù)據(jù)集合在一起形成的一個(gè)新的數(shù)據(jù)類型,是一種復(fù)合型的數(shù)據(jù)類型。數(shù)組可以是一維的,其中的每個(gè)元素只需要由一個(gè)下標(biāo)確定其在數(shù)組中的位置,例如a1、a2、a3、…、a10就是一個(gè)一維的數(shù)組。數(shù)組也可以是二維或多維的,例如,
a11、a12、a13
a21、a22、a23
a31、a32、a33
就是一個(gè)二維數(shù)組,每個(gè)元素由兩個(gè)下標(biāo)確定其在數(shù)組中的位置,VHDL仿真器支持多維數(shù)組,但是綜合器只支持一維數(shù)組。數(shù)組的元素可以是任何一種數(shù)據(jù)類型,用以定義數(shù)組元素的下標(biāo)范圍子句決定了數(shù)組中元素的個(gè)數(shù),以及元素的排序方向,即下標(biāo)數(shù)是由低到高,或是由高到低。如子句“0TO7”是由低到高排序的8個(gè)元素;“15DOWNTO0”是由高到低排序的16個(gè)元素。
VHDL允許用戶自定義兩種不同類型的數(shù)組,即限定性數(shù)組和非限定性數(shù)組。它們的區(qū)別是,限定性數(shù)組下標(biāo)的取值范圍在數(shù)組定義時(shí)就被確定了,而非限定性數(shù)組下標(biāo)的取值范圍需留待隨后確定。限定性數(shù)組定義語句格式如下:
TYPE數(shù)組名ISARRAY(數(shù)組范圍)OF數(shù)據(jù)類型;其中:數(shù)組名是新定義的限定性數(shù)組類型的名稱,可以是任何標(biāo)識符;數(shù)據(jù)類型即指數(shù)組各元素的數(shù)據(jù)類型;數(shù)組范圍明確指出數(shù)組元素的定義數(shù)量和排序方式,以整數(shù)來表示其數(shù)組的下標(biāo)。限定性數(shù)組定義示例如下:
TYPEbusAISARRAY(7DOWNTO0)OFBIT;
這個(gè)例子定義了一個(gè)名為busA的數(shù)組,它有8個(gè)元素,數(shù)組中元素的下標(biāo)排序是7、6、5、4、3、2、1、0,各位的名稱分別是busA(7)、busA(6)、…、busA(0)。限定性數(shù)組還可以采用以下格式定義:
TYPEdataIS(low,high);
TYPEdata_busISARRAY(0TO7,data)OFBIT;
該例中首先定義data為兩元素的枚舉數(shù)據(jù)類型,然后將data_bus定義為一個(gè)有8個(gè)元素的數(shù)組類型,其中每一元素的數(shù)據(jù)類型是BIT,data中的low和high分別對應(yīng)于BIT類型中的“0”和“1”。
非限制性數(shù)組類型就是不說明所定義的數(shù)組下標(biāo)的取值范圍,而是定義某一數(shù)據(jù)對象為此數(shù)組類型時(shí),再確定該數(shù)組下標(biāo)的取值范圍。這樣就可以通過不同的定義取值,使相同的數(shù)據(jù)對象具有不同下標(biāo)取值的數(shù)組類型。非限制性數(shù)組的定義語句格式如下:
TYPE數(shù)組名ISARRAY(數(shù)組下標(biāo)名RANGE<>)
OF數(shù)據(jù)類型;
其中:數(shù)組名是定義的非限制性數(shù)組類型的取名;數(shù)組下標(biāo)名是以整數(shù)類型設(shè)定的一個(gè)數(shù)組下標(biāo)名稱,符號“<>”是下標(biāo)范圍待定符號,用到該數(shù)組類型時(shí),再填入具體的數(shù)值范圍;數(shù)據(jù)類型是數(shù)組中每一元素的數(shù)據(jù)類型。
4.存取(ACCESS)類型
存取類型用來給新對象分配或釋放存儲空間。在VHDL標(biāo)準(zhǔn)IEEE內(nèi)的STD_1076的程序包TEXTIO中,有一個(gè)預(yù)定義的存取類型Line:
TYPELineISACCESSstlin9;
這表示類型為Line的變量是指向字符串值的指針。只有變量才可以定義為存取類型,如:
VARIABLEline_bufferline;
5.文件(FILE)類型
文件類型用于在主系統(tǒng)環(huán)境中定義代表文件的對象。文件對象的值是主系統(tǒng)文件中值的序列。在IEEESTD_1076的程序包TEXTIO中,有一個(gè)預(yù)定義的文件類型Text,用戶也可以定義自己的文件類型。如:
TYPETextISFILEOFString;??
--TEXTIO程序包中預(yù)定義的文件類型
TYPEInput_typeISFILEOFCharacter;
--用戶自定義的文件類型
在程序包TEXTIO中,有2個(gè)預(yù)定義的標(biāo)準(zhǔn)文本文件:
FILEINPUT:TextOPENread_modeIS“STD_INPUT”;
FILEOUTPUT:TextOPENwrite_modeIS"STD_OUTPUT";
6.記錄(RECORD)類型
記錄類型是將不同類型的數(shù)據(jù)和數(shù)據(jù)名組織在一起而形成的數(shù)據(jù)類型。記錄類型與數(shù)組類型的區(qū)別在于,數(shù)組是由多個(gè)同一類型的數(shù)據(jù)集合起來,記錄可由不同類型數(shù)據(jù)組合,定義記錄類型的數(shù)據(jù)時(shí)需要一一定義。用記錄描述總線結(jié)構(gòu)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年倉儲物流叉車租賃服務(wù)市場拓展合作協(xié)議范本
- 2025年綠色環(huán)保班輪運(yùn)輸合同范本-環(huán)保型集裝箱物流服務(wù)協(xié)議
- 2025年度全民健身中心設(shè)施升級改造及施工監(jiān)管服務(wù)合同
- 2025年企業(yè)社會責(zé)任履行情況審計(jì)委托合同
- 2025年生物醫(yī)療儀器產(chǎn)品代理分銷合同(附銷售支持方案)
- 2025北大金融班面試題及答案
- 2025年度高新技術(shù)產(chǎn)業(yè)民間資金借款服務(wù)協(xié)議
- 2025年新型直升機(jī)租賃及維護(hù)服務(wù)合同
- 2025年兒科專業(yè)護(hù)士職位聘任與服務(wù)協(xié)議
- 2025年校園食堂廢棄物處理及環(huán)保資源化利用服務(wù)合同
- 2025年中國農(nóng)業(yè)銀行寧夏回族自治區(qū)分行春季招聘58人筆試模擬試題參考答案詳解
- 2025年珠海市金灣區(qū)農(nóng)業(yè)農(nóng)村和水務(wù)局招聘下屬事業(yè)單位工作人員公筆試備考試題及答案詳解(有一套)
- 海上風(fēng)電回顧與展望2025年
- GB/T 45911-2025人工影響天氣作業(yè)用彈藥存儲安全要求
- 排污許可證審核及環(huán)境應(yīng)急管理服務(wù)方案投標(biāo)文件(技術(shù)方案)
- 神經(jīng)內(nèi)科業(yè)務(wù)學(xué)習(xí)體系
- 2025年甘肅省高考地理試卷真題(含答案解析)
- 駐京信訪工作組管理辦法
- 尿道下裂的診斷及分型
- 腫瘤的診斷與治療
- 【高朋律師事務(wù)所】RWA發(fā)展研究報(bào)告:法律、監(jiān)管和前瞻(2025年)
評論
0/150
提交評論