Forum: FPGA, VHDL & Co. AXI4-Stream Video Framebuffer


von Achim (Gast)


Lesenswert?

Hallo Zusammen,

ich stehe gerade vor der Aufgabe, eine konfigurierbare Anzahl von 
Videoframes (2-10) mit 2 ppc und 8bit pro Farbe und konfigurierbarer 
Auflösung in externem RAM mit AXI4 Interface abzulegen und wieder 
auszulesen. Nun grüble ich darüber, wie ich das am Besten angehe - da 
ich hier gerade keinen Sparringspartner habe, wollte ich euch fragen ;)

Zuerst geht's darum, in den RAM zu schreiben. Da der RAM da ist und zzt 
für nichts anderes gebraucht wird, muss die Umsetzung nicht 100% 
Effizient sein, aber "sinnvoll" sollte es schon sein. Im Moment gehen 
meine Überlegungen dahin, einen double-buffer im BRAM zu bauen, der die 
48Bit+TLAST mit der Tiefe von einem AXI4 Burst (bspw. 128) speichert und 
dann mit einem Schwung in den externen RAM schreibt. Das würde so lange 
passieren, bis das nächste SOF mit TUSER kommt, um dann auf die nächste 
Startadresse zu wechseln. Wenn der Burst während eines Wechsels zum 
nächste Frame kommt, könnte Null-Bytes geschrieben werden.

Ich habe nicht viel Erfahrung mit AXI4, von daher: klingt das für euch 
sinnvoll? Würdet Ihr da ggf. anders herangehen? Ich wäre für jeden 
Hinweis dankbar!

Viele Grüße
Achim

von Meßprofi (Gast)


Lesenswert?

Solche Lösungen gibt es einige. Klingt nach UHD 4K?

von Tobias B. (Firma: www.elpra.de) (ttobsen) Benutzerseite


Lesenswert?

Welchen FPGA magst du verwenden? Falls du im Xilinx Oekosystem unterwegs 
bist, dann ist der Xilinx VDMA das was du suchst:

https://www.xilinx.com/products/intellectual-property/axi_video_dma.html

von Samuel C. (neoexacun)


Lesenswert?

Alternativ auch die Video Frame Buffer:
https://www.xilinx.com/products/intellectual-property/v-frmbuf.html

Oder wenn du nur einnen großen FIFO brauchst und die Bilder nur 
zwischenspeichern willst, vllt auch den Virtual FIFO:
https://www.xilinx.com/products/intellectual-property/axi_virtual_fifo_controller.html

von Achim (Gast)


Lesenswert?

Danke für euer Feedback!

Meßprofi schrieb:
> Solche Lösungen gibt es einige. Klingt nach UHD 4K?

Ich wäre erstmal mit Full-HD zufrieden.

Tobias B. schrieb:
> Xilinx VDMA

Samuel C. schrieb:
> Video Frame Buffer

Danke - ja, es wird eine Xilinx-Plattform. Die hauseigenen Lösungen mit 
FB-Write und VDMA kenne ich gut auch im praktischen Einsatz. Bei der 
neuen Aufgabe soll aber u.a. ein ROI "ausgeschnitten" werden und ggf. 
einzelne Pixel aus dem Bild gelesen und in der PL weiter verarbeitet 
werden. Das Auslesen wird in jedem Fall mit einer HDL-Lösung laufen, 
insofern macht es auch Sinn auf dem Weg die Daten wegzuschreiben.

Ich habe habe nochmal nachgedacht - das TLAST/EOL mit zu speichern ist 
Unsinn. Bis Full-HD komme ich mit 6 BRAMs aus, wenn jeweils eine 
komplette Zeile gepuffert und anschließend per State Machine in den 
externen RAM wandert. Klingt das für euch sinnvoll?

Viele Grüße

Achim

von Tobias B. (Firma: www.elpra.de) (ttobsen) Benutzerseite


Lesenswert?

Achim schrieb:
> Klingt das für euch sinnvoll?

Das kann man weder mit Ja noch mit Nein beantworten (zumindest ich 
nicht), da brauchts dann doch etwas mehr Infos was du genau machen 
moechtest, vll. mit einem kleinem Blockdiagramm deiner Processing Kette.

von J. S. (engineer) Benutzerseite


Lesenswert?

Achim schrieb:
> Bis Full-HD komme ich mit 6 BRAMs aus, wenn jeweils eine
> komplette Zeile gepuffert und anschließend per State Machine in den
> externen RAM wandert. Klingt das für euch sinnvoll?

Eigentlich macht man das bei Video möglichst on-the-fly, also alles in 
Echtzeit. Die Ausleitung in einen VDMA ist da allerdings problematisch, 
weil man nicht weiß, ob und wann der Ready ist, weil er auch von 
anderen, nicht näher bekannten Komponenten mitbenutzt werden kann ...

... was zur Folge hat, dass man buffer benötigt, um Totzeiten zu 
überwinden, die ausreichend tief sein müssen, um in beide Richtungen 
"pumpen" zu können...

.. was wiederum zur Folge hat, dass man sie deutlich schneller lesen 
(können) muss, als sie beschrieben werden, um sie nicht überbordend groß 
werden zu lassen, ...

... was seinerseits wiederum zur Folge hat, dass das AXI-Zwischensystem 
immer mit erheblich höherer Bandbreite arbeiten muss, als der Videotakt 
...

... was wiederum zur Folge hat, dass man auch auf der 
Video-Eingangsseite einen buffer braucht, sowie eine Taktrekonstruktion 
auf der Ausgangsseite, da der Eingangstakt verloren geht ...

... was wiederum zur Folge hat, dass die beiden buffer eine zusätzliche 
Latenz aufwerfen, alles zusammen mehr Platz und Kombinatorik zur 
Steuerung und Generation brauchen und insgesamt viel mehr Strom 
wegfressen ...

... was wiederum zur Folge hat, dass das System teuer, langsamer und 
größer wird.

Bei Video sollte man auf AXI möglichst verzichten, Dynamik aus dem 
System herausnehmen und den Systemtakt auf den Datentakt abgleichen. Die 
Datenspeicherung - insbesondere bei gemeinsam genutzten Resourcen - 
sollte mit massivem timing erfolgen und die Zuleitung zu verarbeitenden 
Komponenten ereignisgesteuert erfolgen, sodass die eingehenden Daten den 
Takt vorgeben und nicht das verarbeitende System. Damit dies möglich 
ist, muss ein Ablaufsystem mit Prozessoren mindestens die doppelte 
dynamische Bandbreite haben, wie das liefernde System. Damit ergibt sich 
ein natürliches Limit für die Verarbeitung in asynchron laufenden 
Prozessorsystemen und die Lösung, manche Aufgaben besser direkt im FPGA 
zu machen.

... was wiederum zur Folge hat, dass man Leute, die mit 
AXI-Baukastensystemen und Prozessorsystemen groß geworden sind, erst 
einmal überzeugen muss, dass ihr Lösungsansatz unnötig umständlich ist, 
obwohl sie der Ansicht sind, dass in C alles einfacher ist ...

... was wiederum zur Folge hat, dass man die Systempartitionierung immer 
Ingenieuren überlassen muss und nicht Softwareentwicklern :-)

von Duke Scarring (Gast)


Lesenswert?

Jürgen S. schrieb:
> Bei Video sollte man auf AXI möglichst verzichten
Prinzipiell schreibst Du ja richtige Sachen, ich wollte nur mal 
nachfragen, ob Du den Unterschied zwischen  AXI4, AXI4-Lite und 
AXI4-Stream kennst?

Duke

von J. S. (engineer) Benutzerseite


Lesenswert?

