Verilog:总是在里面循环

时间:2016-04-01 16:11:38

标签: verilog

我正在尝试实现一个在always块中使用for循环的模块 我们正在使用0和0的数组。 1是为了记录在一定时间内收到的信号数量。

不幸的是,我们收到了这样的错误:

ERROR:Xst:2636 - "Tourniquet.v" line 54: Loop has iterated 10000 times. Use "set -loop_iteration_limit XX" to iterate more.

似乎for循环中的for循环不允许(n似乎没有重置)。 我查看了各种网站和论坛,但没有找到任何解决方案。

这是我的代码:

  module Tourniquet(
    input t0,
    input mvt,
     input clk,
    output init
    );

reg initialisation;
reg [0:99] memoire;
reg count = 0;
reg compteur = 0;
reg n;

assign init = initialisation;

always @(posedge clk) 
begin
    if (count==99) 
    begin 
            if (mvt)
            begin 
            memoire[count]=1;
            count=0;
            end

            else
            begin 
            memoire[count]=0;
            count=0;
            end
    end 

    else
    begin 
            if (mvt)
            begin 
            memoire[count]=1;
            count = count + 1;
            end

            else
            begin 
            memoire[count]=0;
            count = count + 1;
            end
    end
end

always @(posedge clk) 
begin
initialisation = 0;
for (n=0; n<99; n=n+1) compteur = compteur + memoire[n];
if (compteur>10) initialisation = 1;
compteur = 0;
end

endmodule

我无法找到解决方案,也无法确定问题所在,欢迎任何提示或帮助。 非常感谢你!

2 个答案:

答案 0 :(得分:5)

你需要循环迭代100次。为此,您需要至少8位计数器变量

但是在这里,n被声明为reg n,一个位计数器变量。因此,n+1提供1并再次n+1提供0

因此,n<100 总是满足的for循环条件。而for循环永远不会终止

这是你的for循环多次迭代的主要原因。

通常integer数据类型用于这些类型的计数器。 integer类似于32位reg。将n声明为integer nreg [7:0] n,以使正确增加计数器并正确终止循环。

答案 1 :(得分:4)

继@ sharvil111的答案之后,我看到 all 这些是单个位:

reg initialisation;
reg count = 0;
reg compteur = 0;
reg n;

通常声明Verilog中的N位reg,例如:

reg [N-1:0] n;

其中N是某个数字(常数)。我看到这是一个100位的数字:

reg [0:99] memoire;

显然,我不知道你的设计意图,但我怀疑你想要一组N位数字:

reg [N-1:0] memoire [0:99];

其中N又是一个数字(常数)。