Schaltwerke
Ein Schaltnetz vergisst alles, sobald sich die Eingänge ändern. Führt man einen Ausgang auf einen Eingang zurück, kann eine Schaltung sich etwas merken. Aus dieser Rückkopplung entstehen Flipflops, Register, Speicher – und mit dem Takt eine Maschine, die Schritt für Schritt arbeitet.
Ein Schaltwerk (sequenzielle Schaltung) hat im Unterschied zum Schaltnetz ein Gedächtnis: Sein Ausgang hängt nicht nur von den aktuellen Eingängen ab, sondern auch von dem, was vorher war. Der Trick ist die Rückkopplung – zwei Gatter, die sich gegenseitig speisen, halten einen Zustand fest. So entsteht das Flipflop, die Speicherzelle für ein Bit.
Mehrere Flipflops nebeneinander bilden ein Register, viele Register mit einem Decoder zur Auswahl einen Speicher. Damit alles im Gleichschritt bleibt, übernehmen die Flipflops neue Werte nur im Moment der Taktflanke. Der Takt gibt den Rhythmus vor – und wie schnell er sein darf, bestimmt das langsamste Schaltnetz zwischen zwei Registern.
Ein Bit merken: das SR-Flipflop
Zwei NOR-Gatter, deren Ausgänge jeweils auf einen Eingang des anderen zurückgeführt sind: Das ist die einfachste Speicherzelle. Der Eingang S (Set) setzt den Ausgang Q auf 1, R (Reset) setzt ihn auf 0. Sind beide 0, passiert – nichts. Die Schaltung hält den letzten Zustand. Probier es:
Das Entscheidende passiert, wenn man S wieder auf 0 zurücknimmt: Q bleibt 1, weil der eigene Ausgang über das andere Gatter sich selbst bestätigt. Die Schaltung hat zwei stabile Zustände und bleibt in dem, in den man sie zuletzt gebracht hat. Genau so funktionieren die Speicherzellen in den Caches eines Prozessors (SRAM): sechs Transistoren pro Bit, zwei rückgekoppelte Inverter plus zwei Schalter für Lesen und Schreiben.
Der Takt: alle im Gleichschritt
Ein SR-Flipflop reagiert sofort auf jede Änderung. In einem Prozessor mit Milliarden von Gattern wäre das Chaos: Signale kommen unterschiedlich schnell an, Zwischenergebnisse flackern. Deshalb benutzt man getaktete Flipflops. Das D-Flipflop hat einen Dateneingang D und einen Takteingang: Es übernimmt den Wert von D nur im Moment, in dem der Takt von 0 auf 1 springt (der steigenden Flanke), und hält ihn dann bis zur nächsten Flanke – egal, was D in der Zwischenzeit tut.
Mit dem Freigabeeingang (enable) wird daraus der Baustein, aus dem Register bestehen: Ist die Freigabe aus, behält das Flipflop seinen Wert auch bei einer Taktflanke. Technisch ist das ein Multiplexer aus H4 vor dem D-Eingang, der entweder den neuen Wert oder den alten Ausgang zurückführt.
Damit entsteht das Grundmuster jeder digitalen Maschine: Register halten den Zustand, Schaltnetze berechnen daraus den nächsten Zustand, die Taktflanke übernimmt ihn. Zwischen zwei Flanken muss das Schaltnetz fertig gerechnet haben. Die längste Gatterkette zwischen zwei Registern – der kritische Pfad – bestimmt deshalb die höchste Taktfrequenz. Bei 4 GHz bleiben dafür 0,25 Nanosekunden; in dieser Zeit legt Licht gerade 7,5 Zentimeter zurück. Deshalb teilen Prozessoren die Arbeit an einem Befehl in viele kurze Stufen auf (Pipelining).
Vom Register zum Speicher
Ein Register sind n D-Flipflops nebeneinander mit gemeinsamem Takt und gemeinsamer Freigabe – ein Wort. Ein Speicher sind viele Register übereinander, dazu ein Decoder, der aus der Adresse genau eine Zeile auswählt: Beim Schreiben bekommt nur diese Zeile die Freigabe, beim Lesen lässt ein Multiplexer nur ihren Inhalt durch. Acht Wörter zu acht Bit:
Die Lehrmaschine aus H2 hat genau so einen Speicher, nur größer: 256 Wörter zu 16 Bit, ein Decoder mit 8 Adressbits. Ein Arbeitsspeicher mit 16 GB funktioniert nach demselben Prinzip – allerdings in einer anderen Technik.
SRAM und DRAM
| SRAM | DRAM | |
|---|---|---|
| Speicherzelle | rückgekoppeltes Flipflop, etwa 6 Transistoren | ein winziger Kondensator plus 1 Transistor |
| Hält den Wert | solange Strom da ist | nur Millisekunden – der Kondensator entlädt sich, muss ständig aufgefrischt werden (Refresh) |
| Geschwindigkeit | sehr schnell | deutlich langsamer |
| Dichte und Preis | groß und teuer pro Bit | klein und billig pro Bit |
| Wo | Register, Caches in der CPU | Arbeitsspeicher (DDR-Module) |
Dieser Unterschied ist der Grund für die Speicherhierarchie: kleine, schnelle Flipflop-Speicher nah am Rechenwerk, große, langsame Kondensator-Speicher weiter weg. Und für Daten, die ohne Strom überleben sollen, gibt es Flash: Ladungen, die in einer isolierten Schicht eingesperrt sind.
Für Entwickler übersetzt
Das Taktprinzip – erst den nächsten Zustand komplett aus dem aktuellen berechnen, dann alles auf einmal übernehmen – kennt man aus der Software. So lässt sich ein getaktetes Schaltwerk in Java nachbilden:
final class Register {
private int q; // gespeicherter Wert (Ausgang)
private int d; // anliegender Eingang
private boolean enable;
void setD(int wert, boolean en) { d = wert; enable = en; } // zwischen den Flanken: beliebig oft
void flanke() { if (enable) q = d; } // nur hier ändert sich q
int q() { return q; }
}
// Ein Takt der ganzen Maschine: erst ALLE Eingänge aus den alten Ausgängen berechnen,
// dann ALLE Register gleichzeitig takten – sonst würde ein Register schon den neuen Wert eines anderen sehen
for (Register r : register) r.setD(naechsterWert(r), freigabe(r));
for (Register r : register) r.flanke();Dasselbe Muster steckt im Game of Life (neue Generation in ein zweites Feld schreiben, dann tauschen), in Spiel-Schleifen und in Simulationen. Wer es verletzt und Zustände „mitten im Takt“ überschreibt, bekommt Ergebnisse, die von der Reihenfolge abhängen – in Hardware wie in Software ein klassischer Fehler.
Hardware selbst wird heute ebenfalls in Code beschrieben, in Hardwarebeschreibungssprachen wie Verilog und VHDL oder in Bibliotheken für höhere Sprachen wie Chisel (Scala) und SpinalHDL. Ein Register ist dort ein Objekt, dessen Wert sich nur an der Taktflanke ändert; ein Werkzeug übersetzt die Beschreibung in Gatter und Flipflops für einen Chip oder ein FPGA.