Übersicht
High-Level-Designwerkzeuge bieten FPGA-Technologie (Field-Programmable Gate Array) für Ingenieure und Wissenschaftler, die wenig bis gar keine Hardwaredesignkenntnisse besitzen. Unabhängig davon, ob grafische Programmierung, C oder VHDL eingesetzt wird – der Syntheseprozess ist sehr komplex und wirft die Frage auf, wie FPGAs eigentlich funktionieren. Was passiert im Chip, so dass Programme innerhalb konfigurierbarer Silikonblöcke ausgeführt werden? Dieses Whitepaper wurde für Entwickler erstellt, die über wenig Erfahrung im Bereich der digitalen Signalverarbeitung verfügen, sich aber dennoch über grundlegende Aspekte von FPGAs informieren möchten. Die nachfolgenden Informationen sollen dazu dienen, etwas Licht ins Dunkel dieser außergewöhnlichen Technologie zu bringen.
Inhaltsverzeichnis
Field Programmable Gate Arrays (FPGAs)
Jeder FPGA-Chip besteht aus einer bestimmten Anzahl vordefinierter Komponenten mit programmierbaren Verbindungsleitungen und dient zur Entwicklung rekonfigurierbarer digitaler Schaltungen.
Abb. 1: Die verschiedenen Bestandteile eines FPGAs
Spezifikationen für FPGA-Chips bezeichnen in der Regel die Anzahl konfigurierbarer Logikblöcke und festgelegter Funktionslogikblöcke, wie z. B. Multiplizierer, sowie die Größe der Speicherelemente wie z. B. Embedded-Block-RAMs. Ein FPGA-Chip umfasst zahlreiche weitere Komponenten, jedoch gehören die genannten zu den wichtigsten Aspekten in Bezug auf Auswahl und Vergleich von FPGAs für eine bestimmte Anwendung.
Konfigurierbare Logikblöcke, wie z. B. Slices (größere Einheiten aus LUTs mit Multiplizierern und Flipflops) oder Logikzellen, bestehen aus mindestens zwei Komponenten: Flipflops und LUTs (Look-Up-Tables). Dies ist wichtig, da die verschiedenen FPGA-Familien über unterschiedliche Architekturen verfügen, je nachdem, wie Flipflops und LUTs zusammengefasst sind. Virtex-II-FPGAs z. B. bestehen aus Slices mit zwei LUTs und zwei Flipflops, wohingegen Virtex-5-FPGAs Slices mit vier LUTs und vier Flipflops umfassen. Des Weiteren können sich auch LUT-Architekturen untereinander unterscheiden (vier Eingänge vs. sechs Eingänge). Weitere Informationen zu LUTs werden in einem späteren Abschnitt besprochen.
Tab. 1 umfasst Spezifikationen von FPGAs, die in LabVIEW-FPGA-Hardware verwendet werden. Die Anzahl der Gatter war bisher die Grundlage für den Vergleich von FPGA-Chips mit der ASIC-Technologie, allerdings gibt dies keinen wirklichen Aufschluss über die Bestandteile eines FPGAs. Dies ist einer der Gründe, warum Xilinx bei der neuen Virtex-5-Familie auf die Angabe der Gatteranzahl verzichtet hat.
|
|
Virtex-II 1000 |
Virtex-II 3000 |
Spartan-3 1000 |
Spartan-3 2000 |
Virtex-5 LX30 |
Virtex-5 LX50 |
Virtex-5 LX85 |
|
Gatter |
1 Mio. |
3 Mio. |
1 Mio. |
2 Mio. |
----- |
----- |
----- |
|
Flipflops |
10240 |
28672 |
15360 |
40960 |
19200 |
28800 |
51840 |
|
LUTs |
10240 |
28672 |
15360 |
40960 |
19200 |
28800 |
51840 |
|
Multiplizierer |
40 |
96 |
24 |
40 |
32 |
48 |
48 |
|
Block-RAM (kbit) |
720 |
1728 |
432 |
720 |
1152 |
1728 |
3456 |
Tab. 1: FPGA-Spezifikationen der verschiedenen Produktfamilien
Um diese Spezifikationen besser zu verstehen, ist es wichtig zu wissen, wie Programmcode in einen digitalen Schaltkreis synthetisiert wird. Synthese bedeutet die Ausführung anspruchsvoller Programmiersprachen in echter Hardware. Für jeden Teil eines synthetisierbaren Codes, grafisch oder textbasiert, existiert ein dazugehöriger Schaltplan, der festlegt, wie Logikblöcke miteinander verbunden werden sollen. Das LabVIEW FPGA Module fügt jeder Blockdiagrammfunktion zusätzliche Logikfunktionen hinzu, bevor der endgültige Schaltungsentwurf an den Compiler gesendet wird. Nachfolgend wird einer kleiner Bereich eines Blockdiagrammcodes samt zugehörigem Schaltplan analysiert. Abb. 2 zeigt ein Beispiel mit fünf Booleschen Signalen in einer Gruppe mit Booleschen Funktionen zur grafischen Berechnung eines Binärwerts.