Ja sicher und beim beim Video bezog ich mich auch durchaus auf 
Streaming. Vom Prinzip nach ist das zunächst kein Problem, wenn man das 
Protokoll mit dem Videotakt fährt, insbesondere, wenn man Cores 
einsetzt, die ein entsprechendes Interface vorgeben.

Die Sache wird aber dann interessant, wenn Komponenten ins Spiel kommen, 
die nur deshalb als AXI ausgelegt wurden, weil sie für Multi-Access, 
z.B. CPUs vorgesehen sind, die nicht als streaming arbeiten sondern 
gepulst rechnen, also in strukturellen und zeitlichen Blöcken. Bei 
Video-Bearbeitung hat man das recht oft, um Kompatibilität zu 
Mehrkernsystemen im FPGA zu schaffen, oder weil die Art der Bearbeitung 
per Filter das nahelegt.

Das impliziert in jedem Fall, dass alle Interfaces so ausgeführt sind, 
daß sie ausreichend Universalität für unterschiedliche timing- und 
Betriebsfälle mitbringen, die sich nicht beliebig downstrippen lässt. 
Selbst ausdrücklich als Streaming ausgelegte IFs kommen mit mehr 
overhead. Da sind mindestens zusätzliche FIFOs implementiert, um 
asynchrones Einschreiben auf Datenebene (Pulsbetrieb auf gleichem Takt) 
oder gar Domainwechsel mit unterschiedlichen Takten zu erlauben und 
immer hat es ein handshaking, das die Anforderung aufwirft, zusätzliche 
Protokollstrukturen zu implementieren.

Damit bekommt man natürlich die Option, sich weniger um das Systemtiming 
kümmern zu müssen und man muss auch weniger Annahmen über das 
lowlevel-Protokoll machen. Praktisch poppen aber andere Probleme und 
Aufwände auf, die in den Systemen, die eben nicht mit Blockabfertigung 
arbeiten müss(t)en zu unnötigen Schwierigkeiten führen. Gerade das 
Involvieren von FIFOs und AXI-Umsetzern, stellt mitunter Timing-Limits 
in den Weg, über die man nicht mehr drüber kommt, es sei denn mit einem 
schnelleren Chip.

Man muss sich also entscheiden, ob man "schnell etwas bauen" oder "etwas 
Schnelles bauen" will.

Im günstigsten Fall bringt AXI kaum overhead, weil es ein reiner voll 
paralleler Streaming-Core ist, alles auf einem Systemtakt läuft und kein 
pulsierender Betrieb vorliegt, bzw. es keine unbekannte Zugriffsdynamik 
mehrerer Beteiligter gibt. Allerdings ließe sich ein solches System dann 
auch direkt hinschreiben.

Im häufigeren Fall hat es aber Zugriffsdynamik und / oder der Core kann 
alles Mögliche mit allen erdenklichen Betriebsarten. Dann muss man sich 
entscheiden, ob man den vorgefertigen AXI-Filter-Block reinhaut und 
Senken und Quellen universell anschließt, dass jeder zu jedem Zeitpunkt 
beliebig arbeiten kann und die AXI-Struktur das im Betrieb löst, oder ob 
man solche Themen zur Designzeit abfängt, indem man sich ein kluges 
Timing des Systems überlegt. Video hat da mit seinen Schwarzphasen ja 
einige Optionen, die vorgeben, wann man wie und mit welcher Bandbreite 
die BRAMs aktualisieren kann, um flackerfrei und resourcensparend 
Graphen darzustellen.

: Bearbeitet durch User
von Duke Scarring (Gast)


Lesenswert?

Jürgen S. schrieb:
> Ja sicher und beim beim Video bezog ich mich auch durchaus auf
> Streaming. Vom Prinzip nach ist das zunächst kein Problem, wenn man das
> Protokoll mit dem Videotakt fährt, insbesondere, wenn man Cores
> einsetzt, die ein entsprechendes Interface vorgeben.
Genau.

