本文參考 夜煞CSDN 的CSDN 博客 ,有改動
全文地址請點擊:https://blog.csdn.net/u010549444/article/details/50993274?utm_source=copy
基本概念的差別
wire型數據常用來表示以assign關鍵字指定的組合邏輯信號,模塊的輸入輸出端口類型都默認為wire型,wire相當於物理連線,默認初始值是z。
reg型表示的寄存器類型,用於always模塊內被賦值的信號,必須定義為reg型,代表觸發器,常用於時序邏輯電路,reg相當於存儲單元,默認初始值是x。
在賦值語句中的差別
在連續賦值語句中,表達式右側的計算結果可以立即更新表達式的左側。在理解上,相當於一個邏輯之后直接連了一條線,這個邏輯對應於表達式的右側,而這條線就對應於wire。
在過程賦值語句中,表達式右側的計算結果在某種條件的觸發下放到一個變量當中,而這個變量可以聲明成reg類型。根據觸發條件的不同,過程賦值語句可以建模不同的硬件結構:如果這個條件是時鍾的上升沿或下降沿,那么這個硬件模型就是一個觸發器;如果這個條件是某一信號的高電平或低電平,那么這個硬件模型就是一個鎖存器;如果這個條件是賦值語句右側任意操作數的變化,那么這個硬件模型就是一個組合邏輯。
總而言之,wire只能被assign連續賦值,reg只能在initial和always中賦值
端口信號和內部信號的差別
信號可以分為端口信號和內部信號。出現在端口列表中的信號是端口信號,其它的信號為內部信號。
對於端口信號,一旦定義位input或者output端口,默認就定義成了wire類型,輸入端口只能是net類型(wire/tri)。輸出端口可以是net類型,也可以是reg類型。若輸出端口在過程塊中賦值則為register類型;若在過程塊外賦值(包括實例化語句),則為net類型。
內部信號類型與輸出端口相同,可以是net或reg類型。判斷方法也與輸出端口相同。若在過程塊中賦值,則為reg類型;若在過程塊外如assign賦值,則為net類型。
若信號既需要在過程塊中賦值,又需要在過程塊外賦值。這種情況是有可能出現的,如決斷信號。這時需要一個中間信號轉換。
inout是一個雙向端口, inout端口不能聲明為reg類型,只能是wire類型。
參考代碼解析
-
module net_reg(
-
//input
-
A1,A2,A3,A4,A5,CLK,
-
//output
-
E1,E2,E3,E4,E5
-
);
-
-
//端口信號
-
//1、輸入端口定義,默認定義為wire類型,省略聲明為wire A1,A2,A3;
-
input A1;
-
input A2;
-
input A3;
-
input [1:0]A4;
-
input A5;
-
input CLK;
-
-
-
//2、輸出端口定義,默認定義為wire類型,省略聲明為wire E1,E2,E3;
-
output E1;
-
output E2;
-
output E3;
-
output [9:0]E4;
-
output reg E5;
-
reg E2;
-
reg E3;
-
reg [9:0]E4;
-
-
//內部信號:過程塊中賦值,則為reg類型;若在過程塊外如assign賦值,則為net類型。
-
reg [9:0]in_var1;
-
reg [5:0]in_var2;
-
reg [3:0]cc;
-
-
-
initial begin //E3 在initial塊中賦值,需要定義為reg
-
E3 = A3;
-
end
-
-
assign E1 = A1; // 連續賦值語句中被賦值,定義為wire
-
-
always @ (A1,A2,A3,A4)begin
-
E2 = A2; //E2在always過程塊中被賦值,定義為reg類型
-
if(A3 == 0)
-
E3 = A3; //E3在always過程塊中被賦值,定義為reg類型
-
if(A4 == 2'd0)begin
-
in_var1 = 10'd0;
-
in_var2 = 6'd36;
-
E4 = in_var1;
-
E4 = in_var2;
-
end
-
end
-
-
always @ (posedge CLK)begin
-
if(A5 == 0)begin
-
E5 <= 0;
-
cc <= 4'd0;
-
end
-
else begin
-
E5 <= A5;
-
cc <= cc + 1'b1;
-
end
-
end
-
-
endmodule
【注意】
雖然E2定義在了過程賦值語句中,但是這個條件是賦值語句右側任意操作數的變化,那么這個硬件模型就是一個組合邏輯。
雖然E3定義在了過程賦值語句中,但是這個條件是某一信號的高電平或低電平,那么這個硬件模型就是一個鎖存器;