2

我对verilog完全陌生,对于我在大学学习的一门课程,我必须很快了解它。所以我在玩我的 Altera DE2 板和 quartis2 并学习细节。

我正在尝试制作一个通过开关打开和关闭的计数器。到目前为止,计数器根据按键进行计数和重置。

这是我的错误:

   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];


   always@ (posedge CLOCK_50 or negedge reset_n) begin
       while(enable) begin
           if(!reset_n)
               count = 0;
           else
               count = count + 1;
       end
    end

endmodule

我希望有人能在我的循环中指出我的错误并允许我继续。

谢谢!

4

3 回答 3

3

我不认为你想在while那里使用循环。怎么样:

   always@ (posedge CLOCK_50 or negedge reset_n) begin
           if(!reset_n)
               count <= 0;
           else if (enable)
               count <= count + 1;
    end

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

于 2013-09-10T20:25:57.187 回答
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

注意:我个人也会在每件事中添加 begin end 以避免稍后添加额外的行并想知道为什么它们总是或永远不会被执行,尤其是在语言新手时。它还具有使缩进看起来更好的额外好处。

always@ (posedge CLOCK_50 or negedge reset_n) begin
  if(!reset_n) begin
    count <= 'b0;
  end
  else if (enable) begin
    count <= count + 1;
  end
end
于 2013-09-11T07:01:19.630 回答
0

标题

错误 (10119):Verilog HDL 循环语句错误在:具有非常量循环条件的循环必须在迭代内终止说明

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

解决方法/修复

要解决此错误,可以使用 Quartus II 设置文件 (.qsf) 中的 VERILOG_NON_CONSTANT_LOOP_LIMIT 选项设置循环限制。例如:

set_global_assignment -name VERILOG_NON_CONSTANT_LOOP_LIMIT 300

于 2013-09-10T20:25:51.053 回答