Abb. 2: Ausschnitt aus einem LabVIEW-Blockdiagramm mit einfachen Booleschen Logikfunktionen
Unter normalen Bedingungen (außerhalb der zeitgesteuerte Schleife in LabVIEW) sieht der zum Blockdiagrammausschnitt aus Abb. 2 zugehörige Schaltungsentwurf aus wie in Abb. 3.

Abb. 3: Schaltungsentwurf für Boolesche Logikfunktion in Abb. 2
Es mag etwas schwierig zu erkennen sein, aber es werden tatsächlich zwei parallele Schaltungszweige erstellt. Die fünf obersten schwarzen Leitungen führen in den ersten Zweig, wodurch ein Flipflop zwischen jede Boolesche Operation gesetzt wird. Die fünf untersten schwarzen Leitungen führen zu einer zweiten Logikkette mit der selben Anzahl an Flipflops. Die Logikkette wird erstellt, um nachzuverfolgen, wieviele Taktraten für den Datenfluss durch den digitalen Schaltkreis notwendig sind. Insgesamt werden jeweils zwölf Flipflops und LUTs für diesen Schaltplan verwendet. In den nachfolgenden Abschnitten werden die Komponenten des oberen Zweigs näher erläutert.
Flipflops

Abb. 4: Flipflop-Symbol
Flipflops sind binäre Kippstufen, die zur Synchronisierung von Logikzuständen sowie zu deren Speicherung zwischen zwei Taktraten eingesetzt werden. Ein Flipflop setzt am Eingang jeder Taktflanke den Wert 1 oder 0 (TRUE oder FALSE) und hält diesen Wert konstant bis zur nächsten Taktflanke. Unter normalen Umständen setzt LabVIEW FPGA einen Flipflop zwischen jede einzelne Operation, um die Ausführzeit für jede Operation zu verlängern. In manchen Fällen wird der Code in einer zeitgesteuerten Schleife abgelegt. Bei dieser speziellen Schleifenstruktur werden Flipflops nur am Anfang und Ende des Schleifendurchlaufs gesetzt, so dass der Programmierer das Timing selbst festlegen muss. Die Synthetisierung von Code in zeigesteuerten Schleifen wird in einem späteren Abschnitt näher beschrieben. Abb. 5 zeigt den oberen Zweig aus Abb. 3 mit rot hervorgehobenen Flipflops.
Abb. 5: Schematische Darstellung mit rot hervorgehobenen Flipflops

Abb. 6: 4-Eingangs-LUT
Die logische Funktion in Abb. 6 wird mithilfe einer sehr geringen Anzahl an RAM-Feldern in Form von LUTs implementiert. Man könnte annehmen, dass die Anzahl der Systemgatter in einem FPGA der Anzahl der NAND- und NOR-Gatter in einem bestimmten Chip entspricht. Allerdings handelt es sich bei jeglichen kombinatorischen Logikfunktionen (AND, OR, NAND, XOR etc.) um Wahrheitstabellen im LUT-Speicher. Eine Wahrheitstabelle ist eine vordefinierte Liste an Ausgängen für jede Kombination an Eingängen (wahrscheinlich ruft dies das lang vergessene Karnaugh-Veitch-Diagramm in Erinnerung).
Eine kurze Auffrischung zu digitalen Logikfunktionen:
Die Boolesche AND-Operation ist in Abb. 7 dargestellt:

Abb. 7: Boolesche AND-Operation
Die zugehörige Wahrheitstabelle für die zwei Eingänge einer AND-Operation ist in Tab. 2 dargestellt.
![]()
|
Eingang 1 |
Eingang 2 |
Ausgang |
|
0 |
0 |
0 |
|
0 |
1 |
0 |
|
1 |
0 |
0 |
|
1 |
1 |
1 |
Tab. 2: Wahrheitstabelle für Boolesche AND-Operation
Die Eingänge können auch als numerischer Index für alle möglichen Ausgänge (siehe Tab. 3) betrachtet werden.
|
LUT-Index |
Ausgang |
|
0 (00) |
0 |
|
1 (01) |
0 |
|
2 (10) |
0 |
|
3 (11) |
1 |
Tab. 3: LUT-Implementierung der Wahrheitstabelle für Boolesche AND-Operation
Virtex-II- und Spartan-3-FPGAs verfügen über 4-Eingangs-LUTs, zu denen Wahrheitstabellen mit bis zu 16 Kombinationen aus vier Eingangssignalen gehören. Abb. 8 zeigt ein Beispiel einer 4-Eingangs-Schaltung.

