Steuerwerk
Übersicht
- Zweck: Das Steuerwerk ist die koordinierende Komponente der 8-Bit-Computerarchitektur von DigiSim. Es erzeugt die notwendigen Steuersignale, um den Befehlszähler, den Speicher (RAM), das Befehlsregister, die ALU, das Flagregister und weitere Komponenten so zu koordinieren, dass ein vollständiger Befehlssatz ausgeführt werden kann.
- Symbol: Das Steuerwerk wird durch einen rechteckigen Block mit mehreren Eingangs- und Ausgangspins dargestellt, über die es mit den verschiedenen CPU-Komponenten verbunden ist.
- DigiSim.io-Rolle: Das Steuerwerk ermöglicht die Realisierung eines vollständigen, funktionsfähigen 8-Bit-Computers, indem es alle Systemkomponenten über einen Hol-Decodier-Ausführungs-Speicher-Zyklus korrekt sequenziert und steuert.

Funktionsbeschreibung
Zustandsautomatenbetrieb
Das Steuerwerk arbeitet als endlicher Automat mit vier Zuständen, die zyklisch durchlaufen werden:
- FETCH (Holphase): Der nächste Befehl wird aus dem Speicher gelesen
- DECODE (Decodierphase): Der Befehl wird decodiert und der Befehlszähler inkrementiert
- EXECUTE (Ausführungsphase): Die durch den Befehl spezifizierte Operation wird ausgeführt
- STORE (Speicherphase): Ergebnisse werden gespeichert und Flags bei Bedarf aktualisiert
Eingänge und Ausgänge
Eingänge (7 Pins):
| Pin | Pin-Name | Typ | Beschreibung |
|---|---|---|---|
| 0 | CLK | Eingang | Systemtakt für synchronen Betrieb |
| 1 | RST | Eingang | Reset-Signal zur Initialisierung des Steuerwerks |
| 2 | OP0 | Eingang | Opcode-Bit 0 vom Befehlsregister |
| 3 | OP1 | Eingang | Opcode-Bit 1 vom Befehlsregister |
| 4 | OP2 | Eingang | Opcode-Bit 2 vom Befehlsregister |
| 5 | OP3 | Eingang | Opcode-Bit 3 vom Befehlsregister |
| 6 | Z_FLAG | Eingang | Null-Flag vom Flagregister für bedingte Sprünge |
Ausgänge (18 Pins):
| Pin | Pin-Name | Typ | Beschreibung |
|---|---|---|---|
| 0 | PC_INC | Ausgang | Befehlszähler inkrementieren |
| 1 | PC_LD | Ausgang | Befehlszähler laden (für Sprünge) |
| 2 | PC_OE | Ausgang | Ausgangsfreigabe Befehlszähler (auf Adressbus) |
| 3 | MEM_RD | Ausgang | Lesefreigabe Speicher |
| 4 | MEM_WR | Ausgang | Schreibfreigabe Speicher |
| 5 | RAM_OE | Ausgang | Ausgangsfreigabe RAM (auf Datenbus) |
| 6 | IR_LD | Ausgang | Befehlsregister laden |
| 7 | IR_ADDR_OE | Ausgang | Ausgangsfreigabe IR-Adresse (auf Adressbus) |
| 8 | ALU_OP0 | Ausgang | ALU-Operationscode-Bit 0 |
| 9 | ALU_OP1 | Ausgang | ALU-Operationscode-Bit 1 |
| 10 | ALU_OP2 | Ausgang | ALU-Operationscode-Bit 2 |
| 11 | ALU_OE | Ausgang | Ausgangsfreigabe ALU (auf Datenbus) |
| 12 | ACC_LD | Ausgang | Akkumulator laden |
| 13 | ACC_OE | Ausgang | Ausgangsfreigabe Akkumulator (auf Datenbus) |
| 14 | FLG_LD | Ausgang | Flagregister laden |
| 15 | HALT | Ausgang | Anzeige für Systemhalt |
| 16 | STATE0 | Ausgang | Zustandsbit 0 (LSB der 2-Bit-Zustandskodierung) |
| 17 | STATE1 | Ausgang | Zustandsbit 1 (MSB der 2-Bit-Zustandskodierung) |
Zustandskodierung (STATE1:STATE0):
00→ FETCH (Holphase)01→ DECODE (Decodierphase)10→ EXECUTE (Ausführungsphase)11→ STORE (Speicherphase)
Befehlssatzarchitektur
Das Steuerwerk unterstützt einen Befehlssatz mit 16 Befehlen und 4-Bit-Opcodes:
| Opcode | Hex | Mnemonik | Beschreibung | Operation |
|---|---|---|---|---|
| 0000 | 0x0 | NOP | Keine Operation | PC ← PC + 1 |
| 0001 | 0x1 | LDA addr | Akkumulator laden | ACC ← M[addr] |
| 0010 | 0x2 | STA addr | Akkumulator speichern | M[addr] ← ACC |
| 0011 | 0x3 | ADD addr | Zum Akkumulator addieren | ACC ← ACC + M[addr] |
| 0100 | 0x4 | SUB addr | Vom Akkumulator subtrahieren | ACC ← ACC - M[addr] |
| 0101 | 0x5 | AND addr | Logisches UND | ACC ← ACC & M[addr] |
| 0110 | 0x6 | OR addr | Logisches ODER | ACC ← ACC | M[addr] |
| 0111 | 0x7 | XOR addr | Logisches Exklusiv-ODER | ACC ← ACC ^ M[addr] |
| 1000 | 0x8 | NOT | Logisches NICHT | ACC ← ~ACC |
| 1001 | 0x9 | SHL | Linksschieben | ACC ← ACC << 1 |
| 1010 | 0xA | SHR | Rechtsschieben | ACC ← ACC >> 1 |
| 1011 | 0xB | JMP addr | Unbedingter Sprung | PC ← addr |
| 1100 | 0xC | JZ addr | Sprung bei Null | if (Z=1) PC ← addr |
| 1101 | 0xD | JNZ addr | Sprung bei Nicht-Null | if (Z=0) PC ← addr |
| 1110 | 0xE | LDI | Unmittelbar laden | Reserviert für zukünftige Nutzung |
| 1111 | 0xF | HLT | Halt | Ausführung anhalten |
Befehlsformat
| Bit-Position | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|
| Feld | OPCODE (4 Bit) | OPERAND (4 Bit) | ||||||
| Beschreibung | Auszuführende Operation | Speicheradresse/Wert |
Mikrocode-Architektur
Erzeugung der Steuersignale
Das Steuerwerk verwendet einen Mikrocode-ROM-Ansatz, bei dem jeder Befehl in Mikrooperationen über die vier Zustände hinweg zerlegt wird. Jede Kombination aus Opcode und Zustand erzeugt einen spezifischen Satz von Steuersignalen.
Beispiel: Befehl LDA (Akkumulator laden)
FETCH-Zustand:
- PC_OE = 1 (PC steuert den Adressbus an)
- MEM_RD = 1 (Befehl aus dem Speicher lesen)
- IR_LD = 1 (Befehl in das IR laden)
DECODE-Zustand:
- PC_INC = 1 (PC auf den nächsten Befehl inkrementieren)
EXECUTE-Zustand:
- IR_ADDR_OE = 1 (IR-Adresse steuert den Adressbus an)
- MEM_RD = 1 (Daten von der Speicheradresse lesen)
STORE-Zustand:
- RAM_OE = 1 (RAM steuert den Datenbus an)
- ACC_LD = 1 (Daten in den Akkumulator laden)
- FLG_LD = 1 (Flags aktualisieren)
Bussteuerung und Tri-State-Verwaltung
Das Steuerwerk verwaltet Buskonflikte sorgfältig, indem es sicherstellt, dass zu jedem Zeitpunkt nur eine Komponente jeden Bus ansteuert:
- Adressbus: Gesteuert durch PC_OE oder IR_ADDR_OE
- Datenbus: Gesteuert durch RAM_OE, ALU_OE oder ACC_OE
Integration mit anderen Komponenten
Komponentenkompatibilität
Das Steuerwerk ist so konzipiert, dass es nahtlos mit den vorhandenen Komponenten von DigiSim zusammenarbeitet:
- 8-Bit-ALU: Empfängt Operationscodes (ALU_OP0-2) und liefert Ergebnisse mit Flags
- Befehlszähler: Gesteuert über die Signale PC_INC, PC_LD und PC_OE
- RAM (256×8): Verwaltet über die Signale MEM_RD, MEM_WR und RAM_OE
- Befehlsregister: Wird über IR_LD geladen und liefert die Opcode-/Adressaufteilung
- Flagregister: Wird über FLG_LD aktualisiert und für bedingte Sprünge gelesen (Z_FLAG)
- Akkumulator: Gesteuert über die Signale ACC_LD und ACC_OE
Signaltiming
Das Steuerwerk gewährleistet die korrekten Setup- und Hold-Zeiten für alle Komponenten:
- Adress-Setup: Adresssignale sind vor Speicheroperationen stabil
- Datenvalidität: Daten sind gültig, wenn Ladesignale aktiv sind
- Taktsynchronisation: Alle Zustandsänderungen erfolgen an steigenden Taktflanken
- Reset-Verhalten: Sofortiger asynchroner Reset in einen bekannten Zustand
Anwendungsbeispiele
Einfaches Programm: Zwei Zahlen addieren
; Zwei im Speicher abgelegte Zahlen addieren
0x0: LDA 0x8 ; Erste Zahl von Adresse 0x8 laden
0x1: ADD 0x9 ; Zweite Zahl von Adresse 0x9 addieren
0x2: STA 0xA ; Ergebnis an Adresse 0xA speichern
0x3: HLT ; Ausführung anhalten
...
0x8: 0x05 ; Erste Zahl (5)
0x9: 0x03 ; Zweite Zahl (3)
0xA: 0x00 ; Speicherort für das Ergebnis
Schleifenbeispiel: Von 1 bis 10 zählen
; Von 0 bis 10 zählen
0x0: LDA 0x8 ; Zähler laden
0x1: ADD 0x9 ; 1 addieren
0x2: STA 0x8 ; Zähler speichern
0x3: SUB 0xA ; 10 subtrahieren
0x4: JNZ 0x0 ; Bei Nicht-Null zurückspringen
0x5: HLT ; Bei Fertigstellung anhalten
...
0x8: 0x00 ; Zähler
0x9: 0x01 ; Konstante 1
0xA: 0x0A ; Konstante 10
Technische Hinweise
Taktanforderungen
- Mindestfrequenz: 1 Hz für didaktische Beobachtung
- Maximalfrequenz: Begrenzt durch die Signallaufzeiten der Komponenten
- Tastverhältnis: 50 % empfohlen für optimale Timing-Reserven
Reset-Verhalten
- Asynchroner Reset: Setzt den Zustand sofort auf FETCH
- Signal-Löschung: Alle Steuersignale werden auf den inaktiven Zustand zurückgesetzt
- Halt-Wiederherstellung: Erfordert einen Reset, um die Ausführung wieder aufzunehmen
Leistung
- Alle Befehle: 4 Taktzyklen (Hol-Decodier-Ausführungs-Speicher)
- Befehle pro Sekunde: Taktfrequenz ÷ 4
- Speicherbandbreite: Ein Lese- oder Schreibvorgang pro Befehlszyklus