2014-12-02 45 views
0

程序中有錯誤,我確定它是由始終模塊中的negedge iChang引起的。錯誤是:程序中的組合循環

節點零時鐘振盪.......檢查組合環路的設計或矢量源文件。

我的部分程序如下:

input clk, rst,iChang; 
[email protected](posedge clk or negedge rst or negedge iChang) 
    begin 
     if(!iChang)//auto mode,serious problems!!!!!!!!!!!!!!!!!! 
      begin 
       if(!rst) 
        begin 
         s1<=state1; 
         A<=3'b0; 
         B<=3'b0; 
         count1<=3'd4; 
         count2<=3'd2; 
         count3<=3'd3; 
         count4<=3'd2; 
         temp<=1'b1; 
        end 
       else 
        begin 
         if(temp==1) 
          begin 
           temp<=1'b0; 
           case(s1) 
            state1: 
             begin 
              times<=count1; 
              A<=3'b001; 
              B<=3'b100; 
              s1<=state2; 
             end 
            state2: 
             begin 
              times<=count2; 
              A<=3'b010; 
              B<=3'b100; 
              s1<=state3;    
             end 
            state3: 
             begin 
              times<=count3; 
              A<=3'b100; 
              B<=3'b001; 
              s1<=state4; 

             end 
            state4: 
             begin 
              times<=count4; 
              A<=3'b100; 
              B<=3'b010; 
              s1<=state1; 
             end 
            default: 
             begin 
              A<=3'b000; 
              B<=3'b000; 
             end 
            endcase 
          end  

如果我在always塊取出negedge iChangif(!iChang)塊,不會有任何錯誤。我不明白negedge iChang和組合循環之間的關係。似乎沒有反饋會導致組合循環。

+0

'iChang'從哪裏來? – Unn 2014-12-02 16:39:07

+0

這是一個輸入(按鈕),用於觸發始終阻止 – 2014-12-02 16:47:56

回答

2

邊緣觸發始終塊用於同步邏輯。它應該有一個時鐘參考,它可能有一個異步復位,並可能有一個異步集。根據你的代碼,它應該在posedge clk上採樣iChang,所以它不應該在靈敏度列表中。我相信你將同步總是塊的敏感列表需求與IEEE1364-1995風格的組合總是塊混淆在一起。 IEEE1364-1995風格的組合始終塊要求所有輸入信號列在靈敏度列表中。 (推薦期運用IEEE1364-2001的自動感光度列表(@*/@(*))的組合總是塊)

假設你想要一個異步復位,那麼你總是塊應該是這樣的:

always @(posedge clk or negedge rst) begin 
    if(!rst) begin 
    // ... reset code ... 
    end 
    else if (!iChang) begin 
    // ... synchronous code ... 
    end 
end 

如果您真正想要iChang以防止復位,然後使復位同步以及:

always @(posedge clk) begin 
    if (!iChang) begin 
    if(!rst) begin 
     // ... reset code ... 
    end 
    else begin 
     // ... synchronous code ... 
    end 
    end 
end 
+0

感謝您的幫助 – 2014-12-03 01:59:12

+0

@馬宗猷如果答案有幫助,如果它解決了問題,您可以接受其他人知道問題已解決,謝謝。 – Morgan 2014-12-03 15:12:29

+0

我該如何「接受」呢? – 2014-12-04 16:22:56