Abb. 8: Schaltung mit 4 Eingangssignalen für Boolesche Logikfunktion
Tab. 4 zeigt die zugehörige Wahrheitstabelle, die einer 4-Eingangs-LUT zugrunde liegt.
|
LUT-Index |
Ausgang |
|
0 (0000) |
1 |
|
1 (0001) |
1 |
|
2 (0010) |
1 |
|
3 (0011) |
0 |
|
4 (0100) |
0 |
|
5 (0101) |
0 |
|
6 (0110) |
0 |
|
7 (0111) |
1 |
|
8 (1000) |
0 |
|
9 (1001) |
0 |
|
10 (1010) |
0 |
|
11 (1011) |
1 |
|
12 (1100) |
0 |
|
13 (1101) |
0 |
|
14 (1110) |
0 |
|
15 (1111) |
1 |
Tab. 4: Zu Abb. 8 gehörige Wahrheitstabelle
FPGAs der Virtex-5-Familie nutzen 6-Eingangs-LUTs, die Wahrheitstabellen mit bis zu 64 Kombinationen aus sechs verschiedenen Eingangssignalen umfassen. Dies ist besonders wichtig für den Einsatz zeitgesteuerter Schleifen in LabVIEW FPGA, da die kombinatorischen Logikfunktionen zwischen Flipflops sehr komplex sein können. Der folgende Abschnitt beschäftigt sich mit zeitgesteuerten Schleifen und wie diese für eine optimale Nutzung des LabVIEW-FPGAs sorgen.
Zeitgesteuerte Schleifen
Bei dem bisher verwendeten Beispielcode handelt es sich um Code, der außerhalb einer zeitgesteuerten Schleife platziert war, so dass zusätzliche Schaltungen synthetisiert werden mussten, um einen synchronen Datenfluss zu gewährleisten. Die zeitgesteuerte Schleife ist eine spezielle Struktur in LabVIEW FPGA, die einen stark verbesserten Schaltplan erzeugt, da alle Zweige des Logikblocks innerhalb einer einzigen Taktrate ausgeführt werden können. Wird eine zeitgesteuerte Schleife beipielsweise zur Ausführung mit 40 MHz konfiguriert, dann müssen alle Zweige des Logikblocks innerhalb einer Iteration von 25 ns ausgeführt werden.
Wird die selbe Boolesche Logikfunktion des vorhergehenden Beispiels innerhalb einer zeitgesteuerten Schleife platziert (siehe Abb. 9) dann wird der in Abb. 10 gezeigte Schaltplan erzeugt.
Abb. 9: Einfache Boolesche Logikfunktion innerhalb einer zeitgesteuerten Schleife

Abb. 10: Schaltungsentwurf für Boolesche Logikfunktion in Abb. 9
Vergleicht man diesen Schaltplan mit dem Schaltplan aus Abb. 3 ist deutlich erkennbar, dass es sich um einen wesentlich einfacheren Aufbau handelt. Die Logikfunktionen zwischen den Flipflops erfordern mindestens zwei 4-Eingangs-LUTs in einem Virtex-II- bzw. Spartan-3-FPGA (siehe Abb. 11).

Abb. 11: 4-Eingangs-LUT des Schaltplans aus Abb. 10
Da Virtex-5-FPGAs über 6-Eingangs-LUTs verfügen, kann die gleiche Logikfunktion in einer einzigen LUT implementiert werden (siehe Abb.12).

