關於verilog裡的組合邏輯和時序邏輯要用阻塞賦值

2022-02-03 03:43:44 字數 3437 閱讀 6082

1樓:

概念性的東西就不說了,網上都有,我在工作中編碼規範要求always@(posedge clk)

begin

end這種塊中都要用<=

assign a=b,是用=

別混用,這是要求,其實如果你不考試的話,知道這些就夠了,沒必要非知道為什麼,呵呵

到工作中你就知道了,學的那些verilog語法好多都不讓用的,能用的就那麼一些。

2樓:匿名使用者

組合邏輯用阻塞賦值

時序邏輯用非阻塞複製

3樓:匿名使用者

在序列語句塊中,阻塞型賦值語句按照它們在塊中的排列順序依次執行,即前一條語句沒有完成賦值之前,後面的語句都不能被執行

例如:begin

b=a;

c=b+1;

end首先執行第一條語句,將a賦給b,接著執行第二條,講b(a+1)的值賦給c,即c=a+1。

非阻塞型賦值:

首先計算機所有表示式右邊的值並分別儲存在暫存器中,在begin和end之間所有非阻塞型賦值語句的右邊表示式都被同時計算並儲存後,對左邊暫存器變數的賦值操作才會進行。

例如:begin

b<=a;

c<=b+1;

end這樣,與上面的阻塞型賦值不同,c的值是原來的b的值加上1。

———————— 摘自 康華光版《電子技術基礎(數字部分)》

verilog中時序邏輯和非阻塞賦值的內在聯絡是什麼? 都說時序邏輯用非阻塞賦值,這是什麼決定的?

4樓:宋桓公

reg a;

always @(posedge clk)

begin

a <= 1'b1; //非阻塞賦值,發生在時鐘的上升沿(posedge clk)

end非阻塞賦值,只會在時鐘邊沿觸發,這就是時序邏輯。

wire a;

assign a = 1'b1; //阻塞賦值,及時賦值,他是無視時鐘的,所以是組合邏輯

reg a;

reg b;

always @(posedge clk)

begin

a = 1'b1; //阻塞賦值,及時賦值

b <= 1'b1 //非阻塞賦值

end這時,a的賦值發生,會在b之前,不是因為a在b的上方,而是一個必須根據時鐘沿觸發,一個是及時的無視時鐘的。

純手打,望採納,歡迎追問~~~~

在verilog hdl語言中的阻塞賦值和非阻塞賦值究竟有什麼不同?同一變數在不同的過程塊中(同時觸發)又是如

5樓:匿名使用者

在always語句塊中,verilog語言支援兩種型別的賦值:阻塞賦值和非阻塞賦值。阻塞賦值使用「=」語句;非阻塞賦值使用「<=」語句。

注意,千萬不要將這兩種賦值方法與assign賦值語句混淆起來,assign賦值語句根本不允許出現在always語句塊中。

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

下面我們以描述移位暫存器的兩種方法為例來講述兩種賦值型別的區別。在下面的這種描述中,第一個觸發器中的資料被移到第二個觸發器中,第二個觸發器中的資料被移到第三個觸發器中……如此繼續下去,直到最後一個觸發器中的資料被移出該暫存器為止。

1 module shiftreg (input clk,

2 input sin,

3 outout reg [3:0]q);//這是正確使用非阻塞賦值的例項

4 always @(posedge clk)

5 begin

6 q[0] <= sin;//非阻塞賦值:<=

7 q[1] <= q[0];

8 q[2] <= q[1]

9 q[3] <= q[2];

10 //這裡寫作q <= ;更簡單更好一些

11 end

12 endmodule

非阻塞賦值語句的功能是使得所有語句右側變數的值都同時被賦給左側的變數。因此,在上面的例項中,q[1]得到的是 q[0]的原始值,而非sin的值(在第一條語句中,sin的值被賦給了q[0])。這正是我們期望得到的實際硬體電路。

當然,我們可以把上邊的四條語句合併寫成一條簡短的語句:q<= 。

