信號類型
本節(jié)的文檔編號:001100000037
需要看對應(yīng)的視頻,請點擊視頻編號:?001100000052
1、本節(jié)主要介紹,Verilog HDL的信號類型,主要包括兩種數(shù)據(jù)類型:線網(wǎng)類型(net type)和寄存器類型(reg type),在進行工程設(shè)計中也只會使用到這兩個類型的信號;信號位寬,定義信號類型的同時,必須定義好信號的位寬,取決于該信號要表示的最大值,例如a信號的最大值為1000,那么信號a的位寬必須大于或等于10位;線網(wǎng)類型wire,用于對結(jié)構(gòu)化器件之間的物理連接的建模,代表的是物理連接線,不存儲其邏輯值,通常用assign進行賦值;寄存器類型reg,通常用于對存儲單元的描述,如D型觸發(fā)器、ROM等。必須注意的是:reg類型的變量不一定是存儲單元,如在always語句中進行描述的必須是用reg類型的變量;wire和reg的區(qū)別,
2、本書總結(jié)出一套解決方法:在本模塊中使用always設(shè)計的信號都定義為reg型,其他都定義為wire型。? ??
3、ALTERA和VIVADO文檔
第4節(jié)?信號類型
? ? Verilog HDL的信號類型有很多種,主要包括兩種數(shù)據(jù)類型:線網(wǎng)類型(net type)?和寄存器類型(reg type)。
筆者在進行工程設(shè)計過程中,也是只會使用到這兩個類型的信號。
4.1?信號位寬
定義信號類型的同時,必須定義好信號的位寬。默認(rèn)信號的位寬是1位,當(dāng)信號的位寬為1時可不表述,
如定義位寬為1的wire型信號a可直接用“wire??a;”來表示。但信號的位寬大于1位時就一定要表示出來,
如用“wire [7:0]”來表示該wire型信號的位寬為8位。
信號的位寬取決于要該信號要表示的最大值。該信號能表示的無符號數(shù)最大值是:2n-1,其中n
表示該信號的位寬。例如,信號a的最大值為1000,那么信號a的位寬必須大于或等于10位。
下面向讀者分享一個位寬計算技巧:打開電腦的“計算器”后選用程序員模式,在在10進制下
輸入信號值,如1000,隨后可以查看信號位寬。
4.2?線網(wǎng)類型wire
?線網(wǎng)類型用于對結(jié)構(gòu)化器件之間的物理連線的建模,如器件的管腳,芯片內(nèi)部器件如與門的輸出
等。由于線網(wǎng)類型代表的是物理連接線,因此其不存儲邏輯值,必須由器件驅(qū)動。通常用assign 進行賦值,
如 assign??A =??B ^ C。
wire?類型定義語法如下:
wire [msb: lsb] wire1, wire2, . . .,wireN;
msb和lsb定義了范圍,表示了位寬。例如[7:0]是8位位寬,也就是可以表示成8’b0至8’b1111_1111;
msb和lsb必須為常數(shù)值;
如果沒有定義范圍,缺省值為1位;
沒有定義信號數(shù)據(jù)類型時,缺省為wire 類型。
注意數(shù)組類型按照降序方式,如[7:0] ,不要寫成[0:7]。
下面對上述情況進行舉例說明:
wire [3:0]? ?Sat; // Sat為4?位線型信號
wire Cnt; //1?位線型信號
wire [31:0]? ?Kisp, Pisp, Lisp ;// Kisp, Pisp, Lisp?都是32位的線型信號。
4.3?寄存器類型reg
? ? reg?是最常用的寄存器類型,寄存器類型通常用于對存儲單元的描述,如D型觸發(fā)器、ROM?等。
寄存器類型信號的特點是在某種觸發(fā)機制下分配了一個值,在下一觸發(fā)機制到來之前保留原值。
但必須注意的是:reg?類型的變量不一定是存儲單元,
如在always語句中進行描述的必須是用reg?類型的變量。
reg?類型定義語法如下:
reg??[msb: lsb] reg1, reg2, . . . reg N;
msb和lsb定義了范圍,表示了位寬。例如[7:0]是8位位寬,
也就是可以表示成8’b0至8’b1111_1111;
msb和lsb必須為常數(shù)值;
如果沒有定義范圍,缺省值為1位;
沒有定義信號數(shù)據(jù)類型時,缺省為wire 類型,不是reg型。
對數(shù)組類型按照降序方式,如[7:0] ;不要寫成[0:7]。
例如:
reg [3:0]? ?Sat; // Sat為4?位寄存器。
reg Cnt; //1?位寄存器。
reg [32:1]??Kisp, Pisp, Lisp ; //不建議這樣定義。
4.4 wire和reg的區(qū)別
?reg型信號并不一定生成寄存器。針對什么時候使用wire類型,什么時候用reg類型這一問題,
筆者總結(jié)出一套方法:在本模塊中使用always設(shè)計的信號都定義為reg型,其他信號都定義為wire型。

上述代碼中,cnt1是用always設(shè)計的,所以定義為reg型。
add_cnt1和end_cnt不是由always產(chǎn)生的,所以定義為wire型。

上述代碼中,信號x是用always設(shè)計的,所以要定義為reg型。
注意:實際的電路中信號x不是寄存器類型,但仍然定義為reg型。

以上是例化的代碼,其中df是例化模塊的輸出。
由于df不是由always產(chǎn)生的,而是例化產(chǎn)生的,因此要定義成wire型。
相關(guān)視頻:https://www.bilibili.com/video/BV1yf4y1R7gH?p=6