阻塞賦值&非阻塞賦值

阻塞(blocking)賦值方式(如 b=a)

①賦值語句立即執行,執行完畢後才執行下一條語句(即爲阻塞的含義,依次順序執行);

②b的值在賦值語句執行完後立即改變

非阻塞(Non_blocking)賦值方式(如 b<=a)

①語句執行到此時,先計算“<=”右側a的值,但不立即賦值給b;

②always塊結束後才完成此次賦值操作;

③這是時序邏輯模塊最常用的賦值方法。

 

對於組合邏輯電路:

①可以用assign語句描述較爲簡單的組合邏輯電路;

②也可以使用電平敏感always塊來描述:

        所謂電平敏感的觸發條件,是指@後的括號內必須包含塊中所有輸入信號(也可以用“@(*)”表示,否側可能產生意想不到的latch,下同),且其中任一個電平發生變化(與時序邏輯不同,它在@後的括號內沒有沿敏感關鍵詞,如posedge或negedge),就能觸發always塊的動作。

        此時,always塊中需要將else(在if...else結構中)和default(在case結構中)補充完整,且被賦值的變量一定要定義爲reg型,即可綜合爲純組合邏輯。

 

綜上所述

①用always塊建立純組合邏輯模型時,用阻塞賦值“=”;

時序電路鎖存器建模時,用非阻塞賦值“<=”。

③在同一個always塊中建立時序組合邏輯電路時,用非阻塞賦值“<=”;

④在同一個always塊中不要既用非阻塞賦值又用阻塞賦值;

⑤用always塊建立純組合邏輯模型時,在賦值表達式右端參與賦值的信號都必須在always @(敏感電平列表)中列出完整,否則將生成透明鎖存器;用always塊建立純時序邏輯模型時,事件控制語法爲“always @(posedge clk)”(同步電路)或者“always @(posedge clk or negedge rst)”(異步電路)。

 

補充:

        位於begin/end塊內的多條阻塞賦值語句是串行執行的,這一點同標準的程序設計語言是相同的。但是多條非阻塞賦值語句卻是並行執行的,這些非阻塞賦值語句都會在其中任何一條語句執行完成之前開始執行。這正是硬件電路的特點,因爲實際的邏輯門電路都是獨立運轉的,而不是等到其他門電路運轉結束之後自己纔開始運轉。

        每個always語句塊都隱含表示一個獨立的邏輯電路模塊。因此,對於特定的reg類型的變量,只能在一個always語句塊中對其進行賦值;否則就可能會出現兩個硬件模塊同時從同一個輸出端口輸出數據的情況,這種情況一般稱爲短路輸出shorted output

下面舉例說明:

ex1:阻塞賦值

//阻塞賦值
module ex(clk,a,b,c);
//-----------------------
input clk,a;
output reg b,c;
//-----------------------
always @(posedge clk)
	begin
		b = a;
		c = b;
	end
//-----------------------
endmodule
//-----------------------

        clk信號的上升沿到來時,b馬上取a的值,執行完畢後c取b的值(即等於a),生成的電路如下所示(左圖和右圖等效)。

                       

        功能仿真如下,b、c的值一樣:

 

ex2:非阻塞賦值

//非阻塞賦值
module ex(clk,a,b,c);
//-----------------------
input clk,a;
output reg b,c;
//-----------------------
always @(posedge clk)
	begin
		b <= a;    //區別點
		c <= b;    //區別點
	end
//-----------------------
endmodule
//-----------------------

        clk信號的上升沿到來時,“<=”號右側的a、b值先計算,等always塊結束後,b就等於a,而c等於剛纔計算的b(即原來的b值) ,這裏生成了2個寄存器。

        功能仿真如下圖,c的值比b延遲1個時鐘週期: 

 

         分析如下:

        在posedge_clk_1處:判斷a=1,b=0,always塊結束後(即爲觸發沿_1)b=1,c=0;

        在posedge_clk_2處:判斷a=1,b=1,always塊結束後(即爲觸發沿_2)b=1,c=1;

        在posedge_clk_3處:判斷a=0,b=1,always塊結束後(即爲觸發沿_2)b=0,c=1;

        在posedge_clk_4處:判斷a=0,b=0,always塊結束後(即爲觸發沿_2)b=0,c=0。

        可以理解爲考慮寄存器的硬件延時特性,“b <= a”和“c <= b”在posedge_clk處類似於“併發執行”。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章