阻塞賦值語句的功能更接近於傳統的程式設計語言,但是阻塞賦值語句並不是準確的硬體工作模型。下面考慮使用阻塞賦值語句來實現同一模組可以得到什麼結果。在始終clk的上升沿,verilog將會把sin的值賦給q[0],然後 q[0]的新值被賦給q[1],如此繼續執行下去。

最終所有的四個暫存器都會得到相同的值:sin的值。

本部分內容用意在於:講述使用always語句塊對時序邏輯電路進行建模的時候,如何使用非阻塞賦值。如果設計者能夠充分的靈活應用,比如倒轉上例中四條語句的順序,那麼使用阻塞賦值語句仍然能實現相應的功能,但是與使用非阻塞賦值的方法相比,這種方法並不會帶來任何好處,相反還暗藏了巨大的風險。

最後需要注意的是:每個always語句塊都隱含表示一個獨立的邏輯電路模組。因此,對於特定的reg型別的變數,只能在一個always語句塊中對其進行賦值;否則就可能會出現兩個硬體模組同時從同一個輸出埠輸出資料的情況,這種情況一般稱為 短路輸出(shorted output)。

關於你的第二個問題,雖然沒有說完,但是我大概瞭解你的意思了。verilog中並不允許在兩個always@語句中賦值同一個變數,道理就和不能把兩個與門輸出端接到一起一樣。這時有三個解決方法:

1.把其中一個always語句變為另一個模組,並在主程式中引用。2.

利用中間變數,也就是增加暫存器的方法把需要重複賦值的變數存起來,再統一呼叫。3.更改語言進行編寫,換用沒有類似問題的語言,如vhdl,system verilog等。

6樓:匿名使用者

always裡用阻塞賦值,assign裡用非阻塞賦值。

阻塞賦值在一個時間片內暫存器的值保持原來的值,當時間片結束時同時更新

verilog中阻塞賦值和非阻塞賦值的區別

7樓:匿名使用者

舉個簡單的例子,現假設 reg a = 2, b = 0阻塞賦值:

a = 1;

b = a;

最終結果出來 a,b都為1,是因為a = 1這條賦值語句「阻塞」住了b=a。

非阻塞賦值:

a <= 1;

b <= a;

結果是 a為1,b為2,兩者的賦值是同時的在時序邏輯電路中,用的是非阻塞賦值,阻塞賦值一般僅用於組合邏輯

組合邏輯電路邏輯功能的測試方法,組合邏輯電路邏輯功能的測試方法

這個提法比較籠統,如果是實物電路,可通過專業的邏輯測量儀,或者是萬用表測量 如果是電路,以及邏輯表示式,最好是通過 軟體來測試驗證 組合邏輯電路的 分析方法 1.根據邏輯電路寫出邏輯表示式。2.邏輯表示式化簡。3.根據邏輯表示式畫出真值表。組合邏輯電路功能表示方法有哪些 真值表 邏輯表示式 波形圖 ...

組合邏輯電路和時序邏輯電路的區別是什麼

組合邏輯電路是輸出只與當前的輸入有關,而時序邏輯電路的輸出不僅與當前的輸入有關,還與電路以前的狀態有關。時序邏輯電路和組合邏輯電路的區別是什麼 一 特點 不同1 組合邏輯電路在邏輯功能上的特點是任意時刻的輸出僅僅取決於該時刻的輸入,與電路原來的狀態無關。2 時序邏輯電路在邏輯功能上的特點是任意時刻的...

時序邏輯電路與組合邏輯電路最大的區別是什麼

組合邏輯電路的輸出只取決於當前的輸入值。而時序邏輯電路的輸出,不僅取決於當前的輸入值,還與當前電路所處的狀態有關。也就是說時序邏輯電路一定有記憶功能的元件,如各種觸發器,暫存器等。組合邏輯電路與時序邏輯電路的區別?組合邏輯電路與時序邏輯電路的區別體現在輸入輸出關係 有無儲存 記憶 單元 結構特點上。...