2013-09-10 222 views
0

我对Verilog完全陌生,因此我很快就要在大学时间里了解一门课程。所以我玩弄了我的altera DE2开发板和quartis2并学习了各种细节。Verilog循环条件

我试图做一个计数器,它是通过开关打开和关闭的。 到目前为止,计数器基于按键进行计数和重置。

这是我的错误:

Error (10119): Verilog HDL Loop Statement error at my_first_counter_enable.v(19): loop with non-constant loop condition must terminate within 250 iterations 

我明白我被要求提供一个循环变量,但即使这样,我得到一个错误。 这是我的代码:

module my_first_counter_enable(SW,CLOCK_50,LEDR,KEY); 

    input CLOCK_50; 
    input [17:0] SW; 
    input KEY; 

    output [17:0] LEDR; 

    reg [32:0] count; 
    wire reset_n; 
    wire enable; 

    assign reset_n = KEY; 
    assign enable = SW[0]; 
    assign LEDR = count[27:24]; 


    [email protected] (posedge CLOCK_50 or negedge reset_n) begin 
     if(enable) 
      if(!reset_n) 
       count = 0; 
      else 
       count = count + 1; 
    end 

endmodule 

我希望有人能在我环路指出我的错误,让我继续。

谢谢!

回答

3

我不认为你想使用while循环出现。如何:

[email protected] (posedge CLOCK_50 or negedge reset_n) begin 
      if(!reset_n) 
       count <= 0; 
      else if (enable) 
       count <= count + 1; 
    end 

我还添加非阻塞赋值<=,这是更适合于同步逻辑。

+0

,虽然这个工作,并且实际上教会了我很多(就像这不像我用过的其他微处理器)我仍然希望得到while循环工作,因为它是我更熟悉。 –

+0

我已经修改了代码,所以我每次都不知道为什么会出现错误。一个这样的编辑是我刚刚发布到这个问题上的一个。你知道为什么当我移动if(enable)编译失败吗? –

0

标题

错误(10119):在Verilog HDL语言Loop语句错误:与非恒定循环条件循环必须迭代内终止 说明

可能会出现在Quartus®II软件此错误当合成迭代Verilog HDL中的循环超过合成循环限制时。此限制可防止合成潜在地陷入无限循环。默认情况下,此循环限制设置为250次迭代。

workaround /修正

若要解决此错误,环路限制可使用在Quartus II设置的VERILOG_NON_CONSTANT_LOOP_LIMIT选项文件(.qsf)来设定。例如:

set_global_assignment -name VERILOG_NON_CONSTANT_LOOP_LIMIT 300

+0

我也看过这个,但是当把它放到我的代码中时,我得到了关于这行代码的错误。 –

+0

因为它声明你需要把它放在设置文件中,而不是你的代码。而且你的代码中没有错误,你只是想超过限制。所以你需要或者增加限制,或者采取@toolic回答喜欢的方法:-) –

+0

哦!好吧,我想我很想明白。我会研究设置,在我的设置文件 –

2

每当有一个积极的时钟边缘,该模块就会触发。如果你有一个while循环并不意味着任何硬件,它仍然需要一个时钟来驱动触发器。

While循环可testbeches被用来驱力刺激

integer x; 
initial begin 
    x = 0; 
    while (x<1000) begin 
    data_in = 2**x ; //or stimulus read from file etc ... 
    x=x+1; 
    end 
end 

我发现for循环或repeat更使用,但:

integer x; 
initial begin 
    for (x=0; x<1000; x=x+1) begin 
    data_in = 2**x ; //or stimulus read from file etc ... 
    end 
end 

initial begin 
    repeat(1000) begin 
    data_in = 'z; //stimulus read from file etc (no loop variable)... 
    end 
end 

注:我个人也将增加开始结束到每一件事情,以避免以后增加额外的行,并想知道为什么他们总是或永远不会执行,特别是当新的语言。它还具有使缩进看起来更好一点的附加好处。

[email protected] (posedge CLOCK_50 or negedge reset_n) begin 
    if(!reset_n) begin 
    count <= 'b0; 
    end 
    else if (enable) begin 
    count <= count + 1; 
    end 
end 
+0

非常翔实。非常感谢你! –