2

我是 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 循环代替这个 while,但不断收到同样的错误

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

有人可以帮助我吗?谢谢

4

2 回答 2

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

于 2013-10-16T16:09:39.890 回答
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])

于 2013-10-16T08:32:04.127 回答