verilog知識點(一)
一、Verilog_HDL模型
所謂不同的抽象類別,實際上是指同一個物理電路,可以在不同層次上用Verilog語言來描述。如果只從行為功能的角度來描述某一電路模組,就稱作行為模組。如果從電路結構的角度來描述該電路模組,就稱作結構模組。根據抽象的級別將Verilog的模組分為5種不同的等級:
(1)系統級(system-level):用語言提供的高階結構能夠實現待設定模組的外部效能的模型;
(2)演算法級(algorithm-level):用語言提供的高階結構能夠實現演算法執行的模型;
(3)RTL級(register transfer level):描述資料在暫存器之間的流動和如何處理、控制這些資料流動的模型;
(4)門級(gate-level):描述邏輯閘以及邏輯閘之間連線的模型,與邏輯電路有明確的關係;
(5)開關級(switch-level):描述器件中三極體和儲存節點以及他們之間連線的模型,與具體的物理電路有對應關係;
系統級、演算法級和RTL級屬於行為級描述,只有RTL級才與邏輯電路有明確的對應關係;門級屬於結構級描述。
二、模組結構
verilog的基本設計單元是模組(block),一個模組是由兩部分組成,一部分描述介面,另一部分描述邏輯功能,即定義輸入如何影響輸出。
verilog結構位於module和demodule宣告語句之間,每個verilog程式包括埠定義、I/O口說明、內部訊號宣告與功能定義。
2.1 模組的埠定義:module 模組名(埠1,埠2,......)
2.2 模組引用的埠連線
(1)嚴格按照埠順序進行連線,不用表明原模組定義時規定的埠名稱;
模組名(連線埠1訊號名,連線埠2訊號名,連線埠3訊號名,...)
(2)用埠名與被引用模組的埠相對應,而不必嚴格按照埠順序對應;
模組名(.埠1名(訊號1名),.埠2名(訊號2名),...)
我建議在FPGA開發設計中使用第(2)種埠連線方式。
2.3 模組功能定義
(1)assign語句(連續賦值語句):wire變數,不能是reg變數
(2)例項元件引用:鍵入元件的名字和相連的引腳,例如:and #2 u1(q, a, b);
(3)always塊,例如:always @(posedge clk or negedge rst)
assign語句是用來描述組合邏輯,always語句既可以用來描述組合邏輯,也可以描述時序邏輯。
在verilog模組中的所有過程塊(如:initial塊、always塊)、連續賦值語句、例項引用都是並行的,他們表示的是一種通過變數名互相連線的關係。在同一個verilog模組檔案中,assign語句、例項元件、always塊都是同時執行的,併發的,這三者出現的先後次序無關。兩個或多個always模組同時執行,而每個模組內部的語句是順序執行。只有連續賦值語句assign和例項引用語句可以獨立於過程塊而存在於模組功能定義部分。
三、verilog資料型別
資料型別用來表示數位電路硬體中的資料儲存和傳送元素,Verilog HDL中一共有19種資料型別。
4個基本資料型別:reg型, wire型, integer型, parameter型;
其他型別為:large型, medium型, scalared型, time型, small型, tri型, trio型, tril型, triand型, trior型, trireg型, vectored型, wand型, wor型。
3.1 常量
3.1.1 數字
在Verilog HDL中,整數常量共有4種進製表示形式:二進位制(b或B)、十進位制(d或D)、十六進位制(h或H)和八進位制(o或O).
數字表達方式有3種:
(1)<位寬><進位制><數字>,比較全面的描述方式;
(2)<進位制><數字>,數字的位寬採用預設位寬(由具體的機器系統決定);
(3)<數字>,採用預設進位制(十進位制)。
在表示式中,位寬指定了數字的精確位數。
(4)x和z值。x代表不定值,z代表高阻值,一個x可用來定義十六進位制數的4位二進位制的狀態,八進位制數的3位,二進位制數的1位;z的表達與x類似,另外,z有另外一種表示形式,可以寫作 “?”,尤其在case語句中可以提高程式的可讀性。
例如:8‘h4x //位寬為8的十六進位制數,其低4位為不定值
(5)負數:可以定義為負數,在數字表達式最前面(位寬之前)加一個減號。
3.1.2 引數型(parameter)
在Verilog HDL中,用parameter定義一個識別符號代表常量,稱為符號常量,其說明格式如下:
parameter 引數名1 = 表示式,引數名2 = 表示式,...
其中,賦值語句的右邊必須是常數表示式,即該表示式只能包含常數或之前定義的引數。
3.2 變數
3.2.1 wire型
wire型資料用來表示以assign關鍵字指定的組合邏輯訊號,在Verilog HDL程式模組中,輸入輸出訊號型別預設自動定義為wire型,wire型訊號可以作為任意方程式的輸入,或assign語句和例項元件的輸出。
wire[n-1, 0] a1, a2,...,ai,//共有i條匯流排,每條匯流排內部有n條線路。
3.2.2 reg型
reg型資料常用來表示always模組內的指定訊號,常代表觸發器,在always模組內被賦值的訊號必須定義為reg型,reg型資料的預設初始值為不定值x。reg型資料可以是整數,也可以是負數,但當一個reg型資料是一個表示式的運算元時,它的值被當作是無符號數,即正值。
3.2.3 memory型
memory型資料是通過擴充套件reg型資料的地址範圍來生成的,其格式如下:
reg[7:0] mema[255:0] //定義一個名為mema的儲存器,該儲存器有256個8位儲存器,該儲存器地址範圍為:0-255。
對儲存器進行地址索引的表示式必須是常數表示式。
memory型和reg型資料類似,但有不同之處,如一個由n個1位暫存器構成的儲存器組是不同於一個n位暫存器的。例如:
reg[n-1 : 0]rega; //一個n位暫存器
reg mema[n-1 : 0]; //n個1位暫存器構成的儲存器組
另外,一個n位暫存器可以在一條賦值語句中進行賦值,而一個完整的儲存器組則不可以。如果想對memory型資料進行讀寫操作,必須指定儲存器陣列地址,例如:
mema[3] = 0; //給mema中的第3個寄存單元賦值
四、運算子及其表示式
Verilog HDL語言中的運算子按功能可以分為以下幾類:
(1)算術運算子(+, -, *, /, %),又稱為二進位制運算子;
(2)賦值運算子(=, <=);
(3)關係運算符(>, <, >=, <=);
(4)邏輯運算子(&&, ||, !);
(5)條件運算子(? : );
(6)位運算子(~, |, ^, &, ^~);
(7)移位運算子(<<, >>);
(8)拼接運算子({ });
(9)其他
這些運算子按其所帶的運算元的個數可以分為3種:
(1)單目運算子(unaary operater): 可以帶一個運算元,運算元放在運算子的右邊; 例如:clock = ~clock;
(2)雙目運算子(binaryoperater): 可以帶兩個運算元,運算元放在運算子的兩邊; 例如: c = a|b;
(3)三目運算子(ternary operater): 可以帶三個運算元,這三個運算元用三目運算子分隔開; 例如:r = s?t:u;
4.1 算術運算子
共有以下幾種:
(1)+ (加法或正值運算子)
(2) - (減法或負值)
(3)* (乘)
(4)/ (除)
(5)% (模或求餘運算)
在進行整數除法運算時,結果要略去小數部分,只取整數部分;而進行取模運算時,結果的符號位採用模運算式中第一個運算元的符號位,如下例:
模運算表示式 結果 說明
10%3 1 餘數為1
11%3 2 餘數為2
12%3 0 餘數為0,即無餘數
-10%3 -1 結果取第一個運算元的符號位,所以餘數為-1
11%3 2 結果取第一個運算元的符號位,所以餘數為2
在進行算術運算操作時,如果某一個運算元有不確定的值x,則整個結果也為不定值x。
4.2 位運算子
在硬體電路中,訊號有4種狀態值,即1,0,x,z。在電路中訊號進行與、或、非時,反映在Verilog HDL語言中則是響應的運算元的位運算,Verilog HDL中一共有5種位運算子:
(1)~ //取反
(2)& //按位與
(3)| //按位或
(4)^ //按位異或
(5)^~ //按位同或(異或非)
除取反運算子之外,其他幾個位運算子均是雙目運算子。
不同長度的資料進行位運算時,系統會自動按照右對齊方式,位數少的運算元高位自動補零。
4.3 邏輯運算子
在Verilog HDL中,一共有3種邏輯運算子:
(1)&& 邏輯與
(2)|| 邏輯或
(3)! 邏輯非
“&&”和“||”是雙目運算子,“!”是單目運算子。
邏輯運算子中的“&&”和“||”的優先順序低於算數運算子,“!”優先順序高於算術運算子。
4.4 關係運算符
在Verilog HDL中,一共有4種關係運算符:
(1)a<b
(2)a>b
(3)a<=b
(4)a>=b
所有的關係運算符具有相同的優先順序,關係運算符的優先順序低於算數優先順序。
4.5 等式運算子
在Verilog HDL中,一共有4種等式運算子:
(1)==(等於)
(2)!=(不等於)
(3)===(等於)
(4)!==(不等於)
這四個運算子均是雙目運算子,具有相同的優先順序,(1)和(2)又稱為邏輯等式運算子,(3)和(4)又稱為case等式運算子,常用於case表示式的判別。
由於運算元的某些位可能是不定值x或高阻值z,(1)和(2)運算子運算的結果也可能是不定值x,(3)和(4)運算子則不同,它對運算元進行比較時對某些位的不定值x或高阻值z也進行比較,兩個運算元必須完全一致,其結果才為1,否則為0。
等式運算子真值表如下:
=== | 0 | 1 | x | z | == | 0 | 1 | x | z |
0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | x | x |
1 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | x | x |
x | 0 | 0 | 1 | 0 | x | x | x | x | x |
zx | 0 | 0 | 0 | 1 | z | x | x | x | x |
4.6 移位運算子
在Verilog HDL中,一共有2種移位運算子:<<(左移位),>>(右移位)
這兩種移位運算都是用0來填補移出的空位。
4'b1001 <<1 = 5'b10010; 4'b1001 <<2 = 6'b100100;
1<<6 = 32'b1000000; 4'b1001>>4 = 4'b0000;
4.7 位拼接運算子
位拼接運算子{ }可以把兩個或多個訊號的某些位拼接起來,在位拼接表示式中不允許存在沒有指定位數的訊號,因為在計算機中計算拼接訊號位寬大小時必須知道其中每一個訊號的位寬。
位拼接還可以用重複法或巢狀法來表示,例如:
{4{a}} 等價於 {a, a, a, a}
{b,3{a, b}} 等價於 {b, a, b, a, b, a, b}
4.8 縮減運算子
縮減運算時對單個運算元進行與或非遞推運算,最後的運算結果是1位的二進位制數。運算過程如下:第一步先將運算元的第1位與第2位進行與或非運算,第二步將運算結果與第3位進行與或非運算,以此類推,直至最後一位。
例如: reg[3:0] a; reg b; b = &a; 相當於 b = ((a[0]&a[1] )&a[2])&a[3];