今天平頭哥來和大家伙聊聊FPGA開發語言的事。對于FPGA入門者來說,選擇用哪種開發語言或許也是一個讓人苦惱的問題,目前開發FPGA的手段越來越多,這個后面再聊,先來說說對于RTL開發來說最古老的開發語言也就是VHDL和verilog了。VHDL和Verilog歷史
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 程序可以由實體(Entity)、結構體(Architecture)、配置(Configuration)、程序包和程序包體(Package)以及庫(Library)5 個部分組成,它們是 VHDL 程序的設計單元。
其中實體、配置和程序包屬于初級設計單元,主要的功能是進行端口、行為、函數等的定義。結構體和程序包體是次級設計單元,包含了所有行為以及函數的實現代碼。其中,程序包和程序包體又屬于公用設計單元,即它們是被其他程序模塊調用的。庫則是一批程序包的集合。
Verilog是由Gateway設計自動化公司的工程師于1983年末創立的。當時Gateway設計自動化公司還叫做自動集成設計系統(Automated Integrated Design Systems),1985年公司將名字改成了前者。該公司的菲爾·莫比(Phil Moorby)完成了Verilog的主要設計工作。1990年,Gateway設計自動化被Cadence公司收購。
1990年代初,開放Verilog國際(Open Verilog International, OVI)組織(即現在的Accellera)成立,Verilog面向公有領域開放。1992年,該組織尋求將Verilog納入電氣電子工程師學會標準 。最終,Verilog成為了電氣電子工程師學會1364-1995標準,即通常所說的Verilog-95。
設計人員在使用這個版本的Verilog的過程中發現了一些可改進之處。為了解決用戶在使用此版本Verilog過程中反映的問題,Verilog進行了修正和擴展,這部分內容后來再次被提交給電氣電子工程師學會。這個擴展后的版本后來成為了電氣電子工程師學會1364-2001標準,即通常所說的Verilog-2001。Verilog-2001是對Verilog-95的一個重大改進版本,它具備一些新的實用功能,例如敏感列表、多維數組、生成語句塊、命名端口連接等。目前,Verilog-2001是Verilog的最主流版本,被大多數商業電子設計自動化軟件包支持。
1995年,IEEE 制定了 Verilog HDL 的第一個國際標準,即 IEEE Std 1364-1995,也稱之為 Verilog 1.0。
2001 年,IEEE 發布 Verilog 第二個標準(Verilog 2.0),即 IEEE Std 1364-2001, 簡稱為 Verilog-2001 標準。
VHDL和Verilog的區別
原文鏈接:例說Verilog和VHDL的區別,助你選擇適合自己的硬件描述語言
HDL 建模能力:Verilog與VHDL
首先,讓我們討論一下 Verilog 和 VHDL 的硬件建模能力,因為它們都是用于建模硬件的硬件描述語言。下圖顯示了 Verilog 和 VHDL 在硬件抽象行為級別方面的 HDL 建模能力。
圖形來源:Douglas J. Smith,“VHDL 和 Verilog 比較和對比加上 用 VHDL、Verilog 和 C 編寫的建模示例”
低級建模
如上圖所示,Verilog 和 VHDL 都能夠對硬件進行建模。但是,在底層硬件建模方面,Verilog優于VHDL。這是合理的,因為 Verilog 最初是為建模和模擬邏輯門而創建的。事實上,Verilog 具有內置原語或低級邏輯門,因此設計人員可以在 Verilog 代碼中實例化原語,而 VHDL 則沒有。Verilog 的門基元:and、nand、or、nor、xor、xnor、buf、not、bufif0、notif0、bufif1、notif1、pullup、pulldown。 Verilog 的開關原語:pmos、nmos、rpmos、rnmos、cmos、rcmos、tran、rtran、tranif0、rtranif0、tranif1、rtranif1。
更重要的是,Verilog 支持用戶定義基元 (UDP),因此設計人員可以定義自己的單元基元。此功能對于 ASIC 設計人員來說尤其必要。以下是有關如何在 Verilog 代碼中實例化門基元的 Verilog 示例:
or #5 u1(x,y,z);
and #10 u2(i1,i2,i3);
ADC_CIRCUIT u3(in1,out1,out2,clock);
// ADC_CIRCUIT is an User-Defined Primitive for
// Analog to Digital Converter for example.
Verilog 中一些低級內置門基元的 VHDL 等效項可以通過使用邏輯運算符如 NOT、AND、NAND、OR、NOR、XOR、XNOR 來實現。下面是 Verilog 門基元的 VHDL 等效代碼示例:
or u1(x,y,z); in Verilog <=> x <= y OR z; in VHDL
and u2(i1,i2,i3); (Verilog) <=> i3 <= i2 AND i3; in VHDL
為了支持 Verilog 中的 UDP 功能,VITAL(VHDL Initiative Towards ASIC Libraries-VHDL 面向 ASIC 庫的倡議)問世,使 ASIC 設計人員能夠在符合 VITAL 的 VHDL 中創建自己的單元基元或 ASIC 庫,如上圖所示。盡管如此,VHDL 仍然可能無法實現 Verilog 對低級硬件建模的支持。因此,如果我是 ASIC 設計師,我會更喜歡 Verilog 而不是 VHDL。
高級建模
另一方面,如上述圖表所示,VHDL 在高級硬件建模方面優于 Verilog。與 Verilog 相比,VHDL 為高級硬件建模提供了更多功能和構造。以下是在比較 VHDL 和 Verilog 時支持高級硬件建模的主要不同功能:-
VHDL 中的用戶定義數據類型
type int_8bit is range 0 to 255 -- define 8-bit unsigned numbers
signal i : int_8bit;
type state_FSM is (Idle, start, calculate , finish, delay)
-- define symbolic states to represent FSM states.
signal current_state, next_state: state_FSM;
VHDL 中的設計重用包
VHDL 中的包通常用于數據類型和子程序的聲明。VHDL 包中聲明的子程序或數據類型可用于許多不同的實體或體系結構。例如:
package fsm_type is
type FSM_states is (IDLE, TRANSMIT, RECEIVE, STOP);
end package
-- to use the FSM_states type in an entity or architecture
-- use the following statement on top of the entity
use work.fsm_type.all
entity example is
Verilog 中沒有包定義。與 VHDL 包最接近的 Verilog 等效項是`includeVerilog 編譯器指令。函數或定義可以單獨保存在另一個文件中,然后通過使用`include指令在模塊中使用它。下面是一個 Verilog 示例代碼:
// Below is the content of "VerilogVsVHDL.h" file
`define INPUT_VERILOG "./test_VerilogvsVHDL.hex" // Input file name
`define OUTPUT_VHDL "VHDL.bmp" // Output file name
`define VERILOG_VHDL_DIFFERENCE
// Then call it in every single module that you want to use the definition above
`include "VerilogVsVHDL.h"
-
VHDL 中的配置語句
entity BUF is
generic (DELAY : TIME := 10 ns);
port ( BUF_IN : in BIT; BUF_OUT : out BIT);
end BUF;
-- The first design architecture for BUF
architecture STRUCT_BUF1 of BUF is
signal temp: bit;
begin
BUF_OUT <= not temp after DELAY;
temp <= not BUF_IN after DELAY;
end STRUCT_BUF1;
-- The second design architecture for BUF
architecture STRUCT_BUF2 of BUF is
begin
BUF_OUT <= BUF_IN after 2*DELAY;;
end STRUCT_BUF2;
-- Testbench to simulate BUF entity
entity BUF_TESTBENCH is
end BUF_TESTBENCH;
architecture STRUCT_BUF_TEST of BUF_TESTBENCH is
signal TEST1, TEST2 : BIT := '1';
-- BUF_COMP component declaration:
component BUF_COMP is
generic (TIME_DELAY : TIME);
port ( IN1 : in BIT; OUT1 : out BIT );
end component;
begin
-- instantiation of BUF_COMP component:
DUT:BUF_COMP generic map (10 ns) port map (TEST1,TEST2);
end STRUCT_BUF_TEST;
-- Configuration specify the design entity and architecture
-- for the DUT component instance in the testbench above
configuration CONFIG_BUF of TEST_BUF is
-- Associate BUF_COMP component instance to BUF design entity
-- and STRUCT_BUF1 design architecture for simulation
for STRUCT_BUF_TEST
for DUT : BUF_COMP
use entity WORK.BUF (STRUCT_BUF1)
generic map (DELAY => TIME_DELAY)
port map (BUF_IN => IN1, BUF_OUT => OUT1);
end for;
end for ;
end CONFIG_BUF;
Verilog-2001 中還添加了配置塊。
-
VHDL 中的庫管理
-- library management in VHDL
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.numeric_std.all;
use work.clock_div.all;
簡而言之,VHDL 在高級硬件建模方面比 Verilog 更好。由于 FPGA 設計流程不需要低級硬件建模,如果我是 FPGA 設計師,我更喜歡 VHDL 而不是 Verilog。 值得一提的是,SystemVerilog 的創建是為了通過將 VHDL 中的高級功能和結構添加到 Verilog 中進行驗證來增強 Verilog 語言在高級建模中的弱點。SystemVerilog 現在廣泛用于 IC 驗證。
冗長(Verboseness:):Verilog 與 VHDL
-
VHDL 是強類型的vs Verilog 是松散類型的
signal test_reg1: std_logic_vector(3 downto 0);
signal test_reg2: std_logic_vector(7 downto 0);
test_reg2 <= test_reg1;
-- You cannot assign a 4-bit signal to an 8-bit signal
-- in VHDL, it will introduce a syntax error below:
-- Width mismatch. Expected width 8, Actual width is 4
-- for dimension 1 of test_reg1.
編譯上面的VHDL代碼時,會出現語法錯誤“ Width mismatch. Expected width 8, Actual width is 4 ”。如果將VHDL代碼改為“test_reg2 <= "0000"&test_reg1; "匹配位寬,則不會出現語法錯誤。
如果在 Verilog 中將 4 位信號分配給 8 位信號會怎樣?
wire [3:0] test1;
wire [7:0] test2;
// In Verilog, you can assign 4-bit signal to 8-bit signal.
assign test2 = test1;
// there will be no syntax error during synthesis
當您將 4 位信號分配給 8 位信號時,Verilog 編譯器不會引入語法錯誤。在 Verilog 中,不同位寬的信號可以相互分配。Verilog 編譯器將使源信號的寬度適應目標信號的寬度。未使用的位將在綜合期間進行優化。
下面是在分配信號時混合數據類型的另一個 VHDL 示例:
signal test1: std_logic_vector(7 downto 0);
signal test2: integer;
test2 <= test1;
-- Syntax Error: type of test2 is incompatile with type of test1
上面的 VHDL 代碼會引入一個語法錯誤“ (type of test2 is incompatible with type of test1)test2 的類型與 test1 的類型不兼容”。你必須轉換test1的分配之前整數數據類型TEST1到TEST2如下:
library IEEE;
USE ieee.numeric_std.ALL;
signal test1: std_logic_vector(3 downto 0);
signal test2: integer;
-- Use IEEE.NUMBERIC_STD.ALL Library for this conversion
test2 <= to_integer(unsigned(test1));
-- No syntax errors this time
另一方面,Verilog 在分配時混合數據類型時沒有問題。以下是一個 Verilog 示例:
reg [3:0] test1;
integer test2;
always @(test1) begin
test2 = test1;
end
// NO syntax errors when compiling
當您將具有reg數據類型的信號分配給具有不同數據類型(如integer )的另一個信號時, Verilog 編譯器不會像在 VHDL 中那樣引入語法錯誤。
-
VHDL 復雜數據類型與 Verilog 簡單數據類型
-- VHDL code for ALU
process(SEL,ABUS,BBUS,tmp1,tmp2)
begin
case(SEL) is
when "0000" => ALUOUT <= tmp1; -- ADD
when "0001" => ALUOUT <= tmp2;-- SUB
when "0010" => ALUOUT <= BBUS; -- AND
when others => ALUOUT <= ABUS;
end case;
end process;
// Verilog equivalent to VHDL ALU
assign ALUOUT=(SEL==0)?tmp1:((SEL==1)?tmp2:((SEL==2)?BBUS:ABUS));
VHDL 中的 if else、when/else、with/select 語句可以在 Verilog 中使用條件運算符 (?) 表達得更簡潔,如上例所示。
Verilog 和 VHDL 之間的其他區別:
-
Verilog 類似于C 編程語言,而 VHDL 類似于Ada或 Pascal 編程語言
-
Verilog 區分大小寫,而 VHDL 不區分大小寫。這意味著DAta1和Data1在Verilog中是兩個不同的信號,但在VHDL中是相同的信號。在 Verilog 中,要在模塊中使用組件實例,您只需在模塊中使用正確的端口映射對其進行實例化。在VHDL中,在實例化實例之前,如果您使用舊的實例化語句作為以下示例,則通常需要將組件聲明為架構或包中。在 VHDL-93 中,您可以像這樣直接實例化實體:“Label_name: entity work.component_name port map (port list);”。
例如,要在 VHDL 中實例化實體 clk_div,將在體系結構代碼中添加一個組件聲明,如下所示:
architecture Behavioral of digital_clock is
-- component declaration before instantiation below
component clk_div
port (
clk_50: in std_logic;
clk_1s : out std_logic
);
end component;
signal clk, clk_1s: std_logic;
begin
-- component instantiation
create_1s_clock: clk_div port map (clk_50 => clk, clk_1s => clk_1s);
end
或者在包中聲明組件以供重用:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
package clock_div_pack is
component clk_div is
port (
clk_50: in std_logic;
clk_1s : out std_logic
);
end component clk_div;
end package;
-- Declare the component in a separate package and
-- reuse by using the following statement:
use work.clock_div_pack.all;
entity clock is
end clock;
architecture Behavioral of clock is
signal clk, clk_1s: std_logic;
begin
create_1s_clock: clk_div port map (clk_50 => clk, clk_1s => clk_1s);
end
在 VHDL-93 中直接實例化實體的示例代碼:
create_1s_clock: entity work.clk_div port map (clk_50 => clk, clk_1s => clk_1s);
-
Verilog 具有編譯器指令,例如`timescale(聲明時間單位和延遲精度)、`define(將文本字符串聲明為宏名稱)、`ifdef、ifndef `else `elseif `endif(條件編譯)、`include(包括一個可以包含函數或其他聲明的文件)等。VHDL 沒有編譯器指令。
-
VHDL 支持枚舉和記錄數據類型,允許用戶為一種數據類型定義多個信號。Verilog 不支持枚舉和記錄類型。下面是枚舉和記錄類型的 VHDL 代碼:
type FSM is (IDLE, TEST, VERILOGvsVHDL, STOP, FPGA4student);
-- enumerated type
type int_4 is range 0 to 15;
-- record tye in VHDL
type record_example is record
data1: integer;
data2: int_4;
data3: FSM;
end record;
等等。
盡管 Verilog 和 VHDL 之間存在差異,但它們是兩種最流行的硬件描述語言。如果可以,最好同時學習它們。重要的是要記住,在編碼時始終考慮邏輯門或硬件以開發硬件編碼思維,而在使用 Verilog 和 VHDL 編碼時忘記軟件編程思維,這一點非常重要。詳細對比 表格:
表格轉自:Verilog HDL和VHDL的區別
作者:比特波特
VHDL 與 VerilogHDL 的不同點
序號 | 區別之處 | VHDL | Verilog |
1 | 文件的擴展名不一樣 | .vhd | .v |
2 | 結構不一樣 |
包含庫、實體、結構體。 ENTITY 實體名 IS PORT(端口說明) END 實體名 ;ARCHITECTURE 結構體名 OF 實體名 IS 說明部分BEGIN 賦值語句/ 元件語句/ 進程語句 END 結構體名 ; |
模塊結構 (module… endmodule) module 模塊名 (端口列表) ; 輸入/輸出端口說明; 變量類型說明;assign 語句 (連續賦值語句) ;元件例化語句;always@(敏感列表)begin …end endmodule其中assign語句、元件例化語句、always語句的順序可以更換 |
3 | 對庫文件的要求不一樣 | 須有相應的庫或程序包支持,實體間調用子程序,需要將子程序打成程序包 | 沒有專門的庫文件 (只有基本門的庫),模塊可以通過例化直接調用,不需要打成程序包 |
4 | 端口定義的地方不一樣 | 實體中定義 | module的模塊名后面先列出端口列表,再在模塊中用input,output等定義 |
5 | 端口定義方式不一樣 |
端口名(端口名,端口名) : 方向 數據類型名(Default Value) ; 例如:Q1 : IN Std_Logic_Vector(31 DOWNTO 0) ; |
端口類型 端口1,端口2,端口3,…; 例如:inout [31:0]Q; |
6 | 端口定義類型不一樣 | 有IN, OUT, INOUT, BTFFER 四種 | 有input ,output, inout 三種 |
7 | 內部信號(SIGNAL)聲明不一樣 | 在結構體中聲明,有些局部變量還可在進程中聲明 | 在端口定義后進行聲明內部變量 |
8 | 標識符規則不一樣 | 不區分大小寫 | 區分大小寫 |
9 | 關鍵詞要求不一樣 |
允許大小寫混寫 例如:EnTity |
關鍵詞必須小寫 |
10 | 常量定義的關鍵詞和格式表示不一樣 | CONSTANT 常量名:數據類型 :=數值; | parameter 常量名1 = 數值1, 常量名2 = 數值2,…,常量名n = 數值n; |
11 | 常量表示不一樣 |
用雙引號. 例如:B"011100" |
<位寬>’<進制符號><數字> 例如:8’b10110011 |
12 | 數組定義方式不一樣 |
定義4位數組A: A(3 DOWNTO 0 ) 或者A(0 TO 3) |
定義4位數組A: A[3:0] 或者A[0:3] |
13 | 下標名表示不一樣 |
用小括號表示, 例如:a(0) |
用中括號表示, 例如:a[0] |
14 | 數據對象不一樣,且二者變量的含義不一樣 |
常量,變量,信號. 變量是一個局部量,只能在進程和子程序中使用。變量的賦值是一種理想化的數據傳輸,是立即發生,不存在任何延時的行為。信號是描述硬件系統的基本數據對象,它類似于連接線。信號可以作為設計實體中并行語句模塊間的信息交流通道。數據對象沒有默認 |
常量,變量 變量是在程序運行時其值可以改變的量。變量默認為wire型 |
15 | 數據默認值 | 默認值為本類型的最小非負值(某個類型的范圍是以0為對稱的) | wire類型默認值為 z, reg類型默認值為x ; |
16 | 變量定義的格式不一樣 |
VARIABLE 變量名:數據類型 :=初始值 例如:VARIABLE k:Integer RANGE 0 TO 7; |
數據類型 [位寬] 變量1,變量2,…,變量n; |
17 | 數據類型不一樣 |
布爾(BOOLEAN)、位(BIT)、位矢量(BIT_VECTOR)、標準邏輯位(STD_LOGIC)、標準邏輯矢量(STD_LOGIC_VECTOR)。 VHDL的數據類型比較復雜。 |
wire,tri,reg,interger,real,time型,主要是wire和reg型,比較簡單。 |
18 | 賦值不一樣 | 按數據對象賦值分,變量賦值使用“:=”,信號賦值使用"<=" | 按語句的執行情況分,assign語句和阻塞語句用“=”賦值,非阻塞語句用“<=” |
19 | 賦值要求不一樣 |
強類型語言,賦值兩邊的賦值目標和表達式的數據類型必須一樣。不同類型和寬度的數據之間不能運算和賦值,需要調用包來完成轉換; 例如:A:IN STD_LOGIC_VECTOR(2 DOWNTO 0)B:IN STD_LOGIC_VECTOR(2 DOWNTO 0)C:OUT STD_LOGIC_VECTOR(3 DOWNTO 0) 則C<=A OR B;會出錯 |
不是強類型語言,可以自動完成不同類型數據的運算和賦值; 例如:input [2:0]a;input [2:0]b;output [3:0]c; assign c=a&b;不會出錯 |
20 | 操作符不一樣 | 邏輯操作符(Logica Operator)、關系操作符(Relationa Operator)、算術操作符(Arithmetic Operator)、符號操作符(Sign Operator),沒有縮減操作符,沒有三目的條件操作符 | 操作符比較豐富,有算數操作符,邏輯操作符,位運算、關系操作符,等式操作符,縮減操作符,轉移操作符,條件操作符,位并接操作符 |
21 | 條件中,等于判斷符號不一樣 | 等于= ; 不等于 /= |
等于(= =)或全等(= = =) 不等于(!=)或不全等(!= =) |
22 | 邏輯操作符不一樣 |
AND, NAND, NOT, OR, NOR, XNOR, XOR等 該邏輯操作符運算結果跟Verilog HDL的位運算一樣 |
&&(邏輯與), || (邏輯或), !(邏輯非), ~ (按位取反), &(按位與), |(按位或), ^(按位異或), ^~ 或~ ^(按位同或) |
23 | 移位操作符不一樣 | 除了邏輯左移SLL、邏輯右移SRL之外,還有算數左移SLA、算數右移SRA、循環左移ROL、循環右移ROR。其中邏輯左移SLL、邏輯右移SRL與Verilog HDL的左移<<, 右移>>一致 | 只有邏輯左移<< 和邏輯右移>>,沒有算數左移、算數右移、循環左移、循環右移。 |
24 | 并置操作符不一樣 |
用&并置, 例如:a&b |
用{ }并置, 例如:{a, b} |
25 | 并行賦值語句不一樣 | 信號賦值語句 (直接賦值、條件賦值、選擇賦值) | assign語句 (連續賦值) 只對wire型 |
26 | 順序語句不一樣 |
信號賦值 變量賦值(變量賦值只能在進程和子進程中進行) |
阻塞語句 非阻塞語句 |
27 | 并行語句中的進程語句不一樣 |
PROCESS(敏感列表) BEGIN順序語句;END PROCESS; |
always@ (敏感列表) begin順序語句;end |
28 | 條件判斷語句if的格式不一樣 |
IF 條件1 THEN 順序描述語句;ELSIF 條件2 THEN順序描述語句;…ELSE 順序描述語句;END IF; |
if (條件1) 順序描述語句; else if (條件2) 順序描述語句;…else 順序描述語句; |
29 | 條件控制語句case的格式不一樣 |
CASE 表達式 IS WHEN 條件表達式1 => 順序描述語句; WHEN 條件表達式2 => 順序描述語句; WHEN 條件表達式3 => 順序描述語句; … WHEN 條件表達式n => 順序描述語句;END CASE如果沒有列舉出CASE和IS之間的表達式的全部取值,則WHEN OTHERS =>必不可少 |
case (表達式) 選擇值1:語句1; 選擇值2:語句2; 選擇值3:語句3; … 選擇值n:語句n; default:語句n+1;endcasedefault沒有,不會出現語法錯誤,但邏輯有可能產生錯誤 |
30 | case語句的應用范圍也不一樣 | 在CASE語句中,條件表達式是沒有優先級的,如優先級編碼器可以用IF語句進行描述,但不可以使用CASE語句描述 | 除了case以外,還有相關的casex和casez語句,如用casex可以實現優先編碼器 |
31 | 循環控制語句不一樣 | 循環控制語句有:FOR_LOOP循環語句、WHILE_LOOP循環語句、NEXT語句、EXIT語句 | for語句、repeat語句、while語句、和forever語句 |
32 | for循環控制語句格式不一樣 |
[標號:] FOR 循環變量 IN 循環次數范圍 LOOP 順序語句 END LOOP [標號]; |
for(循環指針=初值; 循環指針<終值; 循環指針=循環指針+步長值) begin 順序語句; … end |
33 | for循環中的循環變量存在區別 | 循環變量不需要定義 | 循環指針需要定義 |
34 | while語句格式不一樣 |
[標號:] WHILE 條件 LOOP 順序描述語句; END LOOP [標號];在循環體內,必須包含條件式中判別變量的賦值語句。 |
while(循環執行條件表達式) begin 重復執行語句; 修改循環條件語句; end |
35 | 元件例化不一樣 |
COMPONENT 元件名 IS GENERIC 說明;PORT 說明;END COMPONENT 元件名; |
設計模塊名 <例化電路名> (端口列表) ; |
36 | 時鐘定義不一樣 |
時鐘列在PROCESS的敏感列表中,如若上升沿有效,則 PROCESS(clk)BEGINIF (clk’EVENT AND clk=‘1’) THEN…END PROCESS; |
在always結構中,上升沿直接體現在always的敏感列表中。如 always@ (posedge clk)begin…end |
37 | 時鐘邊沿定義方式不一樣 |
上升沿(clk’EVENT AND clk=‘1’) 下降沿(clk’EVENT AND clk=‘0’) |
上升沿posedge clk 下降沿negedge clk |
38 | 生成重復結構的能力不同 |
有生成語句(GENERATE)生成由大量相同單元構成的模塊,格式為: [標號:] FOR 循環變量 IN 取值范圍GENERATE[說明部分]BEGIN[并行語句]; - -元件例化語句,以重復產生并行元件。END GENERATE [標號];或者IF 條件 GENERATE[說明部分]BEGIN[并行語句]END GENERATE [標號]; |
沒有對應的生成語句,有相近的實例數組,格式為: <模塊名字> <實例名字> <范圍> (<端口>); |
39 | 子程序不一樣 | procedure和function | task 和 function |
40 | 注釋方法不一樣 | 用- -引導注釋信息 | 用//或/*…*/注釋 |
-
FPGA
+關注
關注
1630文章
21796瀏覽量
606003 -
vhdl
+關注
關注
30文章
817瀏覽量
128343 -
電路模塊
+關注
關注
7文章
34瀏覽量
15406
原文標題:FPGA開發語言的選擇
文章出處:【微信號:ZYNQ,微信公眾號:ZYNQ】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論