序号 | 差別之處 | 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 | 指派不一樣 | 按資料對象指派分,變量指派使用“:=”,信号指派使用"<="< span=""> | 按語句的執行情況分,assign語句和阻塞語句用“=”指派,非阻塞語句用“<=”< span=""> |
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 元件名 ISGENERIC 說明;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 | 注釋方法不一樣 | 用- -引導注釋資訊 | 用//或/*…*/注釋 |
- END -