Forum: FPGA, VHDL & Co. PIM oder xpsDMA ?


von olpo (Gast)


Lesenswert?

Hallo,

mir zerspringt wieder die Birne...
Also, ich möchte DDR2 auslesen und die Daten dann Byte-weise in eine FSL 
stecken.
Jetzt ist die Frage, lasse ich mir die Daten über PLB von xps-DMA 
übergeben, oder soll ich sie selber mittels PIM vom DDR2 holen?
Irgendwie scheint mir DMA die sauberere Methode zu sein. Nur wie ist 
das, wenn meine FSL nun voll ist, und ich somit keine DMA Daten mehr 
annehmen kann? DMA hat zwar eine kleine FIFO, aber wartet der auch 
wirklich bis ich fertig bin, oder fallen dann Daten unter den Tisch, 
wenn ich nicht schnell genug bin? Braucht mein Custom IP wirklich Burst 
unterstützung für DMA?
Ich bin für jeden Kommentar oder Gedanken dankbar.

von Duke Scarring (Gast)


Lesenswert?

Wenn ich das richtig verstanden habe, sind doch FSL und DMA over PLB 
zwei verschiedene Paar Schuhe.
Wenn die Daten nicht zwingend per FSL in den Prozessor kommen müssen, 
wäre ein DDR2-Memorycontroller (der am PLB hängt) das einfachste. Wenn 
der Daten-Cache im Prozessor aktiviert wird, dürfte auch die Datenrate 
akzeptabel sein.

Duke

von olpo (Gast)


Lesenswert?

Doch, in meinem Design ist es schöner, wenn die Daten per FSL in den 
Prozessor kommen.

Egal, ich habe noch ein paar Fragen zu DMA:
1.) Kann ich irgendwie den DMA-Aufruf puffern. Sprich, gibt es eine 
Daten-In-FIFO?
1
Dma_Transfer( pointer_1, length_1);
2
Dma_Transfer( pointer_2, length_2);
Geht das, ohne zu warten, ob Transfer_1 fertig ist?

2.) Die PLB_DWidth ist ja 32b, also 4 Byte = 1 word. Der Aufruf 
Dma_Transfer nimmt als Parameter den Pointer und die Länge des Objekt in 
Byte(!). Was passiert wenn die Länge kein volles Wort ergibt? Bsp. 
length = 5. Wird dann im PLB Byte-Enable eingesetzt?

von Duke Scarring (Gast)


Lesenswert?

olpo schrieb:
> 1.) Kann ich irgendwie den DMA-Aufruf puffern. Sprich, gibt es eine
> Daten-In-FIFO?
???
Mir scheint, Dir ist noch nicht ganz klar, wie das mit dem DMA überhaupt 
funktioniert. Der DMA-Controller ist ein Busmaster, der im Prinzip ein 
schnelles memcpy macht. Du kannst natrürlich auch mehrere Master 
einsetzen. Oder einen der mehrere Channel unterstüzt. Wenn die alle auf 
dem selben Bus hantieren, bremsen die sich aber gegenseitig aus.

> 2.) Die PLB_DWidth ist ja 32b, also 4 Byte = 1 word. Der Aufruf
> Dma_Transfer nimmt als Parameter den Pointer und die Länge des Objekt in
> Byte(!). Was passiert wenn die Länge kein volles Wort ergibt? Bsp.
> length = 5. Wird dann im PLB Byte-Enable eingesetzt?
Vermutlich. Über den Bus wandern aber so oder so 8 Byte. Im Zweifelsfall 
simuliert man das und guckt nach.

Duke

von olpo (Gast)


Lesenswert?

Nochmal zu 1.)

Es geht darum, daß ich eine Datenkette habe.
1
struct pbuf{
2
(void *) pointer;
3
(void *) length;
4
pbuf next;

Und hatte jetzt gehofft, die gesammte Kette auf einmal aufzurufen.
1
while (pbuf has_next()){
2
  Dma_Transfer( pointer, length);
3
  pbuf = pbuf->next;
4
}

Will ich nicht, daß Dma_Transfer(...) Aufrufe ständig die DMA-Register 
überschreiben, bräuchte ich so'ne Art Aufruf-FIFO.
Geht sowas?
Ansonsten müsste ich immer wieder nachfragen:
1
while (pbuf has_next()){
2
  Dma_Transfer( pointer, length);
3
  do {
4
    /*
5
     * Poll DMA status register.
6
     */
7
    RegValue = XDmaCentral_GetStatus(InstancePtr);
8
  }
9
  while ((RegValue & XDMC_DMASR_BUSY_MASK) == XDMC_DMASR_BUSY_MASK);
10
  pbuf = pbuf->next;
11
}

von Duke Scarring (Gast)


Lesenswert?

olpo schrieb:
> Und hatte jetzt gehofft, die gesammte Kette auf einmal aufzurufen.
Das nennt sich Scatter-Gather-DMA. Das muß der verwendete DMA Controller 
unterstützen.

Duke

von Christian R. (supachris)


Lesenswert?

Duke Scarring schrieb:
> olpo schrieb:
>> Und hatte jetzt gehofft, die gesammte Kette auf einmal aufzurufen.
> Das nennt sich Scatter-Gather-DMA. Das muß der verwendete DMA Controller
> unterstützen.
>
> Duke

Der MPMC kann das zumindest. Allerdings wird der FSL die ganze Sache 
ausbremsen. Soweit ich weiß, ist der nicht DMA fähig. Wir wollten damals 
auch eine eigene Peripherie an den MPMC anschließen, das geht nur über 
NPI oder LocalLink.

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.