verilog語法(三)信號類型


Verilog HDL 的信號類型有很多種,主要包括兩種數據類型:線網類型(net type) 和寄存器類型(reg type)。在進行工程設計的過程中也只會使用到這兩個類型的信號。

 

1 信號位寬

定義信號類型的同時,必須定義好信號的位寬。默認信號的位寬是 1 位,當信號的位寬為 1 時可不表述,如定義位寬為 1 wire 型信號 a 可直接用“wire a;”來表示。但信號的位寬大於 1 位時就一定要表示出來,如用“wire [7:0]”來表示該 wire 型信號的位寬為 8 位。

信號的位寬取決於要該信號要表示的最大值。該信號能表示的無符號數最大值是:2n次-1,其中 n表示該信號的位寬。例如,信號 a 的最大值為 1000,那么信號 a 的位寬必須大於或等於 10 位。

下面分享一個位寬計算技巧:打開電腦的“計算器”后選用程序員模式,在在 10 進制下輸入信號值,如 1000,隨后可以查看信號位寬。

 

2 線網類型 wire

線網類型用於對結構化器件之間的物理連線的建模,如器件的管腳,芯片內部器件如與門的輸出等。由於線網類型代表的是物理連接線,因此其不存儲邏輯值,必須由器件驅動。通常用 assign 進行賦值,如 assign A = B ^ C

wire 類型定義語法如下:

wire [msb: lsb] wire1, wire2, . . . ,wireN;

msb 和 lsb 定義了范圍,表示了位寬。例如[7:0] 8 位位寬,也就是可以表示成 8’b0 8’b 1111_1111

msb lsb 必須為常數值;

如果沒有定義范圍,缺省值為 1 位;

沒有定義信號數據類型時,缺省為 wire 類型。

注意數組類型按照降序方式,如[7:0] ,不要寫成[0:7]

下面對上述情況進行舉例說明:

wire [3:0] Sat; // Sat 為 4 位線型信號

wire Cnt; //1 位線型信號

wire [31:0] Kisp, Pisp, Lisp ;// Kisp, Pisp, Lisp 都是 32 位的線型信號。

 

3 寄存器類型 reg

reg 是最常用的寄存器類型,寄存器類型通常用於對存儲單元的描述,如 D 型觸發器、ROM等。寄存器類型信號的特點是在某種觸發機制下分配了一個值,在下一觸發機制到來之前保留原值。但必須注意的是:reg 類型的變量不一定是存儲單元,如在 always 語句中進行描述的必須是用 reg 類型的變量。

reg 類型定義語法如下:

reg [msb: lsb] reg1, reg2, . . . reg N;

msb 和 lsb 定義了范圍,表示了位寬。例如[7:0] 8 位位寬,也就是可以表示成 8’b0 8’b 1111_1111

msb lsb 必須為常數值;

如果沒有定義范圍,缺省值為 1 位;

沒有定義信號數據類型時,缺省為 wire 類型,不是 reg 型。

對數組類型按照降序方式,如[7:0] ;不要寫成[0:7]

例如:

reg [3:0] Sat; // Sat 4 位寄存器型信號。

reg Cnt; //1 位寄存器。

reg [31:0] Kisp, Pisp, Lisp ; // Kisp, Pisp, Lisp 都是 32 位的寄存器型信號。

 

4 wire reg 的區別

reg 型信號並不一定生成寄存器。針對什么時候使用 wire 類型,什么時候用 reg 類型這一問題,這里總結出一套解決方法:在本模塊中使用 always 設計的信號都定義為 reg 型,其他信號都定義為 wire 型。

 

上述代碼中,cnt1 是用 always 設計的,所以定義為 reg 型。add_cnt1 end_cnt 不是由 always 產生的,所以定義為 wire 型。

 

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

 

以上是例化的代碼,其中 df 是例化模塊的輸出。由於 df 不是由 always 產生的,而是例化產生的,因此要定義成 wire 型。

語法部分就簡單地介紹到這里,其余的,遇到一個就學一個。

博主有時候只是個知識的搬運工,本篇博客的內容主要來源於——FPGA 至簡設計原理與應用。

 


免責聲明!

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



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