Ein FPGA ist ein programmierbarer Integrierter Schaltkreis (IC) der Digitaltechnik. Die englische Abkürzung steht für Field Programmable Gate Array und kann als „Vor Ort modifizierbarer Logikbaustein“ übersetzt werden. In FPGAs können durch spezifische Konfiguration interner Strukturen die verschiedenartigsten Schaltungen gebildet werden. Diese reichen von geringer Komplexität, wie z. B. einfacher Synchronzähler, bis zu hochkomplexen Schaltungen, wie Mikroprozessoren. FPGAs werden in allen Bereichen der Digitaltechnik eingesetzt, vor allem aber dort, wo es auf schnelle Signalverarbeitung und flexible Änderung der Schaltung ankommt, um beispielsweise nachträgliche Verbesserungen an den implementierten Funktionen vornehmen zu können, ohne dabei direkt die physikalische Hardware ändern zu müssen.
Mit FPGAs wurden kompakte anwenderspezifische Schaltungen in geringen Stückzahlen möglich. Heutzutage gestatten sie die preiswerte und flexible Fertigung komplexer Systeme wie Mobilfunk-Basisstationen als Alternative zur teureren Auftragsfertigung durch Halbleiterhersteller.
Inhaltsverzeichnis |
Der FPGA beinhaltet programmierbare logische Komponenten, meist mit einer Pfadbreite von einem Bit, weshalb FPGAs als feinkörnig rekonfigurierbar gelten, und programmierbare Verbindungsleitungen mit steuerbaren Schaltern zwischen diesen Komponenten. Das Ganze ist als Feld bzw. Matrix gefertigt, woraus sich der Name dieses Bausteins ableitet (Matrix (dt.)= array (engl.)).
Die Komponenten können grundlegende logischen Funktionen wie AND, OR, NOR, NOT und NAND abbilden. Sie können zu komplexerer Logik wie einem Decoder, Encoder oder mathematischen Funktionen zusammengefasst und verknüpft werden.
Der FPGA wird nach der Herstellung vom Anwender programmiert, der diesen Baustein in seiner Schaltung einsetzt. Allerdings ist der Begriff Programmierung in diesem Kontext anders zu verstehen als bei der Erstellung von Software für einen Prozessor: In einem FPGA werden Schaltungsstrukturen mittels Hardwarebeschreibungssprachen oder in Form von Schaltplänen erstellt und nachfolgend diese Daten zwecks Konfiguration in den Baustein übertragen. Im FPGA werden dadurch bestimmte Schalterstellungen aktiviert bzw. deaktiviert, was dann eine konkret implementierte digitale Schaltung ergibt.
Da die Funktion des FPGAs ausschließlich durch die Konfiguration festgelegt wird, kann der gleiche Baustein für viele verschiedene Schaltungen und Anwendungen verwendet werden. Er kann deshalb in großen Stückzahlen produziert werden, was ihn bei Prototypen und Kleinserien sehr kostengünstig im Vergleich zu einer Anwendungsspezifischen Integrierten Schaltung (ASIC) macht. FPGAs sind dafür im allgemeinen langsamer als ASICs und nicht beliebig tief bzw. kompliziert programmierbar. Die Tiefe der programmierbaren Logik ist von der Vorbereitung durch den Hersteller abhängig. Gemessen wird das an der Anzahl der logischen Komponenten, der I/O-Ports und der Flipflops, die sich in einem FPGA befinden.
Die zentralen Elemente eines FPGAs sind programmierbare Logikblöcke. In diesen können logische Operationen wie AND, OR, NOT, XOR realisiert werden. Außerdem ist ihnen ein Speicherelement nachgeschaltet, das als Flipflop oder Latch verwendet werden kann bzw. überbrückt wird, wenn eine rein kombinatorische Funktion benötigt wird.
Die kombinatorische Logik wird meist durch sog. LUTs (Look-Up-Table) gebildet, das heißt in einem kleinen Speicher wird für jeden Zustand der Eingänge der Wert abgelegt, den der Ausgang annehmen soll. Der LUT-Speicher kann auch als synchrones Schieberegister, als Speicher oder Teil von Rechenfunktionen eingesetzt werden.
Darüber hinaus können je nach konkretem Baustein in den programmierbaren Logikblöcken weitere Funktionen integriert sein, beispielsweise zusätzliche Schaltungsteile für den Aufbau von Addierstufen.
Die Logikblöcke sind untereinander über Schaltmatrizen gekoppelt, mit denen über Leitungen die Verbindung zu anderen Elementen des FPGAs hergestellt wird. In nebenstehender Abbildung ist ein Teil dieser Schaltungsanordnung dargestellt: Die schwarzen Verbindungsleitungen können durch konfigurierbare Schalter (rote Kreise) verschiedene Verbindungen zwischen den einzelnen Funktionsblöcken des FPGA herstellen.
Weitere meist übliche Elemente eines FPGAs sind:
Hersteller wie Xilinx bieten mittlerweile auch auf SRAM basierende FPGAs an, die bereits über im Chipgehäuse untergebrachten Flash-Speicher zur Konfiguration verfügen und keinen externen Flash-Speicher mehr benötigen. Man nennt solche integrierten Schaltungen mit mehreren Chips in einem Gehäuse auch Multi-Die. Die Lade- bzw. Startzeiten des FPGAs bleiben im Vergleich zu externen Speicher in etwa gleich, sind allerdings speziell vom Hersteller optimiert. Ein weiterer Vorteil ist der Schutz vor unrechtmäßigen Kopien durch das Auslesen des extern befindlichen Speichers. Derzeit und auf absehbare Zeit ist es technologisch nicht möglich, die SRAM-basierten Schalterzellen in einem FPGA direkt wie bei den viel kleineren CPLDs durch Flash- bzw. EEPROM-Zellen zu ersetzen.
Oft werden FPGAs mit den digitalen und ebenfalls rekonfigurierbaren CPLD-Bausteinen (Complex Programmable Logic Devices) gleichgesetzt bzw verglichen. Die wesentlichen Unterschiede zwischen FPGAs und CPLDs sind:
Erstellt wird die Konfiguration eines FPGAs meist mittels einer Hardwarebeschreibungssprache, zum Beispiel VHDL oder Verilog, welche die gesamte Funktion der Schaltung in Form von Strukturen und Abläufen beschreibt. Ein sogenanntes Synthesetool erstellt dann aus diesen Daten für einen gewünschten Baustein eine spezifische Netzliste unter Nutzung der in diesem Baustein verfügbaren Ressourcen. Zuvor wird im Rahmen des Entwicklungsprozesses die Hardwarebeschreibung mittels Simulationswerkzeugen in ihrem Verhalten simuliert und optimiert. Bekanntestes Werkzeug hierfür ist ModelSIM.
Die Konfigurationsdaten können aus Übersichts- oder Vereinfachungsgründen bei meist einfachen Schaltungen auch grafisch mittels eines Schaltplans eingegeben werden. Die im FPGA erforderlichen Ablaufsteuerungen wiederum lassen sich durch endliche Automaten darstellen. Der hardwarebeschreibende Code wird dann in einem Zwischenschritt automatisch erzeugt. Darüber hinaus lassen sich mit grafischen Programmiersystemen wie LabVIEW oder Matlab / Simulink ebenfalls Schaltungsmodule für ein FPGA automatisch erstellen.
In den letzten Jahren gab es immer wieder Versuche, FPGAs und CPLDs mit der Programmiersprache C zu beschreiben (HardwareC / HandelC / BachC) oder C in VHDL umzusetzen (Spark). Aktuelle Ansätze bauen hierbei direkt auf den weit verbreiteten Standardsprachen ANSI C bzw C++ auf. So ist in den letzten Jahren eine wachsende Anzahl an Benutzern und Toolherstellern für SystemC zu beobachten, welches als Klassenbibliothek direkt auf C++ aufsetzt und dadurch mit bereits vorhandenen Entwicklungsumgebungen zumindest bis zur Simulation problemlos auskommt. Ein anderer Ansatz ist hier die direkte Verwendung von ANSI C, wie es beispielsweise Mentor Graphics mit ihrem Catapult Synthesis oder Forte Design Systems mit ihrem Cynthesizer unterstützen. Welcher Ansatz langfristig die größere Verbreitung finden wird, muss sich erst noch herausstellen. Jedenfalls ist es zwischenzeitlich klar, dass hier kein schneller Umbruch bei den EDA-Anwendern stattfinden wird, sondern sich die momentan verbreitete Enwicklungsmethode basierend auf VHDL oder Verilog noch lange halten wird. Dieser Prozess könnte sich aber durch die Verfügbarkeit neuer Tools und neuer Standardversionen, beispielsweise durch SystemC TLM 2.0 beschleunigen.
Herstellerspezifische Sprachen wie Altera-HDL (AHDL) oder auch die kaum noch verwendete Hardwarebeschreibungssprache ABEL wurden ebenso genutzt wie UDL/I (Japan).
Zur Implementierung eingebetteter Systeme in FPGAs gibt es mittlerweile Werkzeuge, die eine Konstruktion auf Funktionsblockebene anbieten, z. B. Xilinx EDK (Embedded Development Kit). Funktionsblöcke wie FIFOs, Prozessoren, serielle Schnittstellen, Ethernet-MAC-Layer, RAM-Controller, Parallel-IO etc. werden vom Hersteller zur Verfügung gestellt. Diese Funktionseinheiten, IP-Core genannt, liegen manchmal als Quellcode, oder meist als verschlüsselte Netzliste vor und sind in der Regel parametrisierbar (z. B. Baudrate bei seriellen asynchronen Schnittstellen oder Fifo-Tiefe oder Breite der Parallelschnittstelle). Diese werden über Busse mit anderen Funktionseinheiten verbunden.
Nach der Beschreibung innerhalb des Entwurfsflusses folgen weitere Schritte wie die funktionale Simulation, Synthese, die Implementierung (Place and Route) und laufzeitbasierende Simulation. Erst danach sollte die implementierte Schaltung am realen FPGA erprobt werden.
Die Programmierung der Logikbausteine kann je nach FPGA unterschiedlich gelöst werden. Man kann zwischen Methoden unterscheiden, die es ermöglichen, das FPGA mehrmals zu programmieren, und Methoden, die nur eine einmalige Programmierung zulassen. Bei den mehrmals programmierbaren FPGAs wird die Konfiguration in Speicherzellen (z. B. SRAM, EPROM, EEPROM, Flash) gespeichert. Bei den einmalig programmierbaren FPGAs werden die physikalischen Eigenschaften der Verbindungswege permanent geändert (Antifuse-Technologie).
Für FPGAs wird beim Schaltungsentwurf ein synchrones Schaltungsdesign empfohlen (wenngleich nicht zwingend erforderlich). Das bedeutet: An allen Flipflops in einer so genannten Clock-Domain liegt der gleiche Takt. Gesteuert wird die Datenübernahme in ein Flipflop nur über die zusätzlich vorhandenen Clock Enable-Eingänge und nicht über geteilte Taktsignale (engl. gated clocks). Das vermeidet schwer handhabbare Laufzeiteffekte. Manche FPGAs bieten spezielle Taktumschalter an, die das garantiert störungsfreie Umschalten (glitch-frei) zwischen verschiedenen Taktquellen im Betrieb erlauben.
FPGAs haben in den letzten Jahren ihren Anwendungsbereich von der klassischen „Glue-Logic“, also der reinen Verbindungslogik zwischen verschiedenen digitalen Bausteinen, zunehmend erweitert und werden heute auch bei mittleren Stückzahlen für die Realisierung komplexer digitaler Schaltungen bis hin zu kompletten digitalen Systemen eingesetzt. Durch die Rekonfigurierbarkeit von FPGAs direkt beim Endanwender besteht darüber hinaus der wesentliche Vorteil, auf aktuelle technische Entwicklungen reagieren zu können und die digitalen Schaltungen durch Updates anpassen zu können, ohne direkt die zugrundeliegende Hardware der FPGA-Chips verändern zu müssen.
FPGAs werden beispielsweise zur Echtzeit-Verarbeitung von einfachen bis komplexen Algorithmen genutzt, zur digitalen Signalverarbeitung im Rahmen von digitalen Filtern oder zur schnellen Fourier-Transformation. Aber auch Protokoll-Implementierungen wie Teile des Ethernet-MAC-Layers, die Kodierung von digitalen Videosignalen, die Verschlüsselung von Daten und Fehlerkorrekturverfahren sind Anwendungsgebiete.
Besonders in Bereichen, in denen Algorithmen bzw. Protokolle einer schnellen Weiterentwicklung unterliegen, ist die Verwendung rekonfigurierbarer FPGAs statt ASICs angebracht. Die Vorteile sind schnelle Marktreife, nachfolgende Fehlerbehebungen, Anpassung an neue Entwicklungen.
Für einige Klassen von Rechenproblemen sind auch FPGA-basierte Parallelcomputer sehr geeignet. Das wahrscheinlich bekannteste Beispiel sind FPGA-Rechner zum Brechen kryptographischer Verfahren, wie dem Data Encryption Standard (DES). Der aus 120 FPGAs bestehende Parallelrechner COPACOBANA ist ein solcher Parallelcomputer zum Codebrechen.
Die inzwischen erreichte Anzahl von Logikblöcken erlaubt die Integration mehrerer eingebetteter Computersysteme in einen einzigen FPGA-Baustein inklusive CPU(s), Bussystem(en), RAM, ROM, RAM-Controller, Peripherie-Controller etc. Solche kompletten Systeme werden als System on a Chip (SoC) bezeichnet.
FPGAs werden auch als Entwicklungsplattform für den digital-Teil von ASICs verwendet.
FPGAs bilden je nach Konfiguration beliebige Anordnungen digitaler Schaltungsfunktionen ab und bieten damit grundsätzlich die Möglichkeit, Informationen vollkommen parallel zu verarbeiten. So können die anfallenden Datenflüsse in Bandbreite und Informationstiefe optimal einander angepasst werden. Schnell zu erfassende Signale werden dabei oft voll parallel, langsamer auftretende Signale vermehrt zyklisch und damit platzsparend verarbeitet. Die dafür nötigen Strukturen werden geeignet erzeugt.
Herkömmliche Prozessoren hingegen sind reine endliche Zustandsautomaten, die mit einer festgelegten Hardware auskommen müssen und ihr Programm sequentiell abarbeiten, woraus sich auch wesentliche Unterschiede in der Gestaltung bei der Implementierung von Algorithmen ergeben.
In einem FPGA können hunderte Additionen und Multiplikationen zur gleichen Zeit ausgeführt werden, während selbst moderne Prozessoren mit SIMD-Befehlen nur einige wenige Operanden parallel verarbeiten können. Damit können spezifische Aufgaben in gleicher Zeit mit wesentlich geringeren Taktraten erledigt werden. Ferner lassen sich die parallel existierenden Architekturen zu echten Pipelines zusammenschalten, welche die Daten mit jedem Clock weiterreichen. Hierdurch wird ein maximaler Datendurchsatz erzielt.
Viele Veröffentlichungen aus unterschiedlichsten Anwendungsgebieten berichten über Migration einer Anwendung von Software nach Configware mit Beschleunigungsfaktoren von einer bis zu 4 Größenordnungen. Deshalb finden FPGAs neuerdings Eingang beim Reconfigurable Computing.
Reconfigurable Computing, FPAA (Field Programmable Analog Array)