在Verilog中进行For循环

时间:2013-10-16 02:30:14

标签: verilog

我是Verilog的新手,所以我在使用if

时遇到了一些问题

基本上我有一个5位数,并且想要拆分它,所以我可以有一个2位十进制数。为此,我有这段代码

reg [4:0] position, aux;
reg [3:0] display1, display2;
reg [2:0] secondDigit;

always @(negedge iKEY[1] or negedge iKEY[2]) begin
    aux = position;

    for(secondDigit = 2'b0; aux >= 5'b01010; secondDigit = secondDigit + 2'b01)
        aux = aux - 5'b01010;

    assign display1 = aux[3:0];
    assign display2 = {2'b0, secondDigit};

end

问题是我收到了

的消息
loop with non-constant loop condition must terminate within 250 iterations


我也试过替换for循环,但仍然得到相同的错误

aux = position;
secondDigit = 2'b0;
while(aux > 5'b01010) begin
    aux = aux - 5'b01010;
    secondDigit = secondDigit + 2'b01;
end

有人能帮助我吗? 谢谢

3 个答案:

答案 0 :(得分:4)

如果将逻辑划分为两个始终的块,将会更容易。一个用于组合逻辑,一个用于同步逻辑。在组合逻辑应该看起来像下面。请注意,for循环可以解析为三个连续的if语句。

integer index;
always @* begin // combination logic
  aux = position;
  secondDigit = 2'b00;
  for(index = 0; index < 3; index = index + 1) begin
    if(firstDigit >= 5'b0_1010) begin
      aux = aux- 5'b0_1010;
      secondDigit = secondDigit + 1'b1;
    end
  end
end

正如摩根所说,你不应该使用@(negedge iKEY[1] or negedge iKEY[2]),因为它会产生奇怪的综合结果。看起来你打算翻牌。我建议如下:

wire enable = !(iKEY[1] && iKEY[2]); // clocking signal
always @(posedge enable) begin // use enable as a clock
  display1 <= aux[3:0];
  display2 <= {2'b00,secondDigit[1:0]};
end

使用裸骨测试台工作代码:http://www.edaplayground.com/s/6/245

答案 1 :(得分:2)

我只在RTL中使用for循环,可以静态展开,这可能就是这种情况,但我没看到。

当条件基于secondDigit时,您正在使用循环来递增aux。对我来说,这表明循环周围的次数可变。

aux = aux - 5'b01010;将执行n次,并行显示可变数量的减法器。

虽然看着你的情况aux >= 5'b01010,但这并不意味着在循环中最多一次?这里的if语句会不会更简单?

看起来你在做同样的事情:

if ( aux >= 5'b01010 ) begin
  secondDigit = 2'b01 ;
  aux         = aux - 5'b01010;
end

注意:不要在always块内使用assign它只是:

always @(negedge iKEY[1] or negedge iKEY[2]) begin
  display1 = aux[3:0];
  display2 = {2'b0, secondDigit};
end

您试图用always@(negedge iKEY[1] or negedge iKEY[2])暗示哪些硬件?

答案 2 :(得分:-1)

你的循环条件没有问题 - 你改变了代码吗?你用的是什么SIM卡?