指定 Assign

Verilog

基本語法

型態

全域變數

基本元件

多樣的寫法

指定

assign

always

initial

運算式

分枝

迴圈

模組

函數

Task

陣列

輸出入

觀察

真值表

測試程式

訊息顯示

注意事項

模擬程序

硬體工程

程式範例

Xor

Xor3

全加器

加法器

加減器

快速加法器

乘法器

ALU

閂鎖器

脈衝偵測

計數器

多工器

暫存器群

記憶體

延遲問題

浮點數

狀態機

程式計數器

CPU0-Mini

CPU0

pipeline

工具

QuartusII

Icarus

Veritek

訊息

相關網站

參考文獻

最新修改

簡體版

English

assign 與 always 之不同

以下程式的 seg = tseg 部分只能用 assign,因為 always 區塊中等號左邊只能是 reg 型態的變數,但 assign 中也可以是 output 型態的變數。

module Seg7(input [3:0] num, output [7:0] seg);
   reg [7:0] tseg;
    always @(num) begin
        case (num)
            4'b0000: tseg = 8'b11111100; // 0
            4'b0001: tseg = 8'b01100000; // 1
            4'b0010: tseg = 8'b01011010; // 2
            4'b0011: tseg = 8'b11110010; // 3
            4'b0100: tseg = 8'b01100110; // 4
            4'b0101: tseg = 8'b10110110; // 5
            4'b0110: tseg = 8'b10111110; // 6
            4'b0111: tseg = 8'b11100100; // 7
            4'b1000: tseg = 8'b11111110; // 8
            4'b1001: tseg = 8'b11110110; // 9
            default: tseg = 8'b00000000; //  
        endcase
        // seg = tseg;
    end
    assign seg = tseg;
endmodule

指定的方法

兩種 Assign :Blocking v.s. Nonblocking

a = b ; // Blocking assignment : 執行順序不一定,

a <= b; // Nonblocking assignment : 所有可同時值行的東西都要執行完一次後,才會前進到下一個時間點。

兩種執行方式:Sequential v.s. Concurrent

兩種時間控制:Delayed evaluations v.s. Delayed assignments

指定的範例

wire [8:0] sum;
wire [7:0] a, b;
wire carryin;

assign sum = a + b + carryin; // 當 a, b, carryin 有任何一個改變時,此語句都會被重新觸發。

注意:像 sum = a + b + cin 這樣的語句,x = y 左邊的 x 必須是暫存器 (reg) 型態,不可以是線路 (wire) 型態

(除非是 primitives 或 continuous assignment 兩者的左邊才能是 wire 型態)。

Block 與 Nonblocking 的比較範例

比較一:

以下程式採用 Blocking assignment (=),其執行順序不一定,因此 d2, d3, d4 最後的結果值將會不固定,這是一個不好的程式。

reg d1, d2, d3, d4;

always @(posedge clk) d2 = d1;
always @(posedge clk) d3 = d2;
always @(posedge clk) d4 = d3;

以下的程式採用 NonBlocking assignment (<=),所有同時的事件必須全部執行完一遍後才能開始執行下一個時間點的事件,因此 d2, d3, d4 分別會得到上一輪的 d1, d2, d3。

reg d1, d2, d3, d4;

always @(posedge clk) d2 <= d1;
always @(posedge clk) d3 <= d2;
always @(posedge clk) d4 <= d3;

比較二:

Blocking Assignment: 執行結果相當於 a=1, b=1, c=1

a = 1;
b = a;
c = b;

NonBlocking Assignment: 執行結果相當於 a=1; b = 上一輪的 a; c=上一輪的 b;

a <= 1;
b <= a;
c <= b;

參考文獻

  1. Understanding Verilog Blocking and Nonblocking Assignments (讚!推薦!)
  2. (筆記) 如何使用blocking與nonblocking assignment? (SOC) (Verilog)

Facebook

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License