Verilog 變量聲明與數據類型一


Verilog 變量聲明與數據類型一
Verilog語法中最基本的數據類型有 線網(wire),寄存器(reg)和整數(integer)三種類型,這三種數據類型是可綜合的數據類型,在Verilog 程序設計中被廣泛使用。其它還有可以用於仿真的數據類型如 timer,real,字符串等變量都可以看作reg類型的擴展。wire,reg ,integer,timer,real是聲明變量類型的關鍵字。變量必須先聲明后使用,聲明后變量的數據類型也就確定了。變量聲明是模塊(module)內惟一的,不能在同一個模塊或函數內重復聲明。
  1. 線網(wire):
線網(wire)類型表示邏輯單元或實例之間的連線,一般由邏輯單元的輸出驅動。沒有連接驅動的wire型變量的值為高阻’z’。
  • wire類型變量的使用:
  • wire型變量的聲明與賦值
 
wire類型的變量只能由assign語句賦值,或在聲明時賦初值。而且賦值的機會只有一次。
變量聲明實例:
wire a, b;
wire c = 0;
wire d = 1'b1;
assign a = c;
聲明a, b為線網類型,並將c的值賦給a, 此時a的為0;而且a只有這一次賦值機會。
變量c在聲明的時候賦初值為0,此后c就一直保留該值,不能再給c賦值,也不能再次聲明。
注意:wire類型的變量不能重復賦值。
  •  
  • 橋接
 
Wire 型變量作為中間變量可以實現橋接的作用。在下面的例子中可以看出,wire型變量起到變量之間值傳遞的作用。
實例1:
module wire_bridge
(
input a,b,ci,
output y,co
);
 
wire d, e, f;
 
assign d = a ^ b;
assign e = a & b;
assign f = ci & d;
assign y = d ^ ci;
assign co = e | f;
 
endmodule
wire變量在邏輯電路中的對應關系,簡單的說就是起到連線的作用。
 
 
在例化模塊之間傳遞變量。
實例2:
module fadder4
(
input ci,
input [3:0] a,
input [3:0] b,
 
output [3:0] y,
output co
);
 
wire co1,co2,co3;
 
// 例化 一位全加器,並重復使用4次
fadder1 fadder1_inst1
(
.ci (ci),
.a (a[0]),
.b (b[0]),
.y (y[0]),
.co (co1)
);
 
fadder1 fadder1_inst2
(
.ci (co1),
.a (a[1]),
.b (b[1]),
.y (y[1]),
.co (co2)
);
 
fadder1 fadder1_inst3
(
.ci (co2),
.a (a[2]),
.b (b[2]),
.y (y[2]),
.co (co3)
);
 
fadder1 fadder1_inst4
(
.ci (co3),
.a (a[3]),
.b (b[3]),
.y (y[3]),
.co (co)
);
 
endmodule
wire型變量只能在並發語句或例化模塊中被賦值,如實例1中的 d,e,f和實例2中co1,co2,co3; 但wire型變量可以根據需要在並發語句或順序語句中賦值給其他變量。
對wire型變量的變量賦值,只能采用並發語句賦值。變量定義時初始化時賦值和例化模塊的輸出賦值,wire型變量不能在順序語句中被賦值。
寄存器(reg )類型:
寄存器(reg)是一種具有記憶功能的數據類型。用來表示存儲單元,它會保持數據原有的值,直到被改寫。一般分為鎖存器和觸發器兩種。但無論哪一種建模,它們都只能在順序語句中被賦值,而不能在並發語句中賦值。
例:
reg a; reg b; always@(*) begin a <= 1’b1; b <= 1’b0; end
而 assign a = 1’b1; 就是錯誤的;因為a是reg型變量。
與wire類型變量不同的時,在reg型變量聲明時可以賦初值,而后續的順序語句可以對該變量繼續賦值,從而修改原值。而wire型變量只有一次賦值機會。
注意:在同一個順序過程語句中可以對reg型變量多次賦值,后面的賦值會替代前面的賦值,充分利用這一特點,可以是程序更簡潔。但不允許在多個順序過程語句中對同一個reg型變量都賦值。
 
module reg_assign ( input clk, input a, input b, input sel, output c ); reg ma; //順序過程語句1 always @(posedge clk) begin if(sel) ma <= a; end //順序過程語句2 always @(posedge clk) begin if(!sel) ma <= b; end assign c = ma; endmodule
上面的例子紅色部分是有問題的,雖然reg 型變量允許被多次賦值,但不能在不同的順序過程中多次賦值。上面的代碼可以修改如下:
module reg_assign
(
input clk,
 
input a,
input b,
 
input sel,
output c
);
 
reg ma;
 
//順序過程語句1
always @(posedge clk)
begin
if(sel)
ma <= a;
else
ma <= b;
end
 
assign c = ma;
 
endmodule
wire型變量與reg型變量都可以使用向量(vector)進行聲明;
如 : wire [3:0] a, b;
reg [3:0] c, d;
向量的運算遵循運算符的規則,細節參見verilog 運算符。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM