Hallo,
ich habe folgendes Problem. Ich habe mir in Xilinx EDK Tool ein
MicroBlaze erstellt, der über einen MPMC über Port0 auf einen DDR2
Speicher zugreift.
Ich würde nun gerne über Port1, von außen über das NPI Interface,
ebenfalls auf den DDR2 RAM zugreifen. Wenn ich mir allerdings einen
neuen Core erstelle bekomme ich nur die Möglichkeit den MicroBlaze
internen PLB Bus auszuwählen. Nun meine frage: Was muss ich machen, um
auf den Speicher über NPI zugreifen zu können. Mit zugreifen meine ich,
das ich die Pins sozusagen nach außen legen will, um im ISE einen VHDL
Block dran hängen zu können.
Danke.
MfG
matzunami
Und dann? Dann werden die Pins an die physikalischen Außenpins des FPGA
gelegt....mehr nicht.
Du musst einen IP-Core schreiben, der das NPI Bus Interface nachbildet,
dann die passenden mao und mpd und bbd Dateien erzeugen, damit der Core
vom EDK korrekt erkannt wird. Dann einbinden und die NPI Leitungen
werden automatisch im System View angezeigt.
hm...
ich habe mir jetzt mein MicroBlaze in ISE eingebunden. Da kann ich doch
jetzt direkt auf die Pins zugreifen (werden jedenfalls angezeigt). Warum
sollte das nicht gehen?
Wie/wo schreibe ich einen IP core (nicht über create new peripheral
oder?)
Naja. Ich weiß ja nicht, was du direkt vorhast. Im Normalfall erstellt
man so ein MicroBlaze Design mit dem EDK, dasd erstellt alle
Bus-Verbindungen usw. und dann bindet man eigene Cores über
Create/Import Peripheral ein. Das EDK erstellt ja auch das Grundgerüst
für die Software, was dann in das SDK exportiert wird. Der MicroBlaze
bei dir steuert ja über den PLB den MPMC, welcher sich um den RAM
kümmert. Wenn du jetzt von einem anderen wie auch immer gearteten Core
auf den gleichen RAM zugreifen willst, wird das zumindest aufwendig. Du
musst ja den MPMC dazu bringen, seine Befehle jetzt von deinem Dersign
entgegen zu nehmen, statt vom Prozessor. Ob das über das NPI geht, weiß
ich nicht.
So hatte ich es auch zuerst vor -> Microplaze erstellen -> über
Create/Import Peripheral eine IP core zu entwerfen, der meinen VHDL Code
enthält und bestimmte pins nach außen führt. Leide kann ich bei
Create/Import Peripheral nur den PLB Bus einstellen? was ich ja nicht
möchte.
Ich habe einfach nur vor, das nicht der Microblaze allein auf den DDR2
RAM zugreift, sondern das ich den Speicher auch in meinem ISE erzeugten
Project als externen Speicher nutzen kann. Darum meine Idee
-------------------
| MPMC Port0|<-----PLB----> MicroBlaze
| Port1|<-----NPI----> user VHDL Code
-------------------
Über meinen VHDL code sollen Vodeosignale in den DDR2 gespeichert
werden.
Momentan versuche ich es halt so, dass ich mir die NPI Bus Leitungen
nach außen gelegt habe... und wenn ich den MicroBlaze in ISE einbinde,
auf diese direkt zugreife.
Hab damit auch noch keine erfahrungen gemacht, aber wenn ich mir in EDK
einen IP Core erstelle, der über NPI auf den MPMC zugreift, würde ich
mir doch auch nur die NPI signale nch außen führen, um in ISE drauf zu
greifen zu können (oder?). Also hab ich mir gedacht das ich dies ja auch
gleich machen kann, ohne IP core (wenns geht und es scheint ja zu
gehen).
MfG
matzunami
Muss es denn NPI sein? Das ist das komplizierteste aller Interfaces des
MPMC. Anderer Vorschlag: LocalLink Interface benutzen. Das ist ein
bidirektionales FIFO Interface. Dann einen LL-IP-Core erstellen und den
mit an den MPMC anbinden. Vom MicroBlaze aus kannst du dann DMA
Transfers vom LocalLink zum RAM starten. Wir benutzen das auch hier, um
Daten zu einer externen Hardware auszutauschen. Über den Wizzard kannst
du nur PLB/FSL Grundgerüste erzeugen, für alles andere ist sowieso
Handarbeit angesagt. LLink ist aber wesentlich einfacher als NPI.
Ich dachte das NPI ist für sowas vorgesehen, aber wie gesagt, dass ist
alles noch ziehmlich neu für mich.
Aber wie genau du das jetzt machen würdest hab ich noch nicht
verstanden.
> "Vom MicroBlaze aus kannst du dann DMA Transfers vom LocalLink zum RAM> starten"
Wie schließe ich den IP core an den MPMC an? Über LocalLink, dass kann
ich da doch nicht auswählen, jedenfalls seh ich es nicht.
Hast du eventuell eine art Blockschaltbild für mich, dass ich mir das
vorstellen kann. Oder so was in der Art?
Genau. Der MPMC ist ja prinzipiell ein DMA Controller. Du erstellst dann
einen passenden Descriptor für den Scatter-Gather in deinem Programm und
startest den Transfer. Um die ganze FIFO-Geschichte kümmert der sich
dann selbst.
OK da ist ja auch ein kleines Blockschaltbild.
> Descriptor für den Scatter-Gather
???
SDMA geht an MPMC PLB an den Microblaze und wie bekomm ich meine
externen Daten dazu?
Microblaze
|
|
--- |--------| |-------|
|D| | |----Tx-->| usre |
|D|<---->| SDMA | | VHDL |
|R| | |<---Rx---| |
|2| |--------| |-------|
---
seh ich das richtig so?
Welche Rolle spielt der Microblaze genau. Ich dacht ich kann auf den
DDR2 zugreifen, ohne diesen zu benutzen, dies ist dann wohl nicht der
fall.
Nee, völlig am MicroBlaze vorbei geht nicht, du musst dem MPMC ja sagen,
wieviel Daten er von wo nach wo schaffen soll. Das geht nur über den
PLB, der ja am MicroBlaze hängt. Ich nehme mal an, du willst zunächst
Daten von deiner externen Hardware in den Speicher bringen und dann
irgendwas damit anstellen. Dann wäre das so zu machen. Der MPMC ist ein
Scatter-Gather DMA Controller, zumindest kann man ihn dafür
konfigurieren. Er will für jeden DMA TRansfer einen Descriptor, der zum
Beispiel Quell und Ziel-Adresse, zu übertragende Bytes, Header, Footer
usw. angibt. Den muss der MB über den PLB bereit stellen. Den Rest
erledigt der MPMC. Ist aber recht aufwenig, den MPMC benutzt man nicht
mal eben so. Der riesen Block will schon ordentlich begriffen worden
sein. Du kannst daran auch noch andere SDMA Cores anschließen, z.B. den
XPS_LL_TEMAC , da kannst du dann per DMA die Daten gleich vom/zum
Ethernet übertragen.
Eigenlich war es erst so gedacht, dass ich Bilddaten auf dem DDR2
speicher, und wider lese. Den speicher zugriff wollte ich über MIG
realisieren. Nun ist es aber so, das später der DDR2 speicher auch für
andere sachen genutzt werden soll (MB). Dazu ist der MIG ja ungünstig
und man müste dies dann über den MPMC realisieren. Also soll ich das
gleich so machen. Ich hab das halt nur noch nie gemacht.