程序中的组合循环

时间:2014-12-02 16:23:44

标签: verilog quartus

程序中存在错误,我确定它始终由negedge iChang引起。错误是:

  

节点中的零时振荡.......检查组合环路的设计或矢量源文件。

我的部分节目如下:

input  clk, rst,iChang;
always@(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     

如果我删除negedge iChang块和always块中的if(!iChang),则不会出现错误。我不理解negedge iChang和组合循环之间的关系。似乎没有反馈可以导致组合循环。

1 个答案:

答案 0 :(得分:2)

边沿触发的始终块用于同步逻辑。它应该有一个时钟参考,它可能有一个异步复位,可能有一个异步设置。根据您的代码,iChang上的posedge clk似乎应该在@*上进行采样,因此它不应该在敏感列表中。我相信你将同步始终块的灵敏度列表要求与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 )用于组合总是阻止)

假设您想要异步重置,那么您的always块应如下所示:

iChang

如果你真的希望always @(posedge clk) begin if (!iChang) begin if(!rst) begin // ... reset code ... end else begin // ... synchronous code ... end end end 阻止重置,那么也要使重置同步:

{{1}}