Abb. 12: 6-Eingangs-LUT des Schaltplans aus Abb. 10
Die zeitgesteuerte Schleife aus Abb. 9 wurde für eine Ausführung bei 40 MHz konfiguriert. Das bedeutet, dass die Logikfunktionen zwischen den Flipflops innerhalb einer Iteration von 25 ns ausgeführt werden müssen. Die maximale Geschwindigkeit, mit der Code ausgeführt werden kann, ist abhängig vom Fluss der Elektronen in der Schaltung. Der Zweig des Logikblocks mit der größten Durchflussverzögerung wird als kritischer Pfad bezeichnet. Dieser legt die theoretische Taktgeschwindigkeit für den jeweiligen Teil der Schaltung fest. Die 6-Eingangs-LUTs der Virtex-5-FPGAs sorgen nicht nur dafür, dass weniger LUTs für die Implementierung einer Logikfunktion nötig sind, sie reduzieren zudem die Durchflussverzögerung der Elektronen in diesem Teil des Logikblocks. Das heißt, dass durch den Einsatz Virtex-5-basierter Hardware dieselbe zeitgesteuerte Schleife für schnellere Taktraten konfiguriert werden kann.
Weitere Informationen zu den Vorteilen von Virtex-5-FPGAs entnehmen Sie bitte dem entsprechenden Whitepaper im Bereich "Weitere Ressourcen".
Multiplizierer und DSP-Slices

Abb. 13: Multiplizierfunktion
Der im Prinzip einfache Vorgang, zwei Zahlen miteinander zu multiplizieren, kann im Falle digitaler Schaltungen zu einer ressourcenintensiven und komplexen Angelegenheit werden. Um dies etwas zu verdeutlichen, zeigt Abb. 14 in einer schematischen Darstellung eine Möglichkeit, einen Multiplizierer (4 bit x 4 bit) mithilfe kombinatorischer Logik zu implementieren.

