Hallo, ich versuch mir grad Gedanken darüber zu machen, wie man in VHDL eine 2D-Faltung realisieren könnte ... Wenn der Faltungs-Kernel separierbar ist, wäre eine Faltung in X mit einem Schieberegister ganz easy möglich, für die Faltung in Y müsste man ja dann, je nach Höhe des Kernels, ein paar ganze Zeilen des Bildes in Schieberegister speichern und dann ein Bild durchschieben. Der Speicherbedarf wäre nur bei der Y-Faltung relativ hoch. Bei einer nicht-separierbaren Faltung wärs das gleiche, nur man braucht statt 2*n multiplizierern n*n ... Hat jemand irgendwelche Unterlagen oder Ideen zu der Materie? Hab bisher nichts brauchbares gefunden ... Mfg Thomas Pototschnig
Im einfachsten Fall geht die Faltung so wie auf dem Rechner: zwei verschachtelte Zähler die die Quelldaten-Arrays adressieren, ein MAC der die adressierten Elemente multipliziert und im Ergebnis-Array akkumuliert. Bei 2D-Faltung das ganze zweimal. Das Adressieren der Arrays (Block-RAMs) dürfte viel effizienter sein als alle Daten durch ein gigantisches Schieberegister zu bewegen, und von vornherein komplett parallel mit "n" Multiplizierern zu arbeiten dürfte nirgendwo hin führen. Wenn es schneller gehen muss kann man immer noch mehrere Multiplikationen parallelisieren oder den Umweg über eine FFT gehen.
Andreas Schwarz wrote: > Im einfachsten Fall geht die Faltung so wie auf dem Rechner: zwei > verschachtelte Zähler die die Quelldaten-Arrays adressieren, ein MAC der > die adressierten Elemente multipliziert und im Ergebnis-Array > akkumuliert. Bei 2D-Faltung das ganze zweimal. Ich weiß nicht, ob das in der Praxis wirklich so funktioniert. Ein z.B. 640*480*8bit Bild kriegt man in einen FPGA so gut wie nicht rein. Wenn man externes RAM verwendet muss man Lese-Zugriffe koordinieren, was kompliziert ist und Zeit kostet, wenns auch noch mehrere Prozesse sind, die unterschiedliche Daten haben wollen. Dann sinkt auch die Rechengeschwindigkeit dadurch. Wird noch eine Faltung danach benötigt, muss das Ergebnis vorher abgespeichert werden und dann wieder gelesen werden ... Das sind dann noch mehr Prozesse, die auf ein RAM gleichzeitig zugreifen wollen, sowohl lesend, als auch schreibend. Ich denke, dass da eine Streaming-Architektur wesentlich sinnvoller ist, da nur Speicherplatz für die Schieberegister benötigt werden und sonst nichts abgespeichert werden muss ... > Das Adressieren der > Arrays (Block-RAMs) dürfte viel effizienter sein als alle Daten durch > ein gigantisches Schieberegister zu bewegen Kein gigantisches Schieberegister. Bei einem 640 Pixelbild und Kernelgröße 3x3 wären das 1,88kB Speicher. Ich hab aber keine Ahnung, was diese IP-Wizards von z.B. Xilinx machen, wenn man im Schieberegister irgendwo zwischen drin Daten haben will. > und von vornherein komplett > parallel mit "n" Multiplizierern zu arbeiten dürfte nirgendwo hin > führen. Jo, das ist klar :-) > Wenn es schneller gehen muss kann man immer noch mehrere > Multiplikationen parallelisieren oder den Umweg über eine FFT gehen. Jo, so seh ich das auch. Mfg Thomas Pototschnig
Nachtrag: Man kann Block-RAM als Schieberegister verwenden und mehrere mit je 640Byte Tiefe hintereinanderschalten. Jeder Ausgang eines Schieberegister entspricht dann einem Pixel, das man für die Y-Faltung braucht. Das braucht kaum Logic und verwendet nur BRAM. Der Shift-Register-Generator vom Xilinx-IP-Wizard verwendet leider kein BRAM. Das muss man dann mit dem BRAM-Generator und dem "Read-First"-Modus und einem Counter machen. So ein Shift-Register als Array zu definieren klappte sowiso gleich überhaupt nicht. Da waren 50% Logik weg und es hat lange zum synthetisieren gebraucht. Synthetisieren lässt sich das auch ... sehr wenig Logik-Verbrauch, dafür aber 45% des BRAMs bei 640*480 mit 5x5 Kernel (XC2S200). Mfg Thomas Pototschnig
Hallo, Ob sich das bei einem 5x5 Faltungskern schon rechnet kann ich gerade nicht abschätzen; aber die übliche Methode das im PC zu machen ist ja zunächt mit einer FFT in den Frequenzraum zu wechseln, Faltungskern und Bild Punktweise miteinander zu multiplizieren und dann wieder zurückzutransformieren. 1d FFT und iFFT sind ja effizient auf dem FPGA machbar -- gilt das auch für die 2d Variante? j.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.