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