VHDL程式結構
VHDL五大元素
-Entity
*Block的I/O port規格
-Architecture
*Block的内部電路
*可同時具有多個
-Configuration
*決定哪一個architecture被使用
-Package
-Lib
第一要素實體:
實體描述了子產品的内部接口和外部接口的相關參數
在VHDL中實體描述的結構:
entity 實體名稱 is
port (端口名稱:端口模式 資料類型;
端口名稱:端口模式 資料類型;
端口名稱:端口模式 資料類型);
end 實體名稱
1.端口名稱
一般一個子產品的實體包含不止一個端口,為了差別不同的端口,會将端口的含義包含在名稱中。
端口模式:
in 輸入,隻能被讀取,不能被指派
out 輸出,隻能被指派,不能被讀取
inout 雙向,可以被讀取也可以被指派,被讀取時的值是從端口輸入的值
buffer 緩沖輸出,類似于out,但是值可以被讀取,讀取的值就是被賦的值
linkage 不指定方向
inout端口是雙向端口,既可以做内部信号的輸出端口,也可以做外部信号的輸入端口,但是輸入和輸出是分複服
用的,輸入的信号值是外部信号的驅動的值,而不是内部輸出時驅動的值。
buffer是緩沖輸出接口,使用buffer輸出的信号在實體内部仍可以對其他信号進行指派
基本資料類型:
bit
bit_vector(0 to 7)
Std_logic
Std_logic_vector(15 to 0)
bit隻有0和1兩種取值
Std_logic:有多種取值
'U'——初始值'
‘X’--不定
‘0’--0
‘1’--1
‘Z’--高阻
‘W’--弱信号不定
‘L’--弱信号0
‘H’--弱信号1
‘-’--不可能的情況
構造體:
通常用構造體對實體的内部實作做更加詳細的描述。構造體是一個從屬單元,不能獨立于子產品中,必須與實體聲
明聯合使用。而一個實體聲明可以有多個構造體。
architecture 構造體名稱 of 實體名稱 is
{聲明語句;}
begin
{并發語句}
end 構造體名稱
構造體在描述子產品的内部實作時通常有三種方式,行為描述,資料流描述和結構描述。
(1)行為描述是抽象層最高的描述。主要使用電路的行為特性來描述設計。在VHDL中通常用Process的方式進行
行為描述。
(2)資料流的描述方式主要使用VHDL語言的标準布爾函數,将信号之間的布爾代數關系用布爾方程式來表示。
(3)結構描述主要通過下層子產品的聲明和調用即端口映射将下層子產品相連,構成電路的結構性描述。
聲明語句:
聲明語句在構造體的關鍵字“begin”之前,可用于下列描述語句:
“use”語句
子程式(subprogram)聲明
子程式體(subprogram body)
類型(type)聲明
子類型(subtype)聲明
常量(constant)聲明
信号(signal)聲明
元件(component)聲明
并發(concurrent)語句
并發語句:
構造體中的每一個并發語句都定義了一個運算單元,這個單元包括三個部分:
讀取信号的值
用讀取的信号的值進行運算
将運算的結果指派給另外一個信号。
構造體中的所有并發語句都是同時執行的,與語句的書寫順序沒有任何關系。并發語句有五種類型:
塊(block)語句
元件(component)例化
過程(Procedure)調用
程序(process)
信号(signal)指派
3.配置
一個實體聲明可以有多個構造體,但這個實體被上層子產品調用,并在最終形成電路時,隻能使用一種結構體作為
實體功能實作的描述。這時就需要用配置結構經将實體與對應的結構體連接配接起來。
configuration 配置名稱 of 實體名稱 is
配置語句;
end 配置名稱
Configuration cfg_nand2 of NAND2 is
for RTL
end for;
End cfg_nand2;
4.Package
package的作用就是程式包首的說明可收集多個VHDL設計所需的公共資訊
包集合用于存儲在工程設計中需要反複用到的常量定義、資料類型定義、子類型定義等
5.庫
VHDL設計元素經過編譯後,包含在庫中,庫和包集合構成了工程資料的管理結構
-标準庫(IEEE)
-STD庫:VHDL标準庫,有标準的STANDARD包集合
-ASIC庫:晶片廠商提供
-WORK庫,類似于檔案夾,所有單元都在詞庫中
-使用者自定義庫:使用者自行開發
VHDL語言的對象和資料類型
1.VHDL語言的資料類型
VHDL對類型的要求很嚴格,所有的端口、常量、變量和信号在聲明時都要顯式的定義其對應的資料類型。不同類
型之間不能指派,資料類型相同,而位長不同時也不能帶入。
VHDL中定義了很多種資料類型:
标量類型(Scalar Type)
複合類型(Composite Type)
存取類型(Access Type)
檔案類型(Files Type)
使用者定義的子類型(Sub Type)
标量類型是VHDL中最基本的類型,用于描述一個單值資料對象。屬于标量類型的資料有以下幾種:
位型(BIT)
布爾型(BOOLEAN)
整型(INTEGER)
實型(REAL)
實體型
符号型(CHARACTER)
标準邏輯類型(STD_LOGIC)
枚舉類型(ENUMERATE)
錯誤等級(SEVERITY_LEVEL)
(1)位
BIT型是數字邏輯中最基本的邏輯形式,BIT型在STD庫中有明确的定義,其定義如下:
type BIT is('0','1');
從上面的定義可以看出,BIT類型的資料隻能去兩個值。
(2)布爾
BOOLEAN型相對于BIT型的抽象層次更高,BOOLEAN型的定義如下:
type BOOLEAN is(FALSE,TRUE)
(3)INTEGER
通常INTEGER在定義時,都要用"range"語句給出資料的取值範圍,資料在後續使用過程中不能超出此範
圍。"range"定義必須在-(2^31-1)--(2^31-1)
(4)實型(REAL)
VHDL語言中,實型REAL也叫浮點型。
(5)實體型
實體型資料用于表示一些實體量,如重量、長度、時間、或電壓值等等,使用者可以根據工程需要定義一些實體數
據類型。完整的實體類型資料包含數值和機關兩部分,在定義一個實體類型的資料時,必須先給出一個基準機關,
其他的機關也必須是基準機關的倍數。VHDL中隻定義了一個實體類型TIME。
(6)符号型(CHARACTER)
符号型資料量通常用單引号括起來。VHDL對大小寫不敏感,但是字元中的大小寫字元被認為是不一樣的。
(7)标準邏輯類型(Std_Logic)
STD_LOGIC也是單個數字信号邏輯的
(8)枚舉類型
在VHDL中,也支援類似于其他程式設計語言中常用的枚舉類型。
枚舉類型的描述結構為
type 類型名稱 is(元素,元素...);
(9)錯誤等級
錯誤等級用于表征系統的運作狀态,有四種狀态可用:NOTE(注意),WARNING(警告),ERROR(錯誤)和
FAILURE(失敗)
複合類型
複合型的資料是指由多個單值資料組合起來的一組為資料,複合型資料是以向量、數組或記錄的形式存在
屬于複合類型的資料有以下幾種:
位矢量型(BIT_VECTOR)
标準邏輯矢量型(STD_LOGIC_VECTOR)
字元串型(STRING)
數組型(ARRAY)
記錄型(RECORD)
(1)位矢量型
位矢量型是由多個位型資料組合起來的一組資料。
(2)标準邏輯矢量型(STD_LOGIC_VECTOR)
标準邏輯矢量型是由多個标準邏輯資料組合起來的。
(3)字元串型(STRING)
字元串類型是由多個類型的字元類資料組合起來的。
(4)數組型(ARRAY)
數組型是由多個相同類型的資料組成的集合,組成集合的資料類型可以是任意的。
一個數組可以對另外一個數組進行指派,但是互相指派的兩個數組必須是相同類型的,而且數組的長度必須相同。
數組之間在指派時,是用對應位置的值進行指派的。
數組也可再用一種便捷的方式進行指派,即聯合指派。聯合指派不僅在數組中可以使用,多個标量對象在指派時
也可以采用這種形式。使用聯合指派時,出現在指派符号左側的聯合體隻能由标量類型組成。
(5)記錄型(RECORD)
與數組型類似,記錄型也是有多個資料組成的集合,但組成的集合的資料至少有兩種以上不同的類型。
RECORD類型資料定義結構為:
type 記錄名稱 is
record
元素名稱:資料類型名稱
。。。
end record
檔案類型
VHDL中的檔案類型是由某種類型的資料組成的資料流,可以在仿真中讀入和寫出。
一個檔案類型的執行個體如下:
type TEXT is file of STRING;
file MY_INFILE:TEXT is in "myinfile.txt";
file MY_OUTFILE:TEXT is out "myoutfile.dat"
使用者定義的子類型:
使用者可以根據工程設計的需要,修改已定義資料類型的方位限定,形成新的資料類型。這種類型稱為子類型
(subtype)。子類型定義結構如下:
subtype 子類型名稱 is 已定義類型名稱;
例如:
subtype MY_INT is INTEGER range 0 to 255;
2.VHDL語言的對象類型:
在VHDL中,可以被指派的對象都被稱為對象(Object),對象有很多種,常用的端口有(Port)、常量(Constant)、
信号(Signal)、變量(Variable)
端口(Port):
端口定義了實體的信号傳遞接口,在端口的定義中,資料類型是不可缺少的一部分。
常用的端口類型有輸入in輸出out雙向inout緩沖輸出buffer四種,其中input、inout,buffer端口可以對其他對
象指派,outPut,inOUT和buffer可以被其他對象指派。
常量:
常量是一個固定的值。常量在被建立時就被指派為一個固定的值,并且常量的值在使用過程中隻能對其他對象賦
值,不能被修改。
常量可以在結構體、包集合、實體、快語句、過程語句和子函數中聲明,在結構體中聲明的常量是本地常量,隻
能在結構體中使用。
常量聲明的結構為:constant 常量名稱:資料類型:=常量表達式
變量
變量是用于存儲資訊的一種對象。變量在被建立時也可以賦初始值,但與常量相反,變量在使用過程中既可以對
其他對象進行指派,也可以被修改。
變量是一個局部量,不能在結構體中聲明,而隻能在程序語句(Process)、函數語句(Function)和過程
(Procedure)語句中聲明。
變量聲明的結構為:
variable 變量名稱:資料類型[:=初始值表達式]
變量用":="符号進行指派操作,例如:
V:="0111"
信号(Signal)
信号是電路底層硬體單元連接配接的抽象。在VHDL中,信号可以用于在結構體的不同并發語句之間進行消息傳遞,也
可以通過端口與其他實體傳遞消息。從某種意義上講,端口也是信号的一種,但是被限定了輸入/輸出特性,是以
也可以通過建立端口來建立一個信号,而端口的指派方式也與信号相同。
信号可以在實體(Entity)、結構體(Architecture)和塊語句(Block)中聲明,不能在程序(Process)語句
,函數(function)語句和過程(Procedure)語句中聲明,但可以在程序(Process)、函數(Function)和過
程(Procedure)中私用。
變量和信号的差別:
(1)聲明和使用的位置不同
變量隻能在程序語句(Process)、函數(Function語句,過程(Procedure)語句中進行聲明,也隻能在這些語
句内部使用,是以是一個局部對象。
信号可以在實體(Entity)、結構體(Architecture)和塊語句(Block)中聲明,在在程序語句(Process)、
函數(Function語句,過程(Procedure)語句中使用,是以可以在不同的程序之間傳遞消息,是一個全局對象
(2)指派符号與延遲不同
變量用":="指派,信号用"<="指派。
變量被指派時,可以被看作是右側表達式的代名詞,在使用變量是,可以用其所帶的表達式替代。如果指派的過
程被分為擷取資料值、數值計算、用計算結果進行指派這三個步驟,那麼變量在指派的過程中,第三部"用計算的
結果進行指派"這個操作時即時的。而信号是實體單元的抽象,是以第三個步驟是有時延的。
VHDL操作運算符:
1.邏輯運算符
2.關系運算符
3.移位運算符
sla 算術向左移位時,填入的位值為最後一個位值;算術向右移位時,填入的位值為第一個位值;邏輯向左和邏
輯向右移位時,預設新填入的值都為0;向左旋轉時,填入的位值為第一個位值;向右旋轉時,填入的位值為最後
一個位值。
4.算術運算符
5.并置運算符
并置運算符"&"用于标量和複合類型資料的并置連接配接,使用并置運算符可以很靈活地将标量或數組組織在一起,形
成更大的數組。
VHDL語言的描述語句
2.順序語句
指派語句
IF語句
CASE語句
LOOP語句
EXIT語句
NEXT語句
WAIT
NULL
ASSERT
VHDL中的斷言語句類似于C語言中的斷言語句,它是人機會話的一種手段。使用斷言語句可以檢測某一特定的條件
是否滿足,如果不滿足,可以給出相應的報告,它的文法結構為:
assert條件表達式(report 字元串資訊)[severity 級别]