跳轉到內容

可程式設計邏輯/VHDL 模組結構

來自華夏公益教科書,開放的書籍,開放的世界

模組結構概述

[編輯 | 編輯原始碼]

建立模型有兩種方法:自頂向下和自底向上。模型也可以定義到不同的詳細程度。

作為一種建模語言,VHDL 提供了豐富多樣的結構來適應建模中使用的各種方法和詳細程度。其中包括:實體、體系結構、包和庫。

這裡的訊號用於將資料透過實現的不同階段進行傳播。有時這些訊號用於例項化我們在設計中使用的元件。它們的行為就像一個用於傳播資料的路線圖。

 variable variable_name : type;
 variable variable_name : type := initial_value;

規則和示例

[編輯 | 編輯原始碼]
variable HEIGHT : integer := 8;
variable COND : boolean := true;
variable IN_STRING : string(1 to 80);
variable M,N : bit := '1';
variable I : integer range 0 to 3;

在宣告變數時,可以為其賦予顯式的初始值。如果未為變數賦予顯式值,其預設值將為其宣告型別的最左側值('left)。

variable I : integer range 0 to 3;
-- initial value of I is 0
variable X : std_ulogic;
-- initial value of X is 'U'

子程式(函式和過程)中的變數在每次呼叫子程式時都會被初始化。

function PARITY (X : std_ulogic_vector)
                 return std_ulogic is
  variable TMP : std_ulogic := '0';
begin
    for J in X'range loop
        TMP := TMP xor X(J);
    end loop; --no need to initialise TMP
    return TMP;
end PARITY;

程序中的變數,除了“FOR LOOP”變數,都會在模擬開始時(時間 = 0 ns)接收到其初始值。

process (A)
    variable TMP : std_ulogic := '0';
begin
    TMP := '0';
    -- in this example we need to reset
    -- TMP to '0' each time the process 
    -- is activated
    for I in A'low to A'high loop
        TMP := TMP xor A(I);
    end loop;
    ODD <= TMP;
end process;

SFC

標量資料型別

[編輯 | 編輯原始碼]

複合資料型別

[編輯 | 編輯原始碼]

實體用於描述 VHDL 模組與其他模組的介面。所有進入或退出 VHDL 模組的訊號都必須在實體宣告中宣告。下面是一個描述兩個輸入 AND 門介面的實體示例。

ENTITY and2 IS
    PORT(A : in std_logic;
         B : in std_logic;
         F : out std_logic
	);
END and2;

在實體內部,可以找到一個埠宣告。有以下幾種型別的埠

型別 描述
in 指定一個只能讀取不能寫入的埠。in 埠不能用在賦值左側。
out 指定一個只能寫入不能讀取的埠。out 埠只能用在賦值左側。
in/out 指定一個可以讀寫埠。inout 埠通常用於描述三態匯流排。
buffer 指定一個 out 埠,其當前值可以讀取。可以透過將內部訊號分配給 VHDL 程式碼中的內部訊號來實現相同的功能,並在需要時從該訊號讀取,並使用併發語句將內部訊號分配給 out 埠。

體系結構

[編輯 | 編輯原始碼]

VHDL 中的體系結構描述了模組功能的實現方式。以下是兩個輸入 AND 門的體系結構。

ARCHITECTURE and2_rtl OF and2 IS
  -- Signal, component, type and constant declarations go here.
  ...
BEGIN
  -- Concurrent statements and processes go here
  F <= A and B;
  ...
END and2_rtl;

體系結構實現型別

[編輯 | 編輯原始碼]

體系結構的實現方式可以根據其目的進行不同的方式。

結構實現連線和例項化其他模組。它用於組織和連線模組。嚴格的結構實現僅包含使用埠對映連線在一起的其他例項化塊。

行為實現使用可用的全部 VHDL 結構描述了模組的執行方式。行為設計模組不一定是可綜合的,但對於建模和測試可綜合模組很有用。

暫存器傳輸

[編輯 | 編輯原始碼]

暫存器傳輸實現根據暫存器和暫存器之間資料流的轉換來描述模組的功能。暫存器傳輸實現通常用於描述要在實際裝置上綜合的模組。

VHDL 包用於包含一組可重用的資料型別、函式、過程和其他 VHDL 結構。包的基本語法如下。

PACKAGE package_name IS
...
END package_name;

PACKAGE BODY package_name IS
...
END package_name;

包頭用於宣告 VHDL 結構。包體用於實現它們。並非所有結構(如資料型別)都需要在主體中進行條目。主體通常用於函式和過程的實現。

庫為模組的生存提供名稱空間。當由模擬器或綜合工具編譯時,每個包和實體都被編譯到一個庫中。VHDL 檔案無法指定要將其編譯到哪個庫中。這由用於編譯 VHDL 程式碼的工具決定。工具將 VHDL 物件編譯到的預設庫稱為工作庫。這意味著在建立 VHDL 模型時,以下語句會被假設。

library work;

VHDL 模型可以使用 library 關鍵字使庫對模組可見,並使用庫中的物件。 這對於包含來自其他庫的包以及直接例項化來自其他庫的實體是必需的。

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

library 關鍵字使庫對 VHDL 設計可見。 庫可見後,就可以使用庫中的包。 下一行表示在當前名稱空間中宣告 ieee.std_logic_1164 名稱空間中宣告的所有內容。 例如,這允許我們使用以下語句

signal sQ: std_logic;

而不是

signal sQ: ieee.std_logic_1164.std_logic;

VHDL 模組的例項化

[編輯 | 編輯原始碼]

有兩種方法可以例項化 VHDL 模組。 VHDL '87 中指定的方法使用元件、埠對映和相應的實體宣告。 VHDL '93 中指定的新方法只使用埠對映和相應的實體宣告。 每個方法在某些情況下都有用。 對於每種方法,將例項化以下實體

entity D_FF is
    port(
        clk : out std_logic;
        rst : out std_logic;
        D : in std_logic;
        Q : in std_logic
        );
end entity D_FF;

architecture rtl of D_FF is
  ...
begin
  ...
end architecture rtl;

使用元件

[編輯 | 編輯原始碼]
architecture rtl of uses_d_ff is
  ...
  component D_FF is
    port(
        clk : out std_logic;
        rst : out std_logic;
        D : in std_logic;
        Q : in std_logic
        );
  end component D_FF;
  ...
  signal sClk: std_logic;
  signal sRst: std_logic;
  signal sD:   std_logic;
  signal sQ:   std_logic;
  ...
begin
  u_D_FF: component D_FF
    port map(
        clk => sClk,
        rst => sRst,
        D   => sD,
        Q   => sQ
    );
  
  ...
end architecture rtl;

不使用元件

[編輯 | 編輯原始碼]

不使用元件可以縮短語法。 為了例項化上面的 D_FF,使用以下程式碼

architecture rtl of uses_d_ff is
  ...
  signal sClk: std_logic;
  signal sRst: std_logic;
  signal sD:   std_logic;
  signal sQ:   std_logic;
  ...
begin
  u_D_FF: entity work.D_FF(rtl)
    port map(
        clk => sClk,
        rst => sRst,
        D   => sD,
        Q   => sQ
    );
  
  ...
end architecture rtl;

只要使用的工具支援這種語法,不使用元件是推薦的,因為它可以提高程式碼的可維護性。 當訊號被新增/刪除和從實體中刪除時,它們只需要被新增到實體宣告和埠對映中,或從其中刪除。 當例項化的物件沒有 VHDL 模組時,元件很有用。 當在 VHDL 中例項化 Verilog 設計或使用 IP 核時,有時需要這樣做。 這允許 VHDL 編譯器在編譯 VHDL 時建立一個“黑盒”,並稍後將實際模型連線到黑盒。

華夏公益教科書