基于FPGA的SOC在嵌入式系統應用越來越廣了,比較流行的硬件描述語言有兩種Verilog HDL/VHDL,均為IEEE標準。VHDL如果有C語言基礎的話就會比較容易上手。而VHDL語言則需要Ada編程基礎。另外VHDL語言具有大量成熟的模塊,從某種角度說VHDL更具生命力。
VHDL簡介
VHDL 的歷史
VHDL 的 英 文 全 名 是 Very-High-Speed Integrated Circuit Hardware DescriptionLanguage,誕生于 1982 年。
1987 年底,VHDL 被 IEEE 和美國國防部確認為標準硬件描述語言。自 IEEE 公布了 VHDL 的標準版本 IEEE-1076(簡稱 87 版)之后,各 EDA 公司相繼推出了自己的 VHDL 設計環境,或宣布自己的設計工具可以提供 VHDL 接口。此后 VHDL 在電子設計領域逐步取代了原有的各種非標準硬件描述語言。
1993 年,IEEE 對 VHDL 進行了修訂,從更高的抽象層次和系統描述能力上擴展 VHDL 的內容,并公布了新版本的 VHDL,即 IEEE 標準的 1076-1993版本(簡稱 93 版)。
現在,VHDL 和 Verilog HDL 作為 IEEE 的工業標準硬件描述語言,在電子工程領域已成為事實上的通用硬件描述語言。
VHDL 的特點
VHDL 主要用于描述數字系統的結構、行為、功能和接口。除了含有許多具有硬件特征的語句外,VHDL 在語言形式、描述風格和句法上與一般的計算機高級語言十分相似。VHDL 的程序結構特點是將一項工程設計,或稱設計實體(可以是一個元件、一個電路模塊或一個系統)分成外部和內部兩部分。
外部也可稱為可視部分,它描述了此模塊的端口,而內部可稱為不可視部分,它涉及到實體的功能實現和算法完成。在對一個設計實體定義了外部端口后,一旦其內部開發完成,其他的設計就可以直接調用這個實體。這種將設計實體分成內外部分的概念是VHDL 系統設計的基本點。
應用 VHDL 進行工程設計有以下的優點:
1.行為描述
與其他的硬件描述語言相比,VHDL 具有更強的行為描述能力,強大的行為描述能力是避開具體的器件結構,從邏輯行為上描述和設計大規模電子系統的重要保證。
2.仿真模擬
VHDL 豐富的仿真語句和庫函數,使得在任何系統的設計早期就能查驗設計系統的功能可行性,隨時可對設計進行仿真模擬。
3.大規模設計
一些大型的 FPGA 設計項目必須有多人甚至多個開發組共同并行工作才能實現。VHDL 語句的行為描述能力和程序結構決定了它具有支持大規模設計的分解和已有設計的再利用功能。
4.門級網表
對于用 VHDL 完成的一個確定的設計,可以利用 EDA 工具進行邏輯綜合和優化,并自動把VHDL 描述設計轉變成門級網表。
5.獨立性
VHDL 對設計的描述具有相對獨立性,設計者可以不懂硬件的結構,也不必對最終設計實現的目標器件有很深入地了解。
VHDL的一般結構
讓我們考慮一個簡單的數字電路,如圖所示。
此圖顯示有兩個輸入端口 a 和 b,以及一個輸出端口 out1。該圖表明輸入和輸出端口是一位寬。該電路的功能是對兩個輸入進行“與”運算并將結果放在輸出端口上。
VHDL 使用類似的描述;但是,它有自己的語法。例如,它使用以下代碼行來描述該電路的輸入和輸出端口:
1 entity circuit_1 is
2 Port ( a : in STD_LOGIC;
3 b : in STD_LOGIC;
4 out1 : out STD_LOGIC);
5 end circuit_1;
讓我們逐行分解這意味著什么。
第 1 行:代碼的第一行指定要描述的電路的任意名稱。位于關鍵字“entity”和“is”之間的單詞“circuit_1”決定了該模塊的名稱。
第 2 到 4 行:這些行指定電路的輸入和輸出端口。將這些線路與圖 1 的電路進行比較,我們看到電路的端口及其特性列在關鍵字“端口”之后。例如,第 3 行說我們有一個名為“b”的端口。該端口是一個輸入,如冒號后的關鍵字“in”所示。
關鍵字“std_logic”指定了什么?正如我們將在本文后面討論的那樣,std_logic 是 VHDL 中常用的數據類型。它可以用來描述一位數字信號。由于圖 1 中的所有輸入/輸出端口都將傳輸 1 或 0,因此我們可以對這些端口使用 std_logic 數據類型。
第 5 行:此行確定“實體”語句的結束。
因此,代碼的實體部分指定了 1) 要描述的電路的名稱和 2) 電路的端口及其特性,即輸入/輸出和這些端口要傳輸的數據類型。代碼的實體部分實際上描述了模塊與其周圍環境的接口。由討論的“實體”語句指定的上述電路的特征在圖 1 中以綠色顯示。
除了電路與其環境的接口之外,我們還需要描述電路的功能。在圖 1 中,電路的功能是對兩個輸入進行“與”運算并將結果放在輸出端口上。為了描述電路的操作,VHDL 添加了“架構”部分并將其與實體語句定義的電路_1 相關聯。
第 6 行:此行為將在下一行中描述的架構命名為“行為”。該名稱位于關鍵字“architecture”和“of”之間。它還將這種架構與“電路_1”相關聯。換言之,該架構將描述“電路_1”的操作。
第 8 行: 這指定了架構描述的開始。
第 9行 第 9 行使用 VHDL 的語法來描述電路的操作。兩個輸入 a 和 b 的 AND 在括號內,結果使用賦值運算符“<=”賦值給輸出端口。
第 10 行 這指定了架構描述的結尾。如上所述,這些代碼行描述了電路的內部操作,這里是一個簡單的與門。
將我們到目前為止討論的內容放在一起,我們幾乎完成了用 VHDL 描述“Circuit_1”。我們得到以下代碼:
1 entity circuit_1 is
2 Port ( a : in STD_LOGIC;
3 b : in STD_LOGIC;
4 out1 : out STD_LOGIC);
5 end circuit_1;
6 architecture Behavioral of circuit_1 is
8 begin
9 out1 <= ( a and b );
10 end Behavioral;
但是,我們仍然需要添加幾行代碼。這些行將添加一個包含一些重要定義的庫,包括數據類型和運算符的定義。一個庫可能由多個包組成。我們必須使給定庫的所需包對設計可見。
由于上述示例使用數據類型“std_logic”,我們需要將“ieee”庫中的“std_logic_1164”包添加到代碼中。請注意,std_logic 數據類型的邏輯運算符也在“std_logic_1164”包中定義——否則我們必須使相應的包對代碼可見。最終代碼將是
1 library ieee;
2 use ieee.std_logic_1164.all
3 entity circuit_1 is
4 Port ( a : in STD_LOGIC;
5 b : in STD_LOGIC;
6 out1 : out STD_LOGIC);
7 end circuit_1;
8 architecture Behavioral of circuit_1 is
9 begin
10 out1 <= ( a and b );
11 end Behavioral;
在這里,我們創建兩條新線以超越我們已經創建的內容。第一行添加庫“ieee”,第二行指定需要此庫中的包“std_logic_1164”。由于“std_logic”是一種常用的數據類型,我們幾乎總是需要將“ieee”庫和“std_logic_1164”包添加到VHDL代碼中。
VHDL語言要素
1.四類語言要素:
數據對象(Data Object)
變量(Variable)
物理含義:
暫存某些值的載體,常用于描述算法
局部量,定義于process、function、procedure
具體說明:
變量說明格式
variable 變量名:數據類型 約束條件:= 表達式;
如:variable a, b : bit;
variable count : integer range 0 to 255 := 10;
局部量,只能在進程和子程序中定義、使用,其作用范圍僅局限于定義變量的進程和子程序中。
變量的初值可用于仿真,但綜合時被忽略
常量(Constant)
物理含義:
電源、地、恒定邏輯值等
全局量,可定義于上面兩種場合
常量說明:
對某一個常量名賦予一個固定的值
constant 常數名:數據類型:= 表達式;
constant data: bit_vector(3 downto 0):=“1010”
constant width: integer: = 8;
constant x: new_bit: = ‘x’;
常量數據類型必須與表達式的數據類型一致
常量是全局量,其作用范圍取決于常量被定義的位置。
信號(Signal)
物理含義:
是硬件連接線,端口
全局量,定義于architecture、package、entitiy
具體說明:
電子硬件系統運行的基本特性
各部分電路工作的并行特性;
信號傳輸過程中的延時特性;
多驅動源的總線特性;
時序電路中觸發器的記憶特性
信號是電子系統內部硬件連接和硬件特性的抽象表示:
signal 信號名:數據類型 約束條件:= 表達式;
如:signal s2 : std_logic_vector(15 downto 0);
綜合時初值被忽略
信號是全局量,可在結構體、實體、塊中 說明和使用信號
在進程和子程序中只能使用信號,不能說明信號
信號與端口的區別:信號本身無方向,可讀可寫;端口是一種有方向的隱形信號
數據類型(Data Type)
VHDL是一種強數據類型語言
設計實體中每一個常數、信號、變量、函數以及設定的各種參量都必須事先說明數據類型
同類型才能互相傳遞和作用
操作數(Operands)
操作對象常量或變量
操作符(Operator)
邏輯操作符(Logical Operator)
6種:and、or、nand、nor、xor、not
操作數類型必須相同,可為如下類型:bit、bit_vector、std_logic、std_logic_vector、boolean,數組操作數的維數、大小必須相同
關系操作符(Relational Operator)
用于比較相同父類的兩個操作數,返回boolean值
6 種:=、/=、<、<=、>、>=
算術操作符(Arithmetic Operator)
加操作符“+”、減操作符“-”
串聯(并置)操作符“&”:通過連接操作數來建立新的數組。操作數可以是一個數組或數組中的一個元素.
重載操作符(Overloading Operator)
僅有一個操作數的操作符,包括:“+”、“-”
乘除操作符
用于整數類型:“*”、“/”、“mod”、“rem”
綜合的限制:“/ ”、“mod”、“rem” 三種操作符的右操作數必須為 2 的正整數次冪,即 2n。實際電路用移位實現。
A rem B 余數運算符,利用操作數A決定結果的正負號;A mod B 取模運算符,利用操作數B決定結果的正負號。