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