繁体   English   中英

如何在FPGA中实现无界循环?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM