2013-07-01 37 views
0

我想設計一個簡單的Verilog代碼,其中包含兩個始終阻止,交替執行,如握手。我想用兩個標誌do_A和do_B來控制block_A和block_B這兩個塊。預期的結果必須是ABABAB ...有沒有辦法糾正下面的代碼?感謝您的幫助。如何交替兩個總是塊?

module tb; 
    reg clock, reset, do_A, do_B; 

    initial begin clock = 0; reset = 0; #50; reset = 150; #50; reset = 0; end 
    always #50 clock = ~clock; 

    always @(posedge clock) begin: block_A 
     if (reset) do_B <= 0; 
     else if (do_A) begin 
      do_B <= 0; 
      $display("A"); 
     end 
    end 

    always @(posedge clock) begin:block_B 
     if (reset) do_A <= 1; 
     else if (do_B) begin 
      do_A <= 0; 
      $display("B"); 
     end 
    end 
endmodule 

感謝Vesiliy,以下代碼適用於理想的結果。

always @(posedge clock) begin: Block_A 
     if (reset) do_B = 0; 
     else if (do_A) begin 
      do_B = 0; 
      $display("A"); 
     end 
     else do_B <= 1; 
    end 

    always @(posedge clock) begin:Block_B 
     if (reset) do_A = 1; 
     else if (do_B) begin 
      do_A = 1; 
      $display("B"); 
     end 
     else do_A <= 0; 

這似乎很奇怪,但效果很好。

回答

2

首先reset = 150;看起來很奇怪(錯字?)。不過,它適用於這種情況。

你必須按順序的第一always另一個錯字 - 你(貌似)的意思是寫的是:

else if (do_A) begin 
    do_B <= 1; 
    $display("A"); 
end 

但是,我認爲,在這裏你的主要問題是,你不必else(默認)子句中的順序always塊。

看這個塊(例如):

always @(posedge clock) begin:block_B 
    if (reset) do_A <= 1; 
    else if (do_B) begin 
     do_A <= 0; 
     $display("B"); 
    end 
end 

復位無效do_A = 1後;那麼假設你修正了之前的錯字,do_B將變爲1,這將導致do_A變爲0.在達到這個狀態之後,do_A將被卡在0直到你重置所有的東西。

下除了應該解決這個問題(同爲第一always塊):

always @(posedge clock) begin:block_B 
    if (reset) do_A <= 1; 
    else if (do_B) begin 
     do_A <= 0; 
     $display("B"); 
    end 
    else do_A <= 1; 
end 

我相信,上述修復您的代碼將工作,但是,來描述該功能的正確方法是實現一個具有2個狀態的(簡單)狀態機。去谷歌上查詢。

+0

謝謝Vasiliy。遵循您的建議,我修改了代碼並進行了測試,獲得了ABAB ...序列。 – gnoejh

+0

沒有問題。你需要接受答案。 – Vasiliy

相關問題