Verilog中的For循环

Verilog中的For循环,verilog,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 =

我是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
有人能帮我吗?
谢谢

我只使用RTL中可以静态展开的循环,这里可能是这种情况,但我没有看到

您正在使用循环递增
第二位
,而条件基于
aux
。对我来说,这意味着循环的次数是可变的

aux=aux-5'b01010将执行n次,这意味着并行执行的减法器数量可变

尽管查看您的条件
aux>=5'b01010
这是否意味着最多只能循环一次?if语句在这里不是更简单吗

看起来您的操作与以下操作相同:

if ( aux >= 5'b01010 ) begin
  secondDigit = 2'b01 ;
  aux         = aux - 5'b01010;
end
注意:不要在“始终”块中使用“指定”,它只是:

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

你想用
always@(negedge-iKEY[1]或negedge-iKEY[2])
暗示什么硬件?

如果你把逻辑分成两个always块,会更容易。一个用于组合逻辑,一个用于同步逻辑。在组合中,逻辑应该如下所示。请注意,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

裸骨测试台的工作代码:

逻辑正常-OP使用重复减法进行二进制到BCD转换(即
aux/10
aux%10
)。我想/希望他没有试图合成它…是的,我在做连续减法,以便从二进制转换为BCD,所以在某些情况下,我需要的模式不止一步。我使用Altera DE2-70作为硬件,你需要考虑硬件,而不是软件——首先请参阅Morgan的答案。在第二个始终块(同步块)中,你使用的是块分配。使用
我需要知道iKEY[1]或iKEY[2]中的哪一个改变了它的状态(它们是板中的按钮),因此我认为我需要将这些ifs放在always中block@J0rge您可以在块内使用
iKEY
,启用
只允许合成器将其用作时钟参考。我假设你没有实际的时钟运行,你希望输出来自一个触发器。否则,您应该为闩锁进行设计。合成器在看到多个边缘敏感信号时不知道该怎么办,除非清楚哪一个是同步的,哪一个是异步的。谢谢你,我已经用一种更简单的方式解决了我最大的问题(分离数字),但是你的建议帮助我理解了更多的硬件逻辑
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