gpt4 book ai didi

Verilog : Error using nested for loop 中的 FFT 实现

转载 作者:行者123 更新时间:2023-12-04 20:11:58 25 4
gpt4 key购买 nike

这篇文章与我之前关于 FFT 的文章相关。

FFT implemetation in Verilog: Assigning Wire input to Register type array

我想将第一级的输出分配给 FFT 蝶形模块第二级的输入。我必须根据第二阶段的输入重新排序第一阶段的输出。这是我实现交换的代码。

always@ (posedge y_ndd[0] or posedge J)
begin

if(J==1'b1)
begin
for (idx=0; idx<N/2; idx=idx+1)
begin
IN[2*idx] <= X[idx*2*X_WDTH+: 2*X_WDTH];
IN[2*idx+1] <= X[(idx+N/2)*2*X_WDTH+: 2*X_WDTH];
end
end

else
begin
level=level+1;
modulecount=0;
for(jj=0;jj<N;jj=jj+(2**(level+1)))
begin
for (jx=jj; jx<jj+(2**level); jx=jx+1)//jj+(2**level)
begin
IN[modulecount] <=OUT[jx];
IN[modulecount+1] <=OUT[jx+(2**level)];
modulecount=modulecount+1;
end
end
end

end

当我综合这个时,它给出了 2 个错误。

ERROR:Xst:891 - "Network.v" line 161: For Statement is only supported when the new step evaluation is constant increment or decrement of the loop variable.
ERROR:Xst:2634 - "Network.v" line 161: For loop stop condition should depend on loop variable or be static.

我们不能使用非恒定增量和非静态停止条件吗?

如果是这样,我们如何处理。

感谢任何帮助。提前致谢。

最佳答案

综合工具展开循环以综合电路。因此,只有在编译/精化时已知其常数的迭代次数为常数的循环才是可合成的。

当停止值未知时,您可以假设最大迭代次数并将其用作停止条件。然后在循环内部加入原来的停止条件作为条件语句:

        for (jx=jj; jx < MAX_LOOP_ITERATION; jx=jx+1)//jj+(2**level)
begin
if (jx<jj+(2**level)) // <---------- Add stop condition here
begin
IN[modulecount] <=OUT[jx];
IN[modulecount+1] <=OUT[jx+(2**level)];
modulecount=modulecount+1;
end
end

如果 N 不是常量,则外层循环也应使用类似的条件语句进行固定。您还需要固定增量值并每次添加一个常量值。使用条件语句检查是否 jj==jj+(2**(level+1))

显然,您需要小心,因为最大值可能会增加最坏情况下的延迟和最小时钟周期时间。

关于Verilog : Error using nested for loop 中的 FFT 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23776695/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com