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