Ich bin nicht sicher, wie dies ist VHDL oder Verilog verwandt, da Sie explizit HLS angeben und geben Sie eine C-Stil Frage. In VHDL werden jedoch ungebundene Schleifen nicht explizit unterstützt. Es gibt Fälle, in denen Sie unbegrenzte Schleifen verwenden können, die jedoch irgendwann enden müssen.
Wie der Benutzer1155120 hervorhebt, werden dynamische Schleifenbedingungen nicht unterstützt. Aber um das etwas zu erweitern.
Edit: Anfangs habe ich den Begriff "unbegrenzt" verwendet, wenn ich "Dynamikbereich" Schleifen hätte sagen sollen. Ich habe die Antwort mit dieser Sprache aktualisiert.
Zuerst werden einige Arten von Schleifen mit pseudo-dynamischen Bereichen unterstützt. Zum Beispiel:
for i in 0 to 7 loop
for j in 0 to i loop
...
end loop;
end loop;
Das ist wirklich nicht dynamisch ist, da diese leicht abgerollt werden. Der Synthesizer kann die Grenzen in dieser Schleife bestimmen. Offensichtlich j
nur von 0 bis 7. Aber auch andere Arten von dynamischen Schleifen gehen können, werden nicht unterstützt:
signal a : natural;
...
for i in 0 to a loop
...
end loop;
In diesem Fall wird der Bereich der Schleife ist nicht statisch bekannt.
Aber es gibt eine Möglichkeit, Schleifen basierend auf Eingaben dynamisch zu "binden", aber es erfordert Kenntnis der Grenzen der Eingabe. Man kann so etwas wie:
signal a : natural range 0 to 7;
...
for i in 0 to 7 loop
if (i < a) then
...
end if;
end loop;
Nun ist die Schleife effektiv nur auf den Wert von a
arbeitet auf. (Einige Vorsicht hier. Wenn Sie dies tun, können Speicher - Flops oder Latchs je nach Kontext - innerhalb der if
/end if
für die Fälle abgeleitet werden, in denen die Schleife vorzeitig beendet. Es gibt Möglichkeiten, es zu vermeiden, aber das ist außerhalb der Umfang dieser Antwort.)
RTL kann nicht zu dynamischen Strukturen synthetisiert werden. Daher muss Ihr Design für den größtmöglichen Fall skaliert werden und dann dynamisch ausgewählt werden, wie viele Iterationen bis zum maximal unterstützten durchgeführt werden.
Eine letzte Anmerkung. Es gibt Unterstützung für unbeschränkte Schleifen (While-Schleifen), obwohl es erfordert, dass die Schleife beendet wird. Lassen Sie uns freilaufenden Zähler Beispiel die typische nehmen:
signal ctr : unsigned(31 downto 0) := (others => '0');
...
process(clk)
begin
if (rising_edge(clk)) then
ctr <= ctr + 1;
end if;
end process;
Dies kann auch auf andere Weise ausgedrückt werden:
process
begin
wait until rising_edge(clk);
ctr <= ctr + 1;
end process;
Und es ist möglich zu verwenden, eine unbegrenzte Schleife, zum Beispiel:
process
begin
while true loop
wait until rising_edge(clk);
ctr <= ctr + 1;
end loop;
end process;
Alle diese sind synthetisierbar.
WARNUNG Diskussion unten ist verrückt Sachen und nicht als Beispiel für Code verwendet werden soll.Die Beispiele dienen nur zu Diskussionszwecken.
Und dynamische Entfernungsschleifen sind synthetisierbar, obwohl ihre Funktionalität nicht klar ist. Zum Beispiel:
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;
Oder sogar eine unbeschränkte Schleife:
process
variable i : natural := 0;
begin
while i < a loop
wait until rising_edge(clk);
ctr <= ctr + 1;
end loop;
end process;
Diese beiden synthetisieren. Letzteres ist jedoch besonders problematisch, da es nicht gut simuliert, insbesondere wenn i
> = a
.
VHDL hat eine Schleifenanweisung mit einem For-Iterationsschema, das statische Grenzen für die Synthese oder ein Iterationsschema benötigt, das für die Synthese nicht unterstützt wird. Siehe Std. IEEE 1076.6-2004 (RTL-Synthese, zurückgezogen) 8.8.9 Schleifenanweisung. Schleifenanweisungen inhärent parallelisieren die sequentiellen Anweisungen, die sie enthalten, wenn sie synthetisiert werden. Die Größe der resultierenden Hardware muss bekannt sein. Siehe auch IEEE Std 1076-2008 (das LRM) 10.10 Loop-Anweisung. – user1155120
Dies ist eine begrenzte Schleife; Die Grenze wird durch die Deklaration des Typs (oder Subtyps) für j bestimmt. –