1. 程式人生 > >VHDL基礎1

VHDL基礎1

代碼 系列 data- img 科學計數 pack 復制 -1 sign

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

技術分享
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;
技術分享

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