安裝或設定
可以模擬或合成 VHDL 程式。模擬與其他程式語言中的大多數執行類似。綜合將 VHDL 程式轉換為邏輯閘網路。許多 VHDL 模擬和綜合工具是商業電子設計自動化(EDA)套件的一部分。它們還經常處理其他硬體描述語言(HDL),如 Verilog,SystemVerilog 或 SystemC。存在一些免費和開源應用程式。
VHDL 模擬
GHDL 可能是最成熟的免費和開源 VHDL 模擬器。它有三種不同的風格,取決於使用的後端:gcc
,llvm
或 mcode
。以下示例顯示如何在 GNU / Linux 作業系統下使用 GHDL(mcode
版本)和 Modelsim(Mentor Graphics 的商業 HDL 模擬器)。與其他工具和其他作業系統非常相似。
Hello World
建立一個檔案 hello_world.vhd
,其中包含:
-- File hello_world.vhd
entity hello_world is
end entity hello_world;
architecture arc of hello_world is
begin
assert false report "Hello world!" severity note;
end architecture arc;
VHDL 編譯單元是一個完整的 VHDL 程式,可以單獨編譯。實體是 VHDL 編譯單元,用於描述數位電路的外部介面,即其輸入和輸出埠。在我們的例子中,entity
被命名為 hello_world
並且是空的。我們正在建模的電路是一個黑盒子,沒有輸入也沒有輸出。體系結構是另一種型別的編譯單元。它們總是與 entity
相關聯,它們用於描述數位電路的行為。一個實體可以具有一個或多個體系結構來描述實體的行為。在我們的示例中,實體僅與一個體系結構相關聯 ** 名為 arc
,只包含一個 VHDL 語句:
assert false report "Hello world!" severity note;
該語句將在模擬開始時執行,並在標準輸出上列印 Hello world!
訊息。然後模擬將結束,因為沒有更多的事情要做。我們編寫的 VHDL 原始檔包含兩個編譯單元。我們可以將它們分成兩個不同的檔案但我們不能將它們中的任何一個拆分為不同的檔案:編譯單元必須完全包含在一個原始檔中。請注意,此架構無法合成,因為它沒有描述可以直接轉換為邏輯閘的函式。
使用 GHDL 分析並執行程式:
$ mkdir gh_work
$ ghdl -a --workdir=gh_work hello_world.vhd
$ ghdl -r --workdir=gh_work hello_world
hello_world.vhd:6:8:@0ms:(assertion note): Hello world!
gh_work
目錄是 GHDL 儲存它生成的檔案的地方。這就是 --workdir=gh_work
選項所說的。分析階段檢查語法正確性並生成描述原始檔中找到的編譯單元的文字檔案。執行階段實際上編譯,連結和執行程式。請注意,在 mcode
版本的 GHDL 中,不會生成任何二進位制檔案。每次我們模擬它時都會重新編譯程式。gcc
或 llvm
版本表現不同。另請注意,ghdl -r
不接受 VHDL 原始檔的名稱,如 ghdl -a
,但是不是編譯單元的名稱。在我們的例子中,我們傳遞了 entity
的名稱。因為它只有一個 architecture
關聯,所以不需要指定要模擬哪一個。
使用 Modelsim:
$ vlib ms_work
$ vmap work ms_work
$ vcom hello_world.vhd
$ vsim -c hello_world -do 'run -all; quit'
...
# ** Note: Hello world!
# Time: 0 ns Iteration: 0 Instance: /hello_world
...
vlib
,vmap
,vcom
和 vsim
是 Modelsim 提供的四個命令。vlib
建立一個目錄(ms_work
),儲存生成的檔案。vmap
將 vlib
建立的目錄與邏輯名稱(work
)相關聯。vcom
編譯 VHDL 原始檔,預設情況下,將結果儲存在與 work
邏輯名關聯的目錄中。最後,vsim
模擬程式併產生與 GHDL 相同型別的輸出。再次注意,vsim
要求的不是原始檔,而是已編譯的編譯單元的名稱。-c
選項告訴模擬器以命令列模式而不是預設的圖形使用者介面(GUI)模式執行。-do
選項用於在載入設計後傳遞 TCL 指令碼以執行。TCL 是 EDA 工具中經常使用的指令碼語言。-do
選項的值可以是檔案的名稱,或者像我們的示例中一樣,是一串 TCL 命令。run -all; quit
指示模擬器執行模擬,直到它自然結束 - 或者永遠持續 - 然後退出。