VHDL编程基础课件_第1页
VHDL编程基础课件_第2页
VHDL编程基础课件_第3页
VHDL编程基础课件_第4页
VHDL编程基础课件_第5页
已阅读5页,还剩585页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

VHDL編程基礎3.1概述3.1.1常用硬體描述語言簡介常用硬體描述語言有VHDL、Verilog和ABEL語言。VHDL起源於美國國防部的VHSIC,Verilog起源於積體電路的設計,ABEL則來源於可編程邏輯器件的設計。下麵從使用方面將三者進行對比。

(1)邏輯描述層次:一般的硬體描述語言可以在三個層次上進行電路描述,其層次由高到低依次可分為行為級、RTL級和門電路級。VHDL語言是一種高級描述語言,適用於行為級和RTL級的描述,最適於描述電路的行為;Verilog語言和ABEL語言是一種較低級的描述語言,適用於RTL級和門電路級的描述,最適於描述門級電路。(2)設計要求:VHDL進行電子系統設計時可以不了解電路的結構細節,設計者所做的工作較少;Verilog和ABEL語言進行電子系統設計時需瞭解電路的結構細節,設計者需做大量的工作。

(3)綜合過程:任何一種語言根源程式,最終都要轉換成門電路級才能被佈線器或適配器所接受。因此,VHDL語言根源程式的綜合通常要經過行為級→RTL級→門電路級的轉化,VHDL幾乎不能直接控制門電路的生成。而Verilog語言和ABEL語言根源程式的綜合過程要稍簡單,即經過RTL級→門電路級的轉化,易於控制電路資源。(4)對綜合器的要求:VHDL描述語言層次較高,不易控制底層電路,因而對綜合器的性能要求較高,Verilog和ABEL對綜合器的性能要求較低。

(5)支持的EDA工具:支持VHDL和Verilog的EDA工具很多,但支持ABEL的綜合器僅僅Dataio一家。

(6)國際化程度:VHDL和Verilog已成為IEEE標準,而ABEL正朝國際化標準努力。3.1.2VHDL的優點

VHDL的英文全名是Very-High-SpeedIntegratedCircuitHardwareDescriptionLanguage,誕生於1982年。1987年底,VHDL被IEEE(TheInstituteofElectricalandElectronicsEngineers)和美國國防部確認為標準硬體描述語言。自IEEE公佈了VHDL的標準版本(IEEE-1076)之後,各EDA公司相繼推出了自己的VHDL設計環境,或宣佈自己的設計工具可以和VHDL介面。此後VHDL在電子設計領域得到了廣泛的接受,並逐步取代了原有的非標準硬體描述語言。1993年,IEEE對VHDL進行了修訂,從更高的抽象層次和系統描述能力上擴展VHDL的內容,公佈了新版本的VHDL,即IEEE標準的1076-1993版本。現在,VHDL和Verilog作為IEEE的工業標準硬體描述語言,又得到眾多EDA公司的支持,在電子工程領域,已成為事實上的通用硬體描述語言。有專家認為,在新的世紀中,VHDL與Verilog語言將承擔起幾乎全部的數字系統設計任務。VHDL主要用於描述數字系統的結構、行為、功能和介面。除了含有許多具有硬體特徵的語句外,VHDL的語言形式和描述風格與句法十分類似於一般的電腦高級語言。VHDL的程式結構特點是將一項工程設計,或稱設計實體(可以是一個元件、一個電路模組或一個系統)分成外部(或稱可視部分,即端口)和內部(或稱不可視部分),即設計實體的內部功能和演算法完成部分。在對一個設計實體定義了外部介面後,一旦其內部開發完成後,其他的設計就可以直接調用這個實體。這種將設計實體分成內外部分的概念是VHDL系統設計的基本點。應用VHDL進行工程設計的優點是多方面的,具體如下:(1)與其他的硬體描述語言相比,VHDL具有更強的行為描述能力。強大的行為描述能力是避開具體的器件結構,從邏輯行為上描述和設計大規模電子系統的重要保證。就目前流行的EDA工具和VHDL綜合器而言,將基於抽象的行為描述風格的VHDL程式綜合成為具體的FPGA和CPLD等目標器件的網表檔已不成問題,只是在綜合與優化效率上略有差異。

(2)VHDL具有豐富的仿真語句和庫函數,使得在任何大系統的設計早期,就能查驗設計系統的功能可行性,隨時可對系統進行仿真模擬,使設計者對整個工程的結構和功能可行性做出判斷。(3)VHDL語句的行為描述能力和程式結構,決定了它具有支持大規模設計的分解和已有設計的再利用功能。符合市場需求的大規模系統高效、高速的完成必須有多人甚至多個開發組共同並行工作才能實現,VHDL中設計實體的概念、程式包的概念、設計庫的概念為設計的分解和並行工作提供了有利的支持。(4)用VHDL完成一個確定的設計,可以利用EDA工具進行邏輯綜合和優化,並自動把VHDL描述設計轉變成門級網表(根據不同的實現晶片)。這種方式突破了門級設計的瓶頸,極大地減少了電路設計的時間和可能發生的錯誤,降低了開發成本。利用EDA工具的邏輯優化功能,可以自動地把一個綜合後的設計變成一個更小、更高速的電路系統。反過來,設計者還可以容易地從綜合和優化的電路獲得設計資訊,返回去更新修改VHDL設計描述,使之更加完善。(5)VHDL對設計的描述具有相對獨立性。設計者可以不懂硬體的結構,也不必管最終設計的目標器件是什麼,而進行獨立的設計。正因為VHDL的硬體描述與具體的工藝技術和硬體結構無關,所以VHDL設計程式的硬體實現目標器件有廣闊的選擇範圍,其中包括各種系列的CPLD、FPGA及各種門陣列器件。

(6)由於VHDL具有類屬描述語句和副程式調用等功能,對於完成的設計,在不改變根源程式的條件下,只需改變類屬參量或函數,就能輕易地改變設計的規模和結構。3.1.3VHDL程式設計約定為了便於程式的閱讀和調試,本書對VHDL程式設計特作如下約定:

(1)語句結構描述中方括弧“[]”內的內容為可選內容。

(2)對於VHDL的編譯器和綜合器來說,程式文字的大小寫是不加區分的。本書一般使用大寫。

(3)程式中的注釋使用雙橫線“--”。在VHDL程式的任何一行中,雙橫線“--”後的文字都不參加編譯和綜合。(4)為了便於程式的閱讀與調試,書寫和輸入程式時,使用層次縮進格式,同一層次的對齊,低層次的較高層次的縮進兩個字元。

(5)考慮到MAX+plusII要求根源程式檔的名字與實體名必須一致,因此為了使同一個VHDL根源程式檔能適應各個EDA開發軟體上的使用要求,建議各個根源程式檔的命名均與其實體名一致。3.2VHDL程式基本結構3.2.1VHDL程式設計舉例

1.設計思路全加器可以由兩個1位的半加器構成,而1位半加器可以由如圖3.1所示的門電路構成。

1位半加器的端口信號A和B分別是2位相加的二進位輸入信號,SO是相加和的輸出信號,CO是進位輸出信號,左邊的門電路結構構成了右邊的半加器H_ADDER。在硬體上可以利用半加器構成如圖3.2所示的全加器,當然還可以將一組這樣的全加器級聯起來構成一個串行進位的加法器。圖3.2中,全加器F_ADDER內部的功能結構是由3個邏輯器件構成的,即由兩個半加器U1、U2和一個或門U3連接而成。圖3.11位半加器邏輯原理圖圖3.21位全加器邏輯原理圖2.VHDL根源程式1)或門的邏輯描述--IEEE庫的使用說明

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;--實體OR2的說明

ENTITYOR2IS

PORT(A,B:INSTD_LOGIC;

C:OUTSTD_LOGIC);

ENDENTITYOR2;--實體OR2的結構體ART1的說明

ARCHITECTUREART1OFOR2IS

BEGIN

C<=AORB;

ENDARCHITECTUREART1;2)半加器的邏輯描述--IEEE庫的使用說明

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;--實體H_ADDER的說明

ENTITYH_ADDERISPROT(A,B:INSTD_LOGIC;

CO,SO:OUTSTD_LOGIC);ENDENTITYH_ADDER;--實體H_ADDER的結構體ART2的說明

ARCHITECTUREART2OFH_ADDERISBEGINSO<=(AORB)AND(ANANDB);

CO<=NOT(ANANDB);

ENDARCHITECTUREART2;3)全加器的邏輯描述--IEEE庫的使用說明

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;--實體F_ADDER的說明

ENTITYF_ADDERIS

PORT(AIN,BIN,CIN:INSTD_LOGIC;

COUT,SUM:OUTSTD_LOGIC);

ENDENTITYF_ADDER;--實體F_ADDER的結構體ART3的說明

ARCHITECTUREART3OFF_ADDERIS--元件調用聲明COMPONENTH_ADDER

PORT(A,B:INSTD_LOGIC;

CO,SO:OUTSTD_LOGIC);

ENDCOMPONENT;

COMPONENTOR2PORT(A,B:INSTD_LOGIC;

C:OUTSTD_LOGIC);

ENDCOMPONENT;

SIGNALD,E,F:STD_LOGIC;--元件連接說明

BEGINU1:H_ADDERPORTMAP(A=>AIN,B=>BIN,CO=>D,SO=>E);

U2:H_ADDERPORTMAP(A=>E,B=>CIN,CO=>F,SO=>SUM);

U3:OR2PORTMAP(A=>D,B=>F,C=>COUT);

ENDARCHITECTUREART3;

3.說明及分析

(1)整個設計包括三個設計實體,分別為OR2、H_ADDER和F_ADDER,其中實體F_ADDER為頂層實體。三個設計實體均包括三個組成部分:庫、程式包使用說明,實體說明和結構體說明。這三個設計實體既可以作為一個整體進行編譯、綜合與存檔,也可以各自進行獨立編譯、獨立綜合與存檔,或被其他的電路系統所調用。(2)實體OR2定義了或門OR2的引腳信號A、B(輸入)和C(輸出),其對應的結構體ART1描述了輸入與輸出信號間的邏輯關係,即將輸入信號A、B相或後傳給輸出信號端C,由此實體和結構體描述一個完整的或門元件。

(3)實體H_ADDER及對應的結構體ART2描述了一個如圖3.1所示的半加器。由其結構體的描述可以看到,它是由一個與非門、一個非門、一個或門和一個與門連接而成的,其邏輯關係來自於半加器真值表。在VHDL中,邏輯算符NAND、NOT、OR和AND分別代表“與非”、“非”、“或”和“與”4種邏輯運算關係。(4)在全加器介面邏輯VHDL描述中,根據圖3.2右側的1位二進位全加器F_ADDER的原理圖,實體F_ADDER定義了引腳的端口信號屬性和數據類型。其中,AIN和BIN分別為兩個輸入的相加位,CIN為低位進位輸入,COUT為進位輸出,SUM為1位和輸出。其對應的結構體ART3的功能是利用COMPONENT聲明語句和COMPONENT例化語句將上面由兩個實體OR2和H_ADDER描述的獨立器件,按照圖3.2全加器內部邏輯原理圖中的接線方式連接起來。(5)在結構體ART3中,COMPONENT→ENDCOMPONENT語句結構對所要調用的或門和半加器兩元件作了聲明(COMPONENTDECLARATION),並由SIGNAL語句定義了三個信號D、E和F,作為中間信號轉存點,以利於幾個器件間的信號連接。接下去的“PORTMAP()”語句稱為元件例化語句(COMPONENTINSTANTIATION)。所謂例化,在電路板上,相當於往上裝配元器件;在邏輯原理圖上,相當於從元件庫中取了一個元件符號放在電路原理圖上,並對此符號的各引腳進行連線。例化也可理解為元件映射或元件連接,MAP是映射的意思。例如,語句“U2:H_ADDERPORTMAP(A=>E,B=>CIN,CO=>F,SO=>SUM)”表示將實體H_ADDER描述的元件U2的引腳信號A、B、CO和SO分別連向外部信號E、CIN、F和SUM。符號“=>”表示信號連接。(6)實體F_ADDER引導的邏輯描述也是由三個主要部分構成的,即庫、實體和結構體。從表面上看來,庫的部分僅包含一個IEEE標準庫和打開的IEEE.STD_LOGIC_1164.ALL程式包。但實際上,從結構體的描述中可以看出,其對外部的邏輯有調用的操作,這類似於對庫或程式包中的內容作了調用。因此,庫結構部分還應將上面的或門和半加器的VHDL描述包括進去,作為工作庫中的兩個待調用的元件。由此可見,庫結構也是VHDL程式的重要組成部分。3.2.2VHDL程式的基本結構從前面的設計實例可以看出,一個相對完整的VHDL程式(或稱為設計實體)具有如圖3.3所示的比較固定的結構。至少應包括三個基本組成部分:庫、程式包使用說明,實體說明和實體對應的結構體說明。其中,庫、程式包使用說明用於打開(調用)本設計實體將要用到的庫、程式包;實體說明用於描述該設計實體與外界的介面信號說明,是可視部分;結構體說明用於描述該設計實體內部工作的邏輯關係,是不可視部分。在一個實體中,可以含有一個或一個以上的結構體,而在每一個結構體中又可以含有一個或多個進程以及其他的語句。根據需要,實體還可以有配置說明語句。配置說明語句主要用於以層次化的方式對特定的設計實體進行元件例化,或是為實體選定某個特定的結構體。

