Forum: FPGA, VHDL & Co. zugriff auf NPI Interface


von matzunami (Gast)


Lesenswert?

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

von matzunami (Gast)


Lesenswert?

Kann mir da niemand helfen? Der MPMC hat doch ein Native Peripheral 
Interface... wie kann man da drauf zugreifen?

von Christian R. (supachris)


Lesenswert?

Wie das NPI angesprochen wird, steht im Datenblatt des MPMC. Ich 
bezweifle allerdings, dass das so funktionieren wird, wie du vorhast....

von matzunami (Gast)


Lesenswert?

Ich glaube ich hab was gefunden... bei Port Filters default anzeigen und 
dann bei den gewünschten pins extern einstellen. naja mal sehn

von Christian R. (supachris)


Lesenswert?

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.

von matzunami (Gast)


Lesenswert?

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?)

von Christian R. (supachris)


Lesenswert?

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.

von matzunami (Gast)


Lesenswert?

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

von Christian R. (supachris)


Lesenswert?

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.

von matzunami (Gast)


Lesenswert?

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?

von Christian R. (supachris)


Lesenswert?

LocalLink nennt sich dort SDMA (Soft-DMA). Ist sehr schön gemacht, und 
nicht so aufwendig.

von matzunami (Gast)


Lesenswert?

Ich seh grad LocalLink -> SDMA richtig?

von matzunami (Gast)


Lesenswert?

das ging schnell :)

von Christian R. (supachris)


Lesenswert?

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.

von matzunami (Gast)


Lesenswert?

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?

von matzunami (Gast)


Lesenswert?

... muss mir wohl erstmal alles zu SDMA durchlesen.

von matzunami (Gast)


Lesenswert?

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.

von Christian R. (supachris)


Lesenswert?

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.

von matzunami (Gast)


Lesenswert?

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.

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.