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