Field Programmable Gate Array (FPGA) Complex Programmable Logic Devices (CPLD) 1
FPGA Design Flow 2
1. Einleitung 2. Grundlegende Strukturelemente 3. Syntax 4. Synthesefähiger VHDL-Code 5. Zusammenfassung und Beispiele 6. Simulation von VHDL-Code 7. ModelSim 8. Praktisches Beispiel mit ModelSim 3
Was ist VHDL? Very high speed integrated circuit Hardware Description Language (VHDL) ist eine Hardwarebeschreibungssprache, vergleichbar mit einer Programmiersprache, mit der es einfach möglich ist, komplizierte digitale Systeme zu beschreiben. VHDL ist durch den IEEE 1076 Standard von 1993 genormt. Beschreibt das gewünschte Verhalten einer Schaltung auf einer höheren Abstraktionsebene. (keine einzelne elektronische Bauteile) ermöglicht das schnelle Entwickeln großer und komplexer Projekte hohe Effizienz (zeitlich wie ökonomisch) Ein System kann simuliert, verifiziert und schließlich eine Konfiguration erstellt werden. Durch eine Konvertierung in einen geeigneten Bitstream kann das Programm auf FPGAs oder CPLDs geladen werden. 4
Kopfzeile Bibliotheken Entity Architecture Process 5
Bibliotheken Aufbewahrungsort für kompilierte und wieder zu verwendende Pakete und Designeinheiten Enthalten Datentypen, Komponenten, Objekte <Bibliotheksname>.<Paketname>.<Element von Paket> zu verwendende Bibliothek z.b.: library ieee zu verwendende Pakete der Bibliothek z.b.: use ieee.std_logic_1164.all z.b.: use ieee.numeric_std.all; 6
Entity Beschreibt die Schnittstellen eines VHDL-Funktionsblockes nach außen Anzahl, Bezeichnung und Typ der Anschlüsse (IN, OUT, INOUT, BUFFER) Signaldeklaration durch port-anweisung Kommunikation zwischen einzelnen Entitys aber auch zwischen einer Entity Architectures Konstantendeklaration durch generic-anweisung kann von höherer Hierarchieebene überschrieben werden ähnlich der C #define Anweisung können Konstanten definiert werden Entspricht dem IC-Gehäuse 7
Architecture Beschreibt das Innenleben die Funktionalität Mindestens eine Architecture pro Entity Lokale Signal-, Konstanten und Typdeklarationen nur für den vorliegenden Architekturrumpf gültig Nebenläufige Anweisungen innerhalb einer Architecture! Einzelne Architectures einer Entity sind ebenfalls nebenläufig! Entspricht dem Chip im Gehäuse der Funktion 8
Process Eine Architecture kann ein oder mehrere Process beinhalten Alle Process einer Architecture werden nebenläufig abgearbeitet! Kombinatorische und sequentielle (taktgesteuerte) Logik Sequentielle Abarbeitung innerhalb eines Process! Signale der sensitivity list starten die Bearbeitung des Process Signalzuweisung immer am Process-Ende!! (letzter geschriebener Wert) Erlaubt Verzweigungen und Schleifen (z.b.: if,case,for,while) Benutzung von Variable Gültigkeit nur innerhalb eines Process Werte werden sofort zugewiesen! Variable Signal Nutzung außerhalb 9
Signal oder Variable?! Beispiel 1: Flankenerkennung Beispiel 2: Addition 10
z.b.: FPGA 11
Nebenläufige Abarbeitung Sequentielle Abarbeitung Laufzeit der Signale! (echte Hardware) Unterschiedlich schnelle Prozesse Synchronisation von unterschiedlichen process einer architecture Synchronisation von unterschiedlichen entitys o (Anzahl der Taktzyklen) z.b.: FPGA 12
Datentypen: bit: kann nur logische Werte '1' und '0' annehmen bit_vector (n downto 0) bzw. bit_vector (0 to n) : Vektor aus n +1 Binärwerten std_logic : Erweiterung des Typs bit um sieben zusätzliche Signalwerte: 'U' : nicht initialisiert (z.b. zum Zeitpunkt des Einschaltens) 'X' : unbekannt 'Z' : hochohmig (z.b. bei ungetriebenem Ausgang eines Tri-State Buffers) 'L' : schwache logische Null 'H' : schwache logische Eins 'W' : schwach zwischen Null und Eins ' ' : don't care (für Logiksynthese) signed(n downto 0) bzw. unsigned(n downto 0) Vektor aus n+1 Stellen des Typs std_logic integer : vorzeichenbehaftete ganze Zahl (32-Bit, LE-Ressourcen!) integer range 0 to 15: vorzeichenlos, Zahlen von 0 bis 15 (4 Bit) 13
Typumwandlung Interpretation von Vektoren: Zweierkomplement unsigned: 1011 = 11 signed: 1011 = -5 14
Zuweisungen Integer Variable : A :=3; Signal : A <=3; unsigned/signed (4Bit Vektor, signal) AV(3) <= '1'; AV <= "0101"; AV <= "01" & "01"; AV <= ('0','1','0','1'); AV <= ('1', others => '0'); hexadezimal (vorangestelltes x, x A2 ) oktal (vorangestelltes o) Allgemeines Kommentare beginnen mit: -- Groß-/Kleinschreibung wird ignoriert Namen und Bezeichner müssen mit einem Buchstaben beginnen Nachfolgend sind Zahlen und Unterstriche erlaubt VHDL-Anweisungen werden mit einem Semikolon abgeschlossen 15
Boolsche Operatoren not Negation S <= not A; and UND-Verknüpfung S <= A and B; nand NAND-Verknüpfung S <= A nand B; or ODER-Verknüpfung S <= A or B; nor NOR-Verknüpfung S <= A nor B; xor Exklusiv-ODER-Verknüpfung S <= A xor B; xnor Aquivalenz S <= A xnor B; Arithmetische Operatoren + Addition Y <= A + B - Subtraktion Y <= A - B abs Absolutwertbildung Y <= abs(a) * Multiplikation Y <= A * B / Division Y <= A / B (Logikelemente!) Vergleichs Operatoren: <, <=, >, >=, =, /= 16
Bestimmte Konstrukte können simuliert werden, lassen sich aber nicht für eine reale Hardware übersetzten Was aus dem breiten Spektrum an funktionalem VHDL-Code tatsächlich synthesefähiger VHDL-Code ist, bestimmt primär das zur VHDL- Synthese gewählte Übersetzungsprogramm (Compiler / Synthesetool), z.b. Quartus II Funktionaler, nicht synthesefähiger Code wird vor allem im Bereich der Simulation zur Erstellung sogenannter Testbenches eingesetzt. Synthesefähigen VHDL-Code herzustellen ist im Regelfall aufwendiger und der Entwickler muss dabei auf große Teile der Sprachmöglichkeiten von VHDL bewusst verzichten und die Zielhardware und deren genauen Eigenschaften näher kennen. 17
18
19
Unterschied zu klassischen Programmiersprachen Programmiersprachen legen sequentiellen Ablauf einzelner Anweisungen fest Aufbau physikalischer Schaltungen wird modellhaft durch HDLs beschrieben Zwei Wesentliche Arten Speicherung und Übertragung Signale: Verknüpfung und Informationsübermittlung zwischen einzelnen nebenläufigen (=parallel ablaufenden) Funktionsblöcken Nehmen ihren neuen Zustand erst am Ende eines sequentiellen Prozesses an Variablen: Existieren nur innerhalb von sequentiellen Anweisungsfolgen von Prozessen Zuweisungen wirken unmittelbar (ähnlich wie bei Programmiersprachen) Mehr Komponenten in VHDL mehr Logikelemente zusätzlich generierte Hardware arbeitet voll parallel während Module in Programmen immer Rechenzeit beanspruchen! beeinträchtigt die zeitliche Abarbeitung bereits existenter Module nicht 20
switch_igbts_2 Asynchroner Reset Synchrone (zum FPGA-Clock) Abarbeitung des Codes Generic Eigener Datentyp locate_sector_2 1 Taktzyklus für Abarbeitung Ausgangswerte direkt auf Signal der Entity Ergebnisse die wiederum zur Ausgangswertberechnung benötigt werden sind Variablen calculate_times_2 Sofortige Verfügbarkeit der Ergebnisse durch Variablen Signalausgabe: Variable Signal 21
Für das Erstellen und Testen in Programmiersprachen wie z. B. C sind Debugger mit Single-Step-Funktionalität üblich. bedingt durch die parallele Ausführung nicht möglich in VHDL Signalverläufe werden daher simuliert z.b. mit der Quartus II Entwicklungsumgebung von Altera (Nachteil: langer Kompilierungsvorgang ) oder z.b. mit ModelSim kostenlose "Altera Web Edition" mit kostenlose Version von ModelSim (eingeschränktem Funktionsumfang) 22
In einem Simulationsmodell wird der eigentlich zu testende und synthesefähige VHDL-Code bzw. VHDL-Modul eingebettet und die Hardware darum in einem sogenannten 'Testbench' möglichst getreu nachgebildet. Das Simulationsmodell wird dabei meistens in nicht synthetisierbaren VHDL verfasst, was das Modellieren des Zeitverhaltens oder bestimmter physikalischer Parameter der externen Schaltungsteile erlaubt. Die Erstellung von guten Testbenches beträgt ca. 50% der gesamten Entwicklungszeit für IP-Cores ausmacht. Sie ist aber wesentlich effizienter als frühzeitig mit meist nicht auf Anhieb funktionierenden Schaltungsteilen auf reale Hardware zu gehen die dann nur schwer und umständlich in allen ihren Parametern verifiziert werden können. 23
Es wird zwischen zwei Simulationsarten unterschieden Verhaltenssimulation (behavioral simulation) Simulation des fertig platzierten IP- Core (post-fit simulation) Überprüfen der funktionellen Zusammenhänge z.b.: logische Verknüpfungen einzelner Signale geringer Rechenaufwand Simulation zeitlich längerer Abschnitte z.b mit Modelsim IP-Core wird zunächst synthetisiert, geroutet und platziert Netzliste und die zugehörigen Laufzeitinformationen (timing) der Zielhardware ermittelt (z.b. mit Quartus II) Laufzeitparameter Simulationsprogramm Vorteil: Zeitablaufprobleme in der Zielhardware werden bereits in der Simulation erkannt Aber: hoher Rechenaufwand, sehr langen Simulationszeiten 24
Simulationsumgebung für VHDLs integrierter Debug- und Anlayseumgebung Taktsynchron oder Timing-genaue Verhaltenssimulation Funktionstest von VHDL Code Simulation von VHDL unabhängig von Gatterlaufzeiten Test von einzelne Entitys separat als auch mehrere Entitys gemeinsam in einer Simulationsumgebung Portsignale und Signale innerhalb der zu testenden VHDL-Module können visuell mit einem Zeitverlauf (Waveform) dargestellt werden. Die visuelle Darstellung von Variablen ist Prinzip bedingt nicht möglich. Simulationszeit << Kompilierungszeit in Quartus Einfache Fehlersuche und erkennen von Zusammenhängen durch die dem Oszilloskop ähnliche Waveform-Darstellung 25
Für den Test von Entity(s) wird in ModelSim zusätzlich zu der zu testenden Entity(s) ein Simulationsquellcode benötigt. Muss vom Anwender erstellt und an die zu testende(n) Entity(s) angepasst werden. Muss nicht synthesefähig sein Beschreibt das Zielsystem/die Zielhardware Testbench -.vhdl Beinhaltet alle zum Test notwendigen Informationen Portsignale müssen deklariert und vorgegeben werden Vorgabe von Taktfrequenz und Reset-Signal Zustandswechsel von diversen Eingangssignalen 26
Umwandlung in ein binäres, simulatorinternes Format durch den in ModelSim integrierten VHDL-Compiler Überprüft zudem die Syntax des Codes und bindet die benötigten Bibliotheken ein Festlegen der Signale welche betrachtet werden sollen Starten der Simulation Waveform Verifizieren, Fehlersuche, etc. 27
28
Vorgehensweise in ModelSim 1. Erstellen eines neuen Projektes 2.1 Laden der zu testenden Entitys 2.2 Laden der zugehörigen Testbench 3.1 Kompilieren der VHDL-Codes 3.2 eventuelle Fehlerbehebung 4.1 Simulation starten 4.2 Signale auswählen 5. Verifizieren, Fehlersuche, etc. 29
Tiefpass 1.Ordnung Integrator + Rückkopplung T 1 x + x = k p y input x k T 1 T a + 1 = k p y + T 1 T a x k 1 diff sum temp_out m 30