Multifunktions-rekonfigurierbare I/O-Geräte (RIO-Geräte), die früher als Geräte der R-Serie bezeichnet wurden, verfügen über eine benutzerdefinierte Onboard-Verarbeitung für vollständige Flexibilität bei System-Timing und -Triggerung. Anstelle eines festen ASIC zur Steuerung der Gerätefunktionen verwenden rekonfigurierbare Multifunktions-I/O-Geräte einen FPGA-basierten System-Timing-Controller, um alle analogen und digitalen I/O für den anwendungsspezifischen Betrieb konfigurierbar zu machen. Mit rekonfigurierbarer Multifunktions-I/O-Hardware und dem NI LabVIEW FPGA Module können vollständig flexible und benutzerdefinierte DAQ-Tasks implementiert werden.
Mit LabVIEW FPGA haben DAQ-Systementwickler volle Flexibilität bei der Programmierung einer Anwendung für jede Art von Ein- und Ausgabeoperation. Ohne Vorkenntnisse in Hardware-Design-Tools wie VHDL können Sie LabVIEW Code auf einen FPGA-Chip einbinden und echte hardwaregetaktete Geschwindigkeit und Zuverlässigkeit erzielen.
Beginnen wir mit den gängigen Komponenten der DAQ-Hardware. Wenn Sie Analog-Digital-Wandler (ADCs), Digital-Analog-Wandler (DACs) und digitale Ein-/Ausgabeleitungen haben, muss die gesamte I/O für den tatsächlichen Betrieb getaktet und gesteuert werden. Typische Multifunktions-DAQ-Geräte verwenden einen funktionsreichen ASIC, der die meisten Anforderungen an die Funktionalität erfüllt. Rekonfigurierbare Geräte unterscheiden sich von allen anderen DAQ-Geräten auf dem Markt, da sie anstelle eines festen ASIC zur Steuerung der Gerätefunktionen einen FPGA-basierten System-Timing-Controller verwenden, um alle analogen und digitalen I/O für den anwendungsspezifischen Betrieb konfigurierbar zu machen. Der rekonfigurierbare FPGA-Chip wird mit dem LabVIEW FPGA Module programmiert, wobei das LabVIEW-Datenflussprinzip weiterhin gilt, aber mit einem neuen Satz von Funktionen, die die Geräte-I/O auf der niedrigsten Ebene steuern. LabVIEW FPGA-I/O-Knoten arbeiten nicht mit den NI-DAQmx-Funktionen, sondern abstrahieren gängige Tasks und Funktionen. In den folgenden Abschnitten sehen Sie sich spezifische NI-DAQmx-Beispiele an und erfahren, wie verschiedene Tasks zur Datenerfassung mit rekonfigurierbarer Hardware angepasst werden.
Die häufigste Anwendung rekonfigurierbarer I/O für die erweiterte Datenerfassung ist das benutzerdefinierte Timing und Triggern. Nachfolgend sehen Sie ein Beispiel für einen Task zur getriggerten analogen Erfassung mit Hilfe von NI-DAQmx.
Abbildung 1: Triggerung von Analogsignalen mit NI-DAQmx
Anstatt verschiedene Funktionen für die Kanalkonfiguration zu verwenden (siehe Abbildung 1), verwendet diese Hardware Funktionen, die als FPGA-I/O-Knoten zum Lesen und Schreiben aller analogen und digitalen Kanäle bezeichnet werden. Sehen wir uns den genau gleichen Funktionsumfang mit Hilfe von I/O-Knoten in LabVIEW FPGA an.
Abbildung 2: Getriggerte analoge Erfassung mit Geräten der R-Serie und LabVIEW FPGA
Sie sehen, dass es keine Konfigurationsfunktionen für globale Kanäle, Sample-Takte, Trigger oder Start-, Stopp- und Lösch-Tasks gibt. Das gesamte Timing wird von LabVIEW-eigenen Strukturen wie While-Schleifen und Case-Strukturen gesteuert. Da das gesamte Blockdiagramm in FPGA-Hardware ausgeführt wird, wird der LabVIEW Code hardwaregetaktet und zuverlässig ausgeführt. Sehen wir uns die Funktionsweise dieses Blockdiagramms genauer an. Statt einer bestimmten Sample-Rate verwendet der analoge I/O-Knoten die For-Schleife, um jedes Sample zu erfassen. Der entsprechende A/D-Wandler digitalisiert das Eingangssignal beim Aufruf des FPGA-I/O-Knotens und wird daher von der For-Schleife getaktet. Wenn Sie ein Signal mit 100 kHz abtasten möchten, sollte die für diese Schleife angegebene Verzögerung 10 μs betragen. Die Schleifen-Timer-Funktion sorgt für eine bestimmte Verzögerung, beginnend mit der zweiten Schleifeniteration. Daher haben wir eine Sequenzstruktur verwendet, um den angegebenen Zeitraum zwischen den Samples sicherzustellen. Die Case-Struktur in LabVIEW FPGA ist leistungsstark, da sie im Wesentlichen einen Hardware-Trigger für den gesamten gekapselten Code darstellt. Da alle Funktionen und Strukturen in Hardware mit logischen Gattern ausgeführt werden, stellt die Case-Struktur sicher, dass die Abtastung zum richtigen Zeitpunkt innerhalb von 10 μs Genauigkeit beginnt. Schließlich ist es nicht notwendig, die Task-ID zu löschen oder Speicher freizugeben, da wir jetzt auf Hardwareebene mit wenigen Abstraktionsebenen arbeiten.
Der wahre Vorteil der Verwendung von FPGA-basierter Hardware ist die Fähigkeit, alle Timing- und Trigger-Funktionen anzupassen sowie die Signalverarbeitung und Entscheidungsfindung in Hardware zu implementieren. Lassen Sie uns nun sehen, was notwendig ist, um unseren analogen Eingangs-Trigger für eine benutzerdefinierte Anwendung zu bearbeiten. Was passiert, wenn die Erfassung ausgelöst werden soll, wenn einer der beiden analogen Eingangskanäle einen bestimmten Schwellwert überschreitet? Dies ist relativ einfach in LabVIEW FPGA zu implementieren.
Wenn wir einen zweiten analogen Eingangskanal mit dem NI-DAQmx-Treiber abtasten wollten, wäre das Blockdiagramm nicht viel anders als in Abbildung 1. Es gäbe jedoch immer noch Einschränkungen, da beide Kanäle gezwungen wären, denselben Trigger und denselben Sample mit derselben Taktrate zu referenzieren. Sehen wir uns die verschiedenen Optionen zur Abtastung mehrerer Kanäle mit rekonfigurierbarer I/O und LabVIEW FPGA an.
Abbildung 4: Getriggerte simultane analoge Erfassung mit Geräten der R-Serie
Abbildung 4 (oben) zeigt, wie zwei analoge Eingangskanäle gleichzeitig abgetastet werden, basierend auf einem analogen Trigger von Analogeingangskanal 0 (AIO). Da alle rekonfigurierbaren Multifunktions-I/O-Geräte unabhängige A/D-Wandler haben, werden zwei Kanäle innerhalb eines I/O-Knotens genau zum selben Zeitpunkt abgetastet. Typische Multifunktions-DAQ-Geräte multiplexen alle Kanäle über einen A/D-Wandler. Daher müssen alle Kanäle denselben Sample-Takt und dieselben Trigger-Leitungen haben. Abbildung 5 (unten) zeigt, dass rekonfigurierbare Multifunktions-I/O-Geräte verschiedene analoge Eingangskanäle mit voneinander unabhängigen Raten abtasten können. Durch das Einfügen der Analogeingangs-I/O-Knoten in unabhängige Schleifen kann jeder Kanal mit völlig unterschiedlichen Raten abtasten und dann Daten unabhängig durch zwei DMA-Kanäle streamen.
Abbildung 5: Getriggerte Multiraten-Analogerfassung mit rekonfigurierbarer Multifunktions-I/O-Hardware
Wenn wir möchten, dass beide Kanäle unabhängige Sample-Raten und unabhängige Start-Trigger haben, könnten wir jeden I/O-Knoten in parallele Schleifenstrukturen einfügen (siehe Abbildung 6). Dadurch wird die FPGA-Parallelität voll ausgenutzt, wobei jeder Task seine eigenen dedizierten Ressourcen beansprucht und völlig unabhängig von jedem anderen Erfassungs-Task ausgeführt wird.
Abbildung 6: Unabhängig getriggerte Multiraten-Analogerfassung mit rekonfigurierbarer Multifunktions-I/O-Hardware
Im NI-DAQmx-Treiber sind viele Synchronisationsoptionen integriert, um Ein- und Ausgänge zeitlich zu korrelieren. Unten sehen Sie das Blockdiagramm eines analogen Eingangskanals und eines analogen Ausgangskanals, die mit einem digitalen Start-Trigger synchronisiert sind. Dazu müssen Sie einen digitalen Trigger für die analoge Erfassung angeben und das analoge Eingangs-Start-Triggersignal verwenden, um die analoge Ausgabe zu triggern.
Abbildung 7: Synchronisierte analoge Erfassung und Ausgabe mit NI-DAQmx
Das gleiche Synchronisationsschema mit multifunktionaler rekonfigurierbarer I/O-Hardware zu implementieren ist ziemlich einfach, ohne Task-IDs und integrierte Signalführung zu benötigen. So würde dies im LabVIEW FPGA Blockdiagramm aussehen.
Abbildung 8: Synchronisierte analoge Erfassung und Ausgabe mit Geräten der R-Serie
Wieder verwenden wir die Case-Struktur, um einen Hardware-Trigger auf dem FPGA-Chip zu implementieren, und eine steigende Flanke an Digitalkanal 0 initiiert Programmcode im wahren Case. Die Analogeingangs- und -ausgangsknoten werden innerhalb der Sequenzstruktur nahezu ohne Jitter gleichzeitig aufgerufen. Wenn wir möchten, dass sie unabhängige Raten haben, könnten wir die analogen I/O-Knoten einfach in ihre eigenen While-Schleifen einfügen. Beachten Sie auch, dass die in diesem Blockdiagramm dargestellte Sinusgeneratorfunktion ein Express-VI ist, mit dem Sie die Sinuswerte in einer Zuordnungstabelle interaktiv konfigurieren können.
Das Blockdiagramm in Abbildung 8 hat den gleichen Funktionsumfang wie das NI-DAQmx-VI in Abbildung 7, aber wenn wir diesen Task anpassen möchten, würde nur ein rekonfigurierbares I/O-Gerät die Flexibilität dafür bieten. Wenn wir z. B. einen Pause-Trigger hinzufügen müssten, könnte dies einfach durch Hinzufügen einer Case-Struktur innerhalb der inneren While-Schleife und Verwendung eines anderen digitalen I/O-Knotens zur Auswahl eines TRUE- oder FALSE-Cases erreicht werden. Die Möglichkeit, Hardware zu programmieren, bietet endlose Möglichkeiten für I/O-Timing und Synchronisation.
Ein weiteres Beispiel für die Multifunktionssynchronisation ist die Erzeugung endlicher Impulse mit den geräteeigenen Zählern und die Verwendung des Zählerausgangs als analoger Eingangs-Sample-Takt. Dieser Prozess ist der gängige Ansatz zur Implementierung einer wiederholt triggerbaren endlichen Sample-Erfassung. Nachfolgend finden Sie den erforderlichen NI-DAQmx-Code für eine solche Erfassung.
Abbildung 9: Wiederholbare triggerbare endliche analoge Erfassung mit NI-DAQmx
Vergleichen wir dies nun mit einem LabVIEW FPGA Blockdiagramm mit der gleichen Funktionalität.
Abbildung 10: Wiederholbare endliche analoge Erfassung mit Geräten der R-Serie und LabVIEW FPGA
In Abbildung 10 wird deutlich, dass es aufgrund der Tatsache, dass der LabVIEW Code in Hardware ausgeführt wird, viel weniger Schritte zur Treiberkonfiguration gibt. Mit einer einfachen digitalen Eingangsleitung und einer For-Schleifenstruktur haben wir eine hardwareretriggerbare endliche Erfassung erstellt. Im vorherigen Blockdiagramm in Abbildung 9 werden zwei geräteeigene Zähler zur Erzeugung der wiedertriggerbaren endlichen Impulsfolge verwendet, und typische Multifunktions-DAQ-Geräte verfügen nur über vier Zähler. Multifunktionsrekonfigurierbare I/O-Geräte können jedoch mit LabVIEW FPGA jede Digitalleitung als Zähler konfigurieren. Weitere Informationen zu Zähler-/Timer-Implementierungen erhalten Sie in einem späteren Abschnitt.
Die hardwaregetaktete Flexibilität rekonfigurierbarer I/O-Geräte könnte mit einer frequenzgetriggerten Erfassung noch einen Schritt weiter gehen. Während dies bei einem typischen Multifunktions-DAQ-Gerät nicht möglich ist, kann die Hochgeschwindigkeitsentscheidung der Karte verwendet werden, um die Frequenz eines Eingangssignals zu berechnen und dann den gewünschten Code innerhalb einer Case-Struktur auszuwählen. Zur Synchronisation mehrerer Geräte können multifunktionale rekonfigurierbare I/O-Geräte auch den RTSI-Bus für PCI/PCI-Express-Karten oder den PXI-Trigger-Bus für PXI-Module verwenden. Auf diese externen Timing- und Synchronisationsleitungen kann auch über FPGA-I/O-Knoten im Blockdiagramm zugegriffen werden.
Viele Multifunktions-DAQ-Geräte verfügen über analoge Ausgangskanäle, die einen FIFO-Puffer zur kontinuierlichen analogen Signalerzeugung implementieren. Der erzeugte Signalverlauf kann den FIFO als Ringpuffer verwenden und kontinuierlich eine Reihe von Analogwerten ohne weitere Updates vom Host erzeugen. Dies hängt weniger von der Verfügbarkeit des Kommunikationsbusses ab, da Daten nicht ständig an das Gerät gestreamt werden. Wenn der Signalverlauf jedoch modifiziert werden muss, muss der Ausgabe-Task neu gestartet werden, um neue Daten in den FIFO zu schreiben. Die andere Möglichkeit besteht darin, kontinuierlich Daten an den Hardware-FIFO zu streamen, was zu Verzögerungen in Ihrem Ausgabe-Task führen kann. Multifunktionale rekonfigurierbare I/O-Geräte geben Ihnen die Möglichkeit, die Signalverlaufsergebnisse in der Hardware zu speichern und sogar Hardware-Trigger zu verwenden, um Signalverläufe zu ändern und so einen beliebigen Signalverlaufsgenerator zu erstellen.
Nachfolgend sehen Sie ein Beispiel für einen Funktionsgenerator, der digitale Eingangsleitungen verwendet, um Änderungen im Ausgangssignalverlauf auszulösen. Basierend auf der Kombination der digitalen I/O-Leitungen 0 und 1 erhalten wir vier verschiedene Zustände (Cases) für die analoge Ausgabe.
Abbildung 11a: Funktionsgenerator mit Case 0 der R-Serie – Nullausgabe
Abbildung 11b: Funktionsgenerator mit Case 1 der R-Serie – Sinusschwingung
Wenn beide Leitungen Low sind, wird Case 0 ausgeführt und wie in Abbildung 11a dargestellt, ist die Ausgabe ein konstanter Wert von 0 V. Wenn DIO-Leitung 0 High ist und DIO-Leitung 1 Low ist, wird Case 1 ausgeführt und erzeugt eine Sinusschwingung am Analogausgang 0. In diesem Case zur Sinuserzeugung (Abbildung 11b) wird das Express-VI Sinusgenerator verwendet, mit dem Sie in LabVIEW FPGA interaktiv einen Sinusverlauf mit den erforderlichen Integer-Werten konfigurieren können.
Abbildung 11c: Funktionsgenerator mit Gehäuse der R-Serie 2 – Rechteckschwingung
Case 2 (Abbildung 11c) schaltet bei jeder Iteration der While-Schleife einen booleschen Wert um. Wenn der Wert niedrig ist, wird der Integer 15000 in den Analogausgang 0 geschrieben, was dem Wert 15000 im Ausgangsregister eines 16-Bit-D/A-Wandlers entspricht. Ein vorzeichenbehafteter 16-Bit-Integer kann Werte zwischen -32768 und 32767 haben. Bei einem Ausgangsbereich von -10 bis 10 V erzeugt das Schreiben von -32768 an Analogausgang 0 -10 V und das Schreiben von 32767 10 V. In diesem Beispiel schreiben wir 15000, was knapp 5 V ausgibt. (Hier ist die Mathematik: 15000/32767 * 10 V = 4,5778 V) Grundsätzlich gibt Case 2 eine Rechteckschwingung aus, die zwischen 0 und 4,578 V umschaltet.
Abbildung 11d: Funktionsgenerator mit Case 3 der R-Serie – Sägezahnschwingung
Der letzte Case (Abbildung 11d) wird ausgeführt, wenn sowohl DIO 0 als auch DIO 1 High sind. Dabei wird eine Zuordnungstabelle verwendet, um kontinuierlich eine Sägezahnschwingung zu erzeugen. Das Zuordnungstabellen-VI ist ein weiteres Express-VI, mit dem beliebige Signalverlaufswerte gespeichert und programmatisch indiziert werden können. In diesem Beispiel haben wir eine Sägezahnschwingung für den analogen Ausgangskanal 0 konfiguriert.
Durch das Speichern aller Werte auf dem FPGA eliminieren Sie die Abhängigkeit von der Busverfügbarkeit und gewährleisten hardwaregetaktete Geschwindigkeit und Zuverlässigkeit bei Signalverlaufsaktualisierungen. Die Trigger- und Synchronisationsflexibilität, die bei der analogen Erfassung in früheren Abschnitten beschrieben wurde, gilt auch für die analoge Ausgabe. Mit multifunktionalen rekonfigurierbaren I/O-Geräten können Sie verschiedene analoge Ausgabekanäle mit unterschiedlichen Raten aktualisieren, unabhängig voneinander. Das bedeutet, dass Sie die Frequenz eines einzelnen periodischen Signalverlaufs ändern können, ohne die Ausgangswerte anderer Kanäle zu beeinflussen. Beachten Sie, dass dieser Funktionsumfang auf den meisten Datenerfassungsgeräten nicht möglich ist.
Wie bereits erwähnt, verfügen typische Multifunktions-DAQ-Geräte nur über vier integrierte Zähler, während rekonfigurierbare Multifunktions-I/O-Geräte Zählerfunktionen auf jeder verfügbaren Digitalleitung implementieren können. Digital-I/O-Knoten können die Vorteile der in LabVIEW FPGA als Single-Cycle Timed Loop bezeichneten speziellen Struktur nutzen, mit der Sie Programmcode mit bestimmten Raten von 2,5 bis 200 MHz ausführen können. Mit einem 40-MHz-Takt können Sie beispielsweise mit einer Single-Cycle Timed Loop einen 40-MHz-Zähler auf einer beliebigen Digitalleitung erstellen. Abbildung 12 (unten) ist ein Beispiel dafür, wie das Blockdiagramm aussehen kann.
Abbildung 12: Einfacher Ereigniszähler mit R-Serie
Da der Zählwert an ein Anzeigeelement mit dem Datentyp U32 (32-Bit-Integer) gesendet wird, würde dieser Code einen 40 MHz 32-Bit-Zähler auf dem FPGA-Chip erzeugen. Sie können dies mehrmals kopieren und einfügen, um mehrere Zähler zu erhalten, die alle auf verschiedenen digitalen Leitungen vollständig parallel zueinander arbeiten. Der eigentliche Wert bei der Verwendung von multifunktionalen rekonfigurierbaren I/O-Geräten liegt jedoch in der Anpassung von Zähleroperationen. Sie können wählen, ob der Zähler alle drei steigenden Flanken erhöht werden soll oder ob eine analoge Erfassung basierend auf dem Zählerwert ausgelöst werden soll. Viele komplexe Zähleroperationen, wie z. B. die Erzeugung endlicher Impulsfolgen oder die kaskadierte Ereigniszählung, erfordern die Verwendung von zwei Zählern, was bei typischen Multifunktionsgeräten in der Regel alle geräteeigenen Zähler bedeutet. Bei bis zu 160 digitalen Leitungen ist die maximale Anzahl der Zähler auf rekonfigurierbarer Hardware selten durch die I/O-Verfügbarkeit begrenzt und wird in der Regel durch die Größe des FPGA-Chips bestimmt. Da der LabVIEW Code in Silizium ausgeführt wird, müssen universelle Zähler nicht „aktiviert“ oder „wieder aktiviert“ werden und Sie erhalten die volle Kontrolle über den Zählerbetrieb.
Abbildung 13 (unten) ist ein Beispiel für die Verwendung von Zählern zur Erzeugung einer kontinuierlichen Impulsfolge mit Pause-Trigger in NI-DAQmx.
In LabVIEW FPGA muss der Pause-Trigger nicht konfiguriert werden, da eine einfache Case-Struktur den gleichen Funktionsumfang in Silizium implementieren kann. So sieht der gleiche Funktionsumfang aus, wenn er mit einem rekonfigurierbaren Multifunktions-I/O-Gerät implementiert wird (Abbildung 14).
Ein wesentlicher Unterschied zwischen dem traditionellen Multifunktions-DAQ mit dem NI-DAQmx-Treiber und rekonfigurierbarer Hardware ist die Art und Weise, wie die Datenübertragung implementiert wird. Der NI-DAQmx-Treiber abstrahiert alle Übertragungen vom Gerät zum Host-Computer. Dies muss in LabVIEW für alle FPGA-basierten Geräte vollständig programmiert werden. Es gibt verschiedene Möglichkeiten, Daten auf dem Gerät zu puffern und verschiedene Datenübertragungsmethoden wie DMA-Kanäle und Interrupt-Anfragen zu verwenden.
Ein FIFO-Puffer in LabVIEW FPGA wird im LabVIEW Project Explorer konfiguriert und kann entweder mit karteneigenem Speicher oder Hardwarelogik implementiert werden. Abbildung 18 zeigt, wie im LabVIEW Project Explorer ein FIFO-Puffer aus Integer-Werten im geräteeigenen Blockspeicher konfiguriert wird.
Abbildung 20: DMA-FIFO-Konfiguration in LabVIEW FPGA
Abbildung 21: LabVIEW FPGA Blockdiagramm mit DMA-FIFO und Bitpaketierung
Alle DMA-FIFO-Übertragungen sind 32 Bit. Wenn Sie also Daten von einem 16-Bit-Analogeingangskanal übertragen, ist es oft effizienter, Samples zu kombinieren und Daten zwei Kanäle (Samples) gleichzeitig weiterzuleiten. Dies wird als Bit-Packing bezeichnet (siehe Abbildung 21). Wenn Daten direkt an den Speicher des Host-PCs übergeben werden, können sie mit Hilfe der Host-Schnittstellenfunktionen in LabVIEW unter Windows gelesen werden (Abbildung 22).
Abbildung 22: Host-Schnittstellencode mit DMA-FIFO lesen und Bit entpacken
Wie in Abbildung 22 dargestellt, verweist das Blockdiagramm der Host-Schnittstelle auf das FPGA-Zielsystem-VI und liest den DMA-FIFO kontinuierlich in einer While-Schleife aus. Die 32-Bit-Daten werden in die zwei 16-Bit-Kanäle aufgeteilt, die abgetastet und in einem Signalverlaufsdiagramm dargestellt wurden. Das Host-Schnittstellen-VI kann auch mit jedem Frontpanel-Anzeigeelement oder Bedienelement des FPGA-VIs lesen und schreiben, und in diesem Fall wird auch das Stopp-Schaltflächenelement geschrieben.
Während feste ASICs wie der NI-STC3 die meisten Anforderungen an die Datenerfassung erfüllen, können vollständige Flexibilität und Anpassung nur mit dem rekonfigurierbaren, FPGA-basierten I/O-Timing und der Steuerung der R-Serie erreicht werden. Mit LabVIEW FPGA werden Trigger- und Synchronisationsaufgaben so einfach wie das grafische Zeichnen des Blockdiagramms, um genau das zu tun, was Sie benötigen. Mit unabhängigen analogen und digitalen I/O-Leitungen können Karten der R-Serie die Vorteile der echten Parallelität nutzen, die FPGAs bieten. Ob Multiratenabtastung, benutzerdefinierter Zählerbetrieb oder geräteeigene Entscheidungsfindung bei 40 MHz, Geräte der R-Serie haben die Möglichkeiten der Multifunktionsdatenerfassung revolutioniert.