VHDL基礎1
Description Structure
- 一個可綜合的VHDL描述中一般由3部分組成:LIBRARY declarations、ENTITY、ARCHITECTURE
- Library(庫)用來設計重用和代碼共享,使代碼結構更清晰
1 LIBRARY library_name; 2 USE library_name.package_name.package_parts;
-
- 常用的三個Libray:ieee、std、work
- 其中std、work是默認可見的,不需聲明,ieee需要明確的聲明
- Entity(實體)描述電路的輸入/輸出引腳
ENTITY entity_name IS GENERIC(參數名:數據類型:=設定值 ...); PORT (port_name1: port_mode data_type; port_name2: port_mode data_type; ...); END entity_name;
- GENERIC類屬性為可選,用來指定諸如數據總線寬度、延時時間等參數
- singal_mode 可以是 4 種類型:in out inout buffer
OUT
模式無法回讀到電路內部,Buffer
模式可以,但是 buffer 不能連接到其他類型的端口,即不能把該模塊作為子模塊例化,一般使用中間緩沖信號,解決回讀問題。- Architecture(結構體)描述電路的行為和實現的功能
- Architecture 包含兩個部分:聲明部分和代碼部分
- 聲明部分(可選)用來聲明數據類型、常量、信號、子程序、元件等
- 代碼部分 (begin...end)描述電路行為
1 ARCHITECTURE 結構體名 OF 實體名 IS 2 說明語句 3 BEGIN 4 功能描述語句 5 ...... 6 END 結構體名;
- 註釋用 -- 開始
- VHDL不區分大小寫
Data Types
三種數據對象,聲明信號 signal
1 signal name : type [range] [:= initial_vaule];
還有 常量 constant 聲明:
1 constant name : type := value;
還有 變量 variable 聲明
1 variable name : type [range] [:= initial_vaule];
Pre-defined Data Types
bit & bit_vector
- 用‘0‘、‘1‘賦值
1 signal x : bit; 2 signal y : bit_vector (3 DOWNTO 0); 3 4 x<=‘1‘; 5 y<="0011"
std_logic & std_logic_vector
- 不同於bit類型,可取9種邏輯數據類型,但只有0、1、X、Z 可綜合
- std_logic 是 std_ulogic的子集
Boolean
- 兩種取值:true、false
TIME
1 CONSTANT t_delay:TIME:=30 ns
- 數值部分和單位之間有個空格
- fs、ps、ns、us、ms、sec、min、hr 103關系
integer
- 32位表示的整數 範圍-(231-1)~(231-1)
- 其他進制整數先寫進制數,再用#括起來16#1F#
real
- 小數表示、科學計數表示
character & string
- 使用字符串的可以是常量 和 變量
User-defined Data Types
![技術分享](/img/fz.gif)
1 --integer range 2 TYPE student IS RANGE 0 TO 100; 3 4 --enumerated(枚舉) 5 TYPE state IS (state0,state1,state2,state3); 6 7 --Array 8 TYPE matrix IS ARRAY (0 TO 3) OF std_loogic_vector;
![技術分享](/img/fz.gif)
Port Array
有時在定義端口時,需要把端口定義為矢量陣列。但是在 Entity
中不允許使用 type
定義,所以我們必須自己定義包集 (package),然後使用 use
聲明使用該用戶自定義的包集,最後才能在 Entity 中使用這種新定義的類型。
Data Conversion
-
在 VHDL 中,不同類型的數據是不能直接進行算術/邏輯運算的,所以必要時必須進行類型轉換操作。
函數名稱 | 函數功能 |
TO_STDLOGICVECTOR() | 由BIT_VECTOR轉為STD_LOGIC_VECTOR型 |
TO_BITVECTOR() | 與上相反 |
TO_STDLOGIC() | 由BIT型轉為STD_LOGIC型 |
TO_BIT | 與上相反 |
CONV_STD_LOGIC_VECTOR(a,位長) | 由整型轉為STD_LOGIC_VECTOR型 |
CONV_INTEGER() | 與上相反 |
Operators
VHDL 語法雖然枯燥無味,但是只有對數據類型、運算操作符及其屬性有了深刻認識,才能寫出高質量和高效率的代碼。
Opreators
-
VHDL提供了6種預定義的預算符:
-
賦值 assignment
-
邏輯 logical
-
算術 arithmetic
-
關系 relational
-
並置 concatenation
-
assignment
一共三種:
- <= 用於給 signal 對象賦值
- := 用於給 variable, constant, 賦值
- => 用於給矢量(vector)對象的某些位賦值,常和 others 一起使用
logical
進行邏輯運算,操作數必須是 bit, std_logic, std_ulogic 類型或者他們的擴展,即 bit_vector, std_logic_vector, std_ulogic_vector 類型
- NOT, AND, OR, NAND, NOR, XOR
arithmetic
- 操作數是 signed, integer, real,其中 real 類型是不可綜合的
- + - * / ** MOD REM ABS
comparison
一共有6種:= /= > < >= <=
concatenation
用於位的拼接。
- 操作數:任何支持邏輯運算的數據類型
- 操作符:& (, , ,)
Concurrent Code
HDL對應的是硬件電路,而硬件電路時刻工作,所以它的代碼是並發執行的。只有process、function、procedure中的代碼是順序執行的,而這些模塊作為共同整體時,它們之間也是並行的。
在並發代碼中可以使用下列各項:
- 運算操作符
- when 語句(when/else 和 with/select/when)
- generate 語句
- block 語句
when
when/else syntax:
1 assignment WHEN condition ELSE 2 assignment WHEN condition ELSE 3 ...;
with/select/when syntax:
1 WITH 選擇信號表達式 SELECT 2 assignment WHEN value, 3 assignment WHEN value, 4 ...;
generate
常和 for/if 一起使用,因為描述對象是電路,電路是固定的,功能也是靜態的,所以一種用途是生成相同元件的多次實例化,第二種用途是生成結構相同的多次賦值、組合邏輯。兩種用途目的都是減少代碼量,增加可讀性和可維護性
block
為了把較長的代碼分成幾個較小的區域,便於閱讀和維護,在每個塊內都能對局部信號、數據類型和常量定義
1 塊標號:BLOCK[(塊保護表達式)] 2 [說明部分] 3 BEGIN 4 並行語句 5 END BLOCK [塊標號];
Sequential Code
VHDL 本質是並發執行的代碼,但是在 process
, function
, procedure
內部的代碼是順序執行的,當它們作為一個整體時,相互之間也是並發執行的。
順序代碼並非只能與時序邏輯 (sequential logic
) 對應,同樣也可以用它們來實現組合邏輯 (combinational logic
)。
這裏主要討論順序代碼,也就是這 3 個塊中的代碼,包括 if
, wait
, case
, loop
語句。
process
在一個結構體中允許放置多個進程語句,這些進程也都是並行的,每個進程內部由一系列順序語句構成
1 [進程標號:] PROCESS [敏感信號參數表] IS 2 [進程說明部分] 3 BEGIN 4 順序描述語句 5 END PROCESS [進程標號];
- 每當敏感信號參數表裏的任何參數變化時,進程都被激活重新執行一遍
- 進程說明部分主要定義一些局部量如常量, 變量,子程序等,但這裏不能定義信號
- 順序描述語句是最重要的部分,常用順序語句 if/case/loop
if
1 IF conditions THEN assignment; 2 ELSIF conditions THEN assignments; 3 ...... 4 ELSE assignments; 5 END IF;
case
case 和 when 的區別在於,case 允許在每個測試條件下執行多個賦值操作,而 when 只能執行一個賦值操作。
1 CASE 表達式 IS 2 WHEN value => assignment; 3 WHEN value => assignment; 4 ... 5 WHEN OTHERS => assignments; 6 END CASE;
loop
常用格式有兩種
loop
1 [loop標號:] LOOP 2 順序語句; 3 END LOOP[loop 標號];
for/loop
1 [LOOP標號:] FOR 循環變量 IN 循環參數範圍 LOOP 2 順序語句; 3 END LOOP[LOOP 標號];
- 循環變量是一個臨時局部變量,由LOOP語句自動定義
LOOP不能自己跳出循環,也不能自己跳到另一個循環,有時候需要加入其它控制語句
1 [標識:] EXIT [LOOP 標識] [WHEN condition]; 2 3 [標識:] NEXT [另一個LOOP 標識] [WHEN condition];
/*****註釋*****/
*一組在邏輯上互相獨立的程序或程序段在執行過程中,其執行時間在客觀上互相重疊
VHDL基礎1