VHDL硬件描述語言_第1頁
VHDL硬件描述語言_第2頁
VHDL硬件描述語言_第3頁
VHDL硬件描述語言_第4頁
VHDL硬件描述語言_第5頁
已閱讀5頁,還剩122頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第2章VHDL硬件描述語言2.1VHDL概述2.2VHDL程序根本結構2.3VHDL語言要素2.4VHDL順序語句2.5VHDL并行語句本章小結1/6/20241/6/202412.1VHDL概述2.1.1常用硬件描述語言簡介常用硬件描述語言有VHDL、Verilog和ABEL語言。VHDL起源于美國國防部的VHSIC,Verilog起源于集成電路的設計,ABEL那么來源于可編程邏輯器件的設計。下面從使用方面將3者進行比照。(1)邏輯描述層次:一般的硬件描述語言可以在三個層次上進行電路描述,其層次由高到低依次可分為行為級、RTL級和門電路級。VHDL語言是一種高級描述語言,適用于行為級和RTL級的描述,最適于描述電路的行為;Verilog語言和ABEL語言是一種較低級的描述語言,適用于RTL級和門電路級的描述,最適于描述門級電路。1/6/20241/6/20242(2)設計要求:VHDL進行電子系統設計時可以不了解電路的結構細節,設計者所做的工作較少;Verilog和ABEL語言進行電子系統設計時需了解電路的結構細節,設計者需做大量的工作。(3)綜合過程:任何一種語言源程序,最終都要轉換成門電路級才能被布線器或適配器所接受。因此,VHDL語言源程序的綜合通常要經過行為級→RTL級→門電路級的轉化,VHDL幾乎不能直接控制門電路的生成。而Verilog語言和ABEL語言源程序的綜合過程要稍簡單,即經過RTL級→門電路級的轉化,易于控制電路資源。1/6/20241/6/20243(4)對綜合器的要求:VHDL描述語言層次較高,不易控制底層電路,因而對綜合器的性能要求較高,Verilog和ABEL對綜合器的性能要求較低。(5)支持的EDA工具:支持VHDL和Verilog的EDA工具很多,但支持ABEL的綜合器僅Dataio一家。(6)國際化程度:VHDL和Verilog已成為IEEE標準,而ABEL正朝國際化標準努力。1/6/20241/6/202442.1.2VHDL及其優點VHDL誕生于1982年,1987年底被IEEE和美國國防部確認為標準硬件描述語言。自IEEE公布了VHDL的標準版本(IEEE-1076)之后,各EDA公司相繼推出了自己的VHDL設計環境,或宣布自己的設計工具可以和VHDL接口。此后VHDL在電子設計領域得到了廣泛的接受,并逐步取代了原有的非標準硬件描述語言。1993年,IEEE對VHDL進行了修訂,從更高的抽象層次和系統描述能力上擴展VHDL的內容,公布了新版本的VHDL,即IEEE標準的1076-1993版本。現在,VHDL和Verilog作為IEEE的工業標準硬件描述語言,又得到眾多EDA公司的支持,在電子工程領域,已成為事實上的通用硬件描述語言。有專家認為,在新的世紀中,VHDL與Verilog語言將承擔起幾乎全部的數字系統設計任務。1/6/20241/6/20245VHDL主要用于描述數字系統的結構、行為、功能和接口。除了含有許多具有硬件特征的語句外,VHDL的語言形式和描述風格與句法十分類似于一般的計算機高級語言。VHDL的程序結構特點是將一項工程設計,或稱設計實體(可以是一個元件、一個電路模塊或一個系統)分成外部(或稱可視局部,即端口)和內部(或稱不可視局部),即設計實體的內部功能和算法完成局部。在對一個設計實體定義了外部界面后,一旦其內部開發完成后,其他的設計就可以直接調用這個實體。這種將設計實體分成內外局部的概念是VHDL系統設計的根本點。應用VHDL進行工程設計的優點是多方面的,具體如下:1/6/20241/6/20246(1)與其他的硬件描述語言相比,VHDL具有更強的行為描述能力。強大的行為描述能力是避開具體的器件結構,從邏輯行為上描述和設計大規模電子系統的重要保證。(2)VHDL具有豐富的仿真語句和庫函數,使得在任何大系統的設計早期,就能查驗設計系統的功能可行性,隨時可對系統進行仿真模擬,對整個工程的結構和功能可行性做出判斷。(3)VHDL語句的行為描述能力和程序結構,決定了它具有支持大規模設計的分解和已有設計的再利用功能。VHDL中設計實體的概念、程序包的概念、設計庫的概念為設計的分解和并行工作提供了有利的支持。1/6/20241/6/20247(4)用VHDL完成一個確定的設計,可以利用EDA工具進行邏輯綜合和優化,并自動把VHDL描述設計轉變成門級網表。(5)VHDL對設計的描述具有相對獨立性。設計者可以不懂硬件的結構,也不必管最終設計的目標器件是什么,而進行獨立的設計。(6)由于VHDL具有類屬描述語句和子程序調用等功能,對于完成的設計,在不改變源程序的條件下,只需改變類屬參量或函數,就能輕易地改變設計的規模和結構。

1/6/20241/6/202482.1.3VHDL程序設計約定便于程序的閱讀和調試,本書對VHDL程序設計特作如下約定:(1)語句結構描述中方括號“[]”內的內容為可選內容。(2)對于VHDL的編譯器和綜合器來說,程序文字的大小寫是不加區分的。本書一般使用大寫。(3)程序中的注釋使用雙橫線“--”。在VHDL程序的任何一行中,雙橫線“--”后的文字都不參加編譯和綜合。(4)為了便于程序的閱讀與調試,書寫和輸入程序時,使用層次縮進格式,同一層次的對齊,低層次的較高層次的縮進兩個字符。1/6/20241/6/202492.1.4VHDL程序設計舉例

1.2選1多路選擇器的VHDL程序

ENTITYmux21aISPORT(a,b:INBIT;s:INBIT;y:OUTBIT);ENDENTITYmux2la;ARCHITECTUREoneOFmux21aISBEGINy<=aWHENs='0'

ELSEb;ENDARCHITECTUREone;

以上是2選1多路選擇器的VHDL程序完整描述。圖2.1是此描述對應的邏輯圖,圖中,a和b分別為兩個數據輸入端的端口名,s為通道選擇控制信號輸入端的端口名,y為輸出端的端口名。“mux21a”是設計者為此器件取的名稱。圖2.2是對以上程序綜合后獲得的門級電路,可以認為是多路選擇器mux21a的內部電路結構。圖2.1mux21a實體

圖2.2mux21a結構體

1/6/20241/6/2024102.說明及分析可見,此電路的VHDL描述由兩大局部組成:(1)以關鍵詞ENTITY引導,ENDENTITYmux2la結尾的語句局部,稱為實體。VHDL的實體描述了電路器件的外部情況及各信號端口的根本性質。圖2.1可以認為是實體的圖形表達。(2)以關鍵詞ARCHITECTURE引導,ENDARCHITECTUREone結尾的語句局部,稱為結構體。結構體負責描述電路器件的內部邏輯功能或電路結構。圖2.2是此結構體的原理圖表達。在VHDL結構體中用于描述邏輯功能和電路結構的語句分為順序語句和并行語句。順序語句的執行方式是按照語句的前后排列逐條順序執行的,而并行語句都是同時執行的,與語句的前后次序無關。1/6/20241/6/202411程序中的邏輯描述是用WHEN_ELSE結構的并行語句表達的。它的含義是,當滿足條件s='0',即s為低電平時,a輸入端的信號傳送至y,否那么(即s為高電平時)b輸入端的信號傳送至y。2選1多路選擇器的電路功能可以從圖2.3的時序波形中看出,分別向a和b端輸入兩個不同頻率的信號fa和fb(設fa>fb),當s為高電平時,y輸出fb,而當s為低電平時,y輸出fa。顯然,圖2.3的波形證實了VHDL邏輯設計的正確性。圖2.3mux21a功能時序波形圖

1/6/20241/6/202412圖2.4VHDL程序設計根本結構2.2VHDL程序根本結構一個相對完整的VHDL程序(或稱為設計實體)具有如圖2.4所示的比較固定的結構。通常包含實體(Entity)、結構體(Architecture)、配置(Configuration)、程序包(Package)和庫(Library)5個局部。1/6/20241/6/202413其中,庫、程序包使用說明用于翻開(調用)本設計實體將要用到的庫、程序包,程序包存放各個設計模塊共享的數據類型、常數和子程序等;庫是專門存放預編譯程序包的地方。實體用于描述所設計的系統的外部接口信號,是可視局部;結構體用于描述系統內部的結構和行為,建立輸入和輸出之間的關系,是不可視局部。在一個實體中,可以含有一個或一個以上的結構體,而在每一個結構體中又可以含有一個或多個進程以及其他的語句。根據需要,實體還可以有配置說明語句。配置說明語句主要用于以層次化的方式對特定的設計實體進行元件例化,或是為實體選定某個特定的結構體。如何才算一個完整的VHDL程序(設計實體),并沒有完全一致的結論,因為不同的程序設計目的可以有不同的程序結構。通常認為,一個完整的設計實體的最低要求應該能為VHDL綜合器所接受,并能作為一個獨立設計單元,即以元件的形式存在的VHDL程序。1/6/20241/6/202414

2.2.1實體實體(ENTITY)是一個設計實體的表層設計單元,其功能是對這個設計實體與外部電路進行接口描述。它規定了設計單元的輸入輸出接口信號或引腳,是設計實體經封裝后對外的一個通信界面。

1.實體語句結構實體說明單元的常用語句結構如下:ENTITY實體名IS[GENERIC(類屬表);][PORT(端口表);]ENDENTITY實體名;1/6/20241/6/202415實體說明單元必須以語句“ENTITY實體名IS”開始,以語句“ENDENTITY實體名;”結束,其中的實體名是設計者自己給設計實體的命名,可作為其他設計實體對該設計實體進行調用時用。中間在方括號內的語句描述,在特定的情況下并非是必須的。例如構建一個VHDL仿真測試基準等情況中可以省去方括號中的語句。1/6/20241/6/2024162.類屬(GENERIC)說明語句類屬(GENERIC)參量是一種端口界面常數,常以一種說明的形式放在實體或塊結構體前的說明局部。類屬為所說明的環境提供了一種靜態信息通道,類屬的值可以由設計實體外部提供。因此,設計者可以從外面通過類屬參量的重新設定而容易地改變一個設計實體或一個元件的內部電路結構和規模。類屬說明的一般書寫格式如下:GENERIC([常數名;數據類型[:設定值]{;常數名:數據類型[:設定值]});1/6/20241/6/202417類屬參量以關鍵詞GENERIC引導一個類屬參量表,在表中提供時間參數或總線寬度等靜態信息。類屬表說明用于確定設計實體和其外部環境通信的參數,傳遞靜態的信息。在一個實體中定義的、可以通過GENERIC參數類屬的說明,為它創立多個行為不同的邏輯結構。比較常見的情況是選用類屬來動態規定一個實體端口的大小,或設計實體的物理特性,或結構體中的總線寬度,或設計實體中、底層中同種元件的例化數量等。一般在結構體中,類屬的應用與常數是一樣的。1/6/20241/6/202418【例2.2】2輸入與門的實體描述。ENTITYAND2ISGENERIC(RISEW:TIME:=1ns;FALLW:TIME:=1ns);PORT(A1:INSTD_LOGIC;A0:INSTD_LOGIC;Z0:OUTSTD_LOGIC);ENDENTITYAND2;這是一個準備作為2輸入與門的設計實體的實體描述,在類屬說明中定義參數RISEW為上沿寬度,FALLW為下沿寬度,它們分別為1ns,這兩個參數用于仿真模塊的設計。1/6/20241/6/202419

3.PORT端口說明

由PORT引導的端口說明語句是對于一個設計實體界面的說明。實體端口說明的一般書寫格式如下:PORT(端口名:端口模式數據類型;{端口名:端口模式數據類型});

其中,端口名是設計者為實體的每一個對外通道(系統引腳)所取的名字,一般用幾個英文字母組成;端口模式(端口方向)是指這些通道上的數據流動方式,即定義引腳是輸入還是輸出;數據類型是指端口上流動的數據的表達格式。由于VHDL是一種強類型語言,它對語句中的所有操作數的數據類型都有嚴格的規定。一個實體通常有一個或多個端口,端口類似于原理圖部件符號上的管腳。實體與外界交流的信息必須通過端口通道流入或流出。

1/6/20241/6/202420圖2.5端口模式符號圖IEEE1076標準包中定義了4種常用的端口模式,各端口模式的功能及符號分別見表2.1和圖2.5。表2.1端口模式說明1/6/20241/6/202421【例2.3】端口模式及數據類型定義舉例PORT(n0,n1,select:INBIT;q:OUTBIT;bus:OUTBIT_VECTOR(7DOWNTO0));

本例中,n0,n1,select是輸入引腳,屬于BIT型,q是輸出引腳,BIT型,bus是一組8位二進制總線,屬于BIT_VECTOR。【例2.4】端口模式及IEEE庫數據類型定義舉例

LIBRARYIEEE;

;ENTITYmmISPORT(n0,n1,select:INSTD_LOGIC;Q:OUTSTD_LOGIC;Bus:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDmm;

在此例中端口數據類型取自IEEE標準庫(該庫中有數據類型和函數的說明),其中STD_LOGIC取值為“0”,“1”,“X”和“Z”。因為使用了庫,所以在實體說明前要增加庫說明語句。

1/6/20241/6/2024222.2.2結構體結構體(ARCHITECTURE)是設計實體的一個重要局部,結構體將具體實現一個實體。每一個實體都有一個或一個以上的結構體,每個結構體對應著實體不同結構和算法實現方案,其間的各個結構體的地位是同等的,它們完整地實現了實體的行為,但同一結構體不能為不同的實體所擁有。結構體不能單獨存在,它必須有一個界面說明,即一個實體。對于具有多個結構體的實體,必須用CONFIGURATION配置語句指明用于綜合的結構體和用于仿真的結構體,即在綜合后的可映射于硬件電路的設計實體中,一個實體只對應一個結構體。在電路中,如果實體代表一個器件符號,那么結構體描述了這個符號的內部行為。1/6/20241/6/202423

1.結構體的一般語句格式

ARCHITECTURE結構體名OF實體名IS[說明語句]--內部信號,常數,數據類型,函數等的定義BEGIN[功能描述語句]END[ARCHITECTURE][結構體名];

【例2.5】

ENTITYnaxISPORT(a0,a1:INBIT;Sel:INBIT;Sh:OUTBIT);ENDnax;ARCHITECTUREdataflowOFnaxISBEGINsh<=(a0ANDsel)OR(NOTselANDa1);ENDdataflow;

1/6/20241/6/2024242.結構體說明語句結構體中的說明語句是對結構體的功能描述語句中將要用到的信號(SIGNAL)、數據類型(TYPE)、常數(CONSTANT)、元件(COMPONENT)、函數(FUNCTION)和過程(PROCEDURE)等加以說明的語句。但在一個結構體中說明和定義的數據類型、常數、元件、函數和過程只能用于這個結構體中,假設希望其能用于其他的實體或結構體中,那么需要將其作為程序包來處理。3.功能描述語句結構體描述設計實體的具體行為,它包含兩類語句:(1)并行語句:并行語句總是在進程語句(PROCESS)的外部,該語句的執行與書寫順序無關,總是同時被執行。(2) 順序語句:順序語句總是在進程語句(PROCESS)的內部,從仿真的角度,該語句是順序執行的。1/6/20241/6/202425

一個結構體包含幾個類型的子結構描述:BLOCK(塊)描述、PROCESS(進程)描述、SUNPROGRAMS(子程序)描述。塊語句是由一系列并行執行語句構成的組合體,它的功能是將結構體中的并行語句組成一個或多個模塊。進程語句定義順序語句模塊,用于將從外部獲得的信號值,或內部的運算數據向其他的信號進行賦值。子程序調用語句用于調用一個已設計好的子程序。信號賦值語句將設計實體內的處理結果向定義的信號或界面端口進行賦值。元件例化語句對其他的設計實體作元件調用說明,并將此元件的端口與其他的元件、信號或高層次實體的界面端口進行連接。

1/6/20241/6/202426

1) BLOCK語句描述使用BLOCK語句描述的格式如下:

塊標號:BLOCKBEGINENDBLOCK塊標號:【例2.6】

用塊語句實改的二選一電路ENTITYmuxISPORT(d0,d1,sel:INBIT;q:OUTBIT);ENDmux;ARCHITECTUREconnectOFmuxISSIGNALtmp1,tmp2,tmp3:BIT;BEGINcale:BLOCKBEGINtmp1<=d0ANDsel;tmp2<=d1AND(NOTsel);tmp3<=tmp1ORtmp2;q<=tmp3;ENDBLOCKcale;

ENDconnect;

1/6/20241/6/2024272)進程(Process)描述進程描述的格式如下:

[進程名]:PROCESS(信號1,信號2,…)BEGIN┇ENDPROCESS[進程名];

【例2.7】用進程語句實現的二選一電路

ENTITYmux1ISPORT(d0,d1,sel:INBIT;q:OUTBIT);ENDmux1;ARCHITECTUREconnectOFmux1ISBEGINcale:

VARIABLEtmp1,tmp2,tmp3:BIT;--在進程中定義的變量BEGINtmp1:=d0ANDsel;--輸入端口向變量賦值tmp2:=d1AND(NOTsel);tmp3:=tmp1ORtmp2;q<=tmp3ENDPROCESScale;

ENDconnect;

1/6/20241/6/2024283)子程序描述

子程序的概念和其它高級程序中子程序的概念相同,在VHDL中有2種類型:過程(Procedure)和函數(Function)。過程的格式:PROCEDURE過程名(參數1,參數2)IS函數的格式:FUNCTION函數名(參數1,參數2)RETURN數據類型名IS【例2.9】FUNCTION語句應用舉例

FUNCTIONmin(x,y:INTEGER)RETURNINTEGERISBEGINIFX<YTHENRETURN(x);ELSERETURN(y);ENDIF;ENDmin;

1/6/20241/6/202429【例2.8】PROCEDURE語句應用舉例

PROCEDUREvector_to_int(z:INSTD_LOGIC_VECTOR;x_flag:OUTBOOLEAN;q:ININTEGER)ISBEGINq:=0;x_flag:=FALSE;FORiINzRANGELOOPq:=q*2;IF(z(i)=1)THENq:=q+1;ELSEIF(z(i)/=10)THENx_flag:=TRUE;ENDIF;ENDLOOP,ENDvector_to_int;

1/6/20241/6/2024302.2.3庫庫是經編譯后的數據的集合,它存放包定義、實體定義、構造定義和配置定義。在設計單元內的語句可以使用庫中的結果,所以,庫的好處就是設計者可以共享已經編譯的設計結果,在VHDL中有很多庫,但他們相互獨立。IEEE庫:在IEEE庫中有一個STD_LOGIC的包,它是IEEE正式認可的包。STD庫:STD庫是VHDL的標準庫,在庫中有名為STANDARD的包,還有TEXTIO包。另外還有ASIC庫、WORK庫和用戶自定義庫等。在使用庫之前,一定要進行庫說明和包說明,庫和包的說明總是放在設計單元的前面:LIBRARY庫名;

1/6/20241/6/2024312.2.4程序包通常在一個實體中對數據類型、常量等進行的說明只可以在一個實體中使用,為使這些說明可以在其它實體中使用,VHDL提供了程序包結構,包中羅列VHDL中用到的信號定義、常數定義、數據類型、元件語句、函數定義和過程定義,它是一個可編譯的設計單元,也是庫結構中的一個層次,使用包時可以用USE語句說明,例如:

程序包分為包頭和包體,包結構的格式如下:(1)包頭格式:

PACKAGE包名IS[說明語句]END包名(2)包體格式:

PACKAGEBODY包名IS[說明語句]END包名;1/6/20241/6/202432【例2.11】包頭

PACKAGElogicISTYPEthree_level_logicIS(‘0’,’1’,’z’);--數據類型工程CONSTANTunknown_value:three_level_logic:=’0’;--常數工程FUNCTIONinvert(input:three_level_logic)--函數工程RETURNthree_level_logic;ENDlogic;1/6/20241/6/2024332.2.5配置用于在多結構體中的實體中選擇結構體,例如,在做RS觸發器的實體中使用了2個結構體,目的是研究各個結構體描述的RS觸發器的行為性能如何,但是究竟在仿真中使用哪一個結構體的問題就是配置問題。配置語句格式:

CONFIGURATION配置名OF實體名IS

[說明語句]

END配置名;

1/6/20241/6/202434【例2.13】

ENTITYrsISPORT(set,reset:INBIT;q,qb:BUFFERBIT);ENDrs;ARCHITECTURErsff1OFrsISCOMPONENTnand2PORT(a,b:INBIT;c:OUTBIT);ENDCOMPONENT;BEGINU1:nand2PORTMAP(a=>set,b=>qb,c=>q)U2:nand2PORTMAP(a=>reset,b=>q,c=>qb)ENDrsff1;ARCHITECTURErsff2OFrsISBEGINq<=NOT(qbANDset);qb<=NOT(qANDreset);ENDrsff2;

1/6/20241/6/2024352.3VHDL語言要素2.3.1VHDL文字規那么VHDL文字(Literal)主要包括數值和標識符。數值型文字主要有數字型、字符串型、位串型。1.數字型文字數字型文字的值有多種表達方式,現列舉如下:(1)整數文字:整數文字都是十進制的數,如:5,678,0,156E2(=15600),45_234_287(=45234287)數字間的下劃線僅僅是為了提高文字的可讀性,相當于一個空的間隔符,而沒有其他的意義,因而不影響文字本身的數值。(2)實數文字:實數文字也都是十進制的數,但必須帶有小數點,如:188.993,88_670_551.453_909(=88670551.453909),1.0,44.99E-2(=0.4499),1.335,0.01/6/20241/6/202436(3)以數制基數表示的文字:用這種方式表示的數由5個局部組成。第1局部,用十進制數標明數制進位的基數;第2局部,數制隔離符號“#”;第3局部,表達的文字;第4局部,指數隔離符號“#”;第5局部,用十進制表示的指數局部,這一局部的數如果是0可以省去不寫。現舉例如下:10#170#--(十進制數表示,等于170)2#1111_1110#--(二進制數表示,等于254)16#E#E1--(十六進制數表示,等于2#11100000#,等于224)16#F.01#E+2--(十六進制數表示,等于3841.00)1/6/20241/6/2024372.字符串型文字字符是用單引號引起來的ASCII字符,可以是數值,也可以是符號或字母,如:‘A’,‘*’,‘Z’。而字符串那么是一維的字符數組,須放在雙引號中。VHDL中有兩種類型的字符串:文字字符串和數位字符串。(1)文字字符串:文字字符串是用雙引號引起來的一串文字,如:“ERROR”,“X”。(2)數位字符串:數位字符串也稱位矢量,是預定義的數據類型BIT的一位數組,它們所代表的是二進制、八進制或十六進制的數組,其位矢量的長度即為等值的二進制數的位數。數位字符串的表示首先要有計算基數,然后將該基數表示的值放在雙引號中,基數符放在字符串的前面,分別以“B”、“O”和“X”表示二、八、十六進制基數符號。例如:B“1_1101_1110” --二進制數數組,位矢數組長度是9X“AD0”--十六進制數數組,位矢數組長度是121/6/20241/6/2024383.標識符標識符用來定義常數、變量、信號、端口、子程序或參數的名字。VHDL的根本標識符就是以英文字母開頭,不連續使用下劃線“_”,不以下劃線“_”結尾的,由26個大小寫英文字母、數字0~9以及下劃線“_”組成的字符串。VHDL的保存字不能用于作為標識符使用。如:DECODER_1,FFT,Sig_N,NOT_ACK,State0,Idle是合法的標識符;而_DECODER_1,2FFT,SIG_#N,NOT_ACK,RYY_RST,data_BUS,RETURN那么是非法的標識符。4.下標名及下標段名下標名用于指示數組型變量或信號的某一元素,而下標段名那么用于指示數組型變量或信號的某一段元素,其語句格式如下:

數組類型信號名或變量名(表達式1[TO/DOWNTO表達式2]);表達式的數值必須在數組元素下標號范圍以內,并且必須是可計算的。TO表示數組下標序列由低到高,如“2TO8”;DOWNTO表示數組下標序列由高到低,如“8DOWNTO2”。如下是下標名及下標段名使用例如:

SIGNALA,B,C:BIT_VECTOR(0TO7);SIGNALM:INTEGERRANGE0TO3;Y<=A(M);--M是不可計算型下標表示Z<=B(3);--3是可計算型下標表示1/6/20241/6/2024392.3.2VHDL數據對象

在VHDL中,數據對象(DataObjects)類似于一種容器,它接受不同數據類型的賦值。數據對象有三種,即常量(CONSTANT)、變量(VARIABLE)和信號(SIGNAL)。1.常量常量的定義和設置主要是為了使設計實體中的常數更容易閱讀和修改。例如,將位矢的寬度定義為一個常量,只要修改這個常量就能很容易地改變寬度,從而改變硬件結構。在程序中,常量是一個恒定不變的值,一旦作了數據類型的賦值定義后,在程序中不能再改變,因而具有全局意義。常量的描述格式:

CONSTANT常數名:數據類型:=表達式

例:CONSTANTVcc:REAL:=5.0;CONSTANTDALY:TIME:=100ns;CONSTANTFBUS:BIT_VECTOR:=”0101”;1/6/20241/6/2024402.變量(VARIABLE)在VHDL語法規那么中,變量是一個局部量,只能在進程和子程序中使用。變量不能將信息帶出對它作出定義的當前設計單元。變量的賦值是一種理想化的數據傳輸,是立即發生,不存在任何延時的行為。VHDL語言規那么不支持變量附加延時語句。變量常用在實現某種算法的賦值語句中。變量只能在進程、函數和過程中使用,一旦賦值立即生效。

定義變量的語法格式如下:VARIABLE變量名:數據類型:=初始值;例如:VARIABLEA:INTEGER;--定義A為整數型變量VARIABLEB,C:INTEGER:=2;--定義B和C為整型變量,初始值為2VARIABLEcount:INTEGERRANGE0TO255:=10;

1/6/20241/6/2024413.信號(SIGNAL)信號是描述硬件系統的根本數據對象,它類似于連接線。信號可以作為設計實體中并行語句模塊間的信息交流通道。在VHDL中,信號及其相關的信號賦值語句、決斷函數、延時語句等很好地描述了硬件系統的許多根本特征。如硬件系統運行的并行性;信號傳輸過程中的慣性延時特性;多驅動源的總線行為等。信號作為一種數值容器,不但可以容納當前值,也可以保持歷史值。這一屬性與觸發器的記憶功能有很好的對應關系。除了沒有方向說明以外,信號與實體的端口(PORT)概念是一致的。信號的描述格式如下:SIGNAL信號名:數據類型﹕=初始值;1/6/20241/6/202442

4.信號與變量的區別

信號賦值可以有延遲時間,變量賦值無時間延遲;信號除當前值外還有許多相關值,如歷史信息等,變量只有當前值;進程對信號敏感,對變量不敏感;信號可以是多個進程的全局信號,但變量只在定義它之后的順序域可見;信號可以看作硬件的一根連線,但變量無此對應關系。

例:SIGNALsys_clk:BIT:=‘0’;

--定義了一個位BIT的信號sys_clk,初始值為0SIGNALS1:STD_LOGIG﹕=0;--定義了一個標準位的單值信號S1,初始值為低電平SIGNALS4:STD_LOGIC_VECTOR(15DOWNTO0);--定義了一個位矢量(數組、總線)信號S4共有16個信號元素在程序中,信號值輸入信號時采用代入符”<=”,而不是賦值符“:=”,同時信號可以附加延時。信號是一個全局量,可以用來進行進程之間的通信。信號傳送語句:

s1<=s2AFTER10ns

1/6/20241/6/2024432.3.3VHDL數據類型VHDL是一種強類型語言,要求設計實體中的每一個常數、信號、變量、函數以及設定的各種參量都必須具有確定的數據類型,并且相同數據類型的量才能互相傳遞和作用。VHDL作為強類型語言的好處是使VHDL編譯或綜合工具很容易地找出設計中的各種常見錯誤。VHDL中的數據類型可以分成在現成程序包中可以隨時獲得的標準數據類型和用戶自定義數據類型兩個類別。標準的VHDL數據類型是VHDL最常用、最根本的數據類型,這些數據類型都已在VHDL的標準程序包Standard和STD_LOGIC_1164及其他的標準程序包中作了定義,并可在設計中隨時調用。1/6/20241/6/2024441.標準數據類型(1)整數(INTEGER)范圍:-2147483547~+2147483646,即可用32位有符號的二進制數表示。如2、10E4、16#D2#。例:INTEGERRANGE100DOWNTO0(2)實數(REAL)范圍:-1.0E38~1.0E38,書寫時一定要有小數。如:65.36、8#43.6#E+4。(3)位(BIT)取值只能是用帶單引號的‘1’和‘0’來表示。(4)位矢量(BIT_VECTOR)位矢量是用雙引號括起來的一組位數據,如“010101”。例:BIT_VECTOR(3DOWNTO0)(5)布爾量(BOOLEAN)只有“真”和“假”2個狀態,可以進行關系運算。(6)字符(CHARACTER):字符通常用單引號括起來,對大小寫敏感。(7)字符串(STRING):字符串是雙引號括起來的一串字符,如“laksdklakld”。(8)時間(TIME):完整的時間類型包括整數和物理量單位兩局部,整數和單位之間至少留一個空格,如55ms,20ns。1/6/20241/6/202445另外,在IEEE庫的程序包STD_LOGIC_1164中,定義了兩個非常重要的數據類型,即標準邏輯位STD_LOGIC和標準邏輯矢量STD_LOGIC_VECTOR。(1)標準邏輯位(STD_LOGIC)數據類型STD_LOGIC的定義如下所示:TYPESTD_LOGICIS('U','X','0','1','Z','W','L','H','-');各值的含義是:'U'--未初始化的,'X'--強未知的,'0'--強0,'1'--強1,'Z'--高阻態,'W'--弱未知的,'L'--弱0,'H'--弱1,'-'--忽略。由定義可見,STD_LOGIC是標準的BIT數據類型的擴展,共定義了9種值,這意味著,對于定義為數據類型是標準邏輯位STD_LOGIC的數據對象,其可能的取值已非傳統的BIT那樣只有0和1兩種取值,而是如上定義的有9種可能的取值。在程序中使用此數據類型前,需參加下面的語句:LIBRARYIEEE;;(2)標準邏輯矢量(STD_LOGIC_VECTOR)數據類型STD_LOGIC_VECTOR類型定義如下:TYPESTD_LOGIC_VECTORISARRAY(NATURALRANGE<>)OFSTD_LOGIC;顯然,STD_LOGIC_VECTOR是定義在STD_LOGIC_1164程序包中的標準一維數組,數組中的每一個元素的數據類型都是以上定義的標準邏輯位STD_LOGIC。1/6/20241/6/2024462.用戶自定義數據類型VHDL允許用戶自行定義新的數據類型,如枚舉類型(ENUMERATIONTYPE)、整數類型(INTEGERTYPE)、數組類型(ARRAYTYPE)、記錄類型(RECORDTYPE)、時間類型(TIMETYPE)、實數類型(REALTYPE)等。用戶自定義數據類型是用類型定義語句TYPE和子類型定義語句SUBTYPE實現的。用戶自定義數據類型的一般格式:TYPE數據類型名IS數據類型定義[OF根本數據類型];1/6/20241/6/202447其中,數據類型名由設計者自定;數據類型定義局部用來描述所定義的數據類型的表達方式和表達內容;關鍵詞OF后的根本數據類型是指數據類型定義中所定義的元素的根本數據類型,一般都是取已有的預定義數據類型,如BIT、STD_LOGIC或INTEGER等。例:TYPEdigitISINTEGERRANGE0TO9;TYPEcurrentISREALRANGE-1E4TO1E4;TYPEwordISARRAY(INTEGER1TO8)OFSTD_LOGIC;1/6/20241/6/202448

3.數據類型的轉換數據類型轉換函數由VHDL語言的包提供,例如:STD_LOGIC_1164和STD_LOGIC_ARITH等。轉換函數見表2.2。

函數

說明

STD_LOGIC_1164包TO_STDLOGICVECTOR(A)TO_BITVECTOR(A)TO_LOGIC(A)TO_BIT(A)

由BIT_VECTOR轉換成STD_LOGIC_VECTOR由STD_LOGIC_VECTOR轉換成BIT_VECTOR由BIT轉換成STD_LOGIC由STD_LOGIC轉換成BITSTD_LOGIC_ARITH包CONV_STD_LOGIC_VECTOR(A,位長)

CONV_INTEGER(A)

由INTEGER,UNSIGNED和SIGNED轉換成STD_LOGIC_VECTOR由UNSIGNED和SIGNED轉換成INTEGERSTD_LOGIC_UNSIGNED包CONV_INTEGER

由STD_LOGIC_VECTOR轉換成INTEGER表2.2轉換函數表

1/6/20241/6/202449【例2.14】由STD_BIT_VECTOR轉換成INTEGERLIBRARY

IEEE;ENTITYadd5ISPORT(num:INSTD_LOGIC_VECTOR(2DOWNTO0);┇

);ENDadd5;ARCHITECTURErtlOFadd5ISSIGNALin_num:INTEGERRANGE0TO5;┇BEGIN

In_num<=CONV_INTEGER(num);

ENDrtl;

1/6/20241/6/2024502.3.4VHDL運算操作符VHDL的各種表達式由操作數和操作符組成,其中操作數是各種運算的對象,而操作符那么規定運算的方式。1.操作符種類及對應的操作數類型在VHDL中,有4類根本操作符,即邏輯操作符(LogicalOperator)、關系操作符(RelationalOperator)、算術操作符(ArithmeticOperator)和符號操作符(SignOperator)。根本操作符是完成邏輯和算術運算的最根本的操作符的單元。此外還有重載操作符(OverloadingOperator),是對根本操作符作了重新定義的函數型操作符。常用運算操作符見表2.3,操作符之間的優先級別見表2.4。1/6/20241/6/202451表2.3常用運算操作符1/6/20241/6/202452表2.3常用運算操作符(續)1/6/20241/6/202453表2.4VHDL操作符優先級1/6/20241/6/202454

2.各種操作符的使用說明(1)邏輯運算符要求運算符左右的數據類型必須相同。例:x<=(aANDb)OR(NOTcANDd);x<=bANDaANDdANDe;x<=bORcORdORe;x<=aXORdXORe;a<=(x1ANDx2)OR(y1ANDy2);(2)算術操作符在使用乘法運算符時,應該特別慎重,因為它可以使邏輯門數大大增加。(3)關系運算符應該注意小于等于<=和代入運算符的不同(從上下文區別)。1/6/20241/6/202455(4)并置運算符并置運算符“&”用于位連接。例如:y(0)=b(0)&eny(1)=b(1)&eny(2)=b(2)&eny(3)=b(3)&eny(4)=a(0)y(5)=a(1)y(6)=a(2)y(7)=a(3)

從上可以看出a,b是四位長度的矢量,而y的位長是7位,上述情況可以表示成:

tmp_b<=bAND(en&en&en&en);y<=a&tmp_b;

假設是位連接,可以簡單寫為:

tmp_b<=bAND(en,en,en,en);1/6/20241/6/202456

2.3.5VHDL語言結構體的描述方式

有3種描述方式:行為描述,RTL描述和ASIC描述,采用后兩種描述方式可以進行邏輯綜合。1.行為描述

描述數字系統的行為,主要用于仿真和系統工作原理的研究。下面介紹一些專用語句。(1)代入語句格式:信號量<=敏感信號量表達式;例如:z<=aNOR(bNANDc);該例中有3個敏感量,無論哪一個發生變化都可以使z變化。具有時間延遲的代入語句:

a<=bAFTER10ns

表示當b發生變化10ns后a才變化。

1/6/20241/6/202457例:與門電路

ENTITYand2ISPORT(a,b:INBIT;c:OUTBIT);ENDand2;ARCHITECTUREand2_behaveOFand2ISBEGINc<=aANDb;ENDand2_behave;(2)延時語句VHDL中有兩種延時語句:慣性延時和傳輸延時。VHDL中慣性延時是缺省的,因為邏輯硬件電路總是有時間延遲的,假設延遲時間是20ns,那么入信號時間假設小于20ns,那么輸出信號將不跟隨輸入信號的變化。有時為使延遲時間更逼真實際電路,就專門設置慣性時間:

b<=aAFTER10ns;

傳輸延時常代表總線、連接線的延遲時間,該時間必須專門說明。該傳輸延時只對信號起純延時作用。例:b<=TRANSPORTaAFTER20ns;1/6/20241/6/2024582.數據流描述方式數據流描述方式是一種可以進行邏輯綜合的描述方式,由于要進行邏輯綜合所以對使用的語句有一定的限制,VHDL中的每一個命令和語句都對邏輯綜合能力進行了定義,要進行邏輯綜合的設計實體就要使用有邏輯綜合能力的命令和語句。【例2.15】四選一電路

LIBRARYIEEE;;;ENTITYmux42ISPORT(input:INSTD_LOGIC_VECTOR(3DOWNTO0);Sel:INSTD_LOGIC_VECTOR(1DOWNTO0);Y:OUTSTD_LOGIC);ENDmux42;ARCHITECTUREappOFmux42ISBEGINy<=input(0)WHENsel=0ELSEinput(1)WHENsel=1ELSEinput(2)WHENsel=2ELSEinput(3);ENDapp;

1/6/20241/6/2024593.結構描述方式注重調用已有的元件或門級電路之間的連線是結構描述的特點,結構描述可以提高設計效率。(1)元件聲明語句元件聲明語句用于調用已生成的元件,這些元件可能在庫中,也可能是預先編寫的元件實體描述。元件聲明語句的格式:

COMPONENT元件名PORT說明;ENDCOMPONENT;

元件聲明語句可以在Architecture,Package和Block的說明局部。1/6/20241/6/202460(2)元件調用語句格式:

標號名:元件名PORTMAP(信號,…);兩層信號之間的關系為映射關系,該映射有兩種:位置映射和名稱映射。①位置映射例有一元件的端口說明為:

port(a,b:inbit;c:outbit);

調用該元件時:U2:元件名portmap(n1,n2,m);這里n1對應a,n2對應b,m對應c。②名稱映射例該映射就是將庫中已有模塊的端口名稱,賦予設計中的信號名.

U2:元件名portmap(a=>n1,b=>n2,c=>m);

1/6/20241/6/2024612.4VHDL順序語句順序語句(SequentialStaements)和并行語句(ConcurrentStatements)是VHDL程序設計中兩大根本描述語句系列。在邏輯系統的設計中,這些語句從多側面完整地描述數字系統的硬件結構和根本邏輯功能,其中包括通信的方式、信號的賦值、多層次的元件例化以及系統行為等。順序語句是相對于并行語句而言的,其特點是只能用在進程和子程序中,它和其他高級語言一樣,其語句是按照語句的出現的順序加以執行的。VHDL有如下6類根本順序語句:等待語句;賦值語句;轉向控制語句;子程序調用語句;返回語句和空操作語句。1/6/20241/6/2024622.4.1等待語句和斷言語句

1.等待(WAIT)語句進程在執行過程中總是處于2種狀態:執行或掛起(Suspension),進程的狀態變化受等待(WAIT)語句的控制,當進程執行到WAIT語句,就被掛起,直到滿足此語句設置的結束掛起條件后,將重新開始執行進程或過程中的程序。但VHDL規定,已列出敏感量的進程中不能使用任何形式的WAIT語句。WAIT語句的語句格式如下:WAIT[ON敏感信號表][UNTIL條件表達式][FOR時間表達式];

(1) 無限等待語句:WAIT單獨的WAIT,未設置停止掛起條件的表達式,表示永遠掛起。

1/6/20241/6/202463(2)敏感信號等待語句:WAITON信號[,信號]在信號表中列出的信號是等待語句的敏感信號。當處于等待狀態時,敏感信號的任何變化(如從0~1或從1~0的變化)將結束掛起,再次啟動進程。如:

WAITONa,b;

表示當a或b中任一信號發生改變時,就恢復執行WAIT語句之后的語句。例:

PROCESSBEGINy<=aANDb;WAITONa,b;ENDPROCESS;

(3)條件等待語句:WAITUNTIL布爾表達式當進程執行到該語句時,被掛起;假設布爾表達式為真時,進程將被啟動。例:WAITUNTIL((x*10)<100)1/6/20241/6/202464(4)WAITFOR時間表達式當進程執行到該語句時,被掛起;等待一定的時間后,進程將被啟動。例:WAITFOR20ns

WAITUNTILCLOCK='1';--時鐘CLOCK上跳沿啟動進程

例2.16中的進程將完成一個硬件求平均的功能,每一個時鐘脈沖由A輸入一個數值,4個時鐘脈沖后將獲得此4個數值的平均值。

【例2.16】求4個數值的平均值程序PROCESSBEGINWAITUNTILCLK='1';AVE<=A;WAITUNTILCLK='1';AVE<=AVE+A;WAITUNTILCLK='1';AVE<=AVE+A;WAITUNTILCLK='1';AVE<=(AVE+A)/4;ENDPROCESS;

1/6/20241/6/202465(5)多條件WAIT語句例:WAITONnmi,interruptUNTIL((nmi=TRUE)OR(interrupt=TRUE))FOR5us該等待有3個條件:第一,信號nmi和interrupt任何一個有一次刷新動作;第二,信號nmi和interrupt任何一個為真;第三,等待5μs。只要一個以上的條件被滿足,進程就被啟動。

2.斷言(Assert)語句格式:ASSERT條件[REPORT輸出信息][SEVERITY級別]執行到斷言語句時,判斷條件,假設條件滿足就繼續執行,否那么輸出文字串和錯誤級別信息。例:ASSERT(tiaojian='1')REPORT"somethingwrong"SEVERITYERROR;1/6/20241/6/2024662.4.2賦值語句

