LabVIEWForum.de
Fragen zu DMA FIFO - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Module (/Forum-LabVIEW-Module)
+---- Forum: LabVIEW RealTime (/Forum-LabVIEW-RealTime)
+---- Thema: Fragen zu DMA FIFO (/Thread-Fragen-zu-DMA-FIFO)



Fragen zu DMA FIFO - gfzk - 18.10.2011 10:50

Hallo,

ich schlag mich seit einiger Zeit mit dem DMA FIFO Transfer von Daten von FPGA nach Realtime herum.

Mein Vorhaben ist folgendes:
Unter FPGA möchte ich 32 AI Kanäle (2x NI 9205, diff) alle 1 ms samplen und die Daten in einen FIFO schreiben.
Dieser soll auf RT alle 100 ms ausgelesen werden wo aus den 100 Werte pro Kanal der Mittelwert und die Standartab-
weichung gebildet werden sollen.

Gut, das ließe sich mit der Scan Engine auch machen, auf diese muss ich jedoch verzichten, da ich das Chasis im
FPGA Modus programmieren muss, da ein anderes Modul (CAN) dies verlangt. Zudem denke ich, dass sich für so
etwas ein FIFO geradezu anbietet und das Rechenleistung spart im Vergleich zu einer Scan Engine Variante.

Mein Problem ist nun, dass ich wie schon geschrieben mit dem FIFO nicht zurechtkomme. Fangen wir mal bei den Puffern
an, wie ich sehe gibts den FIFO Puffer auf dem FPGA und die "Tiefe" des Puffers in meiner RT Anwendung.
Wie hängen die beide zusammen und welche Werte trage ich hier sinnvollerweise ein?

Gruß,
Georg


RE: Fragen zu DMA FIFO - GerdW - 18.10.2011 12:07

Hallo Georg,

Zitat:Gut, das ließe sich mit der Scan Engine auch machen, auf diese muss ich jedoch verzichten, da ich das Chasis im
FPGA Modus programmieren muss, da ein anderes Modul (CAN) dies verlangt.
Nur, weil das CAN-Modul den FPGA voraussetzt, musst du trotzdem nicht auf die ScanEngine verzichten. Du kannst sie parallel nutzen... (1ms Abtastung bleibt aber mit der ScanEngine hakelig.)

Zitat:welche Werte trage ich hier sinnvollerweise ein?
Der Puffer sollte groß genug sein, um deine 32Kanäle über 100ms puffern zu können. Wenn dein RT beim Lesen des Puffers nicht hinterherkommt, hast du eh ein größeres Problem...


RE: Fragen zu DMA FIFO - gfzk - 18.10.2011 12:42

Hallo Gerd,

von diesem Hybridmodus hab ich schon gehört, gut zu wissen, dass ich damit auch arbeiten könnte.

In der LabView Hilfe "How DMA Transfer Work (FPGA Module)" steht, dass es einen FPGA Buffer und einen Host Buffer
gibt, die über einen DMA Channel verbunden sind. Ich geh mal davon aus, dass wenn keine Daten aus
dem Host Puffer ausgelesen werden, zuerst der Host Puffer volläuft und danach der FPGA Puffer, ist das richtig?
Das hieße zum Beispiel, dass ich mich entscheiden kann wie ich die Gesamtmenge an Elementen der beiden Puffer,
sagen wir 32 Kanäle * 100 Samples = 3200 Elemente, auf die jeweiligen Puffer aufteile? Z.b. den FPGA Puffer nur
32 Elemente groß machen, dafür den Host Puffer 3200-32=3168 Elemente groß, oder umgekehrt - ginge das?

Gruß, Georg


RE: Fragen zu DMA FIFO - GerdW - 18.10.2011 12:49

Hallo Georg,

der FIFO, den ich nutze, hat nur eine einzige Größeneinstellung... Da gibt es also keine explizite Aufteilung nach Host und Target...


RE: Fragen zu DMA FIFO - gfzk - 18.10.2011 13:12

Jetzt bin ich verwirrt,

den von mir angelegte FIFO im Projekt unter FPGA hab ich 32 Elemente groß gemacht,
das FPGA VI wird alle 10 ms ausgeführt.
Auf dem Host VI, das auf dem cRio läuft, hab ich mittels eines Methoden Knotens und
der Option Konfigurieren die "Tiefe" auf 3200 festgelegt.
Nun lese ich den FIFO periodisch aus mittels zweier While Schleifen. Die äußere Schleife
ist mit 1000 ms getaktet, die innere Schleife ließt je 32 Elemente solange, bis der FIFO leer ist.
Und die Schleife die den FIFO ausließt wird 100 mal ausgeführt, ließt also 3200 Elemente!


RE: Fragen zu DMA FIFO - gfzk - 24.10.2011 17:23

Hallo,
ich komm in der Sache mit dem FIFO leider nicht so richtig weiter :-(

Ich poste hier mal den Code, den ich für den FPGA geschrieben habe. Wie man erkennt erfasse ich unter anderem 32 Kanäle
jede Milisekunde und schreibe die Werte in einen FIFO. Hier fangen die Unklarheiten schon an, was trage ich am Timeoutanschluss
des FIFO hier sinnvollerweise ein? In der Hilfe steht folgendes:

Zitat:Timeout specifies the time, in number of clock ticks, that the method waits for available space in the FIFO if the FIFO is full. A value of –1 prevents the function from timing out. A value of 0 indicates no wait.
Mir ist nich klar, wie sich -1 von 0 unterscheidet. Und was passiert wenn der FIFO voll ist, wir der dann einfach überschrieben?

Bisher hatte ich Probleme in der Art, dass nach einem Pufferüberlauf die Reihenfolge der Kanäle im Array nicht mehr stimmt. Kanal 0, im Array auf Index 0 wanderte plötzlich ans Ende des Arrays und die anderen rückten dementsprechend einen Platz nach vorne. Dieses Phänomen trat auf als ich unter besagtem Timeout 5 (Ticks) angegeben hatte.
Diesen habe ich nunmal auf -1 gestellt, worauf die Kanäle auch bei einem Pufferüberlauf im Array an der gleichen Stelle blieben.
Allerdings sind die Werte dann fraglich, an Kanal 0 hab ich z.B. 8 Volt angeschlossen, dieser Wert sinkt kontinuierlich ganz langsam ab.

Irgendwie weiss ich grad garnicht was ich mache, deshalb frag ich Euch ;-)

Gruß,
Georg