Grobe Erklärung & Einführung
Was ist VHDL?
- VHDL steht für VHSIC Hardware Description Language und ist eine Sprache zur Beschreibung digitaler Schaltungen.
- Sie wird genutzt, um das Verhalten und die Struktur von Schaltungen textuell zu modellieren.
- Mit VHDL kann man Schaltungen nicht nur entwerfen, sondern auch simulieren und testen.
Warum VHDL?
- Statt einzelne Bauteile wie Logikgatter zu verdrahten, beschreibt man in VHDL, was und wie die Schaltung funktioniert.
- Die textuelle Beschreibung wird von Synthesetools in echte Hardware umgesetzt (z.B. auf FPGAs).
- VHDL eignet sich besonders für modulare und wiederverwendbare Designs.
Was kann man mit VHDL machen?
- Strukturelle Beschreibung: Wie sind Bauteile miteinander verbunden?
- Verhaltensbeschreibung: Wie reagiert die Schaltung auf bestimmte Eingaben?
- Simulation: Testen des Designs, bevor es in Hardware umgesetzt wird.
Einsatzgebiete:
- Digitale Elektronik
- FPGA-Programmierung
- Lehre und Forschung
- Entwicklung komplexer digitaler Systeme
Installation Quartus II
Hier wird erklärt, wie du die Quartus II Web Edition installierst, um mit VHDL-Entwicklung zu beginnen.
Vorbereitung
Zuerst müssen folgende 3 Dateien vom Schulserver heruntergeladen werden:
Danach müssen alle 3 Dateien in das gleiche Verzeichnis gespeichert werden:
Installation von Quartus II und ModelSim
- Doppelklicke auf die Datei QuartusSetupWeb-13.1.0.162.exe und installiere das Programm.
- Doppelklicke anschließend auf die Datei ModelSimSetup-13.1.0.162.exe und installiere ebenso dieses Programm.
Installation des USB Blaster Treibers
- Öffne den Geräte Manager und doppelklicke unter Andere Geräte auf USB Blaster
- Klicke in Eigenschaften von USB-Blaster unter Allgemein auf Treiber aktualisieren
- Klicke anschließend auf Auf meinem Computer nach Treibern suchen
- Klicke auf Durchsuchen und suche nach dem Ordner in dem der USB-Blaster Treiber installiert ist
- Klicke anschließend auf Weiter und dann auf Installieren
- Danach sollte unter USB-Controller der Altera USB-Blaster zu sehen sein
- Zuletzt ist ein Neustart erforderlich!
Unterschied von VHDL zu Programmiersprachen
VHDL ist eine Hardwarebeschreibungssprache, die zur Modellierung digitaler Systeme verwendet wird. In diesem Tutorial lernst du die Grundlagen von VHDL kennen.
Der fundamentale Unterschied:
| Merkmal | VHDL (Hardwarebeschreibungssprache, HDL) | Klassische Programmiersprachen (z.B. C++, Python) |
|---|---|---|
| Ziel | Beschreibung und Modellierung der Struktur und des Verhaltens von digitalen Schaltungen (Hardware), z.B. für FPGAs oder ASICs(FPGA und ASIC sind beides Arten von integrierten Schaltkreisen (Chips), die zur Implementierung digitaler Schaltungen verwendet werden.). | Beschreibung einer sequenziellen Abfolge von Anweisungen zur Ausführung auf einem Prozessor (Software). |
| Ergebnis | Ein Hardware-Netzwerk aus Logikgattern, Speichern und Verbindungen, das durch ein Synthesewerkzeug aus dem Code erzeugt wird. | Eine ausführbare Datei (Programm), die von einem Prozessor interpretiert oder direkt ausgeführt wird. |
1. Parallelität vs. Sequenzialität
- VHDL: Intrinsische Parallelität Der Code beschreibt Komponenten und Prozesse, die gleichzeitig (parallel) ablaufen. Wenn Sie in VHDL zwei Prozesse definieren, laufen diese – analog zu den physikalischen Schaltungsteilen – gleichzeitig. Der Datenfluss und die gleichzeitige Signalverarbeitung stehen im Vordergrund.
- Programmiersprachen: Sequenzielle Ausführung Der Code wird normalerweise Anweisung für Anweisung in einer festen Reihenfolge abgearbeitet (sequenziell), wie es von der CPU vorgegeben wird.
2. Zeit und Signale
- VHDL: VHDL arbeitet mit Signalen und expliziten Zeitverzögerungen. Signale repräsentieren physikalische Drähte in der Schaltung, deren Wert sich erst nach einer bestimmten Zeitverzögerung (oder im nächsten Taktzyklus) ändert. Die zeitliche Komponente ist fundamental.
- Programmiersprachen: Sie verwenden Variablen, deren Wert sich sofort ändert. Die Programmausführung ist primär logisch sequenziell und die Laufzeit wird in der Regel nicht explizit in der Sprache definiert (abgesehen von Funktionen zur Zeitmessung oder Verzögerung).
3. Synthese vs. Kompilierung
- VHDL: Der VHDL-Code wird nicht kompiliert, um auf einem Prozessor zu laufen, sondern synthetisiert. Das Synthesewerkzeug wandelt die textuelle Beschreibung in eine Netzliste um, die die tatsächliche physische Hardware-Implementierung (Gatter, Flip-Flops etc.) beschreibt.
- Programmiersprachen: Der Code wird kompiliert oder interpretiert, um Maschinencode zu erzeugen, der auf einem Prozessor läuft.
Der Detail-Unterschied(Syntax unterschied):
| Merkmal | VHDL | Klassische P-Sprachen |
|---|---|---|
| Zuweisung 1 (Signal) | Signal <= Wert; (Nicht sofort; modelliert Hardware-Verzögerung) | Variable = Wert; (Sofortige Zuweisung) |
| Zuweisung 2 (Variable) | Variable := Wert; (sofort; nur in sequenziellen Blöcken) | Variable = Wert; (Sofortige Zuweisung) |
| Typen | Spezielle Hardware-Typen wie std_logic (9 Zustände, z.B. 'Z' für Hochimpedanz). | Meist nur Boolean (true/false) und Standard-Zahlentypen. |
Aufbau von VHDL
VHDL (Very High Speed Integrated Circuit Hardware Description Language) ist eine Hardwarebeschreibungssprache, mit der digitale Systeme wie Schaltungen und Prozessoren textbasiert modelliert, simuliert und synthetisiert werden können.
1. Bibliotheken und Pakete
- Am Anfang werden Bibliotheken eingebunden (z. B. IEEE) und Pakete ausgewählt, die Datentypen und Funktionen bereitstellen.
2. Entity (Schnittstelle)
- Die Entity beschreibt die äußere Schnittstelle eines Moduls.
- Hier werden Ports definiert: Eingänge, Ausgänge und deren Datentypen.
3. Architecture (Verhalten/Struktur)
- Die Architecture beschreibt das Innenleben des Moduls.
- Es gibt zwei Hauptarten:
- Verhaltensbeschreibung (Behavioral): beschreibt, was das Modul tun soll, meist mit Prozessen und Anweisungen.
- Strukturbeschreibung (Structural): beschreibt, wie das Modul aus anderen Komponenten zusammengesetzt ist.
4. Konfiguration (optional)
- Mit einer Configuration kann festgelegt werden, welche Architecture zu einer Entity verwendet wird.
- Wird oft nur bei komplexeren Projekten benötigt.
5. Testbench (Simulation)
- Eine Testbench ist ein spezielles VHDL-Modul, das Eingaben erzeugt und Ausgaben überprüft, um das Verhalten der Schaltung zu testen.
- Sie hat keine Ports, sondern simuliert die Umgebung.
Anschlüsse und Elemente des DE0-Boards
- LEDs (10) – Ausgaben
- Schalter (10) – Eingaben
- Taster (4) – Eingaben (Impuls)
- 7-Segment-Anzeigen (4) – Zahlendarstellung
- GPIO-Header – externe Module/Sensoren
- ADC-Eingänge – analoge Signale
- SD-Karten-Slot – Datenspeicherung
- Speicher (SRAM, SDRAM, Flash) – komplexere Designs
- USB-Blaster – Programmierung & Debug
Nutzung mit VHDL
- Clock: Standardtakt ist 50 MHz. Meist wird er mit einem Clock-Divider heruntergeteilt, um sichtbare Effekte (z. B. LED-Blinken) zu erzeugen.
- Pin-Zuordnung: In Quartus müssen die Signale aus dem VHDL-Code den richtigen Pins des Boards zugewiesen werden.
- Workflow:
- VHDL-Code schreiben
- Kompilieren in Quartus
- Bitstream (.sof) erzeugen
- Mit USB-Blaster ins Board laden
Erstes Project anlegen
Hier kannst du einen weiteren wichtigen Aspekt oder ein Thema zu VHDL ergänzen.
Punkt 7
Platzhaltertext für Punkt 7.
Aufbau von ASICs – PROM, PAL & GAL
ASIC bedeutet Application Specific Integrated Circuit, also ein integrierter Schaltkreis für eine spezielle Aufgabe. PROM, PAL und GAL gehören zu den programmierbaren Logikbausteinen und sind frühe bzw. klassische Formen von ASICs.
️1. PROM (Programmable Read-Only Memory)
Ein PROM ist ein Speicherbaustein, der einmalig programmiert werden kann und später nur noch gelesen wird. Er kann aber auch zur Realisierung von Logikfunktionen genutzt werden.
Aufbau eines PROM:
Ein PROM besteht aus:
- Adressdecoder (UND-Ebene)
- Feste ODER-Ebene
- Programmierbare Speicherstellen (Sicherungen / Fuses)
Funktionsprinzip:
- Die Eingänge bilden eine Adresse.
- Der Adressdecoder schaltet genau eine Speicherzelle frei.
- Über programmierbare Sicherungen (Fuses) wird festgelegt, ob am Ausgang eine 0 oder 1 erscheint.
Besonderheiten:
- UND-Ebene: fest
- ODER-Ebene: fest
- Nur die Speicherstellen sind programmierbar
- Sehr sicher, aber nicht änderbar
PROM eignet sich gut für Wahrheitstabellen mit vielen Eingängen.
2. PAL (Programmable Array Logic)
Ein PAL ist ein frei programmierbarer Logikbaustein zur Realisierung kombinatorischer Logik.
Aufbau eines PAL:
Ein PAL besteht aus:
- Programmierbare UND-Ebene
- Feste ODER-Ebene
- Ausgangsstufe (optional mit Flipflop)
Funktionsprinzip:
- Die Eingänge gehen in eine UND-Matrix
- Dort werden Produktterme gebildet
- Diese werden in einer festen ODER-Ebene zusammengefasst
- Das Ergebnis erscheint am Ausgang
Besonderheiten:
- UND-Ebene: programmierbar
- ODER-Ebene: fest
- Schnell, einfach, preiswert
- Begrenzte Flexibilität
3. GAL (Generic Array Logic)
Ein GAL ist die moderne Weiterentwicklung des PAL.
Aufbau eines GAL:
- Programmierbare UND-Ebene
- Programmierbare ODER-Ebene
- Flexible Ausgangszellen
- Direkt
- Invertiert
- Mit Flipflop
- EEPROM-Technik (wiederbeschreibbar)
Besonderheiten:
- UND-Ebene: programmierbar
- ODER-Ebene: programmierbar
- Löschbar & neu programmierbar
- Ein GAL kann mehrere PAL-Typen ersetzen
- Sehr flexibel
FPGA
Was ist ein FPGA?
Ein FPGA (Field Programmable Gate Array) ist ein integrierter Schaltkreis, dessen innere Struktur nach der Herstellung frei programmiert werden kann. Das bedeutet: Du kannst selbst bestimmen, welche digitale Schaltung im Chip entsteht.
Wie ist ein FPGA aufgebaut?
Ein FPGA besteht aus vielen kleinen, universellen Bausteinen:
1. Logikzellen (CLBs – Configurable Logic Blocks)
Der Grundbaustein jedes FPGAs.
Jeder Block enthält:
- LUTs (Look-Up Tables) → erzeugen Logikfunktionen (AND, OR, XOR, Addierer, …)
- Flip-Flops → speichert 1 Bit, ermöglicht Register
2. Programmierbare Verbindungen (Routing-Netzwerk)
Ein riesiges Gitter aus schaltbaren Leitungen.
Damit kannst du Logikzellen miteinander verbinden → wie Drähte.
3. IO-Blöcke
Schnittstellen nach außen:
- digitale Pins
- oft konfigurierbar für verschiedene Spannungen (1,2–3,3V)
- manchmal High-Speed-Transceiver
Wie funktioniert ein FPGA?
Wichtig:
Ein FPGA führt kein Programm aus – es IST die Schaltung.
Wenn du ein FPGA programmierst, passiert Folgendes:
- Du beschreibst, welche Logik du willst (z. B. einen Zähler).
- Die Software baut daraus:
- Gatter
- Register
- Multiplexer
- Verbindungen
- Die Struktur wird als Bitstream erzeugt.
- Dieser Bitstream wird ins FPGA geladen.
- Das FPGA wird physisch in diese Schaltung verwandelt.
Das FPGA arbeitet dann genauso wie eine reale, feste digitale Schaltung aus Gattern.
Wichtigstes Merkmal: Parallelität
Anders als ein Mikrocontroller, der Befehle nacheinander ausführt, arbeitet ein FPGA:
- 100 % parallel
- ohne Prozessor
- ohne Programmablauf
Beispiel:
Ein LED-Blinker, ein UART, ein Zähler und ein Filter laufen gleichzeitig, ohne sich gegenseitig zu bremsen.
Warum FPGAs?
Vorteile
- Sehr schnell und deterministisch
- Harte Echtzeit
- Parallelität
- Energieeffizient
- Frei konfigurierbar
- Kann komplexe digitale Systeme umsetzen
- Ideal für:
- Signalverarbeitung
- Kommunikation (UART, SPI, CAN, Ethernet)
- Steuerungen
- Motorregelung
- Audio/Video
- Messsysteme
Nachteile
- Teurer als Mikrocontroller
- Schwerer zu programmieren
- Braucht viel Wissen über digitale Logik
- Große Tools (Quartus, Vivado …)
Was macht ein FPGA besonders?
Ein FPGA kann nach dem Start seine komplette interne Schaltung ändern, weil:
- Die Logikzellen programmierbar sind
- Die Verbindungen programmierbar sind
→ Dadurch können beliebige digitale Schaltungen nachgebildet werden.
Kombinatorische Logik
Was ist kombinatorische Logik?
Wenn man von kombinatorischer Logik spricht, meint man Schaltungen, bei denen der Ausgang direkt von den Eingängen abhängt. Es gibt kein „Merken“ von alten Werten, kein Zwischenspeichern – sobald sich ein Eingang ändert, reagiert der Ausgang sofort. Das ist die Grundlage für einfache Bausteine wie UND‑, ODER‑ oder NICHT‑Gatter, aber auch für komplexere Dinge wie Multiplexer oder Decoder.
VHDL und Kombinatorische Logik
- Direkte Abhängigkeit: In VHDL bedeutet kombinatorische Logik, dass ein Ausgang sofort den Wert bekommt, der sich aus den Eingängen ergibt. Es läuft nicht Schritt für Schritt wie in einem Programm, sondern alles gleichzeitig – genau wie in echter Hardware.
- Direkte Zuweisung: Man schreibt einfach, dass ein Ausgang immer gleich einer bestimmten Verknüpfung der Eingänge ist. Beispiel: „y ist gleich a UND b“. Das ist die einfachste Form.
- Prozesse ohne Takt: Wenn die Logik etwas komplizierter ist, fasst man Bedingungen in einem Prozess zusammen. Wichtig ist, dass dabei kein Clock‑Signal verwendet wird, sonst würde es sequentielle Logik werden. Typisch ist das bei Multiplexern oder Decodern.
- Simulation vs. Hardware: Am Computer sieht man die Änderungen sofort. In einer echten Schaltung dauert es ein kleines bisschen länger, weil das Signal durch Bauteile laufen muss. Diese Verzögerung nennt man Laufzeit.
Sequentielle Logik
Sequentielle Logik kurz erklärt:
- Im Gegensatz zur kombinatorischen Logik hängt der Ausgang nicht nur von den aktuellen Eingängen ab, sondern auch von einem gespeicherten Zustand.
- Dieser gespeicherte Zustand entsteht durch Rückkopplung und wird mit einem Taktsignal (Clock) gesteuert.
- Dadurch kann die Schaltung „merken“, was vorher war, und Abläufe Schritt für Schritt ausführen.
Zusammenhang mit VHDL
- In VHDL beschreibt man Sequentielle Logik in Prozessen, die auf den Takt reagieren.
- Das bedeutet: Bei jeder Taktflanke wird überprüft, ob neue Werte übernommen werden sollen.
- So lassen sich Bausteine wie Zähler, Register oder Zustandsautomaten modellieren.
- Der große Unterschied zur kombinatorischen Logik:
- Kombinatorisch = sofortige Reaktion auf Eingänge
- Sequentiell = Reaktion im Takt, mit „Gedächtnis“ für vorherige Werte
Warum ist Sequentielle Logik wichtig?
- Mit kombinatorischer Logik allein könnte man nur einfache Verknüpfungen bauen.
- Erst durch Sequentielle Logik kann man Abläufe, Speicher und komplexe Steuerungen in VHDL beschreiben.
- Damit bildet VHDL die reale Hardware sehr genau ab:
- Kombinatorisch für direkte Verknüpfungen
- Sequentiell für alles, was einen Zustand oder zeitliche Abfolge braucht
Punkt 12
Platzhaltertext für Punkt 12.
Punkt 13
Platzhaltertext für Punkt 13.
Ende
Du hast das Tutorial durchlaufen!
Über die Entwickler
Dieses Tutorial wurde erstellt von Theodor Kabbe, Lukas Gritsch, Maximilian Sprengart und Christian Alt.