我正在尝试实现一个在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
我无法找到解决方案,也无法确定问题所在,欢迎任何提示或帮助。 非常感谢你!
答案 0 :(得分:5)
你需要循环迭代100次。为此,您需要至少8位计数器变量。
但是在这里,n
被声明为reg n
,一个位计数器变量。因此,n+1
提供1
并再次n+1
提供0
。
因此,n<100
总是满足的for循环条件。而for循环永远不会终止。
这是你的for循环多次迭代的主要原因。
通常integer
数据类型用于这些类型的计数器。 integer
类似于32位reg
。将n
声明为integer n
或reg [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又是一个数字(常数)。