verilog中對同一個變量有判斷條件的賦值


且看一段代碼:

always @(posedge clk) begin   if(count<=5*T10MS)   count<=count+1'b1;   else    begin     count<=0;     sel<={sel[4:0],sel[5]};    flag<=flag+1'b1;     if(flag>=4'b1010)      flag<=0;    end end always @(flag)

begin case(flag) 4'b0000: dig=S0; 4'b0001: dig=S1; 4'b0010: dig=S2; 4'b0011: dig=S3; 4'b0100: dig=S4; 4'b0101: dig=S5; 4'b0110: dig=S6; 4'b0111: dig=S7; 4'b1000: dig=S8; 4'b1001: dig=S9; default: dig=8'hff; endcase end

以上一個例子是,控制一個數碼管從0到9進行顯示,但是卻出現了default所示的狀態,也就相當於出現了一個空檔。這個是不允許出現的。這個不允許出現的flag狀態就是flag=10。當flag=10,不能正常譯碼就執行了default語句,那么數碼管就熄滅了。那么這個狀態時如何出現的呢?

當flag=9時,一個clk的上升沿到來時,

   flag<=flag+1'b1;     if(flag>=4'b1010)      flag<=0; 由於flag<10,那么if條件語句部分並未執行,所以當上升沿結束以后,flag為10,只有當下一個clk上升沿到來的時候,flag才會清零。這樣就導致了數碼管會熄滅。

當代碼變為如下的時(其他部分不變)

  flag=flag+1'b1;     if(flag>=4'b1010)      flag=0; 結果是不會出現數碼管熄滅的。因為在這里,是進行阻塞賦值的,當flag為9時,一個clk的上升沿到來,那么就出現

flag=flag+1'b1; flag=10;緊接着執行   

if(flag>=4'b1010)      flag=0; 這樣在這個always模塊執行完畢的時候,flag為0而不是10。

出現這樣這樣的結果的主要原因是對於阻塞賦值和非阻塞賦值語句不清楚的,

不要因為這里有一個判斷語句就以為上下兩個語句是非阻塞的。但是如果換成,非阻塞語句就不會出現這樣情況,而且也容易理解,可讀性強,所以還是建議用非阻塞語句,書寫這樣的代碼。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM