1. 程式人生 > >1.VHDL的基礎知識

1.VHDL的基礎知識

 目錄

使用者自定義

屬性

運算子

 1.VHDL語言基礎

VHDL 概 概 述:

  • VHDL VHSIC Hardwarter Description Language
  • Very High speed integrated circuit 
  1.  VHDL 是美國國防部在20世 世紀 紀80 年代初 為實現 其高速集 成電路硬體VHSIC計 計 劃 提 出 的描述語言;
  2. IEEE 從1986 年開始致力於 於VHDL 標準化 工 作 , 融 合 了其它ASIC 晶片製造 商開發 的 硬體 描述語言的優點,於93 年形成 了標準版 本( (IEEE.std_1164) ) 。
  3.  1995年 , 我 國國家技術監督局推薦VHDL做 做 為電 子 設計 自動化硬體 描述語言的國家標準。

VHDL的優點:

  1.  覆蓋面廣,系統硬體描述能 力強 ,是一 個多層次的硬 描述語言;
  2.  VHDL 語言 具 有 良好 的可 讀性 , 既 可以 被 計算機 接受 , 也容易被人們所理解;
  3. VHDL 語言可以 與 工藝 無關 程式設計;
  4. VHDL 語言 已做 為一種IEEE 的工 業標準 , 便 於 使 用、交流 和 推廣 。

1.1.識別符號 (Identifiers)

標 識符用來定義常數、 變數 、 訊號 、 埠 、 子程式或引數的名字,由字母 母(A~Z,a~z) 、數字(0~9)和下劃線 線(_)字元組成。

要求 :

  1. 首字元必須是字母
  2. 末字元不能為下 劃 線
  3. 不允許出現兩個連續的下劃線
  4. 不區分大小寫
  5. VHDL定義的保留字(關鍵字),不能用作識別符號
  6. 識別符號字元 最長可以是可以是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

注意事項:

  1. 常量所賦的值應和定義的資料型別一致 ;
  2. 常量在程式包 、實體 、構造體或程序的說明性區域內必須加以說明 。 定義在程式包內的常量可供所含的任何實體 、構造體所引用, 定義在實體說明內的常量只能在該實體內可見 , 定義在程序說明性區域中的常 量只能在該程序內可見
  •   變數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

注意:

  1. 在實際應用中,VHDL模擬器將Integer做為有符號數處理 , 而VHDL綜合器將Integer做為無符號數處理。
  2. 要求用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)