> Im günstigsten Fall bringt AXI kaum overhead, weil es ein reiner voll
> paralleler Streaming-Core ist, alles auf einem Systemtakt läuft und kein
> pulsierender Betrieb vorliegt, bzw. es keine unbekannte Zugriffsdynamik
> mehrerer Beteiligter gibt.
Darauf wollte ich hinaus.

> Man muss sich also entscheiden, ob man "schnell etwas bauen" oder "etwas
> Schnelles bauen" will.
Solange die Komplexität im Rahmen bleibt (Video in -> Filter 1 -> Filter 
2 -> Video out) würde ich AXI-Stream nicht verteufeln...

Warum Achim das Bild unbedingt in einem externen RAM zwischenspeichern 
will, hat er uns (noch) nicht verraten...

Duke

von Messtechniker (Gast)


Lesenswert?

Duke Scarring schrieb:
> Warum Achim das Bild unbedingt in einem externen RAM zwischenspeichern
> will, hat er uns (noch) nicht verraten...

In der Regel deshalb weil er mehrfach über das Bild drübergehen möchte, 
um es zu analysieren? Z.B. eine Helligkeitsanpassung, eine Farbkorrektur 
oder er sucht etwas im Bild. Da kommt man um eine Speicherung kaum 
herum.

Oder kennt jemand einen FPGA, in den vollständige Bilder passen?

von Tobias B. (Firma: www.elpra.de) (ttobsen) Benutzerseite


Lesenswert?

Messtechniker schrieb:
> Oder kennt jemand einen FPGA, in den vollständige Bilder passen?

Es gibt Xilinx FPGAs mit UltraRAM. Das sind "abgespeckte" BRAMs mit 
288Kb Groesse. Wenn man ein paar nimmt und die Bilder klein genug sind, 
passen sie rein. ;-)

https://www.xilinx.com/products/technology/memory.html#internalMemory

Und es gibt mittlerweile auch Xilinx FPGAs mit HBM. Das ist praktisch 
externer DDR SDRAM im Chip (wenn ichs richtig verstanden habe). Sind 
allerdings den Virtex Ultrascale+ FPGA vorenthalten, also eher nix fuer 
den kleinen Geldbeutel:

https://www.xilinx.com/products/silicon-devices/fpga/virtex-ultrascale-plus-hbm.html

von J. S. (engineer) Benutzerseite


Lesenswert?

Tobias B. schrieb:
> Und es gibt mittlerweile auch Xilinx FPGAs mit HBM. Das ist praktisch
> externer DDR SDRAM im Chip (wenn ichs richtig verstanden habe).

In der Tat, die gibt es minimal mit 4GB. Da sollte über 1sec 
unkomprimiertes HD-Video 1080p60 reinpassen, wenn ich es richtig 
überschlagen habe. Von der realen Speicherbandbreite her (alle 
DDR4-Effekte und Beschränkungen der AXI-Matrix berücksichtig) könnte man 
gleichzeitig alle aktuellen RGB-Bildpunkte in 25 parallele RAM-Bereiche 
wegschreiben und gleichzeitig parallel mit 25 Verarbeitern wiederholen 
können, die Einzelpixel suchen und korrigieren.

Alternativ könnte man sie zweimal gleichzeitig wegspeichern und parallel 
mit 2 Matchern jeweils 2 beliebige 5x5 Pixelgruppen aus irgendwelchen 
Bildern holen, um sie zu verarbeiten. Damit könnte man 4D-Matching 
betreiben.

Mit Bezug zu dem Beitrag oben: 
Beitrag "Re: AXI4-Stream Video Framebuffer" kann man das DDR 
komplett weglassen, wenn man es on the fly macht - dann auch in einem 
ARTIX7. Übrigens kann auch der genug Videobandbreite, hat eben nur kein 
ausreichendes RAM. Da passen nur einige hundert Zeilen rein.

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.