2016-05-05 14 views
2

Ich verstehe, dass Schleifen, die für vordefinierte Anzahl von Iterationen ausgeführt werden, während HLS entrollt werden. Aber was ist mit Loops ohne vordefinierte Grenzen? z. B.Wie kann ich unbegrenzte Schleifen im FPGA implementieren?

for (i = 0; i < j; i++) { ... } 

Wie werden solche Schleifen in FPGAs implementiert?

+3

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

+0

Dies ist eine begrenzte Schleife; Die Grenze wird durch die Deklaration des Typs (oder Subtyps) für j bestimmt. –

Antwort

5

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.

+0

Unbounded Loops (while loops) werden unterstützt ... für die Simulation. Die Synthese erfordert eine wie oben beschriebene Begrenzung. Das letzte Beispiel kann verbessert werden, indem die fragilen magischen Zahlen entfernt werden: "Untertyp a_type ist der natürliche Bereich 0 bis 7; signalisieren a: a_type; ... für i in einer Art Schleife ... ' –

+0

Danke. Ich bin neu in HLS. Gibt es auf der Schaltungsebene etwas, das verhindert, dass unbeschränkte Schleifen implementiert werden? Wie können sie nicht innerhalb eines einzigen Taktzyklus ausgeführt werden und benötigen Register, um den aktuellen Wert der Schleifenvariablen zu halten? – JRR

+0

@BrianDrummond Ich beantwortete die Frage in Bezug auf den Kontext des OP, der fragte: "Wie werden solche Schleifen in FPGAs implementiert?" Dies ist eine Frage zur Synthese, nicht zur Simulation. Meine Sprache war jedoch ungenau, daher habe ich die Antwort aktualisiert. Auch die "magischen Zahlen" waren nur zum Beispiel. – PlayDough