wire 和reg是Verilog程序里的常見的兩種變量類型,他們都是構(gòu)成verilog程序邏輯最基本的元素。正確掌握兩者的使用方法是寫好verilog程序的前提。但同時,因為他們在大多數(shù)編程語言中不存在,很多新接觸verilog語言的人并不能很清楚的區(qū)別兩種變量的不同之處。這里簡單對他們做一個比較,方便在編程時區(qū)別使用。
功能和狀態(tài)
Wire主要起信號間連接作用,用以構(gòu)成信號的傳遞或者形成組合邏輯。因為沒有時序限定,wire的賦值語句通常和其他block語句并行執(zhí)行。
Wire不保存狀態(tài),它的值可以隨時改變,不受時鐘信號限制。
除了可以在module內(nèi)聲明,所有module的input 和output默認都是wire型的。
Reg是寄存器的抽象表達,作用類似通常編程語言中的變量,可以儲存數(shù)值,作為參與表達式的運算,通常負責(zé)時序邏輯,以串行方式執(zhí)行。
Reg可以保存輸出狀態(tài)。狀態(tài)改變通常在下一個時鐘信號邊沿翻轉(zhuǎn)時進行。
賦值方式
Wire有兩種賦值方式
1.在定義變量時賦初值,方式是用=。如果之后沒有再做賦值,初值會一直保留,(是否可以給邏輯?)
wire wire_a = 1’b0;
2.用assign語句賦值,等式右邊可以是wire,reg,一個常量或者是邏輯運算
Wire wire_a;
Wire wire_b;
Wire wire_c;
Reg reg_a;
assign wire_b = wire_a;
assign wire_c =reg_a;
assign wire_d =wire_b & wire_c;
如果不賦值,wire的默認狀態(tài)是高阻態(tài),即z。
對reg的使用通常需要有觸發(fā)條件,在always的block下進行。觸發(fā)條件可以是時鐘信號上升沿。賦值語句可以是=或者
Wire wire_a;
Wire wire_b;
Reg reg_a;
Reg reg_b;
Always @( posedge clk)
Begin
Reg_b =reg_a;
Reg_c = wire_a | wire_b;
end
Reg在聲明時候不賦初值。未賦值的reg變量處于不定態(tài),即x。
使用方式
在引用一個module時,輸入端口可以是wire型,也可以reg型。這里可以把對input的賦值看作一個assign語句,使用的變量相當于等號右邊的變量,所以兩者都可以。
而對于輸出端口,必須使用reg型,而不能是wire型。同樣用assign的角度考慮,module的輸出在等號右邊,而使用的變量成了等號左邊,assign語句等號左邊只能是wire型。
位寬
這是個使用注意事項。所有的wire和reg在聲明時如果不做特殊聲明,只有1位。這個對于熟悉其他編程語言的人是一個容易犯錯的地方。
執(zhí)行
wire wire_a = 4’he;
語句最后得到的wire_a是0x1,而不是0xe。因為wire_a只取了0xe的最低位的值而省略掉了其他值。所以正確的語句應(yīng)該是
wire[3:0] wire_a = 4’he;
這樣wire_a輸出的結(jié)果才是一個0xe。
小結(jié)
這篇文章從功能,變量狀態(tài),賦值方式,使用方式等角度討論了wire和reg變量類型的區(qū)別。并且給出了一個在verilog中常見的使用錯誤及解決方法。
-
寄存器
+關(guān)注
關(guān)注
31文章
5434瀏覽量
124443 -
Verilog
+關(guān)注
關(guān)注
29文章
1367瀏覽量
112261
發(fā)布評論請先 登錄
使用STM32F103控制兩步進電機同時進行不同的運動(軟件指令驅(qū)動),與控制一個電機的不同之處在哪里?
Verilog中signed和$signed()的用法

Verilog 電路仿真常見問題 Verilog 在芯片設(shè)計中的應(yīng)用
Verilog 與 ASIC 設(shè)計的關(guān)系 Verilog 代碼優(yōu)化技巧
Verilog 測試平臺設(shè)計方法 Verilog FPGA開發(fā)指南
Verilog與VHDL的比較 Verilog HDL編程技巧
CCD傳感器與CMOS傳感器的相同之處與不同之處
NXP MCX N23和MCX N94/54的不同之處

評論