Forum: FPGA, VHDL & Co. Realisierung des MJPEG-Decoder auf FPGA (softwarebasiert)


von Nohchi V. (chedisel)


Angehängte Dateien:

Lesenswert?

Hallo,

in meiner Bachelorarbeit realisiere ich den MJPEG-Decoder auf dem 
Virtex-5-FPGA der Firma Xilinx (ML507-Board) unter Verwendung von 
Network-on-Chip-Kommunikation (siehe Anhang). Die Netzwerkarchitektur 
(MicroRouters und Protokoll) ist bereist realisiert und es implementiert 
die Schichten von 1 bis 4 des OSI-Models. Die Kommunikation zwischen 
beteiligten Komponenten (MicroBlazes und Routers) erfolgt über 
4-Byte-Pakete, wobei lediglich zwei Bytes davon die Nutzlast ist.
Die Quellcode in C für den JPEG-Decoder ist auch schon vorhanden.Nun 
will ich die einzelnen Dekodierungsschritte des MJPEG-Decoders über 
jeweilige MicroBlazes verteilen (siehe Anhang). Die Funktionsweise 
meiner Quellcode ist so, dass zuerst ein ganzes dekodiertes Bild erst 
eingelesen und zwischengespeichert wird. Nun werden die Bilddaten 
bearbeitet und der Stukturdatentyp stJpegData (siehe Anhang) 
initialisiert und dessen Komponenten während des Auslesens der Header- 
und Tabelleninformationen mit entsprechenden Werten initialisiert. Somit 
brauchen die Funktionen für entsprechende Dekodierungsschritte in 
MicroBlazes nur Zeiger auf Puffer mit Bilddaten und auf Strukturdatentyp 
stJpegData.
Meine Frage ist, ob meine Vorgehensweise auf FPGA realisierbar ist. Ich 
brauche zwei Puffer, wobei im ersten Puffer zuerst alle kodierten Daten 
von SOI bis EOI und im zweiten Puffer der Stukturdatentyp mit allen 
Headerinformationen sowie DQT-und Huffman-Tabellen gespeichert werden. 
Die Zeiger auf diese Puffer sollten dann beim Funktionsaufruf an 
entsprechenden MicroBlaze übergeben werden, sodass jeder MicroBlaze dem 
Zugriff auf diese Speicherbereiche hat.

Ich bin ganz neu in der FPGA-Welt und für jeden Vorschlag oder Idee von 
ihrer Seite würde ich sehr dankbar sein.

Viele Grüße
Nohchi

von Klakx (Gast)


Lesenswert?

Nohchi V. schrieb:
> Ich bin ganz neu in der FPGA-Welt und für jeden Vorschlag oder Idee von
> ihrer Seite würde ich sehr dankbar sein.

Prinzipiell sehe ich erstmal keine Bedenken. Ist die ganze FPGA-Struktur 
schon fertig und es fehlt nur noch Software? (Ich hoffe doch für eine 
Bachlorarbeit zumindest :)

Ich rate dir es erstmal zu probieren. Prinzipiell sollte mit einem NoC 
ein MB sich ja von überall die Daten holen können. Am Ende ist die 
Effizienz/Geschwindigkeit das andere Problem.

von S. R. (svenska)


Lesenswert?

Was genau soll der FPGA tun? Soll der nur die Prozessoren und deren 
Kommunikation hosten, und die MJPEG-Dekodierung ist dann Hardware, oder 
soll er auch aktiv beim Dekodieren helfen?

von Gustl B. (-gb-)


Lesenswert?

Die Prozessoren sind IM FPGA. Ja aber gute Frage wieso man das 
Dekodieren nicht in Hardware macht sondern in C. Für mich sieht das eher 
so aus als wäre die Aufgabe ein Network-on-Chip mit mehreren CPUs zu 
bauen.

von Nohchi V. (chedisel)


Lesenswert?

> Prinzipiell sehe ich erstmal keine Bedenken. Ist die ganze FPGA-Struktur
> schon fertig und es fehlt nur noch Software? (Ich hoffe doch für eine
> Bachlorarbeit zumindest :)

Die Network-on-Chip-Architektur ist bereits vorhanden. Die MikroRouters 
sind in VHDL implementiert. Die Softwareschnittstelle zu MikroRoutern, 
die die Schicht 4 implementiert, ist auch vorhanden. In Meiner Arbeit 
muss ich nun diese Network-on-Architektur anwenden. Dabei implementiere 
ich MJPEG-Decoder und verteile die Funktionalitäten der einzelnen 
Dekodierungschritte über MicroBlazes, die dann die Dekodierung 
sequentiell durchführen. Die Software habe ich bereits implementiert und 
die Funktionsweise habe ich schon teils in meiner Frage erläutert. Ich 
weißt jetzt einfach nicht, wo ich meine Daten zwischenspeichern soll, 
sodass jeder MB beim Funktionsaufruf die Zeiger auf die entsprechenden 
Speichern als Parameter bekommen und auf diese Daten zugreifen.

