2013-10-16 80 views
1

我是新来的Verilog,所以我有一些问题,如果for循环中的Verilog

基本上我有一个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

如果你将逻辑分成两个块总是会更容易。一个用于组合逻辑,一个用于同步逻辑。在组合逻辑应该看起来像下面。请注意,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

+0

我需要知道iKEY [1]或iKEY [2]中的哪一个已经改变了它的状态(它们是板上的按钮),所以我认为我需要将这些ifs放在总是阻止 – Jorgel

+0

@ J0rge的位置,在块内使用'iKEY','enable'只允许合成器将其用作时钟参考。我假设你没有实际的时钟运行,并且你希望输出来自翻牌。否则,你应该设计一个闩锁。除非清楚哪一个是同步的,哪些是异步的,否则合成器在看到多个边沿敏感信号时不知道该怎么做。 – Greg

+0

谢谢你,我用一种更简单的方式解决了我最大的问题(将数字分开),但是你的建议帮助我理解了更多的硬件逻辑 – Jorgel

0

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

+0

我使用的Quartus II 9.1网络版 – Jorgel

2

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

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

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

虽然看着你的情况aux >= 5'b01010 doe这不是最多一次暗示循环? 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 

你想与[email protected](negedge iKEY[1] or negedge iKEY[2])意味着什么硬件?

+1

的逻辑是好的 - 在OP的使用重复减法做二进制BCD转换(即“aux/10”和“aux%10”)。我想/他希望他不想合成它... – EML

+0

是的,我正在做成功的减法,以便从二进制转换为BCD,所以在某些情况下我需要模式而不是一步。我正在使用Altera DE2-70作为硬件 – Jorgel

+0

好吧,您需要考虑硬件,而不是软件 - 请参阅摩根对初学者的回答。 – EML