Hardware-kompatible Messdatenkomprimierung in Echtzeit für LabVIEW FPGA

  Print

"LabVIEW-FPGA-Designmethoden werden verwendet, um die Algorithmen effizient in Hardware zu implementieren."

- Benjamin Steinwender, M. Sc., Kompetenzzentrum Automobil- und Industrie-Elektronik GmbH

The Challenge:
Echtzeit-Datenkompression auf FPGA-Karten, um den vorhandenen Speicherplatz optimal auszunutzen

The Solution:
Die angewandte Lösung besteht aus drei Stufen: (1) der Differenzbildung und dem Wandeln in positive Integers, (2) der Kodierung der Werte nach Fibonacci und (3) dem Packen der Daten in den 32-bit-weiten Datenspeicher.

Author(s):
Benjamin Steinwender, M. Sc. - Kompetenzzentrum Automobil- und Industrie-Elektronik GmbH

Eingesetzte Produkte: grafische Entwicklungsumgebung NI LabVIEW FPGA, RIO-FPGA-Karten von NI, PXI-Produkte von NI


Einleitung

Für ein proprietär entwickeltes Lebensdauertestsystem für die Kurzschlussfestigkeit intelligenter Halbleiterschalter werden zur Ansteuerung die RIO-FPGA-Karten von National Instruments verwendet. Insgesamt vier FPGA-Karten mit je 160 digitalen I/Os steuern bis zu 256 Bauteile parallel an und lesen Strom- und Spannungsverläufe zurück.

Mittels SPI Protokoll werden Strom- und Spannungswerte der Kurzschlusspulse von den 14-bit-ADCs ausgelesen und im FPGA Block RAM abgelegt. Wenn die im Testplan eingestellte Anzahl an Abtastwerten erreicht ist, wird der FPGA-Speicher vom Hostprogramm ausgelesen.


Problemstellung

Wenn solche 14-bit-Messdaten in einem 16 bit breiten Speicherplatz abgelegt werden, bleiben 2 bit beziehungsweise 12,5 % des Speicherplatzes unbenutzt. Datenkompressionstechniken sind notwendig, um den vorhandenen Platz optimal auszunutzen.
In einem kontinuierlichen Messdatenverlauf unterscheiden sich aufeinanderfolgende Abtastwerte oft nur geringfügig. Aus diesem Grund kann die Speicherung der Differenzen einen weiteren Vorteil in der Ausnutzung des Speicherplatzes mit sich bringen. Um kleinere Werte auch mit weniger Bits kodieren zu können, werden flexible Kodierungsverfahren benötigt.

Obwohl viele numerische Methoden zur verlustfreien Datenkompression bekannt sind, gibt es nur wenige Kandidaten, die sich ressourcenschonend in Hardware für eine echtzeitfähige Anwendung implementieren lassen. Grundsätzlich kann man verlustfreie Datenkompressionsverfahren in zwei Gruppen einteilen: Entropiekodierung und Wörterbuchkompression.

Wörterbuchkompressionsverfahren, auch Stringersatzverfahren genannt, suchen die Eingabedaten nach wiederkehrenden Mustern ab, um diese durch kürzere Symbole, wie zum Beispiel den Index im Wörterbuch, zu kodieren. Aus diesem Grund müsste auch das Wörterbuch am FPGA gespeichert werden, was zu erhöhtem Ressourcenverbrauch führt.

Entropiekodierung hingegen versucht, den Symbolen in der Eingabe unterschiedlich lange Bitfolgen zuzuweisen. Dadurch lässt sich die gesamte Anzahl an Bits reduzieren. Bekannte Vertreter dieser Methode sind die Huffman und die arithmetische Kodierung sowie universelle Kodierungsverfahren. Die zwei erstgenannten Methoden basieren darauf, dass die Wahrscheinlichkeitsverteilung aller Eingabedaten bekannt ist. 

Im Fall abgetasteter Messwerte ist es nicht leicht möglich, die Wahrscheinlichkeiten zukünftiger Daten zu ermitteln. Außerdem muss man die Wahrscheinlichkeitstabelle, wenn sie am FPGA erzeugt wird, auch dem Host mitteilen, um die empfangenen Daten dekodieren zu können.

Universelle Kodierungsverfahren nehmen a priori eine monotone Wahrscheinlichkeitsverteilung der Eingabewerte an, sodass kleinere positive Zahlen wahrscheinlicher sind und deshalb mit kürzeren Bitfolgen kodiert werden. Diese Methoden lassen sich somit auch für unbekannte Verteilungen einsetzen. Aus mehreren Möglichkeiten wurde die Fibonacci-Kodierung aufgrund der minimalen Anzahl an Ergebnisbits in Anbetracht der effizienten Hardwareimplementierung ausgewählt.

 

Lösungsmethode

Die angewandte Lösung besteht aus drei Stufen: (1) der Differenzbildung und dem Wandeln in positive Integers, (2) der Kodierung der Werte nach Fibonacci und (3) dem Packen der Daten in den 32 bit weiten Datenspeicher (vgl. Bild 1).

Zuerst ist es notwendig, aus vorzeichenbehafteten Messwerten kleine posi-tive Integerwerte zu erzeugen. Da die Messdaten sich oft nur geringfügig voneinander unterscheiden, ist eine Differenzbildung zum vorher aufgezeichneten Abtastwert sinnvoll.