von Gustl B. (-gb-)


Lesenswert?

HM. Musst Du das mit den Microblazes und in C machen? Ich kenne mich 
damit nicht aus aber bei FPGA und Dekoder habe ich doch sehr erwartet, 
dass da viel direkt in Hardware gemacht wird. Vielleicht noch mit CPU 
zur Steuerung aber eben nicht für rechenintensive Aufgaben.
Was ist denn der Grund wieso das mit CPUs gerechnet werden soll? Finde 
ich auch spannend weil ungewöhnlich.

von Klakx (Gast)


Lesenswert?

Nohchi V. schrieb:
> Ich weißt jetzt einfach nicht, wo ich meine Daten zwischenspeichern
> soll, sodass jeder MB beim Funktionsaufruf die Zeiger auf die
> entsprechenden Speichern als Parameter bekommen und auf diese Daten
> zugreifen.

Wie sieht es aus wenn du ein allgemeines BRAM ans NoC hängst? Dann 
kopieren sich die MB das notwendige in ihren eigenen RAM.
Hier weiß ich nun nicht wie dynamisch die Sache abläuft. Es könnte dann 
zuviel Traffic am BRAM anliegen. Außerdem kann ich die Größe dieser 
ganzen Zeiger Daten noch nicht abschätzen und Synchronisierung ist auch 
wichtig.

von S. R. (svenska)


Lesenswert?

Dann schlage ich vor, du löst dich erstmal von dem Wort "FPGA". Du hast 
nämlich eigentlich keinen FPGA, sondern einfach mehrere 
MicroBlaze-Prozessoren, die miteinander über ein Netzwerk 
(Network-on-chip) verbunden sind. Dass die in einem FPGA implementiert 
sind, ist relativ egal.

Viel wichtiger sind die klassischen Fragen der Mikrocontrollerei:
- Wie ist die Aufteilung des Adressraums aus Sicht jedes MicroBlaze?
--- Wo befindet sich der RAM (welche Adressen) und was für RAM ist es?
--- Hat jeder MicroBlaze eigenen RAM?
----- Können die anderen MicroBlazes darauf zugreifen?
--- Gibt es einen gemeinsam genutzten RAM irgendwo?
----- Ist der auch schnell genug für parallele Zugriffe?
--- Findet zwischen den MicroBlazes Message Passing statt?
----- Mit oder ohne DMA?
------- Wie mächtig ist der DMA-Controller?

Wenn es keinen RAM gibt, auf den alle MicroBlazes zugreifen können, dann 
kannst du schlicht keinen Zeiger auf die Daten bauen, sondern du musst 
vorher die Daten in die richtige CPU kopieren. Dabei ändert sich 
natürlich die Adresse.

Wenn es einen gemeinsamen RAM gibt (oder der Speicher in einem 
gemeinsamen Adressraum verteilt ist), kannst du zwar mit einem Pointer 
arbeiten, aber Zugriffe auf "fremden" Speicher können deutlich langsamer 
sein als Zugriffe auf "eigenen" Speicher. Dann willst du trotzdem 
kopieren, und zwar je nach Datenmenge mit DMA.

Wenn zwei CPUs gleichzeitig auf einen RAM zugreifen, musst du die 
Zugriffe synchronisieren (z.B. durch Locks oder sowas wie Transaktionen, 
z.B. FIFOs). Im Zweifelfall brauchst du dafür spezielle 
CPU-Instruktionen (test-and-set o.ä.), um das implementieren zu können. 
Oder du garantierst atomische Zugriffe und kannst lock-free 
synchronisieren. Hängt vom NoC ab, was du brauchst und was du kannst.

von Nohchi V. (chedisel)


Lesenswert?

> Dann schlage ich vor, du löst dich erstmal von dem Wort "FPGA". Du hast
> nämlich eigentlich keinen FPGA, sondern einfach mehrere
> MicroBlaze-Prozessoren, die miteinander über ein Netzwerk
> (Network-on-chip) verbunden sind. Dass die in einem FPGA implementiert
> sind, ist relativ egal.

So verstehe ich es auch. Ich habe mich von Anfang an mit C und 
JPEG-Standard gründlich beschäftigt, um die Softwarelösung zu erarbeiten 
und natürlich das Xilinx-ML507-Board mit EDK noch kennen gelernt.

> Viel wichtiger sind die klassischen Fragen der Mikrocontrollerei:
> --- Hat jeder MicroBlaze eigenen RAM?
> ----- Können die anderen MicroBlazes darauf zugreifen?
> --- Gibt es einen gemeinsam genutzten RAM irgendwo?

Genau diese Fragen interessieren mich jetzt und das ist der Grund, warum 
ich diesen Thread geöffnet habe.
Ich habe es versucht mit "MicroBlaze Processor Reference Guide" von 
Xilinx herauszufinden, aber da ist alles irgendwie verwirrend für mich.

> ----- Ist der auch schnell genug für parallele Zugriffe?

Da die Dekodierungsschritte von MicroBlazes sequentiell durchgeführt 
werden, fällt auch der Bedarf an parallelen Speicherzugriffen von 
MicroBlazes aus.

> --- Findet zwischen den MicroBlazes Message Passing statt?

Die einzelnen Dekodierungsschritte (Entropiedekodierung, DeZigZag, 
Dequantizierung, IDCT usw.) sind als Funktionen in entsprechenden 
MicroBlazes implementiert und bei Aufruf benötigen diese Funktionen 
Zeiger auf Tabellen und Bilddaten, wofür ich jetzt einen gemeinsamen 
Speicher brauche, und die Zeiger auf diese Speicherbereiche werden 
zwischen MicroBlazes unter Hilfe von NoC ausgetauscht.

> Wenn es keinen RAM gibt, auf den alle MicroBlazes zugreifen können, dann
> kannst du schlicht keinen Zeiger auf die Daten bauen.

Genau das ist mein Problem, ich weiß jetzt einfach nicht, ob es einen 
gemeinsamen RAM gibt oder nicht und dafür suche ich hier Hilfe.

> Wenn es einen gemeinsamen RAM gibt (oder der Speicher in einem
> gemeinsamen Adressraum verteilt ist), kannst du zwar mit einem Pointer
> arbeiten, aber Zugriffe auf "fremden" Speicher können deutlich langsamer
> sein als Zugriffe auf "eigenen" Speicher.

Es gibt von der Seite des Betreuers keine Randbedingungen oder bestimmte 
Anforderungen, daher kommt die Optimierung erst als nächstes in die 
Frage. Ich muss jetzt den Dekoder einfach laufen lassen.

: Bearbeitet durch User
von S. R. (svenska)


Lesenswert?

Nohchi V. schrieb:
>> Viel wichtiger sind die klassischen Fragen der Mikrocontrollerei:
>> --- Hat jeder MicroBlaze eigenen RAM?
>> ----- Können die anderen MicroBlazes darauf zugreifen?
>> --- Gibt es einen gemeinsam genutzten RAM irgendwo?
>
> Genau diese Fragen interessieren mich jetzt und das ist der Grund, warum
> ich diesen Thread geöffnet habe.

Diese Fragen können wir dir aber nicht beantworten, weil die nicht vom 
MicroBlaze abhängen, sondern davon, wie konkret das Netzwerk 
implementiert ist. Da musst du den Designer des Systems fragen.

>> ----- Ist der auch schnell genug für parallele Zugriffe?
>
> Da die Dekodierungsschritte von MicroBlazes sequentiell durchgeführt
> werden, fällt auch der Bedarf an parallelen Speicherzugriffen von
> MicroBlazes aus.

Du hast 4 MicroBlazes, also können pro Taktzyklus bis zu 4 
Speicherzugriffe auftreten, wenn die 4 MicroBlazes auf einem Speicher 
arbeiten und der nur einen Port hat.

>> Wenn es keinen RAM gibt, auf den alle MicroBlazes zugreifen können, dann
>> kannst du schlicht keinen Zeiger auf die Daten bauen.
>
> Genau das ist mein Problem, ich weiß jetzt einfach nicht, ob es einen
> gemeinsamen RAM gibt oder nicht und dafür suche ich hier Hilfe.

Frag den Designer des Systems, denn der hat das entschieden. Der muss 
eine Dokumentation abgeliefert haben.

>> Wenn es einen gemeinsamen RAM gibt (oder der Speicher in einem
>> gemeinsamen Adressraum verteilt ist), kannst du zwar mit einem Pointer
>> arbeiten, aber Zugriffe auf "fremden" Speicher können deutlich langsamer
>> sein als Zugriffe auf "eigenen" Speicher.
>
> Es gibt von der Seite des Betreuers keine Randbedingungen oder bestimmte
> Anforderungen, daher kommt die Optimierung erst als nächstes in die
> Frage. Ich muss jetzt den Dekoder einfach laufen lassen.

