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
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 VDMASamuel 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
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.
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 :-)
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
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.
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
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?
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.