2016-04-05 14 views
1

Ich versuche eine (sehr einfache) GPU auf einem Spartan-6 FPGA mit VHDL zu erstellen. Das große Problem, auf das ich gestoßen bin, ist, dass mein Verständnis von HDL ziemlich begrenzt ist - ich habe meinen Code mit verschachtelten for Schleifen für Ray Tracing/Scanline Rasterisierungsalgorithmen geschrieben, ohne zu bedenken, dass diese enormen Schleifen mehr als 100% verbrauchen der DSP schneidet, wenn die Schleifen bei der Synthese aufgetrennt werden.Serialisierungscode in VHDL

Meine Frage ist, wenn, ich habe eine Uhr ausgelöst Zähler anstelle einer for Schleife (mit dem Zähler als Index und Reset auf 0 bei seiner max), würde dies bedeutet, dass die gesamte Logik wird nur einmal generiert? Ich kann das sehen, wenn ich Raytracing auf einem 600x800 Bildschirm mit einem 200 MHz Takt führe, dass die gesamte Bildwiederholrate des gesamten Bildschirms auf 625 Hz fallen würde, aber das sollte theoretisch noch schnell genug sein.

Vielen Dank!

Antwort

2

Wenn Sie eine for-Schleife implementieren, wird die Funktionalität in der for-Schleife gleichzeitig für alle Werte ausgeführt, die von der for-Schleife durchlaufen werden. Um dies zu erreichen, muss das Synthesewerkzeug die Funktionalität für jeden Wert in der for-Schleife einmal implementieren, so dass Sie immer noch die massive Hardware-Implementierung haben.

Zum Beispiel wird dieser Code entrollen Hardware für die Funktionalität paralleler, in diesem Fall das UND-Gatter, aber ohne Overhead in Hardware als Ergebnis der for-Schleife:

process (clk_i) is 
begin 
    if rising_edge(clk_i) then 
    for idx_par in z_par_o'range loop 
     z_par_o(idx_par) <= a_i(idx_par) and b_i(idx_par); -- Functionality 
    end loop; 
    end if; 
end process; 

Verschachtelung von Verarbeitung für verschiedene Daten Werte müssen dann explizit in VHDL implementiert werden, so dass ein Signal mit dem Wert vorhanden ist, und dieser Wert jedes Mal inkrementiert und umbrochen wird, wenn die Funktionalität das Ergebnis für den angegebenen Wert berechnet hat.

Und wird dieser Code serielle Hardware für die Funktionalität, aber mit Aufwand in Hardware als Ergebnis der Schleife:

process (clk_i) is 
begin 
    if rising_edge(clk_i) then 
    if rst_i = '1' then -- Reset 
     idx_ser <= 0; 
    else -- Operation 
     z_par_o(idx_ser) <= a_i(idx_ser) and b_i(idx_ser); -- Functionality 
     if idx_ser /= LEN - 1 then -- Not at end of range 
     idx_ser <= idx_ser + 1; -- Increment 
     else -- At end of range 
     idx_ser <= 0; -- Wrap 
     end if; 
    end if; 
    end if; 
end process; 

Ordinary VHDL-Synthese-Tools sind nicht in der Lage für Schleifen entrollen im Laufe der Zeit auszuführen.

+0

Entschuldigung - ich verstehe, dass der erste Teil über das Synthese-Tool für jeden Wert einmal implementiert (was zu massiven Hardware), aber ich verstehe nicht ganz den zweiten Teil der Interleaving-Verarbeitung? – davidhood2

+1

Siehe Update zur Antwort. –

+0

Zur Verdeutlichung der VHDL-Struktur - nach meiner eng verwandten Frage - werden alle 'Funktions'-Anweisungen in einem einzigen Zyklus ausgeführt (und wenn nicht, wie kann eine Funktion über mehrere Taktzyklen hinweg erstellt werden) oder kann die Berechnung über mehrere Zyklen verteilt werden nur mit Entitäten gemacht werden? – davidhood2