9.6 KiB
9.6 KiB
MU1-Rechner
Was kann er mehr:
- Indirekte Adressierung
- Schleifen
- Unterprogramme (Strukturen)
- Optimieren der Datenzugriffe (schneller)
ALU
Verbesserungen
- Funktionen der ALU
- A+B ist der Ausgang des Addierers
- A-B wird gebildet als A+nichtB+1
- B wird implementiert, indem A fest auf 0 gesetzt wird
- A+1 wird implementiert, indem Eingang B fest auf 0 und Carry-Eingang auf 1 gesetzt wird
Grundfunktionen MU1-ALU
- FA: Funktion (0, A) (also eig. F0A)
- FB: Funktion (0, B)
- FIA: Funktion (Inverter, A)
- FIB: Funktion (Inverter, B)
- FC: Funktion (F1, Carry-Flag)
- F1: Funktion (0/1)
- FS: Funktionsergebnis Statusregister
- C: Funktionsergebnis C
Der MU1-Datenpfad
- Das erweiterte Modell besitzt
- Stackpointer SP
- Register Din und Dout
- Laufzeiten sind kürzer pro Takt
- Takt kann erhöht werden
- Durch Din und Dout braucht es mehr Taktzyklen, diese sind aber schneller durchlaufen
Der Reset
- Jeder Prozessor hat einen Reset-Eingang
- ist negiert angelegt → 0 macht reset
- Program Counter wird auf 0 gestellt, Microprogram-Counter step ebenfalls
- ALU wird auf Funktion NULL gesetzt
- ist negiert angelegt → 0 macht reset
- Beim Einschalten wird Reset-Signal verzögert gesetzt
- Prozessor braucht Zeit um Startzustand herzustellen
Micro-Program-Counter Step
- Step ist ein Speicher in der Steuereinheit (Timing/Control Unit)
- meiste Befehle benötigen mehrere Takte
- Micro-Program-Counter Step gibt Steuerlogik Informationen
- welche Aktionen sind auszuführen
- Step = Eingangsinformation für jeden Schritt
- Micro-Program-Counter Step gibt Steuerlogik Informationen
- Steuerungstabelle weiß welcher step welcher Schritt ist
Befehlsablauf MU1
- Step == Null
- Fetch (lesen des Befehls in das Instruction Register)
- letzter Schritt: Step = Null
- Step wird meistens um 1 erhöht
- falls nicht → Schleife
Fetch-Zyklus
- findet in einem Takt statt
-
- Taktflanke
- Program Counter wird auf Adressbus und auf ALU[A] geschaltet
- An der ALU ist Befehl=A+1, S=0
-
- Taktflanke
- Speicher liest nächste Instruktion und speichert in IR
- PC wird über ALU um 1 erhöht
-
Befehl LDA (Laden des AKK aus Speicher)
Zustandsbeschreibung des Ladebefehls
- Nach Fetch entscheidet Opcode im IR und Schrittnummer, welchen Zustand der Automat als nächstes annimmt
- Step ist PC im Microcode und beschreibt Abfolge der Befehle im Microcode
- Zu jedem Schritt gehört eindeutige Funktion
- Lässt sich in Timing-Control-Logik umsetzen
Adressierung
Direkte Adressierung (STO/LDA)
- Befehl erhält direkt die Speicheradresse
- Adresse kann zur Laufzeit nicht mehr verändert werden
Indirekte Adressierung (STR/LDR)
- Adresse steht an Speicherstelle
- effektive Adresse kann noch berechnet werden
- Schleifen können programmiert werden
- effektive Adresse kann noch berechnet werden
Adressierungsarten
Unmittelbare Adressierung (immediate)
- Befehl erhält Konstante
- bspw.: ADD #1
Direkte Adressierung (direct, absolute)
- Befehlt enthält Adresse im Speicher, an der sich Operand befindet
- bspw.: LDA S (S gibt Adresse im Speicher an)
Indirekte Adressierung (indirect)
- Befehl enthält Adresse, an der dich effektive Adresse mit Inhalt befindet
- bspw.: LDR S (S gibt indirekte Adresse an)
Der Stack
- stellt dynamischen Zwischenspeicher dar
- Grundoperationen: Push, Pop
- Meiste Speicherlayouts (Konventionen) sehen vor:
- wächst von oben nach unten
- wächst von großen zu kleinen Adressen
Stack - PUSH
- erniedrigt Stackpointer
- schiebt einen Wert in Speicherwort, auf das der Stackpointer zeigt
Stack - POP
- liest ein Speicherwort von Adresse auf den der Stackpointer zeigt
- erhöht den Stackpointer
Der Stack im Speicher
- Stackpointer wird auf Adresse am Ende des Speicherbereichs gesetzt
- Programme werden im unteren Speicherbereich platziert
- Programm-Counter auf Adresse 0
- Programmbereich schließt sich nach oben an Datenbereich an
- Zwischen Daten und Stack findet man Heap
Zugriffe auf den Speicher
Unterprogramme
- wichtiges Strukturierungsmittel für Programmierung
- werden mit Sprungbefehl (call, bl) angesprungen
- Nach Verlassen des UP wird ursprüngliches Programm wieder fortgesetzt
- Rücksprung erfolgt indem gespeicherte Adresse wieder in PC übertragen wird
Unterprogramm Aufrufe
Call
- nächster nach der Rückkehr auszuführende Befehl wird auf den Stack gespeichert
- Sprungadresse wird aus IR in PC geladen
Return
- Rücksprungadresse von Stack in PC geschrieben
- fetch-Zyklus lädt neue Instruktion
MU1-Befehlssatz
Micro-Codes
X = Y
- Inhalt des Registers Y wird nach X verschoben
X = [Y]
- Inhalt von Adresse in Y wird nach X verschoben
X = Y op Z
- Inhalt von Y (A-Bus der ALU) wird mit Z (B-Bus der ALU) verrechnet und nach X transportiert
[X] = Y
- In Adresse in X wird Inhalt von Y geschrieben
ACC = Din
- ACC & Din sind Registernamen
- Inhalt von Din wird nach ACC transportiert
- in Din muss oe gesetzt sein, in ACC muss ie gesetzt sein
- Transport über ALU
- ALU Funktion muss B sein
- Da Speicher nicht angesprochen wird (keine [])
- MEMeq=0 und RnW beliebig
Din = [SP]
- Inhalt von SP ist Adressinformation
- Adressmultiplexer muss auf 0 stehen
- Da Speicher angesprochen wird
- MEMrq = 1, RnW = 1
- Da ALU nicht benutzt wird
- ALU-Funktion kann beliebig gesetzt werden
PC = PC + 1
- ALU-Funktion muss A+1 sein
- PC wird auf A-Bus gelegt
- in der zweiten Hälfte des Takts wird Ergebnis in PC geschrieben
- oe und ie von PC müssen 1 sein
Din = [SP], SP = SP+1
- Beide Operationen können in einem Takt durchgeführt werden
- Adressierung in der ersten Takthälfte
- Zurückschreiben in der zweiten Takthälfte
Regeln für MU1
[X] = Dout
- wird in den Speicher geschrieben, muss rechte Seite Dout sein
- MEMrq = 1, RnW = 0
- zu schreibender Wert muss VORHER nach Dout gebracht werden
X = [Y]
- wird vom Speicher gelesen
- linke Seite muss IR oder Din sein
- MEMrq = 1, RnW = 1
keine Adresse
- wird keine Adresse verwendet
- Nur ein Register darf jeweils auf einen Bus schreiben (A- oder B-Bus), aber alle dürfen lesen
Die Addition ADD S
- IR wird zur Adressierung verwender und der Wert nach Din gebracht
- Din = [IR]
- Inhalt des AKK wird auf A-Bus gelegt, Inhalt von Din auf B-Bus
- ALU-Funktion ist A+B, S : ACC = ACC + DIN
Die Operation PUSH
Akkumulator wird auf den Stack geschoben
- Besteht aus 3 Schritten
- Micro-Program-Counter Step wird auf 0 gesetzt
- Fetch-Zyklus schließt sich an
MU1-Zustandsautomat für LDA, ADD, PUSH
- Nach dem Holen des Opcodes im Fetch-Zyklus
- Zustand des OpCode wird angesprungen
- Step-Variable (PC im Micro-Code) wird in Schleife durchlaufen
- endet bei 0 im Fetch-Zyklus
Bedingte Sprünge
- Bedingter Sprung JGE (Jump on greater or equal)
- in Abhängigkeit des Negative-Flags im Statusregisters (~15 Bit des ACC, ACC >=0 oder ACC <0) wird ein unterschiedlicher Zustand angesprungen
- ? N = 0 (ACC >= 0)
- PC = IR
- ? N = 1 (ACC < 0)
- keine Operation wird ausgeführt (NOP)
- ? N = 0 (ACC >= 0)
- in Abhängigkeit des Negative-Flags im Statusregisters (~15 Bit des ACC, ACC >=0 oder ACC <0) wird ein unterschiedlicher Zustand angesprungen
- Bedingter Sprung JNE (_Jump on not equal)
- strukturell gleich, Zusatzbedingung:
- Accumulator = Null (Zero-Flag = 1)
- strukturell gleich, Zusatzbedingung:
MU1-Steuerlogik für bedingte Sprünge
- Beide Befehle weisen 2 Zustände auf
- unterscheiden sich durch Statusbits des Akkumulators
- Beide Zustände haben Schrittnummer 1 und Folgeschritt 0
- Funktion NOP ist gekennzeichnet
- kein Registerinhalt wird verändert
- Alle Register haben oe und ie auf 0
- Speicher wird nicht angesprochen
- MEMrq = 0
- kein Registerinhalt wird verändert
Der Stop-Befehl
Reset
- Zustandsmaschine geht in Zustand reset
- PC = 0
- Step = 0
- Beendigung des Reset-Signals mit dem fetch fortgefahren und Befehl von Adresse 0 wiederholt
Zusammenfassung
- Funktionen ALU
- Neue Register Stackpointer, Din, Dout
- Micro-Programm-Counter Step
- Fetch-Zyklus
- Micro Programm + Micro Codes + Zustandsautomaten für LDA, ADD, Push, JGE, Stop, Reset
- Direkt und indirekte Adressierung
- Stack, Unterprogramme
- Beschreibung der Microcode-Funktion durch einfache Sprache
- Zentrales Register: ACC → Akkumulator-Architektur