Mit der Fibonacci-Methode lassen sich nur Werte größer als „0“ kodieren. Deshalb werden mittels bijektiver Abbildung die Eingabewerte von (0, 1, −1, 2, −2, …) in die Ausgabe von (1, 2, 3, 4, 5, …) transformiert. Mit der „Single-Cycle Timed Loop“ aus dem LabVIEW FPGA Module ist es zudem möglich, diese Funktion in nur einem einzigen Taktzyklus auszuführen. Zu beachten ist, dass der gültige Wertebereich der Eingabe zwischen −32767 und +32767 liegt (vgl. Bild 2).

Der zweite Schritt enthält die Kodierung der gewandelten Werte. Um eine Zahl zu kodieren, benötigt man alle Fibonacci-Zahlen, die kleiner/gleich der entsprechenden Zahl sind. Die Zahl wird darauf in eine Summe von Fibonacci-Zahlen zerlegt, wobei immer die größtmöglichen Zahlen verwendet werden. Schließlich setzt man je eine Stelle im Codewort auf „1“, wenn die entsprechende Fibonacci-Zahl zur Zerlegung beiträgt, beziehungsweise auf „0“, wenn die Fibonacci-Zahl nicht verwendet wird. Am Ende des Codewortes wird noch ein Stoppbit angefügt, um eine eindeutige Abgrenzung zu erreichen.

Für 14-bit-Eingabedaten werden demnach zwischen 1 und 22 Ergebnisbits und ein Stoppbit benötigt. In jeder Iteration wird der Wert im Schieberegister mit der nächsten Fibonacci-Zahl verglichen. Wenn die Fibonacci-Zahl in der Eingabe enthalten ist, wird das entsprechende Bit gesetzt und die Zahl subtrahiert. Zusätzlich muss für den darauffolgenden Schritt die Länge des erzeugten Codewortes ermittelt werden. Für diese Iterationen werden insgesamt 22 Taktzyklen sowie ein weiterer Zyklus zur Initialisierung der Schieberegister benötigt (vgl. Bild 3).

Zuletzt müssen zur weiteren Speicherung oder für den Datentransfer zum Host die kodierten Werte mit variabler Bitlänge in einem fixen 32-bit-Block untergebracht werden. Dazu wird beim Einfügen des Werts anhand der angegebenen Länge überprüft, ob noch Platz vorhanden ist, bevor der Wert angehängt wird. Reicht der Platz nicht mehr aus, dann wird der Datenspeicher mit dem ersten Teil fertig beschrieben ausgegeben. Die überbleibenden Eingabedaten werden als neuer Startwert im Datenspeicher abgelegt.

Auch hier wird eine Single Cycle Timed Loop verwendet, um den Code in einem Taktzyklus ausführen zu können. Insgesamt ergibt sich dadurch eine Zeitdauer von 25 Taktzyklen. Da das Einlesen der Abtastwerte über das SPI-Protokoll 160 Taktzyklen benötigt, kann der Codierer parallel in einer Pipeline-Architektur verwendet werden, um zusätzliche Verzögerungen zu minimieren(vgl. Bild 4)

Zum Dekodieren der Daten wird am Host nach den Stoppbits gesucht und der Bitstrom an diesen Stellen unterteilt. Die einzelnen Abtastwerte können dann durch Umkehrung des Kompressionsvorganges wieder zusammengesetzt werden.

Ergebnis

Ein Ausschnitt einer typischen Kurvenform wird in folgender Grafik gezeigt. Zu sehen sind die skalierten Strom- und Spannungsmessdaten sowie die gesamte erforderliche Wortlänge, um beide Abtastwerte zu kodieren. Wie oben erwähnt, werden zwischen 4 bit und 46 bit zur Kodierung benötigt. Man kann erkennen, dass im Mittel 4 bits bis 34 bits benötigt werden, wobei der Anteil der erzeugten Codewörter zwischen 4 bit und 12 bit überwiegt (vgl. Bild 5).

In unseren Anwendungen werden zirka 3000 32-bit-Wörter für eine komplette Kurvenform mit 12.288 Abtastwerten benötigt. Damit wird ein durchschnittlicher Komprimierungsgrad von 24,5 % der ursprünglichen Größe erreicht. Man kann also bis zu vier Mal so viele Daten in einem Durchlauf aufzeichnen. Herkömmliche Komprimierungsverfahren (z. B. zip) auf einem Desktop-PC weisen bei denselben Daten einen Komprimierungsgrad von 23 % auf.


Zusammenfassung

Dieser Beitrag beschreibt eine Methode zur Echtzeit-Datenkompression kontinuierlicher Messdaten auf dem LabVIEW FPGA Module. Ein universelles Datenkompressionsverfahren wird angewendet; um die Anzahl der speicherbaren Datenpunkte zu erhöhen. LabVIEW-FPGA-Designmethoden werden verwendet, um die Algorithmen effizient in Hardware zu implementieren.

Bookmark and Share


Explore the NI Developer Community

Discover and collaborate on the latest example code and tutorials with a worldwide community of engineers and scientists.

‌Check‌ out‌ the‌ NI‌ Community


Who is National Instruments?

National Instruments provides a graphical system design platform for test, control, and embedded design applications that is transforming the way engineers and scientists design, prototype, and deploy systems.

‌Learn‌ more‌ about‌ NI