教你認識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連續賦值、過程賦值、過程連續賦值總結賦值
- JavaScript 連等賦值JavaScript賦值
- 通過幾段程式碼理解Verilog裡面阻塞賦值和非阻塞賦值的區別,以及Verilog的for迴圈的使用賦值
- 糾結的連等賦值賦值
- 複雜連結串列的賦值賦值
- 教你認識Java 可變引數Java
- 連續插值,用forall實現。
- 手把手教你認識OPTIMIZER_TRACE
- 教你認識 Windows 98 安裝盤(轉)Windows
- Verilog有符號數、無符號數之間的賦值與運算符號賦值
- 【c++】深賦值與淺賦值C++賦值
- php之普通變數賦值、物件賦值、引用賦值的區別PHP變數賦值物件
- Python 賦值與運算子和連線符Python賦值
- 教你認識AWK 使用者自定義函式函式
- 變數的賦值 指標間接賦值變數賦值指標
- 常被新手忽略的值賦值和引用賦值(偏redux向)賦值Redux
- 基礎知識梳理~ES6 解構賦值賦值
- javascript變數賦值或者重新賦值注意事項JavaScript變數賦值
- 教你正確認識WIFI無線聯網技術WiFi
- 陣列賦值陣列賦值
- 解構賦值賦值
- 棧是按照順序且連續儲存值
- PLSQL Language Reference-PL/SQL語言基礎-變數賦值-使用賦值語句賦值SQL變數賦值
- java裡面給物件賦值,慎用賦值符號(=) (轉)Java物件賦值符號
- 一步一步教你認識 Python 閉包Python
- 常識:Verilog語法-generate-for
- 常識:Verilog語法-取模
- 理解Golang多重賦值Golang賦值
- JS解構賦值JS賦值
- 物件賦值轉換物件賦值
- CSS 屬性賦值CSS賦值
- php 自增賦值PHP賦值
- 賦值運算子(轉)賦值
- 人的意識思維是連續的嗎?
- jquery取值和賦值(包含部分是原生js的取值和賦值)jQuery賦值JS
- Verilog HDL程式設計心得(持續記錄)程式設計
- vector訪問與賦值賦值
- vue scrollTop 無法賦值Vue賦值