賦值語句的功能就是將一個值或一個表達式的運算結果傳遞給某一數據對象,如信號或變量,或由此組成的數組。VHDL設計實體內的數據傳遞以及對端口界面外部數據的讀寫都必須通過賦值語句的運行來實現。賦值語句有兩種,即信號賦值語句和變量賦值語句。(1) 信號賦值語句格式:目的信號量<=信號量表達式例:a<=b;(2) 變量賦值語句格式:目的變量:=表達式例:c:=a+d;

1/6/20241/6/202467變量賦值與信號賦值的區別在于,變量具有局部特征,它的有效只局限于所定義的一個進程中,或一個子程序中,它是一個局部的、暫時性數據對象(在某些情況下)。對于它的賦值是立即發生的(假設進程已啟動),即是一種時間延遲為零的賦值行為。信號那么不同,信號具有全局性特征,它不但可以作為一個設計實體內部各單元之間數據傳送的載體,而且可通過信號與其他的實體進行通信(端口本質上也是一種信號)。信號的賦值并不是立即發生的,它發生在一個進程結束時。賦值過程總是有某種延時的,它反映了硬件系統并不是立即發生的,它發生在一個進程結束時。賦值過程總是有某些延時的,它反映了硬件系統的重要特性,綜合后可以找到與信號對應的硬件結構,如一根傳輸導線、一個輸入輸出端口或一個D觸發器等。讀者可以從例例2.17中看出信號與變量賦值的特點及它們的區別。當在同一賦值目標處于不同進程中時,其賦值結果就比較復雜了,這可以看成是多個信號驅動源連接在一起,可以發生線與、線或或者三態等不同結果。1/6/20241/6/202468【例2.17】SIGNALS1,S2:STD_LOGIC;SIGNALSVEC:STD_LOGIC_VECTOR(0TO7);...PROCESS(S1,S2)VARIABLEV1,V2:STD_LOGIC;BEGINV1:='1';--立即將V1置位為1V2:='1';--立即將V2置位為1S1<='1';--S1被賦值為1S2<=‘1’;--由于在本進程中,這里的S2不是最后一個賦值語句故不做任何賦值操作SVEC(0)<=V1;--將V1在上面的賦值1,賦給SVEC(0)SVEC(1)<=V2;--將V2在上面的賦值1,賦給SVEC(1)SVEC(2)<=S1;--將S1在上面的賦值1,賦給SVEC(2)SVEC(3)<=S2;--將最下面的賦予S2的值‘0’,賦給SVEC(3)V1:='0';--將V1置入新值0V2:='0';--將V2置入新值0S2:='0';--由于這是S2最后一次賦值,賦值有效,此‘0’將上面準備賦入的‘1’覆蓋掉SVEC(4)<=V1;--將V1在上面的賦值0,賦給SVEC(4)SVEC(5)<=V2;--將V2在上面的賦值0,賦給SVEC(5)SVEC(6)<=S1;--將S1在上面的賦值1,賦給SVEC(6)SVEC(7)<=S2;--將S2在上面的賦值0,賦給SVEC(7)ENDPROCESS;

1/6/20241/6/2024692.4.3轉向控制語句轉向控制語句通過條件控制開關決定是否執行一條或幾條語句,或重復執行一條或幾條語句,或跳過一條或幾條語句。轉向控制語句共有5種:IF語句、CASE語句、LOOP語句、NEXT語句和EXIT語句。1.IF語句IF語句是一種條件語句,語句中至少應有一個條件句,條件句必須由布爾表達式構成。IF語句根據條件句產生的判斷結果TRUE或FALSE,有條件地選擇執行其后的順序語句。如果某個條件句的布爾值為真(TRUE),那么執行該條件句后的關鍵詞THEN后面的順序語句,否那么結束該條件的執行,或執行ELSIF或ELSE后面的順序語句后結束該條件句的執行……直到執行到最外層的ENDIF語句,才完成全部IF語句的執行。1/6/20241/6/202470(1)IF的門閂控制格式:IF條件THEN

順序執行語句ENDIF;

例:IF(a=’1’)THENc<=b;ENDIF;格式二:IF條件THEN

順序執行語句ELSIF條件THEN

順序執行語句

ELSIF條件THEN

順序執行語句ENDIF;(2)IF語句的選擇控制格式一:IF條件THEN

順序執行語句ELSE

順序執行語句ENDIF;1/6/20241/6/202471

【例2.18】IF語句完成的一個具有2輸入與門功能的函數定義。FUNCTIONAND_FUNC(X,Y:INBIT)RETURNBITISBEGINIFX=‘1’ANDY=‘1’THENRETURN‘1’;ELSERETURN‘0’;ENDIF;ENDAND_FUNC;1/6/20241/6/202472【例2.19】IF語句的選擇控制程序舉例LIBRARYIEEE;;ENTITYCONTROL_STMTSISPORT(A,B,C:INBOOLEAN;OUTPUT:OUTBOOLEAN);ENDCONTROL_STMTS;ARCHITECTUREEXAMPLEOFCONTROL_STMTSISBEGINPROCESS(A,B,C)VARIABLEN:BOOLEAN;BEGINIFATHENN:=B;ELSEN:=C;ENDIF;OUTPUT<=N;ENDPROCESS,ENDEXAMPLE;圖2.6例2.19對應的硬件電路

1/6/20241/6/202473

2.CASE語句

CASE語句根據滿足的條件直接選擇多項順序語句中的一項執行。CASE語句的結構如下:CASE表達式ISWHEN選擇值=>順序語句;WHEN選擇值=>順序語句;[WHENOTHERS=>順序語句;]…ENDCASE;選擇值可以有4種不同的表達方式:①單個普通數值,如4;②數值選擇范圍,如(2TO4),表示取值2、3或4;③并列數值,如3|5,表示取值為3或者5;④混合方式,以上三種方式的混合。1/6/20241/6/202474當執行到CASE語句時,首先計算表達式的值,然后根據條件句中與之相同的選擇值,執行對應的順序語句,最后結束CASE語句。表達式可以是一個整數類型或枚舉類型的值,也可以是由這些數據類型的值構成的數

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論