verilog中阻塞的理解與例子

2021-06-09 23:38:10 字數 1248 閱讀 1486

下面給出乙個基於阻塞賦值和非阻塞賦值的多級觸發器級聯例項,要求將輸

入資料延遲 3 個時鐘週期再輸出,並給出對應的 rtl 級結構圖和**結果。

(1)基於 d觸發器的阻塞賦值語句**如下:

module pipeb1 (q3, d, clk);

output [7:0] q3;

input [7:0] d;                                       

input clk;

reg [7:0] q3, q2, q1;

always @(posedge clk) begin

q1 = d;

q2 = q1;

q3 = q2;

end

endmodule

上述**綜合後能得到所期望的邏輯電路嗎? 答案是否定的, 根據阻塞賦值語句的執行

過程可以得到執行後的結果是 q1 = d;q2 = d。實際只會綜合出乙個暫存器,如圖 8-33 所示,

並列出下面的警告資訊,而不是所期望的三個。其中的主要原因就是採用了阻塞賦值,首先

將 d 的值賦給 q1,再將q1 的值賦給q2,依次到q3,但是 q1、q2、q3 的值在賦值前其數值

已經全部被修改為當前時刻的 d 值,因此上述語句等效於 q3=d,這和圖 8-33 所示的 rtl 結

構是一致的。

(2) 如何才能得到所需要的電路呢?如果把 always  塊中的兩個賦值語句的次序顛倒後

再進行分析:先把 q2 的值賦於 q3、再把 q1 的值賦於 q2,最後把 d  賦於q1。這樣在先賦值

再修改,可以使得 q2,q3 的值都不再是 d 的當前值。修改後的**如下所列。

verilog中的阻塞與非阻塞

初學verilog的同學容易搞混淆阻塞與非阻塞賦值操作。要區分的話,其實也有辦法。學過數位電路的都知道時序的概念,比暫存器的操作,把d端輸入用clk打入暫存器,在clk時鐘上公升沿取樣d值,只有在時鐘上公升沿的下一週期的上公升沿,d值才會在輸出端q上輸出出來。符合這個特徵的就是非阻塞賦值 alway...

verilog阻塞與非阻塞的綜合

關於阻塞和非阻塞語句的5大原則 原則1 時序電路建模時,用非阻塞賦值。原則2 用always塊寫組合邏輯時,採用阻塞賦值。原則3 在同乙個always塊中不要同時使用非阻塞賦值和阻塞賦值。原則4 鎖存器電路建模時,用非阻塞賦值。原則5 在同乙個always塊中同時建立時序和組合邏輯電路時,用非阻塞賦...

verilog中的阻塞賦值與非阻塞賦值詳解

網上看到的覺得不錯分享下 組合邏輯的always模組中使用阻塞賦值 時序邏輯的always模組中使用非阻塞賦值 可以這樣理解,組合中計算馬上賦值,時序邏輯中上公升沿計算,下降沿賦值關鍵是組合邏輯中是實時變化的,而時序邏輯中乙個cycle才變化一次 比如 always a or b begin c a...