2014-12-02 58 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