Feldprogrammierbare Gate-Arrays (FPGAs) sind integrierte Schaltkreise, die rekonfiguriert werden können, um den Anforderungen der Entwickler zu entsprechen. FPGA-Chips enthalten ein Array aus programmierbaren Logikblöcken, und die allgemeine Chipakzeptanz wird durch ihre Flexibilität, hardwaregetaktete Geschwindigkeit und Zuverlässigkeit sowie Parallelität bestimmt.
Im Unterschied zu Prozessoren bieten FPGAs echte Parallelität, so dass verschiedene Verarbeitungsoperationen nicht auf die gleiche Ressource angewiesen sind. Jeder einzelne Verarbeitungs-Task wird einem dedizierten Bereich auf dem Chip zugewiesen und kann so autonom und ohne Beeinflussung anderer Logikblöcke ausgeführt werden. Daher wird die Leistungsfähigkeit der Anwendung nicht eingeschränkt, wenn weitere Verarbeitungs-Tasks hinzugefügt werden.
Abbildung 1: Einer der Vorteile von FPGAs gegenüber prozessorbasierten Systemen besteht darin, dass die Anwendungslogik in Hardware-Schaltkreisen implementiert wird und nicht auf einem Betriebssystem, Treibern und Anwendungssoftware ausgeführt wird.
Jeder FPGA-Chip besteht aus einer endlichen Anzahl von vordefinierten Ressourcen mit programmierbaren Leiterbahnen zur Implementierung einer rekonfigurierbaren Digitalschaltung und I/O-Blöcken, um der Schaltung den Zugang zur Außenwelt zu ermöglichen.
Abbildung 2: Die verschiedenen Bestandteile eines FPGAs
FPGA-Ressourcenspezifikationen umfassen oft die Anzahl konfigurierbarer Logikblöcke, die Anzahl fester Funktionslogikblöcke wie Multiplizierer und die Größe von Speicherressourcen wie Embedded-Block-RAM. Von den vielen FPGA-Spezifikationen sind diese in der Regel die wichtigsten bei der Auswahl und dem Vergleich von FPGAs für eine bestimmte Anwendung.
Die konfigurierbaren Logikblöcke (CLBs) sind die grundlegende Logikeinheit eines FPGAs. CLBs bestehen aus zwei Grundkomponenten: Flipflops und Zuordnungstabellen (LUTs). Verschiedene FPGA-Familien unterscheiden sich in der Art und Weise, wie Flipflops und LUTs zusammen verpackt sind. Daher ist es wichtig, Flipflops und LUTs zu verstehen.
Flipflops sind binäre Schieberegister zur Synchronisation von Logik und zum Speichern logischer Zustände zwischen Taktperioden innerhalb einer FPGA-Schaltung. Bei jeder Taktflanke speichert ein Flipflop den Wert 1 oder 0 (TRUE oder FALSE) an seinem Eingang und hält diesen Wert bis zur nächsten Taktflanke konstant.
Abbildung 3: Flipflop-Symbol
Flipflops sind binäre Schieberegister zur Synchronisation von Logik und zum Speichern logischer Zustände zwischen Taktperioden innerhalb einer FPGA-Schaltung. Bei jeder Taktflanke speichert ein Flipflop den Wert 1 oder 0 (TRUE oder FALSE) an seinem Eingang und hält diesen Wert bis zur nächsten Taktflanke konstant.
Abbildung 4: 4-Eingangs-LUT
Ein Großteil der Logik in einer CLB wird mit sehr wenig RAM in Form von LUTs implementiert. Es ist leicht anzunehmen, dass sich die Anzahl der Systemgatter in einem FPGA auf die Anzahl der NAND-Gatter und NOR-Gatter in einem bestimmten Chip bezieht. Aber in Wirklichkeit ist alle kombinatorische Logik (UNDs, ORs, NANDs, XORs usw.) als Wahrheitstabellen im LUT-Speicher implementiert. Eine Wahrheitstabelle ist eine vordefinierte Liste von Ausgaben für jede Kombination von Eingaben.
Hier ist die Schnellauffrischung von der digitalen Logikklasse.
Die boolesche UND-Verknüpfung ist beispielsweise in Abbildung 5 dargestellt:
Abbildung 5: Boolesche UND-Operation von NI LabVIEW
Die entsprechende Wahrheitstabelle für die beiden Eingänge einer UND-Verknüpfung ist in Tabelle 1 dargestellt.
Eingang 1 | Eingang 2 | Ausgang |
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
Tabelle 1: Wahrheitstabelle für boolesche UND-Operation
Abbildung 6: Multiplikationsfunktion von NI LabVIEW
Die scheinbar einfache Aufgabe, zwei Zahlen miteinander zu multiplizieren, kann extrem ressourcenintensiv und komplex in digitalen Schaltungen implementiert werden. Um einen Bezugsrahmen zu schaffen, zeigt Abbildung 6 die schematische Darstellung einer Möglichkeit zur Implementierung eines 4-Bit mal 4-Bit-Multiplizierers mit kombinatorischer Logik.
Abbildung 7: Schematische Darstellung eines 4-Bit-Multiplizierers
Stellen Sie sich nun vor, Sie multiplizieren zwei 32-Bit-Zahlen miteinander und erhalten mehr als 2000 Operationen für eine einzelne Multiplikation. Aus diesem Grund verfügen FPGAs über eine vorgefertigte Multiplizierschaltung, um den LUT- und Flipflop-Einsatz in Mathematik- und Signalverarbeitungsanwendungen einzusparen.
Viele Signalverarbeitungsalgorithmen erfordern, dass die laufende Gesamtzahl der Zahlen multipliziert wird. Daher verfügen leistungsfähigere FPGAs wie Xilinx Virtex-5-FPGAs über eine vorgefertigte Multiplizierer-Akkumulatorschaltung. Diese vorgefertigten Verarbeitungsblöcke, die auch als DSP48-Segmente bezeichnet werden, integrieren einen 25-Bit mal 18-Bit-Multiplizierer mit Addiererschaltung.
Eine weitere wichtige Spezifikation bei der Auswahl von FPGAs sind Speicherressourcen. Benutzerdefinierter RAM, der in den gesamten FPGA-Chip eingebettet ist, ist nützlich, um Datensätze zu speichern oder Werte zwischen parallelen Tasks auszutauschen. Je nach FPGA-Familie können Sie den geräteeigenen RAM in Blöcken von 16 oder 36 kb konfigurieren. Sie haben immer noch die Möglichkeit, Datensätze als Arrays mit Flipflops zu implementieren. Große Arrays werden jedoch schnell teuer für FPGA-Logikressourcen. Ein 100-Element-Array aus 32-Bit-Zahlen kann mehr als 30 Prozent der Flipflops in einem Virtex-II-1000-FPGA oder weniger als 1 Prozent des Embedded-Blockspeichers belegen. Digitale Signalverarbeitungsalgorithmen müssen oft einen ganzen Datenblock oder die Koeffizienten einer komplexen Gleichung verfolgen. Ohne karteneigenen Speicher passen viele Verarbeitungsfunktionen nicht in die konfigurierbare Logik eines FPGA-Chips.
Durch die inhärente parallele Ausführung von FPGAs können unabhängige Hardware-Logikkomponenten von unterschiedlichen Takten angesteuert werden. Das Austauschen von Daten zwischen Logik, die mit unterschiedlichen Raten ausgeführt wird, kann schwierig sein, und karteneigener Speicher wird oft verwendet, um die Übertragung mit Hilfe von FIFO-Puffern (First-in-First-out) zu glätten.
Obwohl FPGAs viele Vorteile bieten, wie Geschwindigkeit, Zuverlässigkeit und Flexibilität, gibt es auch Kompromisse, die mit FPGAs verbunden sind. FPGAs verfügen nicht über das Treiber-Ökosystem und die Code/IP-Basis wie Mikroprozessorarchitekturen und Betriebssysteme. Darüber hinaus bilden Mikroprozessoren, die mit Betriebssystemen gekoppelt sind, die Grundlage für Dateistrukturen und den Datenaustausch mit Peripheriegeräten, die für viele, oft unerlässliche Aufgaben wie die Protokollierung von Daten auf einem Datenträger verwendet werden.
Infolgedessen hat sich in den letzten zehn Jahren eine hybride Architektur entwickelt, die manchmal als heterogene Architektur bezeichnet wird, bei der ein Mikroprozessor mit einem FPGA gepaart wird, der dann mit I/O verbunden wird. Moderne FPGAs kombinieren oft Logik-Gatter mit Prozessoren in einem einzigen Chip, der als System on Chip (SoC) bezeichnet wird. Dieser Ansatz nutzt die Vorteile, die diese beiden Ziele bieten.
National Instruments hat diesen leistungsstarken Mikroprozessor plus FPGA-Architektur in seine FPGA-fähigen Geräte implementiert. Diese Geräte decken viele verschiedene Formfaktoren ab, von robusten bis zu leistungsstarken Systemen, die alle auf derselben Architektur basieren.
NI-FPGA-fähige Hardware umfasst folgende Technologien:
Jetzt, wo Sie die Bausteine eines FPGA-Chips kennen, können Sie fragen: "Wie konfigurieren Sie all diese Millionen von Komponenten, um die Logik aufzubauen, die Sie ausführen müssen?"
Die Antwort ist, dass Sie digitale Rechenaufgaben in Software mit Hilfe von Entwicklungswerkzeugen definieren und dann in eine Konfigurationsdatei oder einen Bitstream kompilieren, der Informationen darüber enthält, wie die Komponenten miteinander verbunden werden sollen. Die Herausforderung bei der FPGA-Technologie bestand in der Vergangenheit darin, dass die Low-Level-FPGA-Design-Tools nur von Ingenieuren mit einem tiefen Verständnis des digitalen Hardwaredesigns verwendet werden konnten. Der verstärkte Einsatz anspruchsvoller Systemdesignwerkzeuge wie LabVIEW vereinfacht auch die FPGA-Programmierung, da neue Technologien grafische Blockdiagramme und sogar C-Programmcode in digitale Hardwareschaltungen konvertieren können.
In den ersten 20 Jahren der FPGA-Entwicklung haben sich Hardwarebeschreibungssprachen (HDLs) wie VHDL und Verilog zu den Hauptsprachen für die Entwicklung der Algorithmen auf dem FPGA-Chip entwickelt. Diese Low-Level-Sprachen integrieren einige der Vorteile anderer Textsprachen mit der Erkenntnis, dass Sie auf einem FPGA eine Schaltung erstellen. Die resultierende hybride Syntax erfordert, dass Signale von externen I/O-Ports auf interne Signale abgebildet oder verbunden werden, die letztlich mit den Funktionen verbunden werden, die die Algorithmen enthalten. Diese Funktionen werden nacheinander ausgeführt und können auf andere Funktionen innerhalb des FPGA verweisen. Die wahre Parallelität der Task-Ausführung auf einem FPGA ist jedoch in einem sequenziellen zeilenweisen Ablauf schwer darstellbar. HDLs spiegeln einige Attribute anderer Textsprachen wider, unterscheiden sich jedoch erheblich, da sie auf einem Datenflussmodell basieren, bei dem die I/O über Signale mit einer Reihe von Funktionsblöcken verbunden ist.
Um dann die von einem FPGA-Programmierer erstellte Logik zu überprüfen, ist es üblich, Prüfstände in HDL zu schreiben, um den FPGA-Entwurf durch Bestätigen von Eingaben und Verifizieren von Ausgaben zu umschließen und zu trainieren. Der Teststand und der FPGA-Code werden in einer Simulationsumgebung ausgeführt, die das Hardware-Timing-Verhalten des FPGA-Chips modelliert und alle Ein- und Ausgangssignale dem Entwickler zur Testvalidierung anzeigt. Der Prozess des Erstellens des HDL-Teststands und der Simulation erfordert oft mehr Zeit als das Erstellen des ursprünglichen FPGA-HDL-Entwurfs selbst.
Nachdem Sie einen FPGA-Entwurf mit HDL erstellt und verifiziert haben, müssen Sie ihn in ein Kompilierungswerkzeug einfügen, das die textbasierte Logik verwendet und in mehreren komplexen Schritten Ihre HDL in eine Konfigurationsdatei oder einen Bitstream synthetisiert, der Informationen darüber enthält, wie die Komponenten miteinander verbunden werden sollen. Als Teil dieses mehrstufigen manuellen Prozesses müssen Sie oft eine Zuordnung von Signalnamen zu den Pins des verwendeten FPGA-Chips angeben.
Abbildung 8: Einfacher Counter-FPGA-Entwurf in VHDL
Letztendlich besteht die Herausforderung in diesem Entwurfsablauf darin, dass das für die Programmierung in traditionellen HDLs erforderliche Know-how nicht weit verbreitet ist und daher die FPGA-Technologie für die große Mehrheit der Ingenieure und Wissenschaftler nicht zugänglich ist.
Das Aufkommen von grafischen HLS-Design-Tools wie LabVIEW hat einige der größten Hindernisse des traditionellen HDL-Design-Prozesses beseitigt. Die LabVIEW Programmierumgebung eignet sich hervorragend für die FPGA-Programmierung, da sie eindeutig Parallelität und Datenfluss darstellt. Benutzer, die sowohl mit traditionellen FPGA-Entwicklungsprozessen vertraut als auch unerfahren sind, können daher die FPGA-Technologie nutzen. Damit bisheriges geistiges Eigentum (IP) nicht verloren geht, können Sie mit LabVIEW vorhandene VHDL in Ihre LabVIEW FPGA-Entwürfe integrieren. Da LabVIEW FPGA hochgradig mit Hardware integriert ist, ist es nicht notwendig, Programmcode in VHDL umzuschreiben, um Zeit- oder Ressourcenbeschränkungen zu erfüllen, wie dies bei vielen HLS-Codegeneratoren der Fall sein kann.
Abbildung 9: Links befindet sich LabVIEW, ein High-Level-Design-Tool für FPGAs. Es bietet Abstraktion für die geringe Komplexität, die beim Erstellen und Skalieren von VHDL-Designs häufig anzutreffen ist.
LabVIEW bietet Funktionen direkt in der Entwicklungsumgebung, um die Funktionsweise Ihrer FPGA-Logik zu simulieren und zu überprüfen. Ohne Kenntnisse der Low-Level-HDL-Sprache können Sie Prüfstände erstellen, um die Logik Ihres Entwurfs zu üben. Darüber hinaus hilft die Flexibilität der LabVIEW-Umgebung fortgeschrittenen Benutzern, das Timing und die Logik ihrer Entwürfe zu modellieren.
LabVIEW FPGA Compilation Tools automatisieren den Kompilierungsprozess, so dass Sie den Prozess mit einem Klick auf eine Schaltfläche starten und ggf. Protokolle und Fehler erhalten können. Wenn aufgrund Ihres FPGA-Entwurfs Timing-Fehler auftreten, werden diese kritischen Pfade grafisch hervorgehoben, um die Fehlersuche zu beschleunigen.
Die Einführung von FPGA-Technologie nimmt weiter zu, da übergeordnete Tools wie LabVIEW FPGAs leichter zugänglich machen. Dennoch ist es wichtig, in den FPGA zu schauen und zu schätzen, wie viel passiert, wenn Blockdiagramme zur Ausführung in Silizium kompiliert werden. Der Vergleich und die Auswahl von Hardware-Zielsystemen basierend auf Flipflops, LUTs, Multiplikatoren und Block-RAM ist die beste Möglichkeit, den richtigen FPGA-Chip für Ihre Anwendung auszuwählen. Das Verständnis des Ressourcenverbrauchs ist während der Entwicklung äußerst hilfreich, insbesondere bei der Optimierung von Größe und Geschwindigkeit. Dieses Papier soll keine umfassende Liste aller FPGA-Grundbausteine sein. Weitere Informationen zu FPGAs und zur Entwicklung digitaler Hardware finden Sie in den folgenden Ressourcen.