簡體   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