www.mikrocontroller.net

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


Autor: Thomas Pototschnig (pototschnig)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomas Pototschnig (pototschnig)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas Pototschnig (pototschnig)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: jb (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.