如何才算一個完整的VHDL程式(設計實體),並沒有完全一致的結論,因為不同的程式設計目的可以有不同的程式結構。通常認為,一個完整的設計實體的最低要求應該能為VHDL綜合器所接受,並能作為一個獨立設計單元,即以元件的形式存在的VHDL程式。這裏所謂的元件,既可以被高層次的系統所調用,成為該系統的一部分,也可以作為一個電路功能塊而獨立存在和獨立運行。圖3.3VHDL程式設計基本結構3.2.3實體(ENTITY)

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

1.實體語句結構實體說明單元的常用語句結構如下:

ENTITY實體名IS[GENERIC(類屬表);][PORT(端口表);]

ENDENTITY實體名;

實體說明單元必須以語句“ENTITY實體名IS”開始,以語句“ENDENTITY實體名;”結束,其中的實體名是設計者自己給設計實體的命名,可作為其他設計實體對該設計實體進行調用時用。中間在方括號內的語句描述,在特定的情況下並非是必須的。例如構建一個VHDL仿真測試基準等情況中可以省去方括號中的語句。

2.類屬(GENERIC)說明語句類屬(GENERIC)參量是一種端口介面常數,常以一種說明的形式放在實體或塊結構體前的說明部分。類屬為所說明的環境提供了一種靜態資訊通道,類屬的值可以由設計實體外部提供。因此,設計者可以從外面通過類屬參量的重新設定而容易地改變一個設計實體或一個元件的內部電路結構和規模。

類屬說明的一般書寫格式如下:

