Verilog:for 循环内总是
Verilog : For loop inside an always
我正在尝试实现一个在 always 块中使用 for 循环的模块
我们使用 0 和 1 的数组来记录在特定时间内接收到的信号数量。
不幸的是,我们收到了那种错误:
ERROR:Xst:2636 - "Tourniquet.v" line 54: Loop has iterated 10000 times. Use "set -loop_iteration_limit XX" to iterate more.
似乎在 always 块中不允许使用 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
我找不到解决方案,也不确定问题出在哪里,欢迎任何提示或帮助。
非常感谢!
您需要循环迭代 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
以获得 适当的计数器增量 和适当的循环终止。
根据@sharvil111 的回答,我看到所有 这些都是单个位:
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 又是某个数字(常数)。
我正在尝试实现一个在 always 块中使用 for 循环的模块 我们使用 0 和 1 的数组来记录在特定时间内接收到的信号数量。
不幸的是,我们收到了那种错误:
ERROR:Xst:2636 - "Tourniquet.v" line 54: Loop has iterated 10000 times. Use "set -loop_iteration_limit XX" to iterate more.
似乎在 always 块中不允许使用 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
我找不到解决方案,也不确定问题出在哪里,欢迎任何提示或帮助。 非常感谢!
您需要循环迭代 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
以获得 适当的计数器增量 和适当的循环终止。
根据@sharvil111 的回答,我看到所有 这些都是单个位:
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 又是某个数字(常数)。