Ich habe mit einer ähnlichen Architektur gearbeitet und für eine 
Iteration meines Algorithmus lag der Zeitunterschied zwischen "unter 
eine Sekunde" und "ich habe die erste Iteration nach 30 Minuten 
abgebrochen".

Du musst dir vorher überlegen, was wo ausgeführt werden soll und wo die 
dazugehörigen Daten liegen müssen. Es hängt von der Systemarchitektur 
ab, was sinnvoll und was überhaupt möglich ist. Diese Entscheidung 
kannst du so ohne weiteres auch nicht ändern (viel Arbeit).

Fange klein an und baue Programme, die eine Zahlenfolge (1, 4, 7, ...) 
von A nach B schicken und lasse sie dir von B ausgeben.

von dose (Gast)


Lesenswert?

Also wenn ich das richtig verstehe. Dafür wird ein "Netzwerk on chip" 
mit mehreren layern eingesetzt.
Wer ist denn auf den Quatsch gekommen? Das ist typischer akademischer 
Müll.

Der Datenstrom ist nur in eine Richtung und für die Flowkontrolle ist 
eine einfach Busy Leitung als Handshake notwendig.

von S. R. (svenska)


Lesenswert?

dose schrieb:
> Wer ist denn auf den Quatsch gekommen?

Ein universelles System ist halt kein MJPEG-Beschleuniger.

von Spartaner (Gast)


Lesenswert?

Denke mal, dass der MJPEG Decoder eher als Demo gedacht ist um zu 
zeigen, dass das System sowas prinzipiell kann.

von Rolf S. (audiorolf)


Lesenswert?

Das glaube ich auch, da so ein Sinn (Softcore!) keinen Sinn macht, 
besonders auch, weil die Virtex-Familie einen PowerPC anbietet, der das 
geringfügig schneller erledigen könnte.

von Nohchi V. (chedisel)


Lesenswert?

> Denke mal, dass der MJPEG Decoder eher als Demo gedacht ist um zu
> zeigen, dass das System sowas prinzipiell kann.
Genau, die mein Arbeit soll nun einfach die Anwendbarkeit in einer 
vorherigen Diplomarbeit implementierten NoC-Architektur zeigen.

von Strubi (Gast)


Lesenswert?

Auweia...
Mal abgesehen davon, dass der Microblaze schlecht skaliert und gleich 
mit einem Virtex aufgefahren werden muss, um eine 
Kanonen-auf-Spatz-Lösung zu schaffen, dürften sich die Probleme zunächt 
beim Datenfluss manifestieren. Und dabei dürfte auch die Erkenntnis 
gewonnen werden, dass das eine von-hinten-durch-die-Brust Idee ist (so 
vernichtend wie User dose wollma mal nicht sein...).
Ich gehe mal davon aus, dass der clevere Diplomand die Geschichte erst 
in einer Multithread-Umgebung im Trockentest durchspielt und sich dann 
Gedanken machen muss, wie die FIFOs/Pipes zwischen den Prozessen 
umgesetzt werden sollen. Eigentlich braucht ab dem Punkt man für diese 
"Idee" kein FPGA mehr.
Übrigens: Ein hart gepipelin'ter MJPEG-Accelerator passt gerade mal auf 
einen Spartan3e/250.

von A. F. (chefdesigner)


Lesenswert?

Strubi schrieb:

> Übrigens: Ein hart gepipelin'ter MJPEG-Accelerator passt gerade mal auf
> einen Spartan3e/250.

Schon mal gebaut, nehme ich an?

von Martin S. (strubi)


Lesenswert?

Jau. Der ENcoder ist hier etwas dokumentiert: 
http://tech.section5.ch/news/?p=219
Beim Decoder sieht die Sache ähnlich aus, das habe ich aber nicht mehr 
dokumentiert (die Anzeige macht schlussendlich eh der Browser). Sollte 
dazu allerdings sagen, dass nur ein JPEG-Kanal (Y/UV gemuxt) in den 
genannten Spartan passt (deswegen 'Accelerator', der ohne externe CPU 
nicht auskommt). Für vollen YUV422-Durchsatz brauchts entsprechend 
doppelt, und für MJPEG am besten noch eine integrierte CPU für das 
browser-kompatible Streaming. Vielleicht sollte man für diese Übung auch 
mal das "M" weglassen :-)

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.