Getaktete Logik in VHDL
Der zugehörige Code befindet sich in FPGA\BlinkingLed\Fixed\src\blinking_led.vhd.
Blinkende LED – Getaktete Logik in VHDL
Beim Button-Beispiel war die Logik rein kombinatorisch: Der Ausgang hing direkt vom Eingang ab, ohne Zeitbezug. Eine blinkende LED braucht jedoch ein Zeitgefühl – und genau dafür gibt es getaktete Schaltungen.
Warum getaktete Schaltungen?
Kombinatorische Logik reagiert sofort auf Signaländerungen. Das ist einfach und schnell, hat aber einen entscheidenden Nachteil: Sie kann sich nichts merken. Es gibt keinen Zustand, keine Geschichte, keine Zeit.
Getaktete Schaltungen lösen das. Ein zentrales Taktsignal – der Clock – gibt den Rhythmus vor. Nur bei jeder steigenden Flanke dieses Signals darf sich etwas ändern. Dazwischen bleibt alles eingefroren. Das bringt drei große Vorteile:
- Zustand speichern: Die Schaltung kann sich Werte von einem Takt zum nächsten merken.
- Zeitverhalten kontrollieren: Alles passiert synchron – keine unkontrollierten Signalwechsel.
- Vorhersagbarkeit: Der Synthesizer und spätere Timing-Analysen können exakt bestimmen, was wann passiert.
Praktisch jedes komplexe digitale System – Prozessoren, Speicher, Kommunikationsschnittstellen – basiert auf getakteter Logik.
Wie realisiert man Taktung in VHDL?
Das zentrale Werkzeug ist der Process. Ein Process ist ein Block, der immer dann ausgeführt wird, wenn sich eines der darin angegebenen Signale ändert. Für getaktete Logik gibt man dort das Taktsignal an – und wertet innerhalb des Process ausschließlich die steigende Flanke aus. Das ist der Moment, in dem der Takt von '0' auf '1' wechselt. Nur in diesem Moment darf sich der Zustand der Schaltung ändern. Dieses Muster – Process mit Flankenauswertung – findet sich in nahezu jedem synchronen VHDL-Design.
Zähler als Zeitbasis
Eine der häufigsten Anwendungen getakteter Logik ist der Binärzähler. Er erhöht seinen Wert bei jeder steigenden Taktflanke um 1. Erreicht er seinen Maximalwert, springt er automatisch auf 0 zurück – ein natürlicher Überlauf, der sich in vielen Designs gezielt nutzen lässt.
Da ein Zähler mehrere Bits benötigt, reicht ein einzelnes STD_LOGIC-Signal nicht aus. Stattdessen verwendet man einen Vektor – eine geordnete Folge von Bits mit einer definierten Breite. Jedes Bit dieses Vektors lässt sich einzeln auslesen. Das ist besonders nützlich, wenn man den Zähler als Zeitbasis verwenden möchte: Die niedrigen Bits wechseln sehr schnell, die höheren immer langsamer. Bit n toggelt genau alle 2ⁿ Takte – bei einem 27-MHz-Takt und Bit 23 entspricht das rund 310 ms. Man wählt also einfach das Bit, dessen Umschaltfrequenz am besten zur gewünschten Zeitbasis passt.
Für die Initialisierung eines Vektors gibt es in VHDL eine praktische Kurzschreibweise, die besagt: „setze alle Bits auf diesen Wert" – unabhängig davon, wie breit der Vektor ist. Das vermeidet Fehler und macht den Code leichter anpassbar.
Zusammenfassung
| Konzept | Bedeutung |
|---|---|
| Getaktete Logik | Zustandsänderungen nur bei steigender Taktflanke |
| Process | VHDL-Block zur Beschreibung sequenzieller Logik |
| Binärzähler | Zählt Taktflanken, Überlauf erzeugt Wiederholung |
| Bitvektor | Mehrbit-Signal für Zähler und Busse |
| Bit-Auswahl | Einzelne Bits als Zeitbasis nutzen |
Der nächste Schritt wäre, die Blinkfrequenz nicht fest im Code zu verdrahten, sondern sie zur Laufzeit einstellbar zu machen – zum Beispiel über einen Button.
