kramann.info
© Guido Kramann

Login: Passwort:










kramann.info
© Guido Kramann

Login: Passwort:




FPGA - Field Programmable Gate Array - Einführung

(EN google-translate)

(PL google-translate)

Was ist ein FPGA?

Ein FPGA ist ein Chip, der ein Array aus verschiedenen Grundbausteinen enthält:

  • Logikblöcke
  • Ein- und Ausgabeblöcke
  • Speicher
  • Takterzeuger
Chip-Architektur eines Spartan 3 - Chips. Quelle: Datenblatt von Xilinx

Bild 0-1: Chip-Architektur eines Spartan 3 - Chips. Quelle: Datenblatt von Xilinx "Spartan-3 Generation FPGA User Guide" - "ug.331.pdf", S.37, 2011.

Es ist bereits eine vollständige Verdrahtung dieser Elemente auf dem Chip vorhandenen. Die einzelnen Verdrahtungen können aber über einen Löschvorgang alle deaktiviert und einzeln über einen Flashvorgang aktiviert werden.

Diese spezielle Architektur erlaubt es unabhängige parallel "concurrent" arbeitende Strukturen auf den FPGA zu übertragen.

Diese parallelen Strukturen arbeiten im Prinzip wie diskrete Schaltungen. Jedoch besitzen insbesondere die Logikblöcke Takteingänge (Clock) und aktualisieren den sich aus den anliegenden Eingängen ergebenden Ausgang mit den Taktflanken eines Taktgebers.

Diese Aktualisierung des Ausgangszustandes kann entweder wirklich durch einen außerhalb der Teilschaltung generierten Takt erfolgen (synchrone Schaltungen), oder aber die einzelenen Schaltungsteile erzeugen ihren eigenen Takt abhängig von der Signallaufzeit durch das Gatter (asynchrone Schaltungen).

Asynchrone Schaltungsstrukturen können durch die lokal auftretenden unterschiedlichen Signallaufzeiten und den sich daraus ergebenden temporär falschen Eingangssignalen zu einem Fehlverhalten einer Schaltung führen.

Die maximal mögliche Taktfrequenz ergibt sich sowohl im synchronen, als auch im asynchronen Fall aus der Laufzeit der Signale durch die realisierte Logik-Gatter-Struktur.

Es gibt FPGA-Typen, die ihre Verbindungsstruktur beim Einschalten aus einem Speicher lesen und solche, die diese nicht flüchtig speichern und so beim Einschalten direkt betriebsbereit sind.

Geflashte FPGAs können diskrete Schaltungen repräsentieren, aber auch Funktionalitäten emulieren, die typisch für Mikrocontroller sind (Protokolle von Bussystemen umsetzen, PWM-Signale erzeugen usw.).

Insbesondere die Möglichkeit Schaltungen realisieren zu können, deren Verabeitungsgeschwindigkeit an die vergleichbarer diskret aufgebauter Schaltungen heranreicht, machen FPGAs attraktiv für Echtzeit-Anwendungen.

Logikblöcke

Wie kann unterschiedliches Verhalten auf dem FPGA realisiert werden? - Dies soll exemplarisch am Beispiel der Logikblöcke verdeutlicht werden.

Logikblock eines FPGA-Chips.

Bild 0-2: Logikblock eines FPGA-Chips.

Über die Konfiguration einer Lookup Tabelle kann für einen Logikblock ein beliebiges binärlogisches Verhalten realisiert werden.

Der sich aus den Eingängen ergebende Ausgang wird entweder unmittelbar ausgegeben, oder bei jeder steigenden Flanke des Clock-Signals. Dies ist umschaltbar mit Hilfe eines Multiplexers (MUX). Die Aktualisierung des Ausgangssignals bei steigender Flanke kann über ein D-Flipflop realisiert werden.

In den vorangehenden Semestern wurde u.a. vermittelt, wie mit objektorientierten Sprachen programmiert werden kann. Wie könnte eine Realisierung eines Logikblocks als Java-Klasse erfolgen?

Übung - Miteinander verknüpfbare Logikbausteine mit Clock-Synchronisierung
digital.zip - Teillösung als Hilfestellung als BlueJ-Projekt.

Überlegen Sie sich eine Klassenbeschreibung für UND- und ODER-Logikgatter mit beliebig vielen Eingängen (Festlegung über den jeweiligen Konstruktor).

Setzen Sie dieses Konzept in Java um.

Schreiben Sie ein Testprogramm, das einen Bitvergleicher realisiert. D.h. der Ausgang der Gesamtschaltung soll immer dann true sein, wenn zwei Bitmuster - sagen wir jeweils der Länge vier - das gleiche Muster aufweisen und sonst false.

Ergänzen Sie das Programm durch eine Testreihe, die die Schaltung mit verschiedenen Eingangsmustern testet.

Sehen Sie eine Objekt-Methode connect(...) vor, die den Ausgang eines beliebigen anderen Logikbaustein-Objekts als einen Eingang mit dem aktuellen Objekt verbindet.

