3 FPGA-Grundlagen
3.1 Was ist ein FPGA?
Ein FPGA kann als Ansammlung von Grundelementen wie Gatter, Flip-Flop, Speicherzelle etc. angesehen werden, die in einem gemeinsamen Gehäuse vorhanden sind, aber noch miteinander verdrahtet werden müssen, um eine bestimmte Funktion zu realisieren. Sehr vereinfacht kann ein FPGA auch als vorbestücktes Steckbrett im Mikroformat betrachtet werden. Elemente wie Gatter und Flip-Flops sind schon fertig aufgesteckt, nur die Verdrahtung muss noch vom Anwender vorgenommen werden. Anstatt wie auf dem Steckbrett Drähte einzustecken, werden beim FPGA die elektrischen Verbindungen durch das Schließen von auch schon vorhandenen »Schaltern« vorgenommen. Abbildung 3-1 zeigt den sehr stark vereinfachten prinzipiellen Aufbau eines FPGA. Man erkennt in Abbildung 3-1 Folgendes:
Es gibt Grundelemente, die intern flexibel miteinander verbunden werden können (hier: UND-Gatter, Inverter, D-Flip-Flop).
Die meisten Pins des Chips können flexibel den Ein- bzw. Ausgängen der internen Elemente zugeordnet werden (die hier dargestellte Aufteilung in Eingangs- und Ausgangspins existiert in der Praxis so nicht, vielmehr sind die meisten Pins sowohl als Eingang als auch als Ausgang konfigurierbar).
Es gibt auch spezielle Pins (hier ein Clock-Eingangs-Pin).
Weitere spezielle Pins, zum Beispiel zur Spannungsversorgung, sind vorhanden, auch wenn sie hier nicht explizit gezeigt werden.
Die hier als Schalter dargestellten Verbindungspunkte sind bei einem FPGA im Auslieferzustand alle offen. Mit Hilfe der entsprechenden Designsoftware wird festgelegt, welche »Schalter« für die gewünschte Anwendung geschlossen werden. Man kann sofort erkennen, dass beim Definieren der Verbindungspunkte sorgfältig vorgegangen werden muss, weil sonst schnell Fehler passieren können (z.B. das Kurzschließen zweier Eingänge), die unter Umständen zur Zerstörung des Chips führen. Allein aus diesem Grund werden die »Schalterstellungen« nicht manuell definiert, sondern durch eine spezielle Entwicklungssoftware; einmal ganz davon abgesehen, dass selbst einfachste FPGA so komplex sind, dass ein manuelles Definieren der Konfiguration auf Low-Level-Ebene vollkommen unpraktikabel ist.
Abbildung 3-1: FPGA – prinzipieller Aufbau
Weiterhin erwähnenswert ist, dass die Pins in der Regel auch in Hinsicht auf physikalische Details wie I/O-Pegel (z.B. 3.3V, 2.5V, 1.8V; ein FPGA kann auch sehr elegant als Pegel-Konverter eingesetzt werden), max. Ausgangsstrom usw. konfiguriert werden können bzw. müssen. Die spezifischen Details hängen immer vom verwendeten Chip ab und müssen in der Entwicklungspraxis neben vielen anderen Dingen bei der Auswahl eines FPGA für einen bestimmten Anwendungsfall berücksichtigt werden.
Zu den I/O-Pegeln sei an dieser Stelle schon angemerkt, dass heute verfügbare FPGAs in aller Regel nicht 5V-kompatibel sind. Wer z.B. ein FPGA mit einem Arduino Uno »verheiraten« möchte, sollte die Verbindungsleitungen zwischen Arduino und FPGA über für diesen Zweck geeignete Pegelkonverter leiten.
Selbst mit dem in Abbildung 3-1 dargestellten idealisierten Mini-FPGA lassen sich bereits diverse Schaltungen realisieren, von denen in Abbildung 3-2 einige dargestellt sind. Jede Schaltung kann durch einfache Umkonfiguration des FPGA schnell erzeugt werden, ohne dass an der Hardware irgendetwas geändert werden muss. Dieses Merkmal ist besonders für das Rapid Prototyping interessant. FPGAs sind aber auch im Serieneinsatz und haben dort in einigen Bereichen ASICs1 abgelöst (natürlich auch in Abhängigkeit von Faktoren wie Stückzahlen). Beim Serieneinsatz von FPGAs ist ein interessanter Aspekt, dass auch nach der Auslieferung noch vergleichsweise einfach Änderungen am Hardwaredesign vorgenommen werden können, vergleichbar mit einem Software- bzw. Firmwareupdate.
Abbildung 3-2: Beispielschaltungen
Zum Speichern der Konfigurationsinformationen in dem FPGA existieren im Wesentlichen zwei Ansätze:
Statisches RAM (SRAM): Hier gehen die Konfigurationsinformationen komplett verloren, sobald das FPGA von der Spannungsversorgung getrennt wird. Das bedeutet, dass beim Hochfahren der Hardware (= Anlegen der Versorgungsspannung) die Konfiguration jedes Mal wieder neu »eingespielt« werden muss. Dazu gibt es verschiedene Verfahren, verbreitet ist die Verwendung spezieller EEPROMS mit SPI-Schnittstelle.
Flash-Speicher: Hier bleibt die Konfiguration beim Abschalten erhalten. Auf der anderen Seite benötigt Flash-Speicher mehr Platz auf dem Chip und ist relativ teuer.
In Wirklichkeit ist das Ganze noch wesentlich komplexer als bisher dargestellt. Beispielsweise finden sich in einem typischen FPGA keine einzelnen UND-Gatter etc. Die Basisbausteine bilden vielmehr Elemente, die je nach Hersteller z.B. »Logic elements« oder »Logic Cells« genannt werden. Sie beinhalten als wesentliche Bestandteile ein bis zwei Lookup-Tables und ein oder zwei Flip-Flops sowie Infrastruktur zum Routen der Signale wie Multiplexer (alles abhängig vom Hersteller und vom genauen FPGA-Typ). Mit Hilfe eines Lookup-Table können sämtliche logischen Kombinationen zwischen den Eingangssignalen (für die hier betrachteten FPGAs typisch 3 ... 6) dieses Basisbausteins gebildet werden.
Anhand eines kleinen Beispiels soll ein Lookup-Table erklärt werden. Es soll die Funktion o = (i1|i2)&i3 implementiert werden. Abbildung 3-3 enthält die entsprechende Schaltung.
Abbildung 3-3: LUT-Beispielschaltung
Die (booleschen) Eingangssignale ›il‹, ›i2‹ und ›i3‹ können als Indices für den Lookup-Table angesehen werden, für jede Kombination dieser Eingangswerte ergibt sich ein eindeutiger Ausgangswert ›o‹.
Dieses einfache Beispiel sollte man mit Papier und Bleistift nachvollziehen, wenn es beim ersten Lesen nicht klar ist. Es wäre dann sinnvoll, zunächst den Ausgang des ODER-Gatters als Zwischenwert zu bestimmen und im zweiten Schritt die UND-Verknüpfung dieses Zwischenergebnisses mit dem dritten Eingang zu ermitteln, was dann auch schon das gesuchte Ausgangssignal ›o‹ liefert. Genauso kann man sich auch andere einfache oder auch komplexere Schaltungen überlegen und dazu den entsprechenden Lookup-Table aufstellen. Letztendlich wird man zu dem Schluss kommen, dass jede beliebige kombinatorische Schaltung mit Hilfe eines Lookup-Table realisiert werden kann. Im Web findet man auch Generatoren für Lookup-Tables, z.B. unter http://programming.dojo.net.nz/study/truth-table-generator/.
Tabelle 3-1: Wahrheitstabelle zu Abbildung 3-3
Eine wiederum stark vereinfachte und idealisierte Version einer »Logic Cell« (oder wie auch immer dieses Basiselement vom jeweiligen Hersteller bezeichnet wird) ist in Abbildung 3-4 dargestellt.
Neben dem Lookup-Table (LUT) sind noch ein Multiplexer (MUX) und ein Flip-Flop (FF) dargestellt. Als Flip-Flop-Typ (D, J/K etc.) wird in der Regel das D-Flip-Flop verwendet. Außerdem sind für das Flip-Flop neben Daten- und Clock-Eingang noch Eingänge für Clock-Enable (CE) und Set/Reset (S/R) dargestellt.
Diese Logikzellen werden häufig paarweise zusammengefasst, dieses Konstrukt nennt sich dann zum Beispiel »Slice«. Selbst einfache FPGA, wie sie für Maker interessant sind, enthalten in der Regel wenigstens 1000 Logikzellen.
Neben den Logikzellen befinden sich auf einem FPGA noch weitere Basisbausteine, die hier jetzt nur kurz erwähnt werden (Ausprägung und Menge hängen wieder stark vom FPGA-Typ ab):
I/O-Zellen: Spezielle Elemente, welche die Verbindung zwischen den Pins und den weiteren Resourcen des FPGAs herstellen. Zum Teil befinden sich dort auch Flip-Flops, welche z.B. zum Abtasten eines Eingangssignals mit der Basisfrequenz des FPGAs verwendet werden können. Auch spezielle Schaltungen z.B. zum Interfacing mit Schnittstellen wie dem PCI-Bus sind dort untergebracht.
Abbildung 3-4: Idealisierte Logikzelle
PLLs2 und Clock-Manager: FPGA-Boards enthalten häufig einen Quarzgenerator mit einer festen Frequenz, z.B. 100 MHz, der das FPGA mit einem zentralen Clock-Signal versorgt. Für verschiedenste Anwendungen werden jedoch Clock-Signale mit einer anderen Frequenz oder sogar mehrere Clock-Signale benötigt. Dafür sind PLLs und Clock-Manager...