GENERIC([常數名;數據類型[:設定值]{;常數名:數據類型[:設定值]});類屬參量以關鍵字GENERIC引導一個類屬參量表,在表中提供時間參數或匯流排寬度等靜態資訊。類屬表說明用於確定設計實體和其外部環境通信的參數,傳遞靜態的資訊。類屬說明在所定義的環境中的地位十分接近常數,但卻能從環境(如設計實體)外部動態地接受賦值,其行為又有點類似於端口PORT。因此,常如以上的實體定義語句那樣,將類屬說明放在其中,且放在端口說明語句的前面。

在一個實體中定義的、可以通過GENERIC參數類屬的說明,為它創建多個行為不同的邏輯結構。比較常見的情況是選用類屬來動態規定一個實體端口的大小,或設計實體的物理特性,或結構體中的匯流排寬度,或設計實體中、底層中同種元件的例化數量等。一般在結構體中,類屬的應用與常數是一樣的。例如,當用實體例化一個設計實體的器件時,可以用類屬表中的參數項定制這個器件,如可以將一個實體的傳輸延時、上升和下降延時等參數加到類屬參數表中,然後根據這些參數進行定制,這對於系統仿真控制是十分方便的。類屬中的常數名是由設計者確定的類屬常數名,數據類型通常取INTEGER或TIME等類型,設定值即為常數名所代表的數值。但需注意,綜合器僅支持數據類型為整數的類屬值。【例3.2.1】

ENTITYMCKISGENERIC(WIDTH:INTEGER:=16);

PORT(ADD_BUS:OUTSTD_LOGIC_VECTOR(WIDTH-1DOWNTO0));

...

在這裏,GENERIC語句對實體MCK的作為地址匯流排的端口ADD_BUS的數據類型和寬度作了定義,即定義ADD_BUS為一個16位的位向量。【例3.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,這兩個參數用於仿真模組的設計。

3.PORT端口說明由PORT引導的端口說明語句是對於一個設計實體介面的說明。實體端口說明的一般書寫格式如下:

PORT(端口名:端口模式數據類型;

{端口名:端口模式數據類型});其中,端口名是設計者為實體的每一個對外通道所取的名字;端口模式是指這些通道上的數據流動方式,如輸入或輸出等;數據類型是指端口上流動的數據的表達格式。由於VHDL是一種強類型語言,它對語句中的所有運算元的數據類型都有嚴格的規定。一個實體通常有一個或多個端口,端口類似於原理圖部件符號上的管腳。實體與外界交流的資訊必須通過端口通道流入或流出。IEEE1076標準包中定義了4種常用的端口模式,各端口模式的功能及符號分別見表3.1和圖3.4。在實際的數字積體電路中,IN相當於只可輸入的引腳,OUT相當於只可輸出的引腳,BUFFER相當於帶輸出緩衝器並可以回讀的引腳(與TRI引腳不同),而INOUT相當於雙向引腳(即BIDIR引腳)。由圖3.4的INOUT電路可見,此模式的端口是普通輸出端口(OUT)加入三態輸出緩衝器和輸入緩衝器構成的。在實用中,端口描述中的數據類型主要有兩類:位(BIT)和位向量(BIT_VECTOR)。若端口的數據類型定義為BIT,則其信號值是一個1位的二進位數,取值只能是0或1;若端口數據類型定義為BIT_VECTOR,則其信號值是一組二進位。表3.1端口模式說明圖3.4端口模式符號圖3.2.4結構體(ARCHITECTURE)

結構體是用於描述設計實體的內部結構以及實體端口間的邏輯關係。結構體內部構造的描述層次和描述內容一般可以用圖3.5來說明。一般地,一個完整的結構體由兩個基本層次組成:●對數據類型、常數、信號、副程式和元件等元素的說明部分。●描述實體邏輯行為的,以各種不同的描述風格表達的功能描述語句。圖3.5結構體構造圖

結構體將具體實現一個實體。每個實體可以有多個結構體,每個結構體對應著實體不同結構和演算法實現方案,其間的各個結構體的地位是同等的,它們完整地實現了實體的行為,但同一結構體不能為不同的實體所擁有。結構體不能單獨存在,它必須有一個介面說明,即一個實體。對於具有多個結構體的實體,必須用CONFIGURATION配置語句指明用於綜合的結構體和用於仿真的結構體,即在綜合後的可映射於硬體電路的設計實體中,一個實體只對應一個結構體。在電路中,如果實體代表一個器件符號,則結構體描述了這個符號的內部行為。當把這個符號例化成一個實際的器件安裝到電路上時,則需配置語句為這個例化的器件指定一個結構體(即指定一種實現方案),或由編譯器自動選一個結構體。

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

ARCHITECTURE結構體名OF實體名IS

[說明語句]BEGIN[功能描述語句]ENDARCHITECTURE結構體名;其中,實體名必須是所在設計實體的名字,而結構體名可以由設計者自己選擇,但當一個實體具有多個結構體時,結構體的取名不可重複。

2.結構體說明語句結構體中的說明語句是對結構體的功能描述語句中將要用到的信號(SIGNAL)、數據類型(TYPE)、常數(CONSTANT)、元件(COMPONENT)、函數(FUNCTION)和過程(PROCEDURE)等加以說明的語句。但在一個結構體中說明和定義的數據類型、常數、元件、函數和過程只能用於這個結構體中,若希望其能用於其他的實體或結構體中,則需要將其作為程式包來處理。

3.功能描述語句結構如圖3.5所示的功能描述語句結構可以含有五種不同類型的,以並行方式工作的語句結構。而在每一語句結構的內部可能含有並行運行的邏輯描述語句或順序運行的邏輯描述語句。各語句結構的基本組成和功能分別是:

(1)塊語句是由一系列並行執行語句構成的組合體,它的功能是將結構體中的並行語句組成一個或多個模組。(2)進程語句定義順序語句模組,用以將從外部獲得的信號值,或內部的運算數據向其他的信號進行賦值。

(3)信號賦值語句將設計實體內的處理結果向定義的信號或介面端口進行賦值。

(4)副程式調用語句用於調用一個已設計好的副程式。

(5)元件例化語句對其他的設計實體作元件調用說明,並將此元件的端口與其他的元件、信號或高層次實體的介面端口進行連接。3.3VHDL語言要素3.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.0(3)以數制基數表示的文字:用這種方式表示的數由五個部分組成。第一部分,用十進位數標明數制進位的基數;第二部分,數制隔離符號“#”;第三部分,表達的文字;第四部分,指數隔離符號“#”;第五部分,用十進位表示的指數部分,這一部分的數如果是0可以省去不寫。現舉例如下:10#170#--(十進位數表示,等於170)2#1111_1110#--(二進位數表示,等於254)16#E#E1--(十六進制數表示,等於2#11100000#,等於224)16#F.01#E+2--(十六進制數表示,等於3841.00)(4)物理量文字(VHDL綜合器不接受此類文字)。如:60s(60秒),100m(100米),kΩ(千歐姆),177A(177安培)

2.字串型文字字元是用單引號引起來的ASCII字元,可以是數值,也可以是符號或字母,如:‘R’,‘A’,‘*’,‘Z’。而字串則是一維的字元數組,須放在雙引號中。VHDL中有兩種類型的字串:文字字串和數位字串。

(1)文字字串:文字字串是用雙引號引起來的一串文字,如:“ERROR”,“BOTHSANDQEQUALTOL”,“X”,“BB$CC”(2)數位字串:數位字串也稱位向量,是預定義的數據類型BIT的一位數組,它們所代表的是二進位、八進制或十六進制的數組,其位向量的長度即為等值的二進位數的位數。數位字串的表示首先要有計算基數,然後將該基數表示的值放在雙引號中,基數符以“B”、“O”和“X”表示,並放在字串的前面。它們的含義分別是:●B:二進位基數符號,表示二進位數位0或1,在字串中每一個位表示一個BIT。●O:八進制基數符號,在字串中的第一個數代表一個八進制數,即代表一個3位(BIT)的二進位數。●X:十六進制基數符號(0~F),代表一個十六進制數,即代表一個4位的二進位數。例如:B“1_1101_1110” --二進位數數組,位矢數組長度是9X“AD0”

--十六進制數數組,位矢數組長度是12

3.識別字識別字用來定義常數、變數、信號、端口、副程式或參數的名字。VHDL的基本識別字就是以英文字母開頭,不連續使用下劃線“_”,不以下劃線“_”結尾的,由26個大小寫英文字母、數字0~9以及下劃線“_”組成的字串。VHDL’93標準還支持擴展識別字,但是目前仍有許多VHDL工具不支持擴展識別字。識別字中的英語字母不分大小寫。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;SIGNALY,Z:BIT;Y<=A(M); --M是不可計算型下標表示Z<=B(3); --3是可計算型下標表示C(0TO3)<=A(4TO7); --以段的方式進行賦值C(4TO7)<=A(0TO3); --以段的方式進行賦值3.3.2VHDL數據對象在VHDL中,數據對象(DataObjects)類似於一種容器,它接受不同數據類型的賦值。數據對象有三種,即常量(CONSTANT)、變數(VARIABLE)和信號(SIGNAL)。前兩種可以從傳統的電腦高級語言中找到對應的數據類型,其語言行為與高級語言中的變數和常量十分相似。但信號是具有更多的硬體特徵的特殊數據對象,是VHDL中最有特色的語言要素之一。

1.常量(CONSTANT)

常量的定義和設置主要是為了使設計實體中的常數更容易閱讀和修改。例如,將位矢的寬度定義為一個常量,只要修改這個常量就能很容易地改變寬度,從而改變硬體結構。在程式中,常量是一個恒定不變的值,一旦作了數據類型的賦值定義後,在程式中不能再改變,因而具有全局意義。常量的定義形式如下:CONSTANT常量名:數據類型﹕=運算式;例如:CONSTANTFBUS﹕BIT_VECTOR﹕=“010115”;CONSTANTVCC﹕REAL﹕=5.0;CONSTANTDELY﹕TIME﹕=25ns;VHDL要求所定義的常量數據類型必須與運算式的數據類型一致。常量的數據類型可以是標量類型或複合類型,但不能是檔類型(File)或存取類型(Access)。常量定義語句所允許的設計單元有實體、結構體、程式包、塊、進程和副程式。在程式包中定義的常量可以暫不設具體數值,它可以在程式包體中設定。

常量的可視性,即常量的使用範圍取決於它被定義的位置。在程式包中定義的常量具有最大全局化特徵,可以用在調用此程式包的所有設計實體中;定義在設計實體中的常量,其有效範圍為這個實體定義的所有的結構體;定義在設計實體的某一結構體中的常量,則只能用於此結構體;定義在結構體的某一單元的常量,如一個進程中,則這個常量只能用在這一進程中。

2.變數(VARIABLE)

在VHDL語法規則中,變數是一個局部量,只能在進程和副程式中使用。變數不能將資訊帶出對它作出定義的當前設計單元。變數的賦值是一種理想化的數據傳輸,是立即發生,不存在任何延時的行為。VHDL語言規則不支持變數附加延時語句。變數常用在實現某種演算法的賦值語句中。定義變數的語法格式如下:VARIABLE變數名:數據類型:=初始值;例如:VARIABLEA:INTEGER;--定義A為整數型變數VARIABLEB,C:INTEGER:=2;--定義B和C為整型變數,初始值為2

變數作為局部量,其適用範圍僅限於定義了變數的進程或副程式中。仿真過程中惟一的例外是共用變數。變數的值將隨變數賦值語句的運算而改變。變數定義語句中的初始值可以是一個與變數具有相同數據類型的常數值,也可以是一個全局靜態運算式,這個運算式的數據類型必須與所賦值變數一致。此初始值不是必需的,綜合過程中綜合器將略去所有的初始值。變數數值的改變是通過變數賦值來實現的,其賦值語句的語法格式如下:目標變數名:=運算式;

3.信號(SIGNAL)

信號是描述硬體系統的基本數據對象,它類似於連接線。信號可以作為設計實體中並行語句模組間的資訊交流通道。在VHDL中,信號及其相關的信號賦值語句、決斷函數、延時語句等很好地描述了硬體系統的許多基本特徵。如硬體系統運行的並行性;信號傳輸過程中的慣性延時特性;多驅動源的匯流排行為等。信號作為一種數值容器,不但可以容納當前值,也可以保持歷史值。這一屬性與觸發器的記憶功能有很好的對應關係。信號的定義格式如下:

SIGNAL信號名:數據類型﹕=初始值;

信號初始值的設置不是必需的,而且初始值僅在VHDL的行為仿真中有效。與變數相比,信號的硬體特徵更為明顯,它具有全局性特性。例如,在程式包中定義的信號,對於所有調用此程式包的設計實體都是可見的;在實體中定義的信號,在其對應的結構體中都是可見的。事實上,除了沒有方向說明以外,信號與實體的端口(PORT)概念是一致的。相對於端口來說,其區別只是輸出端口不能讀入數據,輸入端口不能被賦值。信號可以看成是實體內部的端口。反之,實體的端口只是一種隱形的信號,端口的定義實際上是作了隱式的信號定義,並附加了數據流動的方向。信號本身的定義是一種顯式的定義,因此,在實體中定義的端口,在其結構體中都可以看成一個信號,並加以使用而不必另作定義。以下是信號的定義示例:SIGNALS1:STD_LOGIG﹕=0;--定義了一個標準位的單值信號S1,初始值為低電平SIGNALS2,S3:BIT; --定義了兩個位BIT的信號S2和S3SIGNALS4:STD_LOGIC_VECTOR(15DOWNTO0); --定義了一個標準位矢的位向量--(數組、匯流排)信號,共有16個信號元素以下示例定義的信號數據類型是設計者自行定義的,這是VHDL所允許的:TYPEFOURIS(‘X’,‘0’,‘I’,‘Z’);SIGNALS1﹕FOUR;SIGNALS2﹕FOUR﹕=‘X’;SIGNALS3﹕FOUR﹕=‘L’;

其中,信號S1的初始值取為默認值,VHDL規定初始值取值以取LEFT'MOST項(即數組中的最左項)為默認值。在此例中是‘X’(任意狀態)。信號的使用和定義範圍是實體、結構體和程式包。在進程和副程式中不允許定義信號。信號可以有多個驅動源,或者說賦值信號源,但必須將此信號的數據類型定義為決斷性數據類型。在進程中,只能將信號列入敏感表,而不能將變數列入敏感表。可見進程只對信號敏感,而對變數不敏感。

4.三者的使用比較

(1)從硬體電路系統來看,常量相當於電路中的恒定電平,如GND或VCC介面,而變數和信號則相當於組合電路系統中門與門間的連接及其連線上的信號值。

(2)從行為仿真和VHDL語句功能上看,二者的區別主要表現在接受和保持信號的方式、資訊保持與傳遞的區域大小上。例如信號可以設置延時量,而變數則不能;變數只能作為局部的資訊載體,而信號則可作為模組間的資訊載體。變數的設置有時只是一種過渡,最後的資訊傳輸和介面間的通信都靠信號來完成。(3)從綜合後所對應的硬體電路結構來看,信號一般將對應更多的硬體結構,但在許多情況下,信號和變數並沒有什麼區別。例如在滿足一定條件的進程中,綜合後它們都能引入寄存器。這時它們都具有能夠接受賦值這一重要的共性,而VHDL綜合器並不理會它們在接受賦值時存在的延時特性。

(4)雖然VHDL仿真器允許變數和信號設置初始值,但在實際應用中,VHDL綜合器並不會把這些資訊綜合進去。這是因為實際的FPGA/CPLD晶片在上電後,並不能確保其初始狀態的取向。因此,對於時序仿真來說,設置的初始值在綜合時是沒有實際意義的。3.3.3VHDL數據類型

VHDL是一種強類型語言,要求設計實體中的每一個常數、信號、變數、函數以及設定的各種參量都必須具有確定的數據類型,並且相同數據類型的量才能互相傳遞和作用。VHDL作為強類型語言的好處是使VHDL編譯或綜合工具很容易地找出設計中的各種常見錯誤。VHDL中的數據類型可以分成四大類。標量型(SCALARTYPE):屬單元素的最基本的數據類型,通常用於描述一個單值數據對象,它包括實數類型、整數類型、枚舉類型和時間類型。

複合類型(COMPOSITETYPE):可以由細小的數據類型複合而成,如可由標量複合而成。複合類型主要有數組型(ARRAY)和記錄型(RECORD)。存取類型(ACCESSTYPE):為給定的數據類型的數據對象提供存取方式。檔類型(FILESTYPE):用於提供多值存取類型。這四大數據類型又可分成在現成程式包中可以隨時獲得的預定義數據類型和用戶自定義數據類型兩個類別。預定義的VHDL數據類型是VHDL最常用、最基本的數據類型。這些數據類型都已在VHDL的標準程式包STANDARD和STD_LOGIC_1164及其他的標準程式包中作了定義,並可在設計中隨時調用。

用戶自定義的數據類型以及子類型,其基本元素一般仍屬VHDL的預定義數據類型。儘管VHDL仿真器支持所有的數據類型,但VHDL綜合器並不支持所有的預定義數據類型和用戶自定義數據類型。如REAL、TIME、FILE、ACCES等數據類型。在綜合中,它們將被忽略或宣佈為不支持。

1.VHDL的預定義數據類型

1)布爾(BOOLEAN)數據類型程式包STANDARD中定義布爾數據類型的源代碼如下:

TYPEBOOLEANIS(FALES,TRUE);布爾數據類型實際上是一個二值枚舉型數據類型,它的取值有FALSE和TRUE兩種。綜合器將用一個二進位位表示BOOLEAN型變數或信號。例如,當A大於B時,在IF語句中的關係運算運算式(A>B)的結果是布爾量TRUE,反之為FALSE。綜合器將其變為1或0信號值,對應於硬體系統中的一根線。2)位(BIT)數據類型位數據類型也屬於枚舉型,取值只能是1或0。位數據類型的數據對象,如變數、信號等,可以參與邏輯運算,運算結果仍是位的數據類型。VHDL綜合器用一個二進位位表示BIT。在程式包STANDARD中定義的源代碼是:

TYPEBITIS(‘0’,‘1’);3)位向量(BIT_VECTOR)數據類型位向量只是基於BIT數據類型的數組,在程式包STANDARD中定義的源代碼是:

TYPEBIT_VETORISARRAY(NATURALRANGE<>)OFBIT;使用位向量必須注明位寬,即數組中的元素個數和排列,例如:

SIGNALA﹕BIT_VECTOR(7TO0);信號A被定義為一個具有8位位寬的向量,它的最左位是A(7),最右位是A(0)。4)字元(CHARACTER)數據類型字元類型通常用單引號引起來,如‘A’。字元類型區分大小寫,如‘B’不同於‘b’。字元類型已在STANDARD程式包中作了定義。5)整數(INTEGER)數據類型整數類型的數代表正整數、負整數和零。在VHDL中,整數的取值範圍是-21473647~+21473647,即可用32位有符號的二進位數表示。在實際應用中,VHDL仿真器通常將INTEGER類型作為有符號數處理,而VHDL綜合器則將INTEGER作為無符號數處理。在使用整數時,VHDL綜合器要求用RANGE子句為所定義的數限定範圍,然後根據所限定的範圍來決定表示此信號或變數的二進位數的位數,因為VHDL綜合器無法綜合未限定的整數類型的信號或變數。

