Forum: FPGA, VHDL & Co. Faltung von 2D Daten


von Thomas P. (pototschnig)


Lesenswert?

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

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

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.

von Thomas P. (pototschnig)


Lesenswert?

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

von Thomas P. (pototschnig)


Lesenswert?

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

von jb (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.