[英]how can I implement unbounded loops in FPGA?
我了解在HLS期间展开了运行预定义次数的循环的循环。 但是没有预定义范围的循环又如何呢? 例如,
for (i = 0; i < j; i++) { ... }
在FPGA中如何实现这样的循环?
我不确定这与VHDL或Verilog有什么关系,因为您明确声明了HLS并提出了C风格的问题。 但可以肯定的是,在VHDL中,未明确支持未绑定的循环。 在某些情况下,您可以使用无界循环,但必须在某些时候终止。
如user1155120所指出的,不支持动态循环约束。 但是要扩大一点。
编辑:当我应该说“动态范围”循环时,最初使用术语“无界”。 我已经用该语言更新了答案。
因此,首先,支持某些具有伪动态范围的循环。 例如:
for i in 0 to 7 loop
for j in 0 to i loop
...
end loop;
end loop;
这确实不是动态的,因为它们很容易展开。 合成器可以确定此循环的界限。 显然j
只能从0到7。但是不支持其他类型的动态循环:
signal a : natural;
...
for i in 0 to a loop
...
end loop;
在这种情况下,循环范围不是静态已知的。
但是有一种方法可以基于输入来动态地“绑定”循环,但是它确实需要了解输入的边界。 一个人可以做类似的事情:
signal a : natural range 0 to 7;
...
for i in 0 to 7 loop
if ( i < a ) then
...
end if;
end loop;
现在循环实际上仅在高达价值a
。 (此处有些警告。执行此操作时, end if
情况早于循环终止, if
可以在if
/ end if
内部推断内存(取决于上下文,是触发器还是锁存器)。有一些避免方法,但是那是在外部此答案的范围。)
RTL无法合成为动态结构。 因此,您的设计将必须针对最大可能的情况进行大小调整,然后动态选择要达到最大支持次数的迭代次数。
最后一点。 支持无界循环(while循环),尽管它确实要求终止循环。 让我们以典型的自由运行计数器示例为例:
signal ctr : unsigned(31 downto 0) := (others => '0');
...
process(clk)
begin
if ( rising_edge(clk) ) then
ctr <= ctr + 1;
end if;
end process;
这也可以用另一种方式表示:
process
begin
wait until rising_edge(clk);
ctr <= ctr + 1;
end process;
并且可以使用无界循环,例如:
process
begin
while true loop
wait until rising_edge(clk);
ctr <= ctr + 1;
end loop;
end process;
所有这些都是可综合的。
警告以下讨论是疯狂的事情,不应用作代码示例。 这些示例仅用于讨论目的。
动态范围循环是可合成的,尽管其功能尚不清楚。 例如:
signal a : natural := 33;
signal ctr : natural := 0;
...
process
begin
for i in 0 to a-1 loop
wait until rising_edge(clk);
ctr <= ctr + 1;
end loop;
end process;
甚至是无限循环:
process
variable i : natural := 0;
begin
while i < a loop
wait until rising_edge(clk);
ctr <= ctr + 1;
end loop;
end process;
这些都合成。 但是后者尤其有问题,因为它不能很好地模拟,尤其是当i
> = a
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.