有一套源碼做網站還差什么新的數據新聞
????????wire類型就是一根線,線有兩端,一端發(fā)生改變,經過線傳遞的信號當然也會發(fā)生改變,reg類型則不同,可以把reg類型理解為存儲數據的寄存器,當滿足一定條件時,數值才被激活發(fā)生改變。
那么,信號和輸入輸出端口何時用wire類型,何時使用reg類型呢?請看下圖:
首先介紹一下模塊的內部和外部,見代碼:
module led_breath(//模塊外部input wire rst_n,input wire clk,output reg led);//模塊內部reg [15:0] timer [2:0];reg [1:0] breath_type;endmodule
????????輸入輸出(input output)端口常定義于模塊的外部(我認為是額外定義的,即input output端口也屬于信號),用于和其他模塊交互,最終需要我們配置相關的約束文件,將引腳和他們相連進而運行代碼。在括號之外的屬于模塊的內部的信號,屬于模塊的內部邏輯實現部分。
????????所以對于模塊內部來說,端口定義為wire或reg信號就比較好理解:我認為就可以把它們看作是變量,wire類型就是需要一次次assign賦值,例如說:規(guī)定了呼吸燈閃爍的頻率為 wire 類型等于1/T,reg類型就是在always循環(huán)中自動賦值,例如說:reg類型,計時器當每次時鐘翻轉的時候激活,使加一。
????????這也是很多教程所說的連續(xù)賦值(例如assign)是wire類型,過程賦值(例如always)是reg類型
? ? ? ? 那么對于模塊外部來說,input端口不是模塊能改變的,只能接收外部引腳的輸入,所以只能定義為wire類型,對于output端口來說,模塊可以讓信號經過內部不同的操作之后,輸出自己想要的值,所以可以定義為wire或reg類型,原理類似于模塊內部的wire和reg類型。
? ? ? ? 可以嘗試著看以下代碼:因為需要output端口的信號在模塊中的操作不同,所以定義的wire/reg類型也就可以不同。
module example_module(input [3:0] a, // 輸入端口,隱含 wire 類型input [3:0] b, // 輸入端口,隱含 wire 類型output reg [3:0] sum, // 輸出端口定義為 reg 類型,因為它在 always 塊中被賦值output wire carry // 輸出端口定義為 wire 類型,因為它是通過 assign 驅動的
);// 內部信號wire [4:0] result; // result 是一個內部信號,用于存儲加法結果// 組合邏輯assign result = a + b;// 時序邏輯,用于生成 sumalways @(*) beginsum = result[3:0]; // 在 always 塊中賦值,sum 必須是 reg 類型end// 組合邏輯生成 carryassign carry = result[4]; // carry 是通過 assign 語句賦值,因此是 wire 類型endmodule
????????總的來說,在模塊內部,需要進行什么樣的操作,就定義什么類型的信號(wire/reg),在模塊外部,定于input端口就使用wire類型,定義ouput端口,原理類似于模塊內部,根據信號的操作定義wire或者reg信號。
????????本文權當記錄自己對于verilog中wire類型和reg類型的理解。如有錯誤請一定指出,感謝閱讀。