mikrocontroller.net

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


Autor: SteKu (Gast)
Datum:

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

Autor: SeriousSam (Gast)
Datum:

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

Autor: SteKu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke werde es im neuen Jahr mal ausprobieren!

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

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

Autor: SteKu (Gast)
Datum:

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

Autor: W. Usel (wuselchen)
Datum:

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

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.