Machen Sie zunächst einen Grobentwurf, visualisieren ihn in UML und diskutieren diesen in der Gruppe. Nehmen Sie dann die Kodierung vor.

VHDL

Zu bestimmen, welche Leitungen aus den Verbindungsarrays des Chips aktiviert werden müssen und welche nicht, um eine bestimmte Schaltung zu realisieren, würde aber eine sehr genaue Kenntnis der Architektur eines FPGA-Chips voraussetzen. Die Stärke der FPGA-Technik liegt jedoch neben der Performance der Schaltungen in der Verfügbarkeit von Beschreibungssprachen, die es erlauben, die Funktion statt die Struktur einer gewünschten Schaltung zu beschreiben und einen Compiler dann die konkrete Umsetzung optimiert umsetzen zu lassen.

VHDL steht für VHSIC Hardware Description Language. VHSIC wiederum steht für Very High Speed Integrated Circuit. Die Entwicklung von VHDL verwendet eine ADA ähnliche Syntax. Die Entwicklung von VHDL wurde durch das Verteidigungsministerium der U.S.A betrieben, um eine alternative Möglichkeit dazu zu erhalten, größere elektronische Systeme aus einzelnen ICs zusammenzubauen. Denn bei diesem Vorgehen traten häufig Schwierigkeiten auf, teils weil die verwendeten ICs nicht kompatibel zueinander waren, die Spezifikationen falsch waren, oder der Aufwand, sich durch hunderte von Seiten an Datenblätter durchzuarbeiten unangemessen aufwändig war.

Neben VHDL ist als Alternative Verilog zu erwähnen, die ganz ähnlich arbeitet, aber sich mehr an der C-Syntax orientiert.

Ein VHDL-Programm besteht im Wesentlichen aus zwei Blöcken:

  • Der entity-Block legt fest, welche Ein- und Ausgänge die beschriebene Schaltung hat (Port-Abschnitt in entity).
  • Der architecture-Block beschreibt den strukturellen Aufbau der Schaltung, sowie Prozesse.

Um Strukturen im Architekturblock besser beschreiben zu können, können neben den in entity definierten Ein- und Ausgängen weitere Hilfsvariablen in einem signal-Abschnitt vereinbart werden.

Prozesse, also Programm-Abschnitte, die denen bei der prozeduralen Programmierung ähneln, können im Architekturblock in einem process-Abschnitt beschrieben werden.

Darüber hinaus gibt es noch die Möglichkeit eine bereits zuvor entworfene Teilschaltung in einer neuen Schaltung zu verwenden. Hierfür kann ein component-Block verwendet werden.

VHDL ist nicht Case sensitiv.
Für jede Variable in VHDL muß ein Datentyp vereinbart werden.

Das nachfolgende Beispiel soll vorgreifend grob die Programmstruktur von VHDL demonstrieren, ohne dass an dieser Stelle bereits der Quelltext vollständig analysiert wird.

Beschreibung eines Antivalenz-Gatters mit VHDL.

Bild 0-3: Beschreibung eines Antivalenz-Gatters mit VHDL.

Zwei-Bit-Wort-Vergleicher unter Verwendung der vorangehend definierten Antivalenzgatter.

Bild 0-4: Zwei-Bit-Wort-Vergleicher unter Verwendung der vorangehend definierten Antivalenzgatter.

FORTSETZUNG - Zwei-Bit-Wort-Vergleicher unter Verwendung der vorangehend definierten Antivalenzgatter.

Bild 0-5: FORTSETZUNG - Zwei-Bit-Wort-Vergleicher unter Verwendung der vorangehend definierten Antivalenzgatter.

User Constraints - Randbedingungen

Nachdem die Funktionalität einer Schaltung mit VHDL beschrieben wurde, muß noch festgelegt werden, auf welchen physikalischen Pins des verwendeten FPGA-Chips deren Ein- und Ausgänge liegen sollen, als auch welches zeitliche Verhalten und welche elektrischen Eigenschaften die Pins haben sollen. Dies wird bei der Entwicklungsumgebung ISE von Xilinx in einer Datei mit Endung .ucf festgelegt.

## GCLK6 ist auf FPGA-Chip Pin 56
NET "MEINECLOCK" LOC = "P56";
## IO_L05P_0 ist auf FPGA-Chip Pin 125
NET "MEINELED"   LOC = "P125";

NET "VIERBIT<3>"   LOC = "P126";
NET "VIERBIT<2>"   LOC = "P130";
NET "VIERBIT<1>"   LOC = "P131";
NET "VIERBIT<0>"   LOC = "P132";

NET "MEINECLOCK" IOSTANDARD = LVCMOS25;
NET "MEINELED"   IOSTANDARD = LVCMOS33; 

NET "VIERBIT<3>" IOSTANDARD = LVCMOS33; 
NET "VIERBIT<2>" IOSTANDARD = LVCMOS33; 
NET "VIERBIT<1>" IOSTANDARD = LVCMOS33; 
NET "VIERBIT<0>" IOSTANDARD = LVCMOS33; 

Code 0-1: Festlegungen passend zu obigem VHDL-Quelltext.