教你認識Verilog 連續賦值
導讀 | 連續賦值語句是 Verilog 資料流建模的基本語句,用於對 wire 型變數進行賦值。 |
關鍵詞:assign, 全加器
連續賦值語句是 Verilog 資料流建模的基本語句,用於對 wire 型變數進行賦值。:
格式如下
assign LHS_target = RHS_expression ;
LHS(left hand side) 指賦值操作的左側,RHS(right hand side)指賦值操作的右側。
assign 為關鍵詞,任何已經宣告 wire 變數的連續賦值語句都是以 assign 開頭,例如:
wire Cout, A, B ; assign Cout = A & B ; //實現計算A與B的功能
需要說明的是:
- LHS_target 必須是一個標量或者線型向量,而不能是暫存器型別。
- RHS_expression 的型別沒有要求,可以是標量或線型或存器向量,也可以是函式呼叫。
- 只要 RHS_expression 表示式的運算元有事件發生(值的變化)時,RHS_expression 就會立刻重新計算,同時賦值給 LHS_target。
Verilog 還提供了另一種對 wire 型賦值的簡單方法,即在 wire 型變數宣告的時候同時對其賦值。wire 型變數只能被賦值一次,因此該種連續賦值方式也只能有一次。例如下面賦值方式和上面的賦值例子的賦值方式,效果都是一致的。
wire A, B ; wire Cout = A & B ;
全加器
下面採用資料流描述方式,來設計一個 1bit 全加器。
設 Ai,Bi,Ci 分別為被加數、加數和相鄰低位的進位數,So, Co 分別為本位和與向相鄰高位的進位數。
真值表如下:
Input | Output | |||
---|---|---|---|---|
Ci | Ai | Bi | So | Co |
0 | 0 | 0 | 0 | 0 |
0 | 0 | 1 | 1 | 0 |
0 | 1 | 0 | 1 | 0 |
0 | 1 | 1 | 0 | 1 |
1 | 0 | 0 | 1 | 0 |
1 | 0 | 1 | 0 | 1 |
1 | 1 | 0 | 0 | 1 |
1 | 1 | 1 | 1 | 1 |
全加器的表示式為:
So = Ai ⊕ Bi ⊕ Ci ; Co = AiBi + Ci(Ai+Bi)
rtl 程式碼(full_adder1.v)如下:
例項
module full_adder1( input Ai, Bi, Ci, output So, Co); assign So = Ai ^ Bi ^ Ci ; assign Co = (Ai & Bi) | (Ci & (Ai | Bi)); endmodule
當然,更為貼近加法器的程式碼描述可以為:
例項
module full_adder1( input Ai, Bi, Ci output So, Co); assign {Co, So} = Ai + Bi + Ci ; endmodule
testbench(test.sv)參考如下:
例項
`timescale 1ns/1ns module test ; reg Ai, Bi, Ci ; wire So, Co ; initial begin {Ai, Bi, Ci} = 3'b0; forever begin #10 ; {Ai, Bi, Ci} = {Ai, Bi, Ci} + 1'b1; end end full_adder1 u_adder( .Ai (Ai), .Bi (Bi), .Ci (Ci), .So (So), .Co (Co)); initial begin forever begin #100; //$display("---gyc---%d", $time); if ($time >= 1000) begin $finish ; end end end endmodule
模擬結果如下:
原文來自:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2732473/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Verilog連續賦值、過程賦值、過程連續賦值總結賦值
- 通過幾段程式碼理解Verilog裡面阻塞賦值和非阻塞賦值的區別,以及Verilog的for迴圈的使用賦值
- JavaScript 連等賦值JavaScript賦值
- 教你認識Java 可變引數Java
- Verilog有符號數、無符號數之間的賦值與運算符號賦值
- 手把手教你認識OPTIMIZER_TRACE
- Python 賦值與運算子和連線符Python賦值
- php之普通變數賦值、物件賦值、引用賦值的區別PHP變數賦值物件
- 教你認識AWK 使用者自定義函式函式
- 常識:Verilog語法-generate-for
- 常識:Verilog語法-取模
- 變數的賦值 指標間接賦值變數賦值指標
- 常被新手忽略的值賦值和引用賦值(偏redux向)賦值Redux
- 基礎知識梳理~ES6 解構賦值賦值
- 帶你全面認識CMMI V2.0(四)——管理 賦能
- 棧是按照順序且連續儲存值
- 一文教你如何重新認識使用者
- 解構賦值賦值
- 人的意識思維是連續的嗎?
- JS解構賦值JS賦值
- 物件賦值轉換物件賦值
- php 自增賦值PHP賦值
- 理解Golang多重賦值Golang賦值
- 未來價值轉移:賦能普惠和可持續金融服務
- jquery取值和賦值(包含部分是原生js的取值和賦值)jQuery賦值JS
- 乾貨:從『價值角度』來重新認識社群運營
- vue scrollTop 無法賦值Vue賦值
- vector訪問與賦值賦值
- JavaScript 物件解構賦值JavaScript物件賦值
- JavaScript 字串解構賦值JavaScript字串賦值
- python的賦值傳遞Python賦值
- 使用反射為特性賦值反射賦值
- 運算子-賦值運算子賦值
- Javascript 解構賦值,將屬性/值從物件/陣列中取出,賦值給其他變數JavaScript賦值物件陣列變數
- (12)非阻塞賦值與阻塞賦值區別(以簡單例子說明)賦值單例
- 陣列未被賦值時其值為多少?陣列賦值
- HTTP非持續連線和持續連線HTTP
- 尋找連續或不連續的子字串字串