如語句“SIGNALTYPE1﹕INTEGERRANGE0TO15;”規定整數TYPE1的取值範圍是0~15共16個值,可用4位二進位數來表示,因此,TYPE1將被綜合成由四條信號線構成的信號。整數常量的書寫方式示例如下:2 --十進位整數10E4 --十進位整數16#D2# --十六進制整數2#11011010#--二進位整數6)自然數(NATURAL)和正整數(POSITIVE)數據類型自然數是整數的一個子類型,非負的整數,即零和正整數;正整數也是整數的一個子類型,它包括整數中非零和非負的數值。它們在STANDARD程式包中定義的源代碼如下:

SUBTYPENATURALISINTEGERRANGE0TOINTEGER'HIGH;

SUBTYPEPOSITIVEISINTEGERRANGE1TOINTEGER'HIGH;7)實數(REAL)數據類型

VHDL的實數類型類似於數學上的實數,或稱浮點數。實數的取值範圍為-1.0E38~+1.0E38。通常情況下,實數類型僅能在VHDL仿真器中使用,VHDL綜合器不支持實數,因為實數類型的實現相當複雜,目前在電路規模上難以承受。實數常量的書寫方式舉例如下:

65971.333333--十進位浮點數

8#43.6#E+4

--八進制浮點數

43.6E-4--十進位浮點數8)字串(STRING)數據類型字串數據類型是字元數據類型的一個非約束型數組,或稱為字串數組。字串必須用雙引號標明。如:VARIABLESTRING_VAR﹕STRING(1TO7);…STRING_VAR﹕“ABCD”;9)時間(TIME)數據類型

VHDL中惟一的預定義物理類型是時間。完整的時間類型包括整數和物理量單位兩部分,整數和單位之間至少留一個空格,如55ms,20ns。STANDARD程式包中也定義了時間。定義如下:TYPETIMEISRANGE-2147483647TO2147483647units

fs; --飛秒,VHDL中的最小時間單位

ps=1000fs; --皮秒

ns=1000ps; --納秒

us=1000ns; --微秒

ms=1000us; --毫秒

sec=1000ms; --秒

min=60sec; --分

hr=60min; --時enduntis;10)錯誤等級(SEVERITY_LEVEL)