Abb. 14: Schematische Darstellung eines Multiplizierers (4 bit x 4 bit)
Wenn nun zwei 32-bit-Zahlen miteinander multipliziert werden sollen, müssen mehr als 2000 Operationen für eine einzige Multiplikation durchgeführt werden. Aus diesem Grund verfügen FPGAs über vorgefertigte Multiplikationsschaltungen, um weniger LUTs und Flipflops in Signalverarbeitungsanwendungen einsetzen zu müssen. Virtex-2- und Spartan-3-FPGAs umfassen Multiplizierer mit 18 bit x 18 bit, so dass die Multiplikation von zwei 32-bit-Zahlen nur drei Multiplizierer für eine einzelne Operation erfordert. Viele Signalverarbeitungsalgorithmen behalten die laufende Gesamtanzahl der multiplizierten Zahlen bei. Aus diesem Grund verfügen leistungsstärkere FPGAs wie die der Virtex-5-Familie über vorgefertigte Multiplikationsakkumulator-Schaltungen. Diese vorgefertigten Verarbeitungsblöcke, auch DSP48-Slices genannt, beinhalten einen Multiplizierer mit 25 bit x 18 bit und Addier-Schaltung. LabVIEW FPGA hingegen setzt die Multiplikationsfunktion unabhängig ein. Tab. 5 zeigt die Multiplikationsressourcen der verschiedenen FPGA-Familien.
|
|
Virtex-II 1000 |
Virtex-II 3000 |
Spartan-3 1000 |
Spartan-3 2000 |
Virtex-5 LX30 |
Virtex-5 LX50 |
Virtex-5 LX85 |
|
Anzahl der Multiplizierer |
40 |
96 |
24 |
40 |
32 |
48 |
48 |
|
Typ |
18x18 |
18x18 |
18x18 |
18x18 |
DSP48-Slices |
DSP48-Slices |
DSP48-Slices |
Tab. 5: Multiplikationsressourcen der verschiedenen FPGAs
Block-RAM
Speicherressourcen sind ein weiterer wichtiger Aspekt bei der Auswahl des passenden FPGAs für eine Anwendung. Ein benutzerdefinierbarer RAM, der in den FPGA-Chip integriert ist, eignet sich zur Speicherung von Datensätzen oder Übertragung von Werten zwischen parallelen Schleifen. Abhängig von der FPGA-Familie lässt sich der Onboard-RAM in Blöcken zu 16 bzw. 36 kbit konfigurieren. Es können auch weiterhin Datensätze in Form von Arrays, unter Einsatz von Flipflops, implementiert werden, jedoch verbrauchen umfangreiche Arrays schnell einen großen Teil der FPGA-Logikressourcen. Ein 100-Elemente-Array mit 32-bit-Zahlen kann mehr als 30 % der Flipflops in einem Virtex-II-1000-FPGA in Anspruch nehmen oder aber weniger als 1 % des Embedded-Block-RAMs. Oft müssen Digitalsignal-Verarbeitungsalgorithmen ganze Datenblöcke oder Koeffizienten einer komplexen Gleichung nachverfolgen. Ohne Onboard-Speicher würden viele Verarbeitungsfunktionen nicht in den konfigurierbaren Logikblock auf dem FPGA-Chip passen. Abb. 15 zeigt die grafischen Funktionen für das Lesen/Schreiben auf den Speicher mithilfe von Block-RAM.
Abb. 15: Block-RAM-Funktionen für das Lesen/Schreiben auf den Speicher
Speicherblöcke lassen sich zudem zur Verwaltung periodischer Signalverläufe für die Onboard-Signalerzeugung verwenden, indem die Verläufe als Wertetabelle gespeichert werden, welche dann sequenziell durchsucht wird. Die endgültige Frequenz des Ausgangssignals wird durch die Geschwindigkeit festgelegt, mit der Werte indiziert werden. Diese Methode kann genutzt werden, um die Ausgangsfrequenz dynamisch zu ändern, ohne scharfe Übergänge im Signalverlauf zu schaffen.
Abb. 16: Block-RAM-Funktionen für FIFO-Puffer
Die in FPGAs inhärente parallele Ausführung ermöglicht die Steuerung unabhängiger Hardwarelogikfunktionen mit unterschiedlichen Takten. Der Datenfluss zwischen Logikfunktionen, die mit unterschiedlichen Taktraten ausgeführt werden, kann sich schwierig gestalten, so dass der Onboard-Speicher unter Verwendung von FIFO-Puffern (First In, First Out) oft zum Ausgleichen dieser Unterschiede genutzt wird. FIFO-Puffer, siehe Abb. 16, können für verschiedene Größen konfiguriert werden, um sicherzustellen, dass keine Daten zwischen asynchronen Teilen des FPGA-Chips verlorengehen. Tab. 6 zeigt einen benutzerdefinierbaren Block-RAM, der in vielen FPGA-Familien integriert ist.
|
|
Virtex-II 3000 |
Virtex-II 1000 |
Spartan-3 1000 |
Spartan-3 2000 |
Virtex-5 LX30 |
Virtex-5 LX50 |
Virtex-5 LX85 |
|
Gesamt-RAM (kbit) |
1728 |
720 |
432 |
720 |
1152 |
1728 |
3456 |
|
Blockgröße (kbit) |
16 |
16 |
16 |
16 |
36 |
36 |
36 |
Tab. 6: Speicherressourcen der verschiedenen FPGAs
Fazit
Die FPGA-Technologie erfreut sich zunehmender Beliebtheit, da digitale Werkzeuge und Konzepte immer komplexer und abstrakter werden. Dabei ist es jedoch wichtig, sich mit dem Innenleben von FPGAs vertraut zu machen, um zu verstehen, was eigentlich passiert, wenn ein Blockdiagramm zur Ausführung in Hardware kompiliert wird. Der beste Weg, den passenden FPGA-Chip für eine Anwendung auszuwählen, ist der Vergleich in Bezug auf Flipflops, LUTs, Multiplizierer und Block-RAMs. Für die Entwicklung ist es enorm hilfreich zu verstehen, wie Ressourcen genutzt werden, insbesondere wenn es um die Optimierung bezüglich Größe und Geschwindigkeit geht. Die beschriebenen Bestandteile sind die grundlegenden Komponenten eines FPGAs, welches zahlreiche weitere Teile umfasst, die an dieser Stelle jedoch nicht weiter besprochen werden sollen. Weitere Informationen zu FPGAs und dem Design von digitaler Hardware finden Sie in den folgenden Ressourcen:
Weitere Ressourcen
The Design Warrior's Guide to FPGAs - von Clive "Max" Maxfield
Kundenlösungen mit FPGA-Technologie
Video: Einführung in LabVIEW FPGA
Einführung in die FPGA-Technologie: Die 5 größten Vorteile
Intelligente Datenerfassungsgeräte der R-Serie
LabVIEW FPGA Module von National Instruments
AGB
Dieses Tutorium ("Tutorium") wurde von National Instruments ("NI") entwickelt. Auch wenn National Instruments dieses Tutorium technisch unterstützt, ist es jedoch möglich, dass dieses Tutorium nicht umfassend getestet und überprüft wurde. NI übernimmt weder Garantien bezüglich der Qualität des Tutoriums noch bezüglich der weiteren technischen Unterstützung neuer Versionen ähnlicher Produkte und Treiber. DIESES TUTORIUM WIRD IM "IST-ZUSTAND" ZUR VERFÜGUNG GESTELLT UND NI ÜBERNIMMT KEINERLEI GARANTIEN. AUSFÜHRLICHERE ERLÄUTERUNGEN ZU ANDEREN EINSCHRÄNKUNGEN ENTNEHMEN SIE BITTE DEN NUTZUNGSBEDINGUNGEN AUF NI.COM (http://ni.com/legal/termsofuse/unitedstates/us/).





