Forum: FPGA, VHDL & Co. Video Framegrabber: Frage zu MPMC/DMA


von SteKu (Gast)


Lesenswert?

Hallo
ich schreibe gerade meine Diplomarbeit. Es geht darum einen Videostream 
per DMA in den Speicher zu schreiben und einzelne Bilder aus dem stream 
per Ethernet auf einem PC darzustellen.Ich will den Microblaze mit 
Xilkernel und LwIP lib für die Schnittstelle zum PC nutzen. Das ganze 
soll auf einem Spartan 3ANDSP1800 realisiert werden.
Ich habe mir schonmal die DMA Möglichkeiten angesehen die von Xilinx 
angeboten werden. Werde einen MPMC mit VFBC Port einsetzen. Als 
Schnittstelle zu meinen Videosignalen habe ich mir schonmal den Video 
DMA Controller angesehen, der bei dem VideostarterBoard als OpenSource 
beiliegt. Hier habe ich die Möglichkeit über ein Register die 
Startadresse des Videoframes im RAM anzugeben. Wie kann ich jetzt aber 
sicherstellen, das die Adressen nicht anderweitig (z.B. durch 
Code,Daten) belegt werden. Erste überlegung war mit malloc() 
Speicherplatz zu reservieren. Aber stellt malloc() sicher, das der 
allokierte Speicher direkt hintereinander liegt? habe da schonmal was 
anderes gehört (z.B. auf Windows oder Linux Systemen). Habe ich nur 
zuviel Angst? Wie macht ihr sowas? Für eure Antworten vielen Dank!

von SeriousSam (Gast)


Lesenswert?

Mit malloc reservieren, oder statisch ein array deklarieren, wobei ich 
letzteres bevorzuge im embedded Bereich. Malloc reserviert für den 
Anwender immer zusammenhängende Bereiche. Ein Betriebssystem mit 
virtuellem Speicher wirst du ja kaum haben. Von daher probier einfach 
mal aus.

von SteKu (Gast)


Lesenswert?

Danke werde es im neuen Jahr mal ausprobieren!

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

SeriousSam schrieb:
> Anwender immer zusammenhängende Bereiche. Ein Betriebssystem mit
> virtuellem Speicher wirst du ja kaum haben.
Der Microblaze hat eine MMU und unterstüzt somit theoretisch schon 
Betriebsysteme wie Linux mit Virtuellem Speicher.

von SteKu (Gast)


Lesenswert?

Hi
theoretisch schon - praktisch benutze ich aber nur den xilkernel.
Aber trotzdem danke für die Anmerkung.

@Sam: die statische Variante würde mir auch besser gefallen, der Frame 
Grabber soll aber universell sprich für unterschiedliche Auflösungen 
konfigurierbar sein, aus diesem Grund wird erst zur Laufzeit das Video 
Timing, und die Bildgröße bestimmt/übergeben. Also entweder aussreichend 
Platz statisch deklarieren oder dann doch malloc... hm mal sehen. ich 
kann ja auch beides mal probieren. Schöne Feiertage und nen guten Rutsch

von W. U. (wuselchen)


Lesenswert?

Hi Steku!

Ich habe meine Diplomarbeit auch mit MicroBlaze gemacht. Ich mußte zwar 
gefühlte 1000 mal den dämlichen Wizard konsultieren, weil die ISE 
Werkzeuge noch etwas instabil sind, aber letztendlich hat es gut 
funktioniert.
Ich habe das billige Spartan3A Devboard mit einem XC3S700A verwendet. 
Von MicroBlaze (Version 7) habe ich nur eine Minimalvariante verwendet 
(ohne MMU, platzoptimiert, keine Sonderfunktionen). Die Strukturierung 
hat mir dabei sehr gut gefallen. Man kann VHDL/Verilog Codeblöcke 
schreiben und gleich in das System einbinden und damit kommunizieren, 
Register auslesen und schreiben.

Dein Einwand mit dem Überschreiben des Speicherbereiches ist durchaus 
berechtigt. Wenn man das Problem ignoriert, können Code & Daten Deines 
Programmes überschrieben werden. Ein dynamische Allokierung mittels 
malloc ist zwar möglich, aber dann mußt Du Deinem VideoGrabber immer die 
zurückgelieferte Adresse mitteilen.
Allerdings ist sowieso das Ausführen von Code aus dem DDR2 Ram mit 
MicroBlaze extrem langsam, da der Zugriff sehr lange dauert. Ich meine 
sechs Takte oder so pro Instruktion. Und bei einem DMA Zugriff durch den 
VideoGrabber mußt Du noch länger warten. Es empfiehlt sich daher, 
statische RAM-Blöcke des FPGAs für Code & Daten zu reservieren. Falls 
nicht hinreichend Platz ist, dann würde ich (pro Funktion) unterscheiden 
zwischen häufig ausgeführtem (zeitkritischem) Code / genutzen Daten und 
seltener genutzten/zeitunkritischen Programmanteilen.
Du kannst dann (falls Du die gnu toolchain zur MicroBlaze-Codeerstellung 
verwendest) mittels Linker-Script einzelne sections anlegen und 
auswählen, wo sie liegen sollen. Xilinx hat dafür auch ein graphisches 
Frontend, das hatte bei mir (ISE 9.3) aber nicht richtig funktioniert. 
Ich habe das Linker-Script dann komplett selbst geschrieben. Ich würde 
Dir empfehlen, auch eine eigene section für die DMA Daten Deines 
VideoGrabbers anzulegen. Das entspräche dann einer statischen 
Allokierung (eine Ebene tiefer) mit garantierter Adresse im Speicher 
(die gibst Du ja im Linker-Script an).
In meinem Fall habe ich den DDR RAM für Fonts und als Framebuffer 
verwendet. Code & andere Daten habe ich in die BlockRAMs gequetscht.

Achso:
Bei mir war auch eine Peripheriekomponente, die direkt aus dem DDR RAM 
gelesen hat (Grafikkarte). Leider hat die Prioritätsvergabe des PLB 
(V4.6) nicht wirklich funktioniert. Eventuell solltest Du das genauer 
untersuchen, wenn Du allgemein unerklärliche Probleme bekommst.

Viele Grüße
   W. Usel

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.