在VHDL仿真器中,錯誤等級用來指示設計系統的工作狀態,共有四種可能的狀態值:NOTE(注意)、WARNING(警告)、ERROR(出錯)、FAILURE(失敗)。在仿真過程中,可輸出這四種值來提示被仿真系統當前的工作情況。其定義如下:

TYPESEVERITY_LEVELIS(NOTE,WARNING,ERROR,FAILURE);

2.IEEE預定義標準邏輯位與向量在IEEE庫的程式包STD_LOGIC_1164中,定義了兩個非常重要的數據類型,即標準邏輯位STD_LOGIC和標準邏輯向量STD_LOGIC_VECTOR。

1)標準邏輯位STD_LOGIC_1164中的數據類型以下是定義在IEEE庫程式包STD_LOGIC_1164中的數據類型。數據類型STD_LOGIC的定義如下所示:

TYPESTD_LOGICIS('U','X',‘0’,'1','Z','W','L','H','-');

各值的含義是:

'U'--未初始化的,'X'--強未知的,‘0’--強0,'1'--強1,'Z'--高阻態,'W'--弱未知的,'L'--弱0,'H'--弱1,'-'--忽略。在程式中使用此數據類型前,需加入下麵的語句:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;

由定義可見,STD_LOGIC是標準的BIT數據類型的擴展,共定義了9種值,這意味著,對於定義為數據類型是標準邏輯位STD_LOGIC的數據對象,其可能的取值已非傳統的BIT那樣只有0和1兩種取值,而是如上定義的那樣有9種可能的取值。目前在設計中一般只使用IEEE的STD_LOGIC標準邏輯的位數據類型,BIT型則很少使用。由於標準邏輯位數據類型的多值性,在編程時應當特別注意。因為在條件語句中,如果未考慮到STD_LOGIC的所有可能的取值情況,綜合器可能會插入不希望的鎖存器。

程式包STD_LOGIC_1164中還定義了STD_LOGIC型邏輯運算符AND、NAND、OR、NOR、XOR和NOT的重載函數,以及兩個轉換函數,用於BIT與STD_LOGIC的相互轉換。在仿真和綜合中,STD_LOGIC值是非常重要的,它可以使設計者精確模擬一些未知和高阻態的線路情況。對於綜合器,高阻態和“-”忽略態可用於三態的描述。但就綜合而言,STD_LOGIC型數據能夠在數字器件中實現的只有其中的4種值,即“-”、“0”、“1”和“Z”。當然,這並不表明其餘的5種值不存在。這9種值對於VHDL的行為仿真都有重要意義。2)標準邏輯向量(STD_LOGIC_VECTOR)數據類型

STD_LOGIC_VECTOR類型定義如下:

TYPESTD_LOGIC_VECTORISARRAY(NATURALRANGE<>)OFSTD_LOGIC;顯然,STD_LOGIC_VECTOR是定義在STD_LOGIC_1164程式包中的標準一維數組,數組中的每一個元素的數據類型都是以上定義的標準邏輯位STD_LOGIC。

STD_LOGIC_VECTOR數據類型的數據對象賦值的原則是:同位寬、同數據類型的向量間才能進行賦值。下例描述的是CPU中數據匯流排上位矢賦值的操作示意情況,注意例中信號數據類型定義和賦值操作中信號的數組位寬。【例3.3.1】…TYPET_DATAISARRAY(7DOWNTO0)OFSTD_LOGIC;--自定義數組類型SIGNALDATABUS,MEMORY:T_DATA;--定義信號DATABUS,MEMORYCPU﹕PROCESS --CPU工作進程開始VAR1ABLEREG1﹕T_DATA --定義寄存器變數REG1BEGIN…DATABUS<=REG1; --向8位數據匯流排賦值ENDPROCESSCPU; --CPU工作進程結束MEM﹕PROCESS --RAM工作進程開始BEGIN…DATABUS<=MEMORY;ENDPROCESSMEM;…

3.其他預定義標準數據類型

VHDL綜合工具配帶的擴展程式包中,定義了一些有用的類型。如Synopsys公司在IEEE庫中加入的程式包STD_LOGIC_ARITH中定義了如下的數據類型:無符號型(UNSIGNED)、有符號型(SIGNED)、小整型(SMALL_INT)。在程式包STD_LOGIC_ARITH中的類型定義如下:TYPEUNSIGNEDISARRAY(NATURALRANGE<>)OFSTD_LOGIC;TYPESIGNEDISARRAY(NATURALRANGE<>)OFSTD_LOGIC;SUBTYPESMALL_INTISINTEGERRANGE0TO1;

如果將信號或變數定義為這幾個數據類型,就可以使用本程式包中定義的運算符。在使用之前,請注意必須加入下麵的語句:LIBRARYIEEE;USEIEEE.STD_LOGIC_ARITH.ALL;

UNSIGNED類型和SIGNED類型是用來設計可綜合的數學運算程式的重要類型,UNSIGNED用於無符號數的運算,SIGNED用於有符號數的運算。在實際應用中,大多數運算都需要用到它們。

在IEEE程式包中,UNMERIC_STD和NUMERIC_BIT程式包中也定義了UNSIGNED型及SIGNED型,NUMERIC_STD是針對於STD_LOGIC型定義的,而NUMERIC_BIT是針對於BIT型定義的。在程式包中還定義了相應的運算符重載函數。有些綜合器沒有附帶STD_LOGIC_ARITH程式包,此時只能使用NUMBER_STD和NUMERIC_BIT程式包。在STANDARD程式包中沒有定義STD_LOGIC_VECTOR的運算符,而整數類型一般只在仿真的時候用來描述演算法,或作數組下標運算,因此UNSIGNED和SIGNED的使用率是很高的。1)無符號數據類型(UNSIGNEDTYPE)UNSIGNED數據類型代表一個無符號的數值,在綜合器中,這個數值被解釋為一個二進位數,這個二進位數的最左位是其最高位。例如,十進位的8可以作如下表示:

UNSIGNED(“1000")

如果要定義一個變數或信號的數據類型為UNSIGNED,則其位矢長度越長,所能代表的數值就越大。如一個4位變數的最大值為15,一個8位變數的最大值則為255,0是其最小值,不能用UNSIGNED定義負數。以下是兩則無符號數據定義的示例:VARIABLEVAR﹕UNSIGNED(0TO10);SIGNALSIG﹕UNSIGNED(5TO0);其中,變數VAR有11位數值,最高位是VAR(0),而非VAR(10);信號SIG有6位數值,最高位是SIG(5)。2)有符號數據類型(SIGNEDTYPE)SIGNED數據類型表示一個有符號的數值,綜合器將其解釋為補數,此數的最高位是符號位,例如:SIGNED(“0101”)代表+5,5;SIGNED(“1011”)代表-5。若將上例的VAR定義為SIGNED數據類型,則數值意義就不同了,如:

VARIABLEVAR﹕SIGNED(0TO10);其中,變數VAR有11位,最左位VAR(0)是符號位。

4.用戶自定義數據類型方式

VHDL允許用戶自行定義新的數據類型,它們可以有多種,如枚舉類型(ENUMERA-TIONTYPE)、整數類型(INTEGERTYPE)、數組類型(ARRAYTYPE)、記錄類型(RECORDTYPE)、時間類型(TIMETYPE)、實數類型(REALTYPE)等。用戶自定義數據類型是用類型定義語句TYPE和子類型定義語句SUBTYPE實現的,以下將介紹這兩種語句的使用方法。1)TYPE語句用法

TYPE語句語法結構如下:

TYPE數據類型名IS數據類型定義[OF基本數據類型];其中,數據類型名由設計者自定;數據類型定義部分用來描述所定義的數據類型的表達方式和表達內容;關鍵字OF後的基本數據類型是指數據類型定義中所定義的元素的基本數據類型,一般都是取已有的預定義數據類型,如BIT、STD_LOGIC或INTEGER等。

以下列出了兩種不同的定義方式:

TYPEST1ISARRAY(0TO15)OFSTD_LOGIC;

TYPEWEEKIS(SUN,MON,TUE,WED,THU,FRI,SAT);第一句定義的數據ST1是一個具有16個元素的數組型數據類型,數組中的每一個元素的數據類型都是STD_LOGIC型;第二句所定義的數據類型是由一組文字表示的,而其中的每一文字都代表一個具體的數值,如可令SUN=“1010”。

在VHDL中,任一數據對象(SIGNAL、VARIABLE、CONSTANT)都必須歸屬某一數據類型,只有同數據類型的數據對象才能進行相互作用。利用TYPE語句可以完成各種形式的自定義數據類型以供不同類型的數據對象間的相互作用和計算。2)SUBTYPE語句用法子類型SUBTYPE只是由TYPE所定義的原數據類型的一個子集,它滿足原數據類型的所有約束條件,原數據類型稱為基本數據類型。子類型SUBTYPE的語句格式如下:

SUBTYPE子類型名IS基本數據RANGEA約束範圍;子類型的定義只在基本數據類型上作一些約束,並沒有定義新的數據類型。子類型定義中的基本數據類型必須在前面已通過TYPE定義的類型。如下例:

SUBTYPEDIGITSINTEGERRANGE0TO9;

例中,INTEGER是標準程式包中已定義過的數據類型,子類型DIGITS只是把INTEGER約束到只含10個值的數據類型。由於子類型與其基本數據類型屬同一數據類型,因此屬於子類型的和屬於基本數據類型的數據對象間的賦值和被賦值可以直接進行,不必進行數據類型的轉換。利用子類型定義數據對象的好處是,除了使程式提高可讀性和易處理外,其實質性的好處在於有利於提高綜合的優化效率,這是因為綜合器可以根據子類型所設的約束範圍,有效地推知參與綜合的寄存器的最合適的數目。

5.枚舉類型

VHDL中的枚舉數據類型是用文字符號來表示一組實際的二進位數的類型(若直接用數值來定義,則必須使用單引號)。例如狀態機的每一狀態在實際電路雖是以一組觸發器的當前二進位數位的組合來表示的,但設計者在狀態機的設計中,為了更便於閱讀和編譯,往往將表徵每一狀態的二進位數組用文字符號來代表。

【例3.3.2】

TYPEM_STATEIS(STATE1,STATE2,STATE3,STATE4,STATE5);

SIGNALCURRENT_STATE,NEXT_STATE:M_STATE;在這裏,信號CURRENT_STATE和NEXT_STATE的數據類型定義為M_STATE,它們的取值範圍是可枚舉的,即從STATE1~STATE5共5種,而這些狀態代表5組惟一的二進位數值。

在綜合過程中,枚舉類型文字元素的編碼通常是自動的,編碼順序是默認的,一般將第一個枚舉量(最左邊的量)編碼為0,以後的依次加1。綜合器在編碼過程中自動將第一枚舉元素轉變成位向量,位矢的長度將取所需表達的所有枚舉元素的最小值。如上例中用於表達5個狀態的位矢長度應該為3,編碼默認值為如下方式:

STATE1='000';STATE2='001';STATE3='010';STATE4='011';STATE5='100';於是它們的數值順序便成為STATE1<STATE2<STATE3<STATE4<STATE5。一般而言,編碼方法因綜合器不同而不同。為了某些特殊的需要,編碼順序也可以人為設置。

6.整數類型和實數類型整數和實數的數據類型在標準的程式包中已作了定義,但在實際應用中,特別在綜合中,由於這兩種非枚舉型的數據類型的取值定義範圍太大,綜合器無法進行綜合。因此,定義為整數或實數的數據對象的具體的數據類型必須由用戶根據實際的需要重新定義,並限定其取值範圍,以便能為綜合器所接受,從而提高晶片資源的利用率。實際應用中,VHDL仿真器通常將整數或實數類型作為有符號數處理,VHDL綜合器對整數或實數的編碼方法是:·對用戶已定義的數據類型和子類型中的負數,編碼為二進位補數;

·對用戶已定義的數據類型和子類型中的正數,編碼為二進位原碼。編碼的位數,即綜合後信號線的數目只取決於用戶定義的數值的最大值。在綜合中,以浮點數表示的實數將首先轉換成相應數值大小的整數。因此在使用整數時,VHDL綜合器要求使用數值限定關鍵字RANGE,對整數的使用範圍作明確的限制。如下例所示:

【例3.3.3】

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论