1.VHDL的基礎知識
目錄
1.VHDL語言基礎
VHDL 概 概 述:
- VHDL VHSIC Hardwarter Description Language
- Very High speed integrated circuit
- VHDL 是美國國防部在20世 世紀 紀80 年代初 為實現 其高速集 成電路硬體VHSIC計 計 劃 提 出 的描述語言;
- IEEE 從1986 年開始致力於 於VHDL 標準化 工 作 , 融 合 了其它ASIC 晶片製造 商開發 的 硬體 描述語言的優點,於93 年形成 了標準版 本( (IEEE.std_1164) ) 。
- 1995年 , 我 國國家技術監督局推薦VHDL做 做 為電 子 設計 自動化硬體 描述語言的國家標準。
VHDL的優點:
- 覆蓋面廣,系統硬體描述能 力強 ,是一 個多層次的硬 描述語言;
- VHDL 語言 具 有 良好 的可 讀性 , 既 可以 被 計算機 接受 , 也容易被人們所理解;
- VHDL 語言可以 與 工藝 無關 程式設計;
- VHDL 語言 已做 為一種IEEE 的工 業標準 , 便 於 使 用、交流 和 推廣 。
1.1.識別符號 (Identifiers)
標 識符用來定義常數、 變數 、 訊號 、 埠 、 子程式或引數的名字,由字母 母(A~Z,a~z) 、數字(0~9)和下劃線 線(_)字元組成。
要求 :
- 首字元必須是字母
- 末字元不能為下 劃 線
- 不允許出現兩個連續的下劃線
- 不區分大小寫
- VHDL定義的保留字(關鍵字),不能用作識別符號
- 識別符號字元 最長可以是可以是32個字 符 。
注意:註釋由兩個連續的虛線( -- )引 導
關鍵字(保留 字):
關鍵字((keyword))是 是VHDL中具有特別含義的單詞 , 只能做為固定的用途 ,使用者不能用其做為識別符號。
如: ABS, ACCESS , AFTER , ALL , AND , ARCHITECTURE, ARRAY , ATTRIBUTE , BEGIN, BODY , BUFFER , BUS , CASE , COMPONENT , CONSTANT , DISCONNECT , DOWNTO , ELSE, ,ELSIF , END , ENTITY , EXIT , FILE , FOR , FUNCTION, GENERIC , GROUP , IF , INPURE , IN ,INOUT , IS , LABEL, LIBRARY , LINKAGE , LOOP , MAP , MOD , NAND , NEW , NEXT, ,NOR , NOT , NULL , OF , ON , OPEN , OR , OTHERS , OUT, PACKAGE , , POUT , , PROCEDURE , PROCESS , PURE , RANGE , RECODE , REM , REPORT , RETURN , ROL , ROR , SELECT, SHARED , SIGNAL , SLA , SLL , SRA , SUBTYPE , THEN, TRANSPORT , TO , , TYPE , UNAFFECTED , UNITS , UNTIL , USE, VARIABLE , WAIT , WHEN , WHILE , WITH ,XOR , XNOR。
1.2.資料物件(Date Objects)
資料物件包括常量 、變數 、訊號和檔案四種類型 。
-
常量 Constant
常量是對某一常量名賦予一個固定的值 ,而且只能賦值一次 。通常賦值在程式開始前進行, 該值的資料型別則在說明語句中指明。
Constant 常數名 :數 據 類 型 : =表示式
例子:
Constant Vcc :real:=5.0; -- 定義Vcc的資料型別是實數, 賦值為為5.0V
Constant bus_width: integer := 8; --定義匯流排寬度為常數8
注意事項:
- 常量所賦的值應和定義的資料型別一致 ;
- 常量在程式包 、實體 、構造體或程序的說明性區域內必須加以說明 。 定義在程式包內的常量可供所含的任何實體 、構造體所引用, 定義在實體說明內的常量只能在該實體內可見 , 定義在程序說明性區域中的常 量只能在該程序內可見。
-
變數Variable
變數只能在程序語句、函式語句和過程語句結構中使用。 變數的賦值是直接的,非預設的, 分配給變數的值立即成為當前值 , 變數不能 表達“ 連線” 或 儲存元件 ,不能設定傳輸延遲量。
變數定義語句:
Variable 變數名 : 資料型別 := 初始值
例子:
Variable count: integer 0 to 255:=20;
解釋:定義count整數變數 , 變化範圍0 ~255, 初始值為20。
變數賦值語句:
目標變數名 := 表示式;
例子:
x:=10.0; -- 實數變數賦值為10.0
Y:=1.5+x; -- 運算表示式賦值 , 注意表示式必須與目標變數的資料型別相 同
A(3 to 6):=(“1101”); -- 位向量賦值
-
訊號Signal
訊號表示邏輯閘的輸入或輸 出 ,類似於連線線, 也可以表達儲存元件的狀態。 訊號通常在構造體 、程式包和實體中。
訊號定義語句:
Signal 訊號名: 資料型別 := 初始值
例子:
Signal clock :bit := ‘0 ’; -- 定義時鐘訊號型別 ,初始值為0
Signal count :BIT_VECTOR(3 DOWNTO 0); -- 定義count 為4位向量
訊號賦值語句:
目標訊號名 <= 表示式;
例子:
x<=9;
Z<=x after 5 ns; -- 在5ns 後將x的值賦予z
1.3.資料型別
-
VHDL的預定義資料型別
在 VHDL標準程式包STANDARD中定義好 ,實際使用過程中, 已自動包含進VHDL原始檔中,不需要通過USE語句顯式呼叫。
- 布林:(Boolean)
TYPE BOOLEAN IS (FALSE, TRUE); -- 取值為FALSE 和TRUE,不是數,不是數值 ,不能運 算,一 般用於關係運算。
- 位 : ( Bit )
TYPE BIT IS (‘0’,’1’); -- 取值為0 和1,用於邏輯運算。
- 位向量 : ( Bit_Vector )
TYPE BIT_VECTOR IS ARRAY (Natural range<>) OF BIT; -- 基於Bit型別的陣列 ,用於邏輯運算。
例子:
SIGNAL a :Bit_Vector(0 TO 7);
SIGNAL a :Bit_Vector ( 7 DOWNTO 0);
- 字元:(Character)
TYPE CHARACTER IS (NUL, SOH,STX, …, ‘ ’, ‘!’,…); --通常用‘’ 引起來 , 區分大小寫。
- 字串 :(String)
VARIABLE string_var: STRING (1 TO 7);
string_var:=“A B C D” ; -- 通常用“” 引起來 , 區分大小寫;
- 整數:(Integer)
取值範圍 -(2^31 -1) ~ (2^31 - 1) ,可用32位有符號的二進位制數表示。
例子:
variable a :integer range -63 to 63
注意:
- 在實際應用中,VHDL模擬器將Integer做為有符號數處理 , 而VHDL綜合器將Integer做為無符號數處理。
- 要求用RANGE子句為所定義的數限定範圍 ,以便根據範圍來決定表示此訊號或變數的二進位制數的位數。
- 實數:(Real)
取值範圍值範圍 -1.0E38 ~ +1.0E38, , 僅用於模擬不可綜合。
例子:
1.0 --十 十 進位制 浮 點數
8 #43.6 #e+4 --八 八 進位制 浮 點數
43.6E-4 --十 十 進位制 浮 點數
- 時間: (Time)
物理量資料 ,完整的包括整數和單位兩個部分 ,用至少一個空格隔開 , 僅用於模擬不可綜合 ;
單位:fs,ps,ns,us,ms,sec,min,hr
- 錯誤等級 ( (Severity Level) )
表示系統狀態, 僅用於模擬不可綜合 ;
例子:
TYPE severity_level IS (NOTE 、WARNING 、ERROR 、FAILURE);
-
IEEE預定義標準邏輯位與向量
- 標準邏輯位( Std_Logic)
U |
Uninitialized (未初始化的) |
X |
Forcing Unkown (強制未知的) |
0 |
Forcing 0 (強邏輯0) |
1 |
Forcing 1 (強邏輯1) |
Z |
High Impedance (高阻態) |
W |
Weak Unknow (弱未知的) |
L |
Weak 0 (弱邏輯0) |
H |
Weak 1 (弱邏輯1) |
— |
Don’t care (忽略) |
- 標準邏輯位向量 ( Std_Logic_vector )
使用 Std_Logic和 Std_Logic_Vector要 呼叫IEEE庫中的Std_Logic_1164程式包; 就綜合而言,能夠在數字器件中實現的是“ -、 0 、1 、Z”四種狀態。
-
使用者自定義
方法一:
TYPE 資料型別名 IS 資料型別定義 OF 基本資料型別 或
TYPE 資料型別名 IS 資料型別定義
例子:
數 組: type value_type is array (127 downto 0) of integer;
type matrix_type is array (0 to 15, 0 to 31) of std_logic;列舉: type states is (idle ,decision ,read ,write);
type boolean is (false ,true);
type bit is (‘0’ ,‘1’);
方法二:
SUBTYPE 子型別名 IS 基本資料型別定義 RANGE 約束
例子:
subtype digit is integer range 0 to 9;
1.4資料型別轉換
VHDL為強定義型別語言,不同型別的資料不能進行運算和直接賦值 。
- 型別標記法
Variable A: integer; Variable B: real;
A= integer (B); B=real (A);
- 函式法
Conv_interger (A) ;-- 由std_logic轉換為integer型,在std_logic_unsigned包。
- 常數轉換法 / 常量轉換法
Type conv_table is array(std_logic) of bit;
Constant table: conv_table:=(‘0’|’L’=>’0’, ‘1’|’H’=>’1’, others=>’0’);
Signal a: bit; signal b: std_logic;
A<=table(b); -- 將std_logic型 型 轉換為 為bit型
在“STD_LOGIC_1164” 、“STD_LOGIC_ARITH”和 “STD_LOGIC_UNSIGNED” 的程式包中提供的資料型別變換函式。
-
屬性
屬 性提供的是關於訊號 、型別等的指定特性 。
‘event : 若屬性物件有事件發生,則生成布林值“true”,常用來檢查時鐘邊沿是否有效。
上升沿: Clock’ EVENT AND Clock=‘1’
’range : 生成一個限制性陣列物件的範圍
’left : 生成數 據 類 型 或數 據 子 類 型 的 左邊界 值;
’right , ’high, ’low, ’length
’range: “0 to n” ; ’reverse_range :“n downto 0”
-
運算子
- 算術運算子 : +, -, *, / , MOD, REM ,SLL ,SRL ,SLA, SRA ,ROL ,ROR ,** ,ABS
- 關係運算符 : =, /= , <, > , <=, >=
- 邏輯運算子: AND ,OR ,NAND ,NOR ,XNOR ,NOT ,XOR
- 賦值運算子: <= ,:=
- 關聯運算子: =>
- 其他運算子 : +, -,&
並置操作符 &
SIGNAL a : STD_LOGIC_VECTOR (3 DOWNTO 0) ;
SIGNAL d : STD_LOGIC_VECTOR (1 DOWNTO 0) ;
...
a <= '1'&'0'&d(1)&'1' ; -- 元素與元素並置 , 並置後的陣列長度為為4
...
IF a & d = "101011" THEN ... –- 在IF條 條 件 句中可以使用並置符
-
運算子的優先順序
優先順序從到高,如下所示:
邏輯 、算術運算子 : NOT, ** ,ABS
乘法運算子 : / , MOD, REM, *
正負運算子 : +, -
加減、 並置運算 符 : +, -, &
關係運算符 : =, /= , <, > , <=, >=
邏輯運算子 :AND ,OR ,NAND ,NOR ,XNOR ,NOT ,XOR
注意事項:
1.移位運算子的左邊為一維陣列 , 其型別必須是BIT或BOOLEAN, 右邊必須是整數移位次數為整數的絕對值,
- SLL: : 將位向量左移 , 右邊移空位補零 ;
- SRL: : 將位向量右移 , 左邊移空位補零 ;
- SLA: : 將位向量左移 , 右邊第一位的數值保持原值不 變;
- SRA: : 將位向量右移 , 左邊第一位的數值保持原值不變;
- ROL 和ROR: 自迴圈左右移位
例子:
“1100”SLL1 =“1000” “1100”SRL1 =“0110” “1100”SLA1 =“1000”
“1100”SRA1 =“1110” “1100”ROL1 =“1001” “1100”ROR1 =“0110
2.取餘運算(a REM b) 的符號與a相同, 其絕對值小於b的絕對值
例子:
(-5 )REM 2= (-1) 5 REM 2= (1)
3.取模運算(a MOD b) 的符號與b相同, 其絕對值小於b的絕對值
例子:
(-5 )MOD 2=1 5 MOD (- 2)= (-1)