VHDL 硬體描述語言 數位電路設計實務 第二章 VHDL 硬體描述語言簡介
2-1硬體描述語言 (Hardware Description Language, HDL) 和傳統數位電路設計的優缺點比較 設計者可以不需要考慮實際製造晶片所用的製程技術,邏輯合成工具可以將您的設計相對於不同的製程作不同的轉換、並作最佳化的處理。 在硬體描述語言的設計中、功能的驗證可以在較高的層次 (例如:暫存器轉移層次) 就執行並作修正以符合要求。大部份的錯誤在暫存器轉移層次就可以被修正,和更低層次與實際電路佈置時所會發生的機率比較起來就相對地小多了。
用硬體描述語言設計電路就好比撰寫電腦程式一樣,因為硬體描述語言就像電腦程式語言一樣、同樣具有結構化程式某些特性:選擇 (if … else … 敘述、case 敘述 … 等等),以及與迴圈的語法 (for 敘述、while 敘述);也可以在電路的描述中加入註解的部份來說明電路的詳細情形,讓人更容易了解,以利於電路的除錯與發展。相較之下、一個以邏輯閘設計出來的電路,尤於過於複雜、要讓人了解電路的實際情況是相當困難,甚至是無法理解的。 由於使用硬體描述語言可以很快地描述出所需要設計的電路,因此數位系統設計人員及數位電路工程師很快地就可以作:邏輯模擬、邏輯合成以及驗證的工作,因此可以很快地開發出所要的數位系統。
相較於傳統以人工畫圖 (Fully Customize Design) 的設計方式、硬體描述語言的缺點 由於電路的合成完全仰賴於電腦輔助設計工具 (CAD),然而合成出來的電路未必皆能得到很好的電路設計。也就是電腦輔助設計工具的在合成時所作的最佳化處理仍待加強。其中的一個原因在於:硬體描述語言提供了數種不同的描述方式來設計一個數位電路。功能同樣的電路、由不同人員所描述 (設計) 出來的硬體描述語言,經由電路合成之後、所得到的邏輯閘電路 (Gate-Level) 未必會是相同的。這種問題和寫程式一樣,二個人寫的程式未必會相同、如果是相同的話那很可能是互相抄襲的。 因為使用人工的方式,數位系統設計人員及數位電路工程師可以針對:電路的速度、面積以及功率的消耗 … 等方向作最佳的考量與設計,調校出所希望的電路設計。然而電腦輔助設計工具 (CAD) 並未能對這些方面作全盤性的考量。
2-2 VHDL 的源由 1983 年七月,由 Intermetrics、IBM 以及德州儀器 (Texas Instruments) 發展出來的。 1985年八月,在美國政府的合約之下形成了 VHDL 7.2 版。 1987年十一月,VHDL 成為IEEE 1076-1987 標準。 1988 年,VHDL 成為 ANSI標準。 1993年九月,VHDL 重新標準化以及增強 VHDL。 VHDL 迄今已被國際電工協會 (IEC) 認定為國際標準。
2-3 VHDL 的特色 提供多種不同的設計方法 (design methodology)。 不同的製程特性 (technology independence) 也不用考量。 可以用來設計各式各樣的數位電路。 它是一種硬體描述語言的標準,設計人員可以用它來交換設計的心得。 由 VHDL 衍生出來的標準語言,像是:WAVES、VITAL 以及 Analog VHDL。
2-4 VHDL 硬體描述語言的特性 VHDL 硬體描述語言(VHDL)的特性、如下列各點: VHDL 為一般性的硬體描述語言、易學易用。 VHDL 的語法與 C 語言相似。 VHDL 允許在同一個模組中有不同層次的表示法共同存在,設計者可以在同一個模組中混合使用:電晶體層次 (Transistor Model)、邏輯閘層次模型 (Gate level Model)、暫存器轉移層次 (Register Transfer Level)、資料流模式 (Data Flow Mode),以及行為模型 (Behavioral Model) 等各種不同層次的表示法來描述所設計的電路。 一般的邏輯合成工具普遍都支援 VHDL。 許多的製造商也都有提供 VHDL 的函數庫。
2-5 VHDL / Verilog 電腦輔助設計工具 --- Quick Logic 的介紹 由 QuickLogic™ 公司所設計出來的 QuickWorks 這套電腦輔助設計工具 (CAD)。 可以安裝在個人電腦的 Windows 各種版本視窗作業系統。 具有VHDL / Verilog 電路編譯以及模擬 … 等等功能,作為本書中所有的 VHDL 電路的編譯以及模擬流程 (Compile and Simulation Flow) 。
2-6 VHDL 電路設計、模擬與燒錄的流程 (VHDL design in、 simulation and program flow) --- 使用 QuickLogic 使用 QuickLogic 來實作 VHDL 電路設計、模擬、合成、佈侷 (Placement) 與繞線 (Routing) 與燒錄的流程,包括下列數個步驟: 編輯 VHDL 電路描述 VHDL 電路描述之合成語法檢查 (Synthesizer Syntax Check) 編輯測試碼檔案 (Test Bench File) 測試碼檔案 (Test Bench File) 之模擬語法檢查 (Simulator Syntax Check) 電路的模擬 (Simulation) 電路的佈侷 (Placement) 與繞線 (Routing) 電路的時序分析 (Timing Analysis) 電路的驗證 (Verify) 電路的燒錄 (Program)
執行 QuickLogic 群組中的 SpDE 點選在桌面上有一個 QuickLogic 的資料夾圖示 (Icon),接著點選 QuickLogic 群組中的 SpDE (SpDE 9.4.1 Release Build Eval Copyright © 1993-2003 QuickLogic)。
以一個位元的全加器電路作為 ModelSim 電路模擬的整個流程 步驟一:設計一個位元全加器電路的 vhdl 檔案 一個位元全加器電路的 VHDL 套件 (vhdl 檔案之一) -- pkg_Full_Adder.vhd 一個位元全加器的 VHDL套件 library ieee; use ieee.std_logic_1164.all; package pkg_Full_Adder is component Full_Adder port( in1 : in std_logic; in2 : in std_logic; carryin : in std_logic; sum : out std_logic; carryout : out std_logic ); end component; end pkg_Full_Adder;
一個位元全加器電路的 VHDL 電路描述檔 (vhdl 檔案之二) -- Full_Adder.vhd 一個位元全加器的 VHDL電路描述檔 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; use work.pkg_Full_Adder.all; entity Full_Adder is port( in1 : in std_logic; in2 : in std_logic; carryin : in std_logic; sum : out std_logic; carryout : out std_logic ); end Full_Adder;
architecture arc of Full_Adder is begin Do_Full_Adder: process( in1, in2, carryin ) variable result : std_logic_vector( 1 downto 0); result := '0'&in1 + in2 + carryin; carryout <= result(1); sum <= result(0); end process Do_Full_Adder; end arc;
步驟二:電路合成語法檢查 編輯完成之後,點選 Turbo Writer 功能表 HDL Synthesizer Syntax Check 做電路合成語法檢查。因為有些 VHDL 的語法是不能用於電路合成的,請參考各章節中註明不能用於電路合成語法的說明。 如果有語意上的錯誤,則出現錯誤的訊息、錯誤訊息包括錯在那個檔案的第幾行以及可能的錯誤原因。例如將 pkg_Full_Adder.vhd 第10行 sum : out std_logic; 故意打錯改成 sum : out std_logic 少打個 ; 號,那麼錯誤的訊息如下:@E: “pkg_Full_Adder.vhd(23)” : 10:8:10:10|Expecting closing) for interface list 告訴您在第10行的語法有錯誤。 如果都沒有問題的話,它會告訴您 VHDL syntax check successful!
如果您設計的任何一個 .vhd 檔案中用到了 VHDL’93 的敘述或語法,則點選 Turbo Writer 功能表 HDL Options… 點選 VHDL’93,Turbo Writer 就會允許您在這個 VHDL 檔案中使用 VHDL’93 的敘述或語法。
2-6.2 VHDL 電路的模擬 步驟三:準備“電路測試碼”的檔案 (.vhd檔案) 點選 Turbo Writer 功能表 HDL Generate Test Bench 來撰寫“電路測試碼”的檔案 (.vhd 檔案)。 Turbo Writer 會自動幫我們產生“電路測試碼”的檔案 (.tb 檔案) 的底下部份:
“電路測試碼”的檔案 (.tb 檔案) 包含了:測試元件的輸出入介面、給定輸入訊號、輸入訊號維持多久時間換成新的訊號值以及測試的元件 … 等等。 您必需自行將一個位元全加器的輸入訊號 in1、in2 以及 carryin 在什麼時間給什麼樣的測試訊號,產生一個完整的“電路測試碼”的檔案 (.tb 檔案),如下粗體字的部份。
library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; ENTITY Full_Adder_tb IS END Full_Adder_tb; ARCHITECTURE HTWTestBench OF Full_Adder_tb IS COMPONENT Full_Adder PORT ( in1 : in std_logic; in2 : in std_logic; carryin : in std_logic; sum : out std_logic; carryout : out std_logic ); END COMPONENT;
SIGNAL in1 : std_logic; SIGNAL in2 : std_logic; SIGNAL carryin : std_logic; SIGNAL sum : std_logic; SIGNAL carryout : std_logic; BEGIN U1 : Full_Adder PORT MAP (in1 => in1, in2 => in2, carryin => carryin, sum => sum, carryout => carryout); process begin
-- 時間為 0 ns in1 <= '0'; in2 <= '0'; carryin <= '0'; wait for 20 ns; -- 時間為 20 ns in1 <= '0'; in2 <= '0'; carryin <= '1'; wait for 20 ns; -- 時間為 40 ns in1 <= '0'; in2 <= '1'; carryin <= '0'; wait for 20 ns; -- 時間為 60 ns in1 <= '0'; in2 <= '1'; carryin <= '1'; wait for 20 ns; -- 時間為 80 ns in1 <= '1'; in2 <= '0'; carryin <= '0'; wait for 20 ns; -- 時間為 100 ns in1 <= '1'; in2 <= '0'; carryin <= '1'; wait for 20 ns;
-- 時間為 120 ns in1 <= '1'; in2 <= '1'; carryin <= '0'; wait for 20 ns; -- 時間為 140 ns in1 <= '1'; in2 <= '1'; carryin <= '1'; wait for 20 ns; -- 時間為 160 ns assert false report " End of Simulation" severity failure; end process; END HTWTestBench;
編輯完成之後,點選 Turbo Writer 功能表 HDL Simulator Syntax Check 做電路模擬語法檢查。 如果有語意上的錯誤則出現錯誤的訊息,如果都沒有問題的話,它會告訴您 VHDL syntax check successful! 最後點選 Turbo Writer 功能表 File Save As,儲存“電路測試碼”的檔案成為 tb_xxx.vhd 檔名,例如:tb_Full_Adder.vhd。
步驟四:執行 開始 程式集 中的 Active-HDL 6.2
Add existing resource files
File New Waveform
Add Signals…
variable (變數)
步驟五:讓 Active-HDL 6.2 為您做電路的模擬
步驟六:觀察波型的變化是否與預期的結果一樣 觀察波型是否與預期的結果一樣?如果一樣,那麼恭禧您,您所撰寫的電路描述功能算是成功地完成了。 如果不一樣就得回到步驟一:設計一個位元全加器電路的 .vhd 檔案,去檢查 VHDL 程式碼在那裡有寫錯了。 也有可能是步驟三:準備“電路測試碼”的檔案 (tb_xxx.vhd 檔案) 的 VHDL 檔案中的測試碼時間給的不好,造成電路沒有作相對應的動作。
Full_Adder.vhd 的模擬結果
放大右上方波型的部份來看
Display 頁次設定訊號高度、顏色、粗體與否以及是否為類比 Analog 訊號表示的設定。
步驟七:可以將觀察訊號存成 .awf 檔, 方便下次叫用 點選功能表 File Save 給定 .awf 的檔案名稱, 例如:Waveform_ Full_Adder.awf 下次只要開啟 Waveform_Full_Adder.awf,就可以將上次觀察的訊號回復回來。
2-6.3 VHDL 電路的合成 (Synthesis)、佈侷 (Placement) 與繞線 (Routing) 電路模擬結果的波型變化與預期的結果一樣之後,請回到 SpDE,接著要讀入 VHDL 檔案,請點選主選單中的 File Import VHDL... 找到 Full_Adder.vhd 接著會自動啟動 Synplify-Lite, Synplify-Lite for QuickLogic 7.2.1 Built: Dec 4 2002, Copyright © 1994-2002 Synplicity, Inc. All Rights Reserved. VHDL and Verilog Synthesis for QuickLogic FPGAs. 專門對 VHDL / Verilog 電路描述作編譯、合成 (Synthesis)、佈侷 (Placement) 與繞線 (Routing) 的功能。
選擇 Synplify-Lite 的功能表 Options 功能表裡頭的 Configure VHDL Compiler…
選擇 SpDE 的功能表 Tools 功能表中的 Options…,可作細項設定 其中的 Logic Optimizer 頁中的 Type 群組,可供您決定合成出來的電路是以電路的速度 (Speed) 為主要的考量對象或者是電路的面積 (Area)。
其中的 Placer/Router 頁中有 Placer Mode、Placer Speed、Router Speed,以及 Placer Type 等四個群組,可以讓您設定 SpDE 為您的 VHDL 作電路合成時元件的佈置與繞線處理過程考慮的因素。
執行 Tools 功能表中的 Run Selected Tools… (也可以按Ctrl + R) 請全部勾選Auto Place & Route、Post-Layout Tools 以及 Pre-Programming Tools 群組中所選擇的功能,接著按 Run 按鈕開始執行。
由底下這個視窗可以看出:使用 FPGA 元件來合成出來的函數電路只佔了整個 FPGA 元件的一小部份,是因為全加器模組蠻小的。
選擇功能表中的 View Zoom In 作侷部放大觀看使用 FPGA 元件來合成出來的函數電路。
2-6.4 IC 的 Pin 腳指定 (Pin Assignment) 回到 SpDE 9.4.1,執行 View 功能表中的 Package View,就會看到 SpDE 為您合成出來的電路相對於整顆 IC 頂視圖中相對的 Pin 腳位置指定 (Pin Assignment) 關係。
執行View Zoom In, 點選右上角作侷部的放大檢視
2-6.5 電路的路徑分析 (Path Analyzer)
2-6.6 電源消秏分析 (Power Calculator) 在 SpDE 9.4.1 中,執行 Tools 功能表中的 Power Calculator:電源消秏分析,它的功能在於讓您知道您電路在那一顆 IC (Part)、輸出負載 (Output loading) 是多少 pF、那一種工作電壓 (Volts) 以及多快的工作頻率 (System Frequency,多少 MHz) 之下,總電源消秏是多少 mW。 其中 Part:、Vcc:、Output loading: 以及 System Freq: 的部份您都是可以手動去更改它的,更改了之後馬上就會幫您算出總電源消秏是多少 mW。
2-6.7 燒錄 (Program) 您辛苦設計的 IC
關於燒錄器的選購 透過電腦和燒錄器的連接就可以將您辛苦設計的 VHDL 硬體描述語言程式碼經由“電路的“模擬”、“編譯”、“合成”、“佈侷” 與 ”繞線” 燒錄到 QuickLogic IC。 QuickLogic 燒錄器必須配合不同的 IC 包裝而選擇不同的轉接頭,不同的轉接頭有不同的價格,您可以直接與 Quicklogic 代理商“大傳企業”洽詢,“大傳企業”的聯絡方式:電話 (02)2555-9676,網站 www.teconet.com.tw。
執行用於燒錄 QuickLogic IC 的燒錄程式 點選在桌面上有一個 QuickPro 的資料夾圖示 (Icon),接著點選 QuickPro 群組中的 QuickPro (QuickPro 9.1 RC3f Copyright © 2002 QuickLogic)。
點選 Configuration 功能表中的 Communication Port,如下圖所示。用於設定您將 QuickLogic 燒錄器的連線接到電腦的 “COM Port” 是 COM1 還是 COM2,COM Port 也就是在印表機埠 (Printer Port) 旁的 RS-232 接頭,選擇完成之後按 OK。
點選 File 功能表中的 Open…,如下圖所示。找到您的 .CHP 或者是 .LOF 檔案的位置之後按 ”開啟舊檔”。
看到 “Report File” 這個對話盒時只要按 “OK” 就好了。
2-7 Primitive Cell 介紹 所謂的「Primitive Cell」是指:電腦輔助設計工具 (CAD) 在電路合成的步驟時,會將 Verilog 模組電路的描述、使用什麼樣的邏輯閘元件來合成出該模組電路的需求來。 QuickLogic 的 Primitive Cell 為:「FPGA」元件。 Synopsys 的 Design Analyzer 之 Primitive Cell 為:最基本的「邏輯閘」元件,以及 Synopsys 公司所提供的 Cells。
FPGA的 Primitive Cell 為:FPGA 元件 「現場可規劃邏輯閘陣列」(FPGA),是 Field Programmable Gate Array 的英文縮寫。FPGA 元件具有較「邏輯閘陣列」元件容易使用之優點,但其設計彈性也相對的比較低。 FPGA 元件的可規劃連接結構大致有下列三種: 靜態隨機存取記憶體 (Static RAM, SRAM) 電子抹除式可規劃唯讀記憶體 (EEPROM, Electric Erasable Programmable Read Only Memory) 反熔絲 (Anti Fuse) 基本的 FPGA 結構依其可規劃邏輯模組電路在晶片上的排列方式可分為下列兩大種結構: 矩陣型結構 列向量型結構
Synopsys 的 Design Analyzer 之 Primitive Cell 為:最基本的「邏輯閘」元件,以及 Synopsys 公司所提供的 Cells Synopsys 的 Design Analyzer 之 Primitive Cell 能夠合成出基本的組合電路 (Combinational circuit),再配合記憶體元件則能夠合成出基本的循序電路 (Sequential circuit)。 可合成的 (Synthesizable) VHDL primitives cells,包括下列的基本元件: not、and、nand、or、nor xor、xnor Synopsys 公司所提供的 Cells:包括很多種加法、減法、乘法 … 等等的元件。
2-8 VHDL 電路合成與模擬的流程 (Synthesis and Simulation Flow) --- 使用 Synopsys 的 Designer Analyzer 使用 Synopsys 的 Design Analyzer 來將 VHDL 元件實作電路合成與模擬的流程 (Synthesis and Simulation Flow)、如圖「VHDL 元件合成與模擬的流程 --- 使用 Synopsys 的 Designer Analyzer」所示,分成 : 「功能模擬」 (Functional Simulation) 階段 「邏輯閘層次模擬」 (Gate Level Simulation) 階段 「模擬結果」比較 (Simulation Output Comparison) 階段
「功能模擬」(Functional Simulation) 階段 1. VHDL 電路描述檔案 (*.vhd 檔) 我們將 VHDL 電路描述檔案 (*.vhd 檔) 作為設計的輸入。 6. 功能模擬 (Functional Simulation) 及 7. 電路的測試碼 (VHDL Test Driver) 「邏輯閘層次模擬」(Gate Level Simulation) 階段 2. VHDL 語法檢查 (Synopsys HDL Compiler) 3. VHDL 電路合成 (Synopsys Design Compiler) 4. 邏輯閘層次描述 (Gate Level Description) 5. 邏輯閘層次模擬 (Gate Level Simulation) 及 7. 電路的測試碼 (VHDL Test Driver) 「模擬結果比較」 (Simulation Output Comparison) 階段 8. 功能及時序模擬結果比較 (Compare Output)