《FPGA設(shè)計(jì)及應(yīng)用》課件第3章_第1頁
《FPGA設(shè)計(jì)及應(yīng)用》課件第3章_第2頁
《FPGA設(shè)計(jì)及應(yīng)用》課件第3章_第3頁
《FPGA設(shè)計(jì)及應(yīng)用》課件第3章_第4頁
《FPGA設(shè)計(jì)及應(yīng)用》課件第3章_第5頁
已閱讀5頁,還剩201頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第3章硬件描述語言3.1硬件描述語言概述3.2VHDL程序的基本結(jié)構(gòu)3.3VHDL的描述方法3.4VHDL的常用語句3.1硬件描述語言概述

VHDL的特點(diǎn)是:*VHDL是IEEE標(biāo)準(zhǔn),語法比較嚴(yán)格;*VHDL支持各種設(shè)計(jì)方法和技術(shù),例如自上而下和自下而上設(shè)計(jì),同步和異步設(shè)計(jì)等;*VHDL能夠處理各種對(duì)象,從描述邏輯門層次的電路到描述整個(gè)數(shù)字系統(tǒng);*VHDL支持由若干小組協(xié)同完成一個(gè)系統(tǒng)的設(shè)計(jì)。

VerilogHDL是在C語言的基礎(chǔ)上發(fā)展起來的一種硬件描述語言,語法較自由,目前ASIC設(shè)計(jì)大多采用這種語言。VerilogHDL語言是美國CadenceDesignSystems公司于1983~1984年組織開發(fā)的,并于1995年成為IEEE標(biāo)準(zhǔn),即VerilogHDL1364-1995,2001年又發(fā)布了VerilogHDL1364-2001標(biāo)準(zhǔn)。該語言的主要特點(diǎn)是:*過程性描述和結(jié)構(gòu)性描述兩者都能接受;*所使用的基本數(shù)據(jù)類型是“線”和“寄存器”,它采用四狀態(tài)制表示布爾值:“0”、"1"、“X”、“Z”,其中“X”表示不確定狀態(tài),“Z”表示懸空;

*能夠使用混合模式的模型,即用其描述的設(shè)計(jì)可以包含不同的抽象層次,并能用一個(gè)仿真程序做仿真;*能夠描述模塊的并行行為以及描述有限狀態(tài)機(jī)?,F(xiàn)在,VHDL和VerilogHDL作為IEEE的工業(yè)標(biāo)準(zhǔn)硬件描述語言,又得到眾多EDA公司的支持,在電子工程領(lǐng)域,已成為事實(shí)上的通用硬件描述語言。VHDL和VerilogHDL兩者相比,學(xué)習(xí)VHDL比學(xué)習(xí)VerilogHDL難一些,但VerilogHDL自由的語法使得初學(xué)者容易上手,同時(shí)也容易出錯(cuò)。從EDA技術(shù)的發(fā)展趨勢上看,直接采用C語言設(shè)計(jì)可編程邏輯電路將是一個(gè)發(fā)展方向,現(xiàn)在已出現(xiàn)用于可編程邏輯電路設(shè)計(jì)的C語言編譯軟件。可以預(yù)見,C語言很可能將逐漸成為繼VHDL和VerilogHDL之后設(shè)計(jì)大規(guī)??删幊踢壿嬰娐返挠忠环N手段。

用VHDL/VerilogHDL語言開發(fā)可編程邏輯電路的完整流程為:

(1)文本編輯。用任何文本編輯器都可以進(jìn)行,也可以用專用的HDL編輯環(huán)境。通常VHDL文件保存為.vhd文件,VerilogHDL文件保存為.v文件。

(2)功能仿真。將文件調(diào)入HDL仿真軟件進(jìn)行功能仿真,檢查邏輯功能是否正確(也叫前仿真,對(duì)簡單的設(shè)計(jì)可以跳過這一步,只有在布線完成以后,才進(jìn)行時(shí)序仿真)。

(3)邏輯綜合。將源文件調(diào)入邏輯綜合軟件進(jìn)行綜合,即把語言綜合成最簡的布爾表達(dá)式。邏輯綜合軟件會(huì)生成.edf(EDIF)的EDA工業(yè)標(biāo)準(zhǔn)文件。

(4)布局布線。將.edf文件調(diào)入FPGA廠商提供的軟件中進(jìn)行布線,即把設(shè)計(jì)好的邏輯安放到CPLD/FPGA內(nèi)。

(5)時(shí)序仿真:需要利用在布局布線中獲得的精確參數(shù),用仿真軟件驗(yàn)證電路的時(shí)序(也叫后仿真)。以上過程通常都可以在FPGA廠家提供的開發(fā)工具中完成,如Altera公司的MAX+PLUSⅡ和QuartusⅡ,Xilinx公司的Foundation和ISE等。如果使用專用HDL工具完成邏輯綜合,如Synplicity公司的Synplify/SynplifyPro,Mentor公司的LeonardoSpectrum和PrecisionRTL,Synopsys公司的FPGAComplierII等等,效果可能會(huì)更好。

如果編寫的HDL程序僅用于仿真,那么幾乎所有的語法和編程方法都可以使用。但如果程序是用于FPGA硬件實(shí)現(xiàn),那么就必須保證程序具有“可綜合性”,即程序所描述的功能可以用硬件電路實(shí)現(xiàn)。不可綜合的HDL語句在軟件綜合時(shí)將被忽略或者報(bào)錯(cuò)。也就是說,所有的HDL程序都可以用于仿真,但不是所有的HDL程序都能用硬件實(shí)現(xiàn)。掌握HDL語言的關(guān)鍵是充分理解HDL語句和硬件電路的關(guān)系。編寫HDL程序,就是在描述一個(gè)電路,設(shè)計(jì)者應(yīng)當(dāng)對(duì)生成的電路有一些大體上的了解,而不能用純軟件的設(shè)計(jì)思路來編寫硬件描述語言。在HDL學(xué)習(xí)中還應(yīng)看到,使用30%左右的基本HDL語句就可以完成95%以上的電路設(shè)計(jì),很多生僻的語句并不能被所有的綜合軟件所支持,并且在程序移植或者更換軟件平臺(tái)時(shí),很容易產(chǎn)生兼容性問題,也不利于其他人閱讀和修改。所以,能夠深刻理解和靈活運(yùn)用一些常用的HDL語句,往往比多掌握幾個(gè)新的語法要有用得多。

3.2VHDL程序的基本結(jié)構(gòu)

一段完整的VHDL程序包括:實(shí)體(ENTITY)、結(jié)構(gòu)體(ARCHITECTURE)、配置(CONFIGURATION)、庫(LIBRARY)和程序包(PACKAGE)五個(gè)組成部分,其中前四部分是可分別編譯的源設(shè)計(jì)單元。實(shí)體是一個(gè)VHDL語言程序的基本單元,它既可以很簡單,也可以很復(fù)雜,簡單到可以描述一個(gè)門電路,復(fù)雜到可以描述一個(gè)微處理器或一個(gè)片上系統(tǒng)(SOC)。無論是簡單的還是復(fù)雜的數(shù)字電路,實(shí)體的基本構(gòu)成是一致的,即由實(shí)體說明和結(jié)構(gòu)體兩部分組成。實(shí)體說明部分用于描述所設(shè)計(jì)系統(tǒng)的外部端口信號(hào)和參數(shù)的屬性和設(shè)置,而結(jié)構(gòu)體部分則定義了設(shè)計(jì)單元的具體功能、行為、數(shù)據(jù)流程或內(nèi)部結(jié)構(gòu)。配置用于從庫中選取所需單元來組成系統(tǒng)設(shè)計(jì)的不同版本。程序包用于存放各設(shè)計(jì)模塊能共享的數(shù)據(jù)類型、常數(shù)、子程序等。庫用于存放已編譯的實(shí)體、結(jié)構(gòu)體、程序包和配置,它可由用戶生成或由ASIC芯片制造商提供,以便于在設(shè)計(jì)中為大家所共享。

【例3-1】

觸發(fā)器的VHDL設(shè)計(jì)。

由例3-1可以看出,VHDL程序中設(shè)計(jì)實(shí)體的保留字為ENTITY,結(jié)構(gòu)體的保留字為ARCHITECTURE。一個(gè)設(shè)計(jì)實(shí)體有且只能有一個(gè)實(shí)體說明,但可以有一個(gè)或多個(gè)結(jié)構(gòu)體。圖3.1顯示了VHDL程序的基本組成。對(duì)于VHDL的編譯器和綜合器來講,VHDL語言代碼是不區(qū)分其大小寫字母的,但是為了方便閱讀和識(shí)別,建議將VHDL語句中的保留字用大寫字母來表示,設(shè)計(jì)者自己添加的內(nèi)容用小寫字母來表示。

圖3.1VHDL程序的基本組成3.2.1實(shí)體說明

VHDL程序中的實(shí)體說明的一般格式為:

ENTITY實(shí)體名IS

[類屬參數(shù)說明];

[端口說明];

END實(shí)體名;一個(gè)基本設(shè)計(jì)單元的實(shí)體說明以“ENTITY實(shí)體名IS”開始,至“END實(shí)體名;”結(jié)束。例如在例3-1中,從“ENTITYflipflopIS”開始,至“ENDflipflop;”結(jié)束。

實(shí)體說明一般由類屬參數(shù)說明和端口說明兩部分構(gòu)成。類屬參數(shù)說明用來指定參數(shù),它與常數(shù)不同,區(qū)別在于:類屬的值可以由設(shè)計(jì)實(shí)體外部提供,設(shè)計(jì)者可以容易地從外面改變類屬參量對(duì)整個(gè)設(shè)計(jì)實(shí)體進(jìn)行修改;而常數(shù)是由實(shí)體內(nèi)部得到賦值并且其值不可以發(fā)生改變。類屬參數(shù)說明必須放在端口說明之前,用于設(shè)置實(shí)體和外部電路間的靜態(tài)參數(shù),其書寫格式為:

GENERIC(參數(shù)名:類型名:=缺省值;

參數(shù)名:類型名:=缺省值);…端口說明用于描述實(shí)體和外部電路的接口信號(hào),也可以說是對(duì)外部引腳信號(hào)的名稱、數(shù)據(jù)類型和輸入輸出方向的描述,其書寫格式為:

PORT(端口名,端口名:端口方向數(shù)據(jù)類型名;

端口名,端口名:端口方向

數(shù)據(jù)類型名);…

端口名是給予每個(gè)外部引腳的名稱,通常用一個(gè)或多個(gè)英文字母,或者是英文字母加數(shù)字的方式來命名,如例3-1中的外部引腳d、clk、clrn等。端口方向用于定義外部引腳的信號(hào)的流向,常用的端口方向有IN、OUT、INOUT、BUFFER和LINKAGE。以“IN”定義的端口為輸入端口,只允許信號(hào)流入端口,由外部電路驅(qū)動(dòng)該設(shè)計(jì)實(shí)體;以“OUT”定義的端口為輸出端口,只允許信號(hào)流出端口,由該設(shè)計(jì)實(shí)體驅(qū)動(dòng)外部電路;以“INOUT”定義的端口為雙向端口,信號(hào)可以流入或流出該設(shè)計(jì)實(shí)體;而"BUFFER"為緩沖端口,它與輸出端口類似,只是緩沖端口允許設(shè)計(jì)實(shí)體內(nèi)部使用該端口信號(hào),它可以用于輸出,也可以用于端口信號(hào)的反饋。當(dāng)一個(gè)結(jié)構(gòu)體用“BUFFER”說明輸出端口時(shí),與其連接的另一個(gè)結(jié)構(gòu)體的端口也要用“BUFFER”說明。以“LINKAGE”定義的端口不指定方向,無論哪個(gè)方向的信號(hào)都可以連接。

在數(shù)字邏輯電路的設(shè)計(jì)中最常用的數(shù)據(jù)類型有兩種,即BIT和BIT_VECTOR。端口的數(shù)據(jù)類型定義為BIT時(shí),該端口信號(hào)的取值只能是邏輯值“0”或“1”;而當(dāng)定義為BIT_VECTOR時(shí),該端口的取值是一組二進(jìn)制位的矢量值,它可以代表設(shè)計(jì)中的多位矢量信號(hào)或是電路中的總線數(shù)據(jù)。

【例3-2】實(shí)體說明示例一。ENTITYhaISPORT(h1,h2:INBIT;q:OUTBIT;haq:OUTBIT_VECTOR(7DOWNTO0));ENDha;例3-2中的端口h1、h2、q的數(shù)據(jù)類型為BIT,而端口haq的數(shù)據(jù)類型為BIT_VECTOR,其中的(7DOWNTO0)表示haq端口是一個(gè)8位的端口,由最高位B7到最低位B0,位矢量長度為8。

【例3-3】

實(shí)體說明示例二。

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITYhaIS

PORT(h1,h2:INSTD_LOGIC;

q:OUTSTD_LOGIC;

haq:OUTSTD_LOGIC_VECTOR(7DOWNTO0));

ENDha;例3-3和例3-2是完全等效的,這里只是替換了原有的數(shù)據(jù)類型BIT和BIT_VECTOR為新定義的STD_LOGIC和STD_LOGIC_VECTOR類型,并且加上了這種新的數(shù)據(jù)類型的庫和程序包的說明語句,以便在對(duì)VHDL程序進(jìn)行編譯時(shí),能夠從指定庫的程序包中找到相應(yīng)的數(shù)據(jù)類型。

3.2.2結(jié)構(gòu)體

1.基本格式結(jié)構(gòu)體(ARCHITECTURE)為一個(gè)基本設(shè)計(jì)實(shí)體的另一重要組成部分,它描述了設(shè)計(jì)實(shí)體所要實(shí)現(xiàn)的功能,指明了設(shè)計(jì)實(shí)體中的行為和內(nèi)部器件的連接關(guān)系以及數(shù)據(jù)流程。由于結(jié)構(gòu)體是對(duì)實(shí)體功能的具體描述,因此它一定要跟在實(shí)體的后面。一個(gè)結(jié)構(gòu)體通常由結(jié)構(gòu)體名稱、定義語句和并行處理語句構(gòu)成,有如下兩種格式:

格式1

ARCHITECTURE結(jié)構(gòu)體名OF實(shí)體名IS

[定義語句];--內(nèi)部信號(hào),常數(shù),數(shù)據(jù)類型,函數(shù)等的定義

BEGIN

[并行處理語句];

END結(jié)構(gòu)體名;格式2

ARCHITECTURE結(jié)構(gòu)體名OF實(shí)體名IS

[定義語句];--內(nèi)部信號(hào),常數(shù),數(shù)據(jù)類型,函數(shù)等的定義

BEGIN

[并行處理語句];

ENDARCHITECTURE結(jié)構(gòu)體名;格式1和格式2分別對(duì)應(yīng)于IEEEStandard1076-1987和IEEEStandard1076-1993標(biāo)準(zhǔn)。結(jié)構(gòu)體的名稱是由設(shè)計(jì)者自由命名的,它是結(jié)構(gòu)體的唯一名稱。OF后面的實(shí)體名稱表明該結(jié)構(gòu)體是屬于哪個(gè)設(shè)計(jì)實(shí)體的。為了讓人一目了然,大多數(shù)的資料文獻(xiàn)中通常采用以下三種方式來命名結(jié)構(gòu)體:

ARCHITECTUREbehavioralOFflipflopIS用結(jié)構(gòu)體的行為命名

ARCHITECTUREdataflowOFflipflopIS用結(jié)構(gòu)體的數(shù)據(jù)流命名

ARCHITECTUREstructuralOFflipflopIS用結(jié)構(gòu)體的結(jié)構(gòu)命名

這三種命名方式對(duì)應(yīng)了結(jié)構(gòu)體的三種描述方式,即行為級(jí)描述、數(shù)據(jù)流級(jí)描述和結(jié)構(gòu)級(jí)描述,下一小節(jié)將詳細(xì)介紹這三種描述方式。設(shè)計(jì)者可以根據(jù)自己設(shè)計(jì)的VHDL程序的結(jié)構(gòu)體描述方式來給結(jié)構(gòu)體命名,以方便閱讀和使用。結(jié)構(gòu)體的名稱后面就是定義語句,用于定義結(jié)構(gòu)體內(nèi)部使用到的信號(hào)、常數(shù)、數(shù)據(jù)類型和函數(shù)等。定義語句位于ARCHITECTURE和BEGIN之間,也就是在結(jié)構(gòu)體內(nèi)部,而不是實(shí)體內(nèi)部,因?yàn)橐粋€(gè)實(shí)體可以有多個(gè)結(jié)構(gòu)體。結(jié)構(gòu)體內(nèi)部的定義語句和端口說明語句類似,因?yàn)槭莾?nèi)部連接使用,所以不用說明方向。

【例3-4】

結(jié)構(gòu)體的定義語句。ARCHITECTUREstructuralOFflipflopISSIGNALq:BIT;

BEGIN

ENDstructural;……

并行處理語句是結(jié)構(gòu)體功能描述的主要語句,它位于BEGIN和END之間。所謂并行處理語句,就是指語句的執(zhí)行不以書寫的順序?yàn)閳?zhí)行順序,而是并行進(jìn)行處理的。比如在ARCHITECTURE中存在兩條語句:

D<=A+E;A<=B+C;這兩條語句將產(chǎn)生兩個(gè)加法器,第二個(gè)輸出作為第一個(gè)的一個(gè)輸入。在仿真時(shí),當(dāng)B或C變化時(shí),激活語句2,當(dāng)A或E變化時(shí),激活語句1。

2.描述方式結(jié)構(gòu)體對(duì)基本設(shè)計(jì)單元的輸入輸出關(guān)系可以有三種描述方式:*行為級(jí)描述,也稱為算法級(jí)描述,它不是對(duì)某一個(gè)器件的描述,而是對(duì)整個(gè)設(shè)計(jì)單元的數(shù)學(xué)模型描述,所以屬于一種高層次描述方式,。*數(shù)據(jù)流級(jí)描述,也稱為寄存器傳輸級(jí)(RTL)描述,即采用進(jìn)程語句順序描述數(shù)據(jù)流在控制流作用下中被加工、處理和存儲(chǔ)的全過程。這種描述方式與采用原理圖輸入方式進(jìn)行電路設(shè)計(jì)處于同一個(gè)層次。

*結(jié)構(gòu)級(jí)描述,也稱為邏輯元器件連接描述或門級(jí)描述,即采用并行處理語句,使用最基本的邏輯門單元來描述設(shè)計(jì)實(shí)體內(nèi)部的結(jié)構(gòu)組織和元器件的連接關(guān)系。這三種描述方式的劃分是根據(jù)寄存器和組合邏輯的確定性而言的:*行為級(jí)描述,寄存器和組合邏輯都不明確;*數(shù)據(jù)流級(jí)描述,寄存器明確,組合邏輯不明確;*結(jié)構(gòu)級(jí)描述,寄存器和組合邏輯都明確。

圖3.2二選一復(fù)用器結(jié)構(gòu)電路

1)行為級(jí)描述在采用行為級(jí)描述方式的程序中,大量采用了邏輯運(yùn)算、算術(shù)運(yùn)算和關(guān)系運(yùn)算,是對(duì)系統(tǒng)基本模型的數(shù)學(xué)描述,抽象程度較高。

【例3-5】

二選一復(fù)用器的行為級(jí)描述。

LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;

ENTITYmux2ISPORT(a,b,sel:INSTD_LOGIC;

q:OUTSTD_LOGIC);ENDmux2;ARCHITECTUREbehavioralOFmux2ISBEGINPROCESS(a,b)BEGINIFsel='1'THEN

q<=a;

ELSE

q<=b;

ENDIF;ENDPROCESS;ENDbehavioral;采用行為級(jí)描述方式的程序不是從設(shè)計(jì)實(shí)體的電路組織和門級(jí)實(shí)現(xiàn)來完成設(shè)計(jì),而是著重設(shè)計(jì)正確的實(shí)體行為、準(zhǔn)確的函數(shù)模型和精確的輸出結(jié)果。采用行為級(jí)描述方式的VHDL語言程序,在一般情況下只能用于行為層次的仿真,而不能進(jìn)行邏輯綜合。只有將行為級(jí)描述方式改寫為數(shù)據(jù)流級(jí)描述方式,才能進(jìn)行邏輯綜合。隨著設(shè)計(jì)技術(shù)的發(fā)展,一些EDA軟件能夠自動(dòng)完成行為綜合,如Synopsys的BehavioralComplier,從而可以把行為級(jí)描述轉(zhuǎn)換為數(shù)據(jù)流級(jí)描述方式。

2)數(shù)據(jù)流級(jí)描述數(shù)據(jù)流級(jí)描述方式,是一種明確規(guī)定寄存器描述的方法,它要么采用寄存器硬件的一一對(duì)應(yīng)的直接描述,要么采用寄存器之間的功能描述,所以數(shù)據(jù)流級(jí)描述方式可以進(jìn)行真正的邏輯綜合,模擬實(shí)際電路和元器件的工作性能。在數(shù)據(jù)流描述的程序中,常用的語法有:Case-when(條件信號(hào)賦值語句)和With-select-when(選擇信號(hào)賦值語句)。它們著重設(shè)計(jì)實(shí)體中數(shù)據(jù)流的運(yùn)動(dòng)路徑、方向和結(jié)果。

【例3-6】二選一復(fù)用器的數(shù)據(jù)流描述。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;

ENTITYmux2ISPORT(a,b,sel:INSTD_LOGIC;q:OUTSTD_LOGIC);ENDmux2;

ARCHITECTUREdataflowOFmux2ISBEGINq<=aWHENsel='1'ELSEb;ENDdataflow;采用數(shù)據(jù)流級(jí)描述方式的程序設(shè)計(jì)中,必須注意以下幾項(xiàng)原則:*禁止在一個(gè)進(jìn)程中存在兩個(gè)寄存器描述;*禁止使用IF語句中的ELSE項(xiàng);*寄存器描述中必須代入信號(hào)值。

3)結(jié)構(gòu)級(jí)描述所謂結(jié)構(gòu)級(jí)描述方式,就是在多層次的設(shè)計(jì)中,高層次的設(shè)計(jì)模塊調(diào)用低層次的設(shè)計(jì)模塊,或者直接用門電路設(shè)計(jì)單元來構(gòu)成一個(gè)復(fù)雜的邏輯電路的描述方法。例3-7給出了一個(gè)采用結(jié)構(gòu)級(jí)描述方式的二選一復(fù)用器的設(shè)計(jì)實(shí)例。

【例3-7】二選一復(fù)用器的結(jié)構(gòu)級(jí)描述。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;

ENTITYmux2ISPORT(a,b,sel:INSTD_LOGIC;q:OUTSTD_LOGIC);ENDmux2;

ARCHITECTUREstructuralOFmux2ISCOMPONENTand2PORT(a,b:INSTD_LOGIC;

c:OUTSTD_LOGIC);ENDCOMPONENT;

COMPONENTor2PORT(a,b:INSTD_LOGIC;

c:OUTSTD_LOGIC);ENDCOMPONENT;

COMPONENTinvPORT(a:INSTD_LOGIC;

b:OUTSTD_LOGIC);ENDCOMPONENT;SIGNALaa,ab,nsel:STD_LOGIC;

BEGINg1:invPORTMAP(sel,nsel);g2:and2PORTMAP(nsel,b,ab);g3:and2PORTMAP(a,sel,aa);g4:or2PORTMAP(aa,ab,q);ENDstructural;

3)子結(jié)構(gòu)描述在比較復(fù)雜的電子設(shè)計(jì)中,如果全部電路都用一個(gè)模塊來描述,是非常不方便的。為此,設(shè)計(jì)者總是希望將整個(gè)電路分成若干個(gè)相對(duì)比較獨(dú)立的模塊來進(jìn)行電路的描述。這樣,一個(gè)結(jié)構(gòu)體可以用幾個(gè)相對(duì)比較獨(dú)立的子結(jié)構(gòu)來構(gòu)成。VHDL語言包含有以下三種形式的子結(jié)構(gòu)描述語句:

(1)進(jìn)程(PROCESS)的子結(jié)構(gòu)方式;

(2)模塊(BLOCK)的子結(jié)構(gòu)方式;

(3)子程序(SUBPROGRAM)的子結(jié)構(gòu)方式。

1)進(jìn)程的子結(jié)構(gòu)方式采用PROCESS的子結(jié)構(gòu)方式描述的電路結(jié)構(gòu)類似于BLOCK方式,VHDL程序中每個(gè)PROCESS的一般格式為:

[進(jìn)程名:]PROCESS(信號(hào)1,信號(hào)2,...)變量說明

BEGIN

ENDPROCESS[進(jìn)程名];…PROCESS的子結(jié)構(gòu)方式從"PROCESS"開始,至"ENDPROCESS"結(jié)束。在一般情況下,進(jìn)程名是可以省略的。在多個(gè)進(jìn)程的結(jié)構(gòu)體描述中,進(jìn)程名是區(qū)分各個(gè)進(jìn)程的標(biāo)志。與BLOCK語句不同的是,PROCESS結(jié)構(gòu)中的語句是按書寫順序一條一條向下執(zhí)行的,而不是并行執(zhí)行的。這種順序執(zhí)行的語句只在PROCESS和SUBPROGRAM的結(jié)構(gòu)體中使用。進(jìn)程只有兩種運(yùn)行狀態(tài),即執(zhí)行狀態(tài)和等待狀態(tài)。在PROCESS語句的括號(hào)中有幾個(gè)信號(hào)量,通常稱為敏感信號(hào),這些信號(hào)量只要有一個(gè)發(fā)生了變化,都將啟動(dòng)該P(yáng)ROCESS語句。一旦啟動(dòng)之后,PROCESS中的語句將從上到下逐句執(zhí)行一遍。當(dāng)最后一個(gè)語句執(zhí)行完畢后,就返回到開始的PROCESS語句,等待下一次敏感信號(hào)的變化??傊灰狿ROCESS中的敏感信號(hào)變化一次,該P(yáng)ROCESS進(jìn)程就會(huì)執(zhí)行一遍。

進(jìn)程也可以不包含敏感信號(hào),它的啟動(dòng)也可以用WAIT語句等待一個(gè)觸發(fā)條件的成立。這種進(jìn)程語句的一般格式為:PROCESS變量說明BEGINWAIT語句

ENDPROCESS];…

需要特別強(qiáng)調(diào)的是,進(jìn)程一定要有敏感信號(hào)表,或者一定要有WAIT語句,否則該進(jìn)程就會(huì)進(jìn)入死循環(huán)狀態(tài)。在復(fù)雜的電子系統(tǒng)中,設(shè)計(jì)實(shí)體可以由多個(gè)結(jié)構(gòu)體構(gòu)成,而每個(gè)結(jié)構(gòu)體又可以由多個(gè)進(jìn)程構(gòu)成,同一結(jié)構(gòu)體中的多個(gè)進(jìn)程是并行執(zhí)行的,也可以通過進(jìn)程之間的信號(hào)或共享變量進(jìn)行通信。為了方便了解多進(jìn)程結(jié)構(gòu)體的結(jié)構(gòu),例3-8給出了一個(gè)含有兩個(gè)進(jìn)程,且之間可以互相通信的結(jié)構(gòu)體,這兩個(gè)進(jìn)程之間的關(guān)系如圖3.3所示。

圖3.3兩個(gè)進(jìn)程的通信關(guān)系

【例3-8】兩進(jìn)程結(jié)構(gòu)體的結(jié)構(gòu)。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;

ENTITYtwo_processIS

PORT(d:INSTD_LOGIC;q:OUTSTD_LOGIC);ENDtwo_process;

ARCHITECTUREstructuralOFtwo_processISSIGNALa:STD_LOGIC;BEGIN

P1:PROCESS(d,b)BEGINIF(b='1')THENq<=d;ELSIF(d'EVENTANDd='1')THENa<=d;ENDIF;ENDPROCESSP1;P2:PROCESS(a)BEGINIF(a'EVENTANDa='1')THENb<=a;ENDIF;ENDPROCESSP2;ENDstructural;例3-8中所示的一個(gè)結(jié)構(gòu)體由兩個(gè)進(jìn)程P1和P2構(gòu)成,當(dāng)P1進(jìn)程的敏感信號(hào)發(fā)生變化時(shí),P1進(jìn)程被啟動(dòng),P1進(jìn)程處理完后,P2進(jìn)程的敏感信號(hào)發(fā)生變化,接著P2進(jìn)程開始工作,這又觸發(fā)了P1進(jìn)程工作,如此循環(huán)。

2)模塊的子結(jié)構(gòu)方式采用BLOCK的子結(jié)構(gòu)方式描述的電路的一般格式為:ENTITY實(shí)體名IS

ARCHITECTURE結(jié)構(gòu)體名OF實(shí)體名

BEGINBLOCK1BLOCK………BLOCK2BLOCK

BLOCK3BLOCK

END結(jié)構(gòu)體名;……VHDL程序中每個(gè)BLOCK的一般格式為:塊結(jié)構(gòu)名:BLOCKBEGIN

ENDBLOCK塊結(jié)構(gòu)名;…VHDL程序中的結(jié)構(gòu)體可以只有一個(gè)BLOCK模塊,也可以同時(shí)有幾個(gè)BLOCK模塊。在對(duì)程序進(jìn)行仿真時(shí),BLOCK語句中所描述的各個(gè)語句是并發(fā)執(zhí)行的,與書寫順序無關(guān)。在BLOCK模塊之外,結(jié)構(gòu)體內(nèi)的各個(gè)語句也是并發(fā)執(zhí)行的。并發(fā)執(zhí)行的語句分為:無條件并發(fā)執(zhí)行和有條件并發(fā)執(zhí)行兩類。有條件并發(fā)執(zhí)行的BLOCK稱為GUARDEDBLOCK(衛(wèi)式BLOCK),其書寫格式為:

BLOCK(條件布爾表達(dá)式)【例3-9】GUARDEDBLOCK編程方法。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;

ENTITYflipflopISPORT(d,clk:IN STD_LOGIC; q:OUTSTD_LOGIC);ENDflipflop;

ARCHITECTUREflipflop-guardedOFflipflopISBEGIND1:BLOCK(clk='1')BEGINq<=GUAREDd;ENDBLOCKD1;ENDflipflop-guarded;

在BLOCK模塊中的語句中都有保留字GUARDED,這表明只有條件布爾表達(dá)式為真時(shí)(例中clk='1'時(shí)為真),該BLOCK語句才會(huì)啟動(dòng)執(zhí)行;而當(dāng)條件布爾表達(dá)式為假時(shí),該BLOCK語句將不執(zhí)行。上述程序的結(jié)構(gòu)體中只有一個(gè)BLOCK塊,如果電路較復(fù)雜,可以由幾個(gè)BLOCK塊組成。

3)子程序的子結(jié)構(gòu)方式采用SUBPROGRAM的子結(jié)構(gòu)方式描述電路,要先清楚子程序的用法。所謂子程序,就是能夠被主程序調(diào)用的具有某一特定功能的程序段。子程序在被調(diào)用時(shí),首先要初始化,執(zhí)行功能后,將處理的結(jié)果返回到主程序。因?yàn)樽映绦蚴且粋€(gè)非重入程序,所以它的內(nèi)部值不能保持,子程序返回后,才能被再次調(diào)用和再次初始化。VHDL語言有兩種子程序格式,即過程(PROCEDURE)和函數(shù)(FUNCTION)。下面分別介紹它們的概念。

(1)過程。VHDL語言中過程語句的一般格式為:PROCEDURE過程名(參數(shù)1;參數(shù)2;...)IS[定義語句];(變量等的定義)BEGIN[順序處理語句];(過程的語句)END過程名;在過程語句中,參數(shù)可以是輸入也可以是輸出,都列在過程名后面的括號(hào)內(nèi)。一般地,IN作為常數(shù)處理,OUT和INOUT作為變量進(jìn)行拷貝,當(dāng)過程語句在主程序調(diào)用以后,將變量OUT和INOUT拷貝到調(diào)用者的信號(hào)和變量中。在過程中,如果需要把IN和INOUT作為信號(hào)使用,則應(yīng)該用定義語句特別指明。

【例3-10】過程語句示例。USELIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;PROCEDUREvector_to_int(z:INstd_logic_vector;x_flag:OUTBOOLEAN;q:INOUTINTEGER)ISBEGINq:=0;x_flag:=false;

FORiINz'RANGELOOP

q:=q*2;IFz(i)='1'THENq:=q+1;ELSIFz(i)/=0THENx_flag:=TRUE;ENDIF;ENDLOOP;ENDvector_to_int;

該過程是將輸入位矢量z的數(shù)據(jù)類型轉(zhuǎn)換為整數(shù)。但是,如果輸入數(shù)組中包含未知量,x_flag輸出為“真”,說明不能得到正確的轉(zhuǎn)換值。因?yàn)閰?shù)q在過程中被讀取,所以將其定義為INOUT方式。過程調(diào)用時(shí),先將初始值傳遞給過程的輸入?yún)?shù),然后按順序自上而下執(zhí)行過程結(jié)構(gòu)中的語句,執(zhí)行結(jié)束后,將輸出值拷貝到調(diào)用者OUT和INOUT所定義的變量或信號(hào)中。

例3-10所描述過程的并行過程調(diào)用語句格式為:vector_to_int(z,x_flag,q);上述并行過程調(diào)用等價(jià)于下面的進(jìn)程語句:PROCESSBEGINvector_to_int(z,x_flag,q);WAITONz;ENDPROCESS;

顯然,z值的變化觸發(fā)過程執(zhí)行,最后將結(jié)果存于x_flag和q兩個(gè)變量中,結(jié)構(gòu)體中的其它語句可直接使用該結(jié)果。

(2)函數(shù)。VHDL語言中函數(shù)語句的一般格式為:

FUNCTION函數(shù)名(參數(shù)1;參數(shù)2;...)RETURN數(shù)據(jù)類型名IS[定義語句];BEGIN[順序處理語句];RETURN[返回變量名];END函數(shù)名;

在函數(shù)語句中,函數(shù)名后面括號(hào)中的參數(shù)都為輸入信號(hào),所以不用指定信號(hào)方向,函數(shù)的輸入值由函數(shù)調(diào)用者拷貝到括號(hào)里的參數(shù)中。通常各種功能的FUNCTION程序都被集中在程序包(PACKAGE)中。下面舉例說明函數(shù)的結(jié)構(gòu)以及函數(shù)的調(diào)用。

【例3-11】函數(shù)語句示例一。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;PACKAGEfun_pacISFUNCTIONmax(a:STD_LOGIC_VECTOR;b:STD_LOGIC_VECTOR)RETURNSTD_LOGIC_VECTOR;ENDfun_pac;PACKAGEBODYfun_pacISFUNCTIONmax(a:STD_LOGIC_VECTOR;b:STD_LOGIC_VECTOR)RETURNSTD_LOGIC_VECTORIS;VARIABLEtemp:STD_LOGIC(a'RANGE);BEGINIF(a>b)THENtemp:=a;ELSEtemp:=b;ENDIF;RETURNtemp;ENDmax;ENDfun_pac;

例3-11在程序包fun_pac中定義了函數(shù)max(a,b),從a和b中選擇最大值輸出。

【例3-12】函數(shù)語句示例二。LIBRARYIEEE.NEWLIB;USEIEEE.STD_LOGIC_1164.ALL;USENEWLIB.fun_pac.ALL;

ENTITYmax_detectISPORT(data:INSTD_LOGIC_VECTOR(7DOWNTO0);clk,set:INSTD_LOGIC;dataout:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDmax_detect;ARCHITECTUREapplianceOFmax_detectISSIGNALpeak:STD_LOGIC_VECTOR(7DOWNTO0);BEGINPROCESS(clk)BEGINIF(clk'EVENTANDclk='1')THENIF(set='1')THENpeak<=data;ELSEpeak<=max(data,peak);--函數(shù)調(diào)用

ENDIF;ENDIF;ENDPROCESS;dataout<=peak;ENDappliance;

過程和函數(shù)之間的區(qū)別在于:*函數(shù)有返回值,而過程無返回值。*函數(shù)中的參數(shù)僅限定為IN方式,而過程中的參數(shù)可以為IN、OUT或者INOUT方式。*函數(shù)中的參數(shù)允許的對(duì)象類型可以是變量或信號(hào),而過程的形式允許的對(duì)象類型可以是變量、信號(hào)或常量。*函數(shù)中的參數(shù)默認(rèn)的對(duì)象類型為常量,而過程的參數(shù)默認(rèn)的對(duì)象類型對(duì)IN方式為常量,而對(duì)INOUT和OUT方式為變量。*在過程中允許使用等待語句和順序信號(hào)賦值語句,而在函數(shù)中則不允許。

3.2.3配置配置(CONFIGURATION)是VHDL程序的一個(gè)基本組成部分,它用于描述層與層之間的連接關(guān)系和實(shí)體與結(jié)構(gòu)體之間的連接關(guān)系。在實(shí)體與結(jié)構(gòu)體之間的連接關(guān)系配置說明中,設(shè)計(jì)者可以利用配置語句為實(shí)體選擇不同的結(jié)構(gòu)體。配置語句的一般格式為:

CONFIGURATION配置名OF實(shí)體名IS

[說明語句];

END配置名;在VHDL程序設(shè)計(jì)中,配置的功能就是把元件安裝到設(shè)計(jì)實(shí)體中,元件和設(shè)計(jì)實(shí)體的連接有多種方式,這里只簡單舉例說明配置語句的默認(rèn)配置方式。

【例3-13】計(jì)數(shù)器的配置。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;

ENTITYcounterISPORT(load,clear,clk:INSTD_LOGIC;data_in:ININTEGER;data_out:OUTINTEGER);ENDcounter;

ARCHITECTUREcount_255OFcounterISBEGINPROCESS(clk)

VARIABLEcount:INTEGER:=0;BEGINIFclear='1'THENcount:=0;ELSIFload='1'THENcount:=data_in;ELSEIF(clk'EVENT)AND(clk='1')AND(clk'LAST_VALUE='0')THENIF(count=255)THENcount:=0;ELSEcount:=count+1;ENDIF;ENDIF;ENDIF;

data_out<=count;ENDPROCESS;ENDcount_255;

ARCHITECTUREcount_64kOFcounterISBEGINPROCESS(clk)VARIABLEcount:INTEGER:=0;BEGINIFclear='1'THENcount:=0;ELSIFload='1'THENcount:=data_in;

ELSEIF(clk'EVENT)AND(clk='1')AND(clk'LAST_VALUE='0')THENIF(count=65535)THENcount:=0;ELSEcount:=count+1;ENDIF;ENDIF;ENDIF;data_out<=count;ENDPROCESS;ENDcount_64k;CONFIGURATIONsmall_countOFcounterISFORcount_255ENDFOR;ENDsmall_count;

CONFIGURATIONbig_countOFcounterISFORcount_64kENDFOR;ENDbig_count;3.2.4庫庫(LIBRARY)用于存儲(chǔ)和放置可編譯的設(shè)計(jì)單元的集合,它存放實(shí)體說明、結(jié)構(gòu)體、配置說明、程序包標(biāo)題和程序包體,可以通過其目錄進(jìn)行查詢和調(diào)用。庫方便了設(shè)計(jì)者共享已經(jīng)編譯成功的設(shè)計(jì)成果。在VHDL程序中,庫的描述語句總是放在設(shè)計(jì)實(shí)體的最前面,其一般格式為:

LIBRARY庫名;在VHDL語言中,可以存在多個(gè)不同的庫,但是庫與庫之間是獨(dú)立的,不能互相嵌套。當(dāng)前在VHDL中使用的庫的種類有:STD庫、IEEE庫、ASIC矢量庫、WORK庫和用戶定義庫。

*STD庫是VHDL的標(biāo)準(zhǔn)庫,是為所有設(shè)計(jì)單元所共享、默認(rèn)的庫,其中包含有STANDARD和TEXTIO兩個(gè)程序包,使用STANDARD時(shí)不需按標(biāo)準(zhǔn)格式說明,但使用TEXTIO時(shí),要先說明庫和程序包名,然后才可使用其中的數(shù)據(jù)。*IEEE庫為被IEEE正式認(rèn)可的標(biāo)準(zhǔn)化庫,例如IEEE庫中的“STD_LOGIC_1164”程序包?,F(xiàn)在有些公司,如Synopspsys公司提供的程序包“STD_LOGIC_ARITH”、“STD_LOGIC_UNSIGNED”也被匯集在IEEE庫中。

*ASIC矢量庫為各個(gè)EDA廠商和公司提供的面向IC設(shè)計(jì)的特色工具庫和元件庫,在該庫中存放著與邏輯門一一對(duì)應(yīng)的實(shí)體,例如Altera公司提供的LMP庫。為了使用面向ASIC的庫,對(duì)庫進(jìn)行說明是非常必要的。*WORK庫為VHDL語言的現(xiàn)行工作庫,用于保存當(dāng)前的設(shè)計(jì)單元,是用戶的臨時(shí)倉庫,用戶的設(shè)計(jì)成品、半成品、設(shè)計(jì)模塊和元件都放在其中。在使用該庫時(shí)無需進(jìn)行任何說明。*用戶定義庫為設(shè)計(jì)者自己所開發(fā)的設(shè)計(jì)單元的集合庫。在使用該庫時(shí)需要說庫名。

在使用庫時(shí),除了STD和WORK庫,其它庫都需要進(jìn)行說明,同時(shí)還要說明庫中的程序包名和項(xiàng)目名,其一般格式為:

LIBRARY庫名;

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

其中第一條語句表明使用什么庫,第二條語句說明設(shè)計(jì)者要使用的是庫中哪一個(gè)程序包以及程序包中的項(xiàng)目,如過程名、函數(shù)名等。

【例3-14】

庫描述語句示例。

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;上例表明,在該VHDL語言程序中要使用IEEE庫中STD_LOGIC_1164程序包的所有項(xiàng)目。這里,項(xiàng)目名為ALL,表示使用程序包中的所有項(xiàng)目。庫說明語句的作用范圍是從一個(gè)實(shí)體說明開始到它所屬的結(jié)構(gòu)體和配置結(jié)束為止。當(dāng)一段VHDL程序中出現(xiàn)多個(gè)實(shí)體時(shí),使用的庫說明語句應(yīng)在每個(gè)實(shí)體說明前重復(fù)書寫。

3.2.5程序包程序包(PACKAGE)用來單純地羅列VHDL語言中所要用到的信號(hào)定義、常數(shù)定義、數(shù)據(jù)類型、元件語句、函數(shù)定義和過程定義等。它是可編譯、可調(diào)用的設(shè)計(jì)單元,也是庫結(jié)構(gòu)中的一個(gè)層次。程序包由兩部分構(gòu)成:程序包標(biāo)題(PACKAGEHEADER)和程序包體(PACKAGEBODY)。程序包標(biāo)題為程序包定義的接口,聲明其中的信號(hào)、常數(shù)、數(shù)據(jù)類型、元件、子程序等,聲明方式與實(shí)體說明中的端口定義類似。程序包體規(guī)定程序的實(shí)際功能以及存放說明中的子程序,其聲明方式與結(jié)構(gòu)體中語句方法相同。簡單地講,程序包標(biāo)題列出了所有項(xiàng)的名稱,而程序包體則給出了各項(xiàng)的細(xì)節(jié)。程序包體是一個(gè)可選項(xiàng),也就是說,程序包可以只由程序包標(biāo)題構(gòu)成,原因是程序包標(biāo)題中也允許使用數(shù)據(jù)賦值和有實(shí)質(zhì)性的操作語句。程序包的一般格式為:

PACKAGE程序包名IS[說明語句];END程序包名;PACKAGEBODY程序包名IS[說明語句];END程序包名;在前面的例3-11中已經(jīng)給出了程序包的結(jié)構(gòu)說明,其程序包名為fun_pac,包含了程序包標(biāo)題和程序包體兩個(gè)完整的部分。在程序包標(biāo)題中,定義了數(shù)據(jù)類型和函數(shù)的調(diào)用說明,而在程序包體中才具體地描述了實(shí)現(xiàn)該函數(shù)功能的語句和數(shù)據(jù)的賦值。這種分開描述的好處在于,當(dāng)函數(shù)的功能需要做某些調(diào)整或需要更改某些數(shù)據(jù)的賦值時(shí),只要改變程序包體的相關(guān)語句就可以了,而不需要改變程序包標(biāo)題的說明,減少了需重新編譯的單元數(shù)目。

3.3VHDL的描述方法

3.3.1標(biāo)識(shí)符標(biāo)識(shí)符(IDENTIFIERS)規(guī)則是VHDL語言中符號(hào)書寫的一般規(guī)則,用以表示VHDL語句中的變量、塊、進(jìn)程等對(duì)象和保留字?;镜腣HDL程序就是由標(biāo)識(shí)符和分界符構(gòu)成的。

IEEEStandard1076-1987標(biāo)準(zhǔn)中有關(guān)標(biāo)識(shí)符的語法規(guī)范已經(jīng)被IEEEStandard1076-1993標(biāo)準(zhǔn)全部接受并加以擴(kuò)展。為了對(duì)二者加以區(qū)別,前者稱為短標(biāo)識(shí)符,后者則稱為擴(kuò)展標(biāo)識(shí)符。下面分別介紹擴(kuò)展前后的標(biāo)識(shí)符命名規(guī)則。

VHDL語言的短標(biāo)識(shí)符遵循以下命名規(guī)則:*短標(biāo)識(shí)符必須以英文字母開頭;如:adder4為合法命名,而4ladder為不合法命名。*短標(biāo)識(shí)符由26個(gè)字母(A~Z,a~z)、數(shù)字(0~9)和下劃線“_”字符組成;如:counter_adder、FIRST_2000為合法命名,而counter&adder為不合法命名。*下劃線“_”的前后都必須有英文字母或者數(shù)字;如:adder4_1為合法命名,而adder4_、_first均為不合法命名。

*短標(biāo)識(shí)符不區(qū)分大小寫;如:EDA、Eda、eda均為相同的命名。VHDL語言的擴(kuò)展標(biāo)識(shí)符遵循以下命名規(guī)則:*擴(kuò)展標(biāo)識(shí)符用反斜杠來分隔;如:\adde\,\begin-add\等。*擴(kuò)展標(biāo)識(shí)符允許包含圖形符號(hào)及空格等;如:\counter&adder\,\entity%end\等。*擴(kuò)展標(biāo)識(shí)符的兩個(gè)反斜杠之間可以用保留字;如:\entity\,\architecture\等。*擴(kuò)展標(biāo)識(shí)符的兩個(gè)反斜杠之間可以用數(shù)字開頭;如:\ladder\,\44counter\等。

*擴(kuò)展標(biāo)識(shí)符中允許多個(gè)下劃線相連;如:\adder.es__counter\等。*同名的擴(kuò)展標(biāo)識(shí)符和短標(biāo)識(shí)符不表示同一名稱;如:\adder\和adder不相同。*擴(kuò)展標(biāo)識(shí)符區(qū)分大小寫字母;如:\EDA\和\eda\不相同。*擴(kuò)展標(biāo)識(shí)符中如果含有一個(gè)反斜杠,可以兩個(gè)反斜杠來代替;如:\adder\\counter\表示的擴(kuò)展標(biāo)識(shí)符名稱為adder\countera。

3.3.2詞法單元

1.注釋

VHDL中的注釋是用“--”開頭,直到本行末尾的一段文字,其內(nèi)容可包含所有特殊字符。注釋既可以跟在一行詞法單元之后,又可以是該行惟一的詞法單元。如果注釋中的內(nèi)容較多,可以采用分行注釋的方法,且每行注釋均以"--"開頭。注釋的內(nèi)容不是VHDL設(shè)計(jì)描述的一部分,其目的僅是為了提高程序的可讀性,所以在程序編譯之后,注釋部分將不作為程序的一部分放入數(shù)據(jù)庫中。

【例3-15】注釋語句示例。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL; --庫描述語句

ENTITYnand2IS --實(shí)體說明

PORT(a,b:INSTD_LOGIC; --端口

y:OUTSTD_LOGIC); --說明ENDnand2;

ARCHITECTUREand2_1OFnand2IS --結(jié)構(gòu)體BEGINy<=anandb;ENDnand2_1;

2.語句

除了某些特定的框架結(jié)構(gòu)以外,VHDL中的語句均以“;”作為結(jié)束符。如在上例中,“ENTITYnand2IS”和“ARCHITECTUREand2_1OFnand2IS”均屬于特定的框架結(jié)構(gòu),不以“;”結(jié)尾,而“PORT(a,b:INSTD_LOGIC;”、“y<=anandb;”等語句應(yīng)用“;”結(jié)尾。

3.?dāng)?shù)字在VHDL語言中,數(shù)字用于表示一個(gè)數(shù),是標(biāo)量。數(shù)字包括實(shí)數(shù)和整數(shù),實(shí)數(shù)含小數(shù)點(diǎn),整數(shù)不含小數(shù)點(diǎn)。依據(jù)進(jìn)制的不同,數(shù)字可分為十進(jìn)制數(shù)字和基數(shù)字兩類。十進(jìn)制數(shù)的定義格式為:整數(shù)[.整數(shù)][指數(shù)]其中整數(shù)可表示為"數(shù)字_數(shù)字",指數(shù)可表示為"E+(或-)整數(shù)",但只有十進(jìn)制的實(shí)數(shù)才允許指數(shù)為負(fù)值。在相鄰的數(shù)字之間插入下劃線,對(duì)數(shù)值并無影響,而且允許在數(shù)字之前冠以若干個(gè)零,但是不允許在數(shù)字中存在空格或其它字符。

【例3-16】十進(jìn)制數(shù)示例。108 合法,表示十進(jìn)制數(shù)108000108合法,表示十進(jìn)制數(shù)1081_08合法,表示十進(jìn)制數(shù)1081.0_8合法,表示十進(jìn)制數(shù)1.081.08E2合法,表示十進(jìn)制數(shù)1081.08e-2合法,表示十進(jìn)制數(shù)0.0108108不合法,數(shù)字中間不能有空格1,08不合法,數(shù)字中間不能有其它字符1.08E2不合法,E前不能有空格.108不合法,未用數(shù)字開頭

以基表示的數(shù),其定義格式如下:基#基于基的整數(shù)[.基于基的整數(shù)]#指數(shù)基是一個(gè)整數(shù),其最小值是2,最大值是16。基于基的整數(shù)可表示為“擴(kuò)展數(shù)字_擴(kuò)展數(shù)字”,其中擴(kuò)展數(shù)字為數(shù)字(或字母,如十六進(jìn)制中的A、B、C、D、E、F,且大小寫字母所表達(dá)的意義相同),插入下劃線不會(huì)影響其數(shù)值大小。

【例3-17】基數(shù)字示例。2#111111_11#等效于(2#11111111#),表示十進(jìn)制數(shù)2558#00377#等效于(8#377#),表示十進(jìn)制數(shù)255016#0Ff#等效于(16#FF#),表示十進(jìn)制數(shù)25516#8F#E1表示十進(jìn)制數(shù)2288,即143×162#1.1111_01#e8表示十進(jìn)制數(shù)50016#0.E#E0表示十進(jìn)制數(shù)0.875

4.字符

VHDL語言中的字符是僅包含一個(gè)字符的詞法單元,其定義格式為:

‘ASCII字符'例如:‘A’,‘*’,‘!’,‘)’等。

5.字符串

VHDL中的字符串是包含若干個(gè)字符的詞法單元,,其定義格式為:“ASCII字符序列”【例3-18】字符串示例。"Thisisastring"長度為16的字符串,包含3個(gè)空格""長度為0的字符串,不包含任何內(nèi)容"A"長度為1的字符串,與字符'A'不同"""長度為1的字符串,為一個(gè)雙引號(hào)"!,%,&"長度為6的字符串,包含特殊字符!、%和&

6.位串

VHDL語言中的位串用于表示位矢量,它由進(jìn)制標(biāo)志符和數(shù)字字符串組成,其定義格式為:基數(shù)說明符"數(shù)字字符串"其中的基數(shù)說明符包括B、O和X,B表示二進(jìn)制數(shù),O表示八進(jìn)制數(shù),X表示十六進(jìn)制數(shù)。數(shù)字字符串可表示為"擴(kuò)展數(shù)字_擴(kuò)展數(shù)字",下劃線僅是為了提高可讀性,它不會(huì)影響位串的值和位串的長度。位串的長度是該位串中擴(kuò)展數(shù)字序列的等價(jià)位數(shù)。表3.1對(duì)位串文字進(jìn)行了說明和示例。

表3.1位串說明

3.3.3數(shù)據(jù)對(duì)象在VHDL語言中,數(shù)據(jù)對(duì)象(DATAOBJECT)是可以賦予一個(gè)值的客體,它主要有三種類型:常量(CONSTANT)、變量(VARIABLE)和信號(hào)(SIGNAL)。*常量。全局量,在實(shí)體說明、結(jié)構(gòu)體描述、程序包標(biāo)題、進(jìn)程說明、過程說明和函數(shù)調(diào)用說明中使用。*變量。局部量,在進(jìn)程說明、過程說明和函數(shù)調(diào)用說明中使用。*信號(hào)。全局量,在實(shí)體說明、結(jié)構(gòu)體描述和程序包標(biāo)題中使用。

1.常量常量是系統(tǒng)設(shè)計(jì)中對(duì)某一常量名賦予的固定值,相當(dāng)于硬件電路中的恒定電平。常量說明就是將一個(gè)固定值賦予某一個(gè)常量名,它通常被放置在程序的開始,數(shù)據(jù)類型也同時(shí)在說明語句中指明。常量說明語句的一般格式為:

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

【例3-19】常量說明語句示例。設(shè)計(jì)實(shí)體的供電電壓:CONSTANTVcc:REAL:=5.0;

某一單元的延時(shí)時(shí)間:CONSTANTDELAY:TIME:=50ns;常量只在它被說明時(shí)賦值,在整個(gè)器件工作期間其值不變化,對(duì)常量的多次賦值是錯(cuò)誤的。如果要改變常量值,必須要改變?cè)O(shè)計(jì)常量說明,然后重新編譯。需要注意的是,定義在程序包中的常量可由所在的任何實(shí)體和結(jié)構(gòu)體調(diào)用,定義在實(shí)體內(nèi)的常量僅在實(shí)體內(nèi)使用,定義在進(jìn)程內(nèi)的常量僅在進(jìn)程內(nèi)使用。常量所賦予的值應(yīng)該與定義的數(shù)據(jù)類型相一致。

2.變量變量是局部量,它相當(dāng)于電路連接線上的信號(hào)值,只能夠在進(jìn)程語句、函數(shù)語句和過程語句結(jié)構(gòu)中使用。變量說明語句的一般格式為:

VARIABLE變量名:數(shù)據(jù)類型

約束條件:=表達(dá)式;

【例3-20】變量說明語句示例。VARIABLEm,n:INTEGER;VARIABLEnum:INTEGERRANGE0TO127:=20;變量num為整數(shù)類型,RANGE0TO127是對(duì)類型INTEGER的附加限制,該語句一旦執(zhí)行,立即將初始值20賦予變量num。變量賦值語句的一般格式為:

[變量名]:=[表達(dá)式];其中,變量賦值符號(hào)為":="。對(duì)變量的賦值是立即生效的,沒有賦值延時(shí),而且在賦值時(shí)也不能附加延時(shí)。變量在硬件電路中沒有直接的對(duì)應(yīng)物,它只是臨時(shí)存貯,表示需要立即改變的行為,最后還是要將變量賦給信號(hào),而且變量不能作為進(jìn)程的敏感信號(hào)。

3.信號(hào)信號(hào)是一個(gè)全局量,可用于進(jìn)程之間的通信。信號(hào)與硬件電路中的“連線”相對(duì)應(yīng),是電路內(nèi)部硬件相互連接的抽象,它除了沒有數(shù)據(jù)流動(dòng)方向說明以外,其它性質(zhì)幾乎與前面所述的“端口”概念完全一致。信號(hào)通常在結(jié)構(gòu)體、程序包和實(shí)體中說明。信號(hào)說明語句的一般格式為:

SIGNAL信號(hào)名:數(shù)據(jù)類型

約束條件:=表達(dá)式;

【例3-21】信號(hào)說明語句示例一。

SINGNALgnd:BIT:='0';其中,符號(hào)“:=”表示對(duì)信號(hào)的直接賦值,可以用來指定信號(hào)的初始值,不產(chǎn)生延時(shí)。信號(hào)賦值語句的一般格式為:

[信號(hào)名]<=[表達(dá)式][AFTER[時(shí)間表達(dá)式]];其中,“<=”表示信號(hào)的代入賦值,是信號(hào)之間的傳遞,時(shí)間表達(dá)式用于指定延遲時(shí)間,如果省略AFTER語句,則延遲時(shí)間取默認(rèn)值。

【例3-22】信號(hào)說明語句示例二。

D1<=D2AFTER15ns;表明信號(hào)D2的值延時(shí)15ns后傳遞給D1。

4.信號(hào)和變量的區(qū)別變量與信號(hào)是不同的,表3.2給出了二者之間的差異。

表3.2信號(hào)和變量的區(qū)別

信號(hào)與變量在結(jié)構(gòu)體的位置說明如下:ARCHITECTURE結(jié)構(gòu)體名OF實(shí)體名IS[信號(hào)說明]--在進(jìn)程外部對(duì)信號(hào)說明,該信號(hào)對(duì)所有的進(jìn)程都是可見的。BEGIN進(jìn)程標(biāo)號(hào)1:PROCESS

變量說明]--在進(jìn)程內(nèi)部對(duì)變量說明,該變量只在該進(jìn)程內(nèi)部是可見的。

ENDPROCESS進(jìn)程標(biāo)號(hào)1;進(jìn)程標(biāo)號(hào)2:PROCESS[變量說明]ENDPROCESS進(jìn)程標(biāo)號(hào)2;END結(jié)構(gòu)體名;……

在變量賦值語句中,該語句一旦被執(zhí)行,其值立即被賦予變量,在執(zhí)行下一條語句時(shí),該變量的值就為上一句新賦的值。而信號(hào)的代入賦值語句即使被執(zhí)行也不會(huì)使信號(hào)值立即發(fā)生變化,在下一條語句執(zhí)行時(shí),該信號(hào)仍舊使用原來的信號(hào)值。直到進(jìn)程結(jié)束之后,所有信號(hào)代入語句的代入才按順序處理。所以說,信號(hào)的實(shí)際代入過程和代入語句的執(zhí)行是分開進(jìn)行的。下面給出了一個(gè)例子。

【例3-23】變量和信號(hào)的賦值。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;

ENTITYvaluationISPORT(signal_out:OUTBIT_VECTOR(7DOWNTO0));ENDvaluation;

ARCHITECTUREbehavioralOFvaluationSIGNALs1,s2:BIT;

BEGIN

PROCESS(s1,s2)

VARIABLEv1,v2:BIT;

BEGINv1:='1';v2:='1';s1<='1';s2<='1';signal_out(0)<=v1;signal_out(1)<=v2;signal_out(2)<=s1;signal_out(3)<=s2;v1:='0';v2:='0';

s2<='0';

signal_out(4)<=v1;signal_out(5)<=v2;signal_out(6)<=s1;signal_out(7)<=s2;ENDPROCESS;ENDbehavioral;

在上例中,語句"s2<='1';"對(duì)執(zhí)行結(jié)果沒有影響,原因是該進(jìn)程中后面的語句"s2<='0'"取代了前面對(duì)s2的賦值。上例最終執(zhí)行結(jié)果為:

signal_out(0)=1signal_out(1)=1signal_out(2)=1signal_out(3)=0signal_out(4)=0signal_out(5)=0signal_out(6)=1signal_out(7)=0

5.信號(hào)的屬性函數(shù)信號(hào)的屬性函數(shù)用來得到信號(hào)的行為信息和功能信息,它可以獲知一個(gè)信號(hào)值是否發(fā)生了變化,信號(hào)從最后一次變化到現(xiàn)在經(jīng)歷的時(shí)間以及信號(hào)變化之前的值等等。定義屬性的一般格式為:項(xiàng)目名'屬性表示符;信號(hào)的屬性函數(shù)有以下幾種:*signal'DELAYED[(time)]:延時(shí)函數(shù),由延時(shí)表達(dá)式time所約束,信號(hào)signal在time表達(dá)式成立時(shí)得到。

*signal'STABLE[(time)]:如果信號(hào)signal在時(shí)間表達(dá)式time所確定時(shí)間內(nèi)保持穩(wěn)定,沒有事件發(fā)生,函數(shù)返回布爾型變量“真”(TURE),否則返回“假”(FALSE)。*signal'QUIET[(time)]:如果信號(hào)signal無事項(xiàng)需要處理或者在time表達(dá)式所指定的時(shí)間內(nèi)沒有事項(xiàng)處理時(shí),則返回“真”(TURE),否則返回“假”(FALSE)。*signal'TRANSACTION:建立一個(gè)BIT類型的信號(hào),當(dāng)信號(hào)signal每發(fā)生一次變化時(shí),該BIT信號(hào)翻轉(zhuǎn)一次。*signal'EVENT:如果在當(dāng)前模擬周期內(nèi),該信號(hào)發(fā)生某個(gè)事件(信號(hào)值發(fā)生了變化),函數(shù)返回布爾型變量“真”(TURE),否則返回“假”(FALSE)。

*signal'ACTIVE:在當(dāng)前模擬周期內(nèi),如果信號(hào)發(fā)生了變化,事件作了處理,則返回“真”(TURE),否則返回"假"(FALSE)。*signal'LAST_EVENT:返回信號(hào)最后一次改變到現(xiàn)在時(shí)刻所經(jīng)歷的時(shí)間。*signal'LAST_VALUE:返回信號(hào)最后一次變化前的值。*signal‘LAST_ACTIVE:返回信號(hào)前一次改變到現(xiàn)在所經(jīng)過的時(shí)間。

【例3-24】信號(hào)屬性函數(shù)的應(yīng)用。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;

ENTITYDffISPORT(d,clk:IN STD_LOGIC; q:OUTSTD_LOGIC);ENDDff;

ARCHITECTUREstructualOFDffISBEGINPROCESS(clk)BEGINIF(clk'EVENTANDclk'='1'ANDclk'LAST_VALUE='0')THENq<=d;ENDIF;ENDPROCESS;ENDstructual;在上例中,D觸發(fā)器在clk發(fā)生變化且值為"1",即時(shí)鐘脈沖上升沿到來時(shí),D觸發(fā)器把d輸入端的數(shù)據(jù)送到輸出端q,其中為了保證不出現(xiàn)clk從"X"變到"1"的錯(cuò)誤,還使用了clk'LAST_VALUE='0',確保了clk從"0"變到"1"時(shí),D觸發(fā)器的正常工作。

3.3.4數(shù)據(jù)類型

1.標(biāo)準(zhǔn)數(shù)據(jù)類型在VHDL語言中,定義了10種標(biāo)準(zhǔn)的數(shù)據(jù)類型:*布爾量(BOOLEAN)。取值為邏輯“真”(TRUE)或“假”(FALSE),無數(shù)值含義,不能進(jìn)行算術(shù)運(yùn)算,只能進(jìn)行邏輯運(yùn)算,初始值一般為FALSE。*字符(CHARACTER):ASICII字符,區(qū)分大小寫字母,在編程時(shí)要用單引號(hào)括起來。*字符串(STRING):由雙引號(hào)括起來的字符序列,也稱字符矢量或字符串?dāng)?shù)組,常用于程序的提示和結(jié)果的說明。

*整數(shù)(INTEGER):取值范圍[-(231-1),(231-1)],只能用于算術(shù)運(yùn)算,不能進(jìn)行邏輯運(yùn)算。*實(shí)數(shù)(REAL):取值范圍為-1.0E+38到+1.0E+38)。有些數(shù)既可以用整數(shù)來表示,也可以用實(shí)數(shù)來表示,例如數(shù)字1的整數(shù)表示為1而實(shí)數(shù)表示為1.0,雖然這兩個(gè)數(shù)的值一樣,當(dāng)其數(shù)據(jù)類型是不同的。*位(BIT)。取值為邏輯“0”和“1”,在程序中用'1'或'0'表示(將值放在單引號(hào)中)。位數(shù)據(jù)可以用來描述數(shù)字系統(tǒng)中總線的值,它不同于布爾數(shù)據(jù),但也可以用轉(zhuǎn)換函數(shù)進(jìn)行轉(zhuǎn)換。*位矢量(BIT_VECTOR)。由邏輯“0”和“1”組成的矢量串,是在程序中用雙引號(hào)括起來的一組數(shù)據(jù)矢量信號(hào)的值,例如:“0011011”。

*時(shí)間(TIME)。物理數(shù)據(jù),包含整數(shù)和單位兩部分,且整數(shù)和單位之間至少應(yīng)留一個(gè)空格的位置,其單位有fs,ps,ns,μs,ms,sec,min和hr。時(shí)間數(shù)據(jù)常用于仿真,用于表示信號(hào)延時(shí),使模型系統(tǒng)能夠更逼近實(shí)際系統(tǒng)的運(yùn)行環(huán)境。*錯(cuò)誤等級(jí)(SEVRITYLEVEL):用于表征電子系統(tǒng)的工作狀態(tài),在仿真時(shí)給設(shè)計(jì)者提供電子系統(tǒng)的工作情況,分為注意(NOTE),警告(WARNING),錯(cuò)誤(ERROR),失敗(FAILURE)四種狀態(tài)。*自然數(shù)(NATURAL)和正整數(shù)(POSITIVE)。整數(shù)的子集,正整數(shù)是指所有大于0的整數(shù),而自然數(shù)則包括0和所有正整數(shù)。

在VHDL語言中,由于BIT類型數(shù)據(jù)只能取值邏輯量"0"或"1",而在實(shí)際的電路設(shè)計(jì)和仿真中,還存在不定狀態(tài)'X',高阻狀態(tài)'Z'等其他狀態(tài),所以IEEE在1993年制定出了新的標(biāo)準(zhǔn)(IEEESTD1164),定義了"STD_LOGIC"型數(shù)據(jù)的9種不同值:'U'--初始值;'X'--不定值;'0'--0;'1'--1;'Z'--高阻;'W'--弱信號(hào)不定;'L'--弱信號(hào)0;'H'--弱信號(hào)1;'-'--不可能情況。

“STD_LOGIC”和“STD_LOGIC_VECTOR”是IEEE的標(biāo)準(zhǔn)化數(shù)據(jù)類型,是VHDL語法以外添加的數(shù)據(jù)類型,因此將它歸屬到用戶自定義的數(shù)據(jù)類型中,當(dāng)要使用這兩個(gè)數(shù)據(jù)類型時(shí),在程序中必須寫出庫說明語句和使用程序包標(biāo)題語句。

2.用戶定義的數(shù)據(jù)類型

VHDL語言允許用戶自己定義數(shù)據(jù)類型,這給電子系統(tǒng)的設(shè)計(jì)者帶來了很大的方便。用戶可以自行定義的數(shù)據(jù)類型有:*枚舉類型(ENUMERATED);*整數(shù)類型(INTEGER);*實(shí)數(shù)、浮點(diǎn)數(shù)類型(REALFLOATING);*數(shù)組類型(ARRAY);*存取類型(ACCESS)

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論