Sie sind auf Seite 1von 13

FAKULTÄT FÜR INFORMATIK

TECHNISCHE UNIVERSITÄT MÜNCHEN


Lehrstuhl für Rechnertechnik und Rechnerorganisation
Prof. Dr. Martin Schulz

Einführung in die Rechnerarchitektur


Wintersemester 2019/2020

Zentralübung 7 14.12.–18.12.2020

Mikroprogrammierung

1 Einführung

In den vorangegangenen Übungen haben wir uns mit der Programmierung von Mikroprozes-
soren befasst. Sie haben dabei gelernt, einfache Maschinenbefehle zu verwenden, um daraus
komplexe Programme zu formen. In den nächsten Übungen werden wir ein wenig in einen
Prozessor hineinsehen und lernen, was dieser intern durchgeführt, wenn er die Befehle eines
Maschinenprogramms ausführt. Um das Ganze nicht zu schwierig werden zu lassen, betrachten
wir nicht einen Prozessor der 80x86-Serie, sondern beschränken uns auf einen sehr viel einfa-
cheren Beispielrechner, der – wie Sie feststellen werden – immer noch kompliziert genug ist.
Dieser ist der AM29xx dessen Komponenten in Abbildung 1 zu sehen ist. Eine von-Neumann
Sichtweise auf diesen ist in Abbildung 2 gegeben.

Für Interessierte: Weiterführende Informationen sind in dem dem Heftchen Beschreibung der

mikroprogrammierbaren Maschine“ von W. Karl und R. Wismüller dokumentiert, welches auf
der Webseite zur Vorlesung (Beschreibung der mikroprogrammierbaren Maschine) erhältlich
ist.

2 Leitwerk

Das Leitwerk hat die Aufgabe, die beschriebene Maschinenbefehls-Interpretationsschleife in


Hardware zu realisieren. Das Leitwerk muss dazu die Steuersignale des Hauptspeichers, der
ALU und anderer Teile der Maschine mit einer passenden Folge von Bitmustern belegen, so
dass diese Funktionseinheiten zum rechten Zeitpunkt die ihnen zugewiesenen Operationen (z. B.
Auslesen einer Speicherzelle) ausführen.

Das Leitwerk besteht also im wesentlichen aus einem Mechanismus, der abhängig von bestimm-
ten Eingangssignalen eine Folge von Zuständen (Schritten) durchläuft und dabei eine Folge von
Ausgabesignalen erzeugt.

1
Datenbus

Adreßbus

Instruktionsregister
Befehls− Inkre− 15 8 7 4 3 0
zähler menter OP−Kode Registeradressen
K−MUX
0 A 0 B

Y−MUX

Adresse
Mapping− A−MUX B−MUX
PROM
OE
Ausgang

Adresse Daten D D
MAP
CEM SIO i RAM i A
Hauptspeicher Am2910 QIO i Qi B
CE µ
CC CT Am2901
Am2904
CCEN
Steuerung IN, I OVR F3, OVR
I 0..3 I C, I Z C n+4 ,F=0
MWE
Y I 0..8
I 0..12 C0 Cn Y
MPS

0 1 2 5 6 17 18 21 22 23 28 29 30 31 34 35 36 37 38 39 40 43 44 45 48 49 57 58 73 74 75 79
HS IR Befehls− Branch− Am2910 Status/ MSR Am2904 Am2904 Y− RB RA Am2901 Inter−

KMUX
ASEL
BSEL
CCEN

Konstante
MWE LD zähler Address Befehle Test µ SR Shift CIN MUX ADDR ADDR Befehle rupt
(BAR)
Mikroinstruktionsregister

Abbildung 1: Übersicht der AM29xx mikroprogrammierbaren Maschine.

Datenbus

Adreßbus

Leitwerk
Instruktionsregister
Befehls− Inkre− 15 8 7 4 3 0
zähler menter OP−Kode Registeradressen
K−MUX
0 A 0 B

Y−MUX

Adresse
Mapping− A−MUX B−MUX
PROM
OE
Ausgang

Hauptspeicher Rechenwerk
Adresse Daten D D
MAP
CEM SIO i RAM i A
Hauptspeicher Am2910 QIO i Qi B
CE µ
CC CT Am2901
Am2904
CCEN
Steuerung IN, I OVR F3, OVR
I 0..3 I C, I Z C n+4 ,F=0
MWE Y I 0..8
I 0..12 C0 Cn Y
MPS

0 1 2 5 6 17 18 21 22 23 28 29 30 31 34 35 36 37 38 39 40 43 44 45 48 49 57 58 73 74 75 79
IR Befehls− Branch− Am2910
KMUX
ASEL

HS Inter−
BSEL

Status/ MSR Am2904 Am2904 Y− RB RA Am2901


CCEN

Konstante
MWE LD zähler Address Befehle Test µ SR Shift CIN MUX ADDR ADDR Befehle rupt
(BAR)
Mikroinstruktionsregister

Abbildung 2: Von-Neumann Perspektive auf AM29xx. Es existiert hier kein E/A Werk

2
2.1 Befehlszähler & Makrobefehlszähler

Im Folgenden wollen wir uns näher mit der Interpretationsschleife befassen, die das Maschinen-
programm einer Von-Neumann-Maschine abarbeitet. Die Realisierung dieser Schleife ist eine
der Hauptaufgaben des Leitwerks.

Wie wir gesehen haben, besteht das Programm, das die Maschine ausführen soll, aus einzelnen
Maschinenbefehlen, die im Hauptspeicher abgelegt sind. Die Wirkung dieser Befehle kann in
drei Hauptgruppen eingeteilt werden:

1. Laden von Daten aus dem Hauptspeicher; Ablegen von Daten im Hauptspeicher.
2. Arithmetische und logische Operationen.
3. Fortsetzen der Programmausführung an einer anderen Stelle des Programms (Sprünge).

Daneben gibt es in der Regel noch andere Befehlsgruppen, die jedoch im Moment für unsere
Zwecke nicht wichtig sind.

Das Leitwerk einer Von-Neumann-Maschine besitzt ein spezielles Register, den Befehlszähler
(BZ, engl. PC (program counter ) oder IP (instruction pointer )), das die Hauptspeicheradresse
des als nächstes auszuführenden Befehls enthält. Daneben verfügt es noch über ein sogenanntes
Instruktionsregister (IR), in dem der aktuell auszuführende Befehl selbst gespeichert wird. Der
Befehlszähler sowie das Instruktionsregister sind in Abbildung 1 als Bestandteil vom Leitwerk
gegeben. Das IR enthält also den Inhalt der Hauptspeicherzelle, deren Adresse im Befehlszähler
gespeichert ist (siehe Abbildung 3).
Hauptspeicher Leitwerk

Adresse
0000 F 0 3 1 Befehlszähler (BZ)
0001 1 0 2 8 0 0 0 5
0002 0 5 3 5
0003 A 0 A B
0004 0 0 0 0 Instruktionsregister (IR)
0005 A A 1 5 A A 1 5
0006 0 0 0 0
0007 F F F F
Operanden
0008 1 4 3 1
0009 8 0 3 1
000A 2 0 3 1 Op−Code
000B

Abbildung 3: Hauptspeicher, Befehlszähler und Instruktionsregister

Während des normalen Betriebs der Maschine arbeitet das Leitwerk unentwegt die folgende
Maschinenbefehls-Interpretationsschleife ab:

1. Befehlsholphase (instruction fetch) :


(a) Hole den nächsten Befehl aus den Hauptspeicher in das Instruktionsregister, d. h.
lies den Inhalt der Hauptspeicherzelle, deren Adresse im Befehlszähler steht.

3
FAIL PASS
1) 2) OE
I3 –I0 MNEMO Name Y Y En.
0 JZ Jump Zero 0 0 PL
2 JMAP Jump Map D D MAP
3 CJP Cond Jump PL µPC D PL
14 CONT Continue µPC µPC PL
1): C C E N = 0 (Mnemo: C) and C C = 1
2): C C E N = 1 (Mnemo: PS) or C C = 0

Tabelle 1: (Auswahl an ERA relevanten) Steuerbefehle des Mikroleitwerk AM2910.

(b) Erhöhe den Befehlszähler. Das Erhöhen des Befehlszählers vor der Ausführung des
Befehls ist eine Optimierung, die u.a. dazu dient, den Zugriff auf unmittelbare Ope-
randen (d. h. Operanden die unmittelbar nach dem ersten Befehlswort im Speicher
stehen) zu vereinfachen.

2. Befehlsdekodierphase (instruction decode) :


Analysiere und dekodiere den eben geladenen Maschinenbefehl. Im einfachsten Fall wird
der Befehl dazu zerlegt in:

(a) den Op-Code, der bestimmt, welche Operation der Befehl ausführen soll,
(b) die Spezifikation der Operanden, auf denen die Operation ausgeführt werden soll.

Op-Code ↔ Mikroprogramm Zuordnung: Das zugehörige Mikroprogramm beginnt im


Mikroprogrammspeicher ab der Adresse “Op-Code × 0x10”

3. Befehlsausführungsphase (instruction execution) :


Die durch den Op-Code gegebene Operation wird auf die spezifizierten Operanden ange-
wandt. Bei der Ausführung von Sprungbefehlen kann der Befehlszähler mit einer neuen
Adresse geladen werden, wodurch die Interpretationsschleife nicht wie sonst mit dem im
Hauptspeicher nachfolgenden Befehl fortfährt.

2.2 Mikroprogrammsteuerwerk

Das AM2910 Mikroprogrammsteuerwerk ist über die AM2910 Befehle im Mikroinstruktionsre-


gister programmierbar. Mögliche Befehle sind in Tabelle 1 aufgeführt (lediglich ERA-relevante
Befehle). Diese Befehle können dazu verwendet werden z.B. den nächsten Mikrobefehl aus
dem Mapping-PROM (PROM = Programmable Read-Only Memory = programmierbarer Fest-
wertspeicher) in das Mikroinstruktionsregister zu laden oder an andere Stellen des Mikropro-
gramms zu springen.

2.3 IFETCH

Im folgenden befassen wir uns näher mit der Befehlsholphase sowie der Befehlsdekodierpha-
se. Sie werden durch ein einfaches Mikroprogramm, genannt IFETCH, realisiert. IFETCH
beginnt an der Mikroprogrammspeicheradresse 0 und besteht aus drei Mikroinstruktionen, die
folgendes bewirken:

4
Instruktion Beschreibung
0 a) Der Inhalt des Maschinenbefehlszählers wird auf den Adressbus ausgegeben.
b) Ein Hauptspeicher-Lesezyklus wird gestartet.
1 Die am Datenbus anliegenden Daten werden in das Instruktionsregister geladen.
2 a) Der Inhalt des Maschinenbefehlszählers wird um eins erhöht.
b) Es wird an die Adresse im Mikroprogrammspeicher verzweigt, die das
Mapping-PROM an den Leitwerksbaustein Am2910 ausgibt. Dazu wird der
Adreßfortschaltbefehl JMAP verwendet.

Nach Ausführung der Instruktion 1 liegt der Op-Code des geholten Befehls am Adresseingang
des Mapping-PROMs an. Die so adressierte Speicherzelle im Mapping-PROM enthält die An-
fangsadresse des Mikroprogramms, das den Maschinenbefehl mit diesem Op-Code realisiert.
Dieses Mikroprogramm wird durch JMAP angesprungen.

Das Mapping-PROM bildet also jeden Maschinenbefehl auf ein Mikroprogramm ab, das
für die Ausführung dieses Befehls zuständig ist. All diese Mikroprogramme zusammen
realisieren den noch fehlenden Teil der Maschinenbefehls Interpretationsschleife, nämlich
die Befehlsausführungsphase. Am Ende springen diese Mikroprogramme alle wieder zur
Mikroprogrammspeicher-Adresse 0 und schließen somit die Schleife der Befehlsausführung.

Das dazugehörige Mikroprogramm ist in der folgenden Tabelle gegeben:


74 57 56 55 54 53 52 51 50 49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

BZ_INC*
BZ_ED*

BZ_EA*
BZ_LD*

IR_LD*
DBUS*
ABUS*
KMUX

MWE*
ASEL

BSEL

D11
D10
D9
D8
D7
D6
D5
D4
D3
D2
D1
D0
A3
A2
A1
A0

B3
B2
B1
B0

I12
I11
I2
I1
I0
I5
I4
I3
I8
I7
I6

I3
I2
I1
I0

Y- CIN AM2910
Src Func Dest RA Addr RB Addr Direktdaten
MUX MUX Befehle

IFETCH
000 X X X NOP X X X X H H X CONT X H H H E H R

001 X X X NOP X X X X H H X CONT X H H H H L R

002 X X X NOP X X X X H H X JMAP X H H I H H R

ˆ Die Ausgabe des Maschinenbefehlszählers auf den Adressbus in Schritt 0a wird durch
Setzen von BZ EA (MI 2) auf E realisiert1 .

ˆ Zum Laden des (Maschinen-)Instruktionsregisters in Schritt 1 muss IR LD (MI 1) auf L


gesetzt werden.

ˆ Das Erhöhen des Maschinenbefehlszählers in Schritt 2a erfolgt schließlich einfach durch


Programmierung von BZ IN C (MI 3) auf I.

ˆ Die restlichen Steuerbits sind jeweils auf H zu setzen, um unerwünschte Aktivitäten zu


verhindern.
1
Wir verwenden stets die mnemotechnischen Bezeichnungen, die in der Beschreibung des Mikroinstruktions-
formats definiert sind. Also in diesem Fall E für enable“ statt 0.

5
2.4 Befehlsdekodierung

Bei der MI-Maschine ist die Befehlsdekodierung sehr einfach, da das Befehlsformat fest vor-
gegeben ist: Im ersten Befehlswort enthalten 8 Bits den Op-Code, je 4 Bits (von denen das
höchstwertige allerdings ignoriert wird) bestimmen Quell- und Zielregister des Befehls (siehe
Instruktionsregister in Abb. 1). Zur Befehlsdekodierung muss also nur das erste Befehlswort in
die genannten Felder aufgeteilt werden. Dies geschieht im Instruktionsregister. Zusätzlich muss
noch aus dem Op-Code die Startadresse des Mikroprogramms ermittelt werden, das den Befehl
realisiert. Dafür wird das Mapping-PROM benutzt.

2.5 Laden des nächsten Befehls

Um den Rücksprung zum Mikroprogramm IFETCH zu realisieren, müssen wir den Mikrobe-
fehlszähler mit dem Wert 0 laden. Tabelle 1 der Maschinenbeschreibung zeigt, dass dies z. B.
der Adressfortschaltbefehl JZ leistet. Er löscht zusätzlich den Keller des Am2910, der uns für
die Übung jedoch nicht weiter interessiert.

Eine andere Möglichkeit bietet der Adressfortschaltbefehl CJP, der den Mikrobefehlszähler mit
dem Wert lädt, der am D-Eingang des Am2910 anliegt. Dieser Eingang ist mit dem BAR-Feld
(Branch-Address bzw. Direktdatenfeld, Bits 6..17) des Mikroinstruktionsregisters verbunden,
so dass dieses mit dem Wert 0 zu belegen ist. Tabelle 1 zeigt, dass CJP aber nur dann die
Adresse vom D-Eingang liest, wenn eine PASS Bedingung vorliegt. Wir können diese erzwingen,
indem wir CCEN = P S programmieren. Im weiteren Verlauf von ERA gehen wir davon aus,
dass CCEN standardmäßig auf P S gesetzt ist! (Deshalb wird dieses Feld auf nicht in dem
reduzierten Mikroinstruktionsregister aufgeführt.)

Die Mikroprogrammadresse bei Sprüngen kann in Direktfeld (BAR) angegeben werden.

3 Hauptspeicher

Wir wollen als nächstes den Hauptspeicher genauer betrachten. In Abb. 1 sehen wir, dass der
Hauptspeicher mit dem Prozessor über zwei Busse und eine Steuerleitung verbunden ist:

1. Adressbus. Dies ist vom Hauptspeicher aus gesehen ein Eingang, der die zu adressierende
Speicherzelle bestimmt. In unserem Rechner ist dieser Bus 16 Bit breit, der Hauptspeicher
kann also 65536 Zellen adressieren.

2. Datenbus. Er stellt eine bidirektionale Verbindung zur adressierten Speicherzelle her und
ist bei uns ebenfalls 16 Bit breit.

3. Steuerleitung M W E (Memory-Write-Enable). Ist diese auf W (d. h. 0) gesetzt, wird der


Datenbus als Eingang verwendet, und es kann auf die adressierte Speicherzelle geschrie-
ben werden. Sonst ist der Datenbus ein Ausgang, über den der Inhalt der Speicherzelle
ausgegeben wird.

Bei unserer mikroprogrammierbaren Maschine ist eine Hauptspeicherzelle 16 Bit breit. Übliche
Mikroprozessoren verwenden dagegen 8 Bit breite Speicherzellen.

6
ALU–Quell–
Mikrokode
operanden
Mnemo
Oktal–
I2 I1 I0 R S
wert
AQ 0 0 0 0 A Q
AB 0 0 1 1 A B
ZQ 0 1 0 2 0 Q
ZB 0 1 1 3 0 B
ZA 1 0 0 4 0 A
DA 1 0 1 5 D A
DQ 1 1 0 6 D Q
DZ 1 1 1 7 D 0

Tabelle 2: ALU Quelloperandensteuerung.

Verwechseln Sie dies bitte nicht mit der Breite des Datenbusses, die bei modernen Prozessoren
meist 64 Bit beträgt. Trotzdem hat bei diesen jedes einzelne Byte (= 8 Bit) eine eigene Adresse
im Speicher, während der Speicher der mikroprogrammierbaren Maschine nur in Einheiten von
16 Bits adressiert werden kann.

Bei jedem Speicherzugriff ist das Zugriffsprotokoll genau einzuhalten. Es legt die zeitliche Ab-
folge fest, in der Busse und Steuersignale zu belegen sind. Bei der ERA-Maschine ist dieses
Protokoll so festgelegt:

Lesezugriff: Zunächst muß die Adresse am Adressbus anliegen und M W E auf R (d.h. 1)
gesetzt werden. Einen Takt (d.h. eine Mikroinstruktion) später liegen die Daten am Da-
tenbus an.
Schreibzugriff: Zunächst muß die Adresse am Adressbus anliegen und M W E auf W gesetzt
werden. Im nächsten Takt müssen die Daten an den Datenbus gelegt und M W E wieder
auf R gesetzt werden.

. Vielleicht ist Ihnen bei unserem Hauptspeicher eine Besonderheit aufgefallen: er besitzt laut
Abb. 1 kein Freigabesignal. Woher weiß der Speicher dann aber, ob wir überhaupt einen Zugriff
durchführen wollen? Die Antwort ist einfach: Das Freigabesignal ist lediglich in Abb. 1 nicht
eingezeichnet. Es wird von der Hardware automatisch erzeugt, wenn wir eine Adresse an den
Adressbus durchschalten.

4 Rechenwerk

4.1 Statuswerk AM2904

Der Vollständigkeit halber soll hier noch das Statuswerk AM2904 erwähnt sein welches zumin-
dest im weiteren Verlauf von ERA keine Rolle spielt.

4.2 Rechenwerk AM2901

Das Rechenwerk ist in Abbildung 4 gegeben. Dies kann über die I0-I8 Bits des Maschinenbefehls
programmiert werden:

7
RAM−Schiebeeinheit
RAM 0 RAM 3

Dateneingang
Q0 Q3
RAM Q−Schiebe−
16 adressierbare einheit
Register
Register
Adresse A A−Adresse F Q’
Register Q Register
Adresse B B−Adresse Daten− Daten−
Ausgang A Ausgang B Q

"0"
Daten−
Eingang D

D A B 0 Q
ALU−Quelloperanden
Auswahl
R S

R S G
P
Arithmetisch/logische Cn+4
CARRY IN Cn Einheit F 3 (SIGN)
ALU OVERFLOW
F F=0

A F
Auswahl Ausgabedaten
Y

57 56 55 54 53 52 51 50 49

...... I2 I1 I0 I5 I4 I3 I8 I7 I6 ......

Am2901 Befehle

Abbildung 4: Rechenwerk der AM29xx mikroprogrammierbaren Maschine.

8
Mikrokode
ALU
Mnemo Oktal– Symbol
I5 I4 I3 Funktion
wert
ADD 0 0 0 0 R Plus S R+S
SUBR 0 0 1 1 S Minus R S−R
SUBS 0 1 0 2 R Minus S R−S
OR 0 1 1 3 R OR S R∨S
AND 1 0 0 4 R AND S R∧S
NOTRS 1 0 1 5 R AND S R∧ S
EXOR 1 1 0 6 R XOR S R⊕S
EXNOR 1 1 1 7 R XNOR S R⊕S

Tabelle 3: ALU Funktionssteuerung.

RAM Q-Reg.
Mikrokode
Funktion Funktion Y
Mnemo
Oktal– Ausgang
I8 I7 I6 Laden Laden
wert
QREG 0 0 0 0 NONE F→ Q F
NOP 0 0 1 1 NONE NONE F
RAMA 0 1 0 2 F→ B NONE A
RAMF 0 1 1 3 F→ B NONE F

Tabelle 4: ALU Zielsteuerung.

ˆ Die Quelloperandensteuerung erfolgt über die Befehle in Tabelle 2.

ˆ Die arithmetische Funktionssteuerung erfolgt über die Befehle in Tabelle 3.


Achtung Nr. 1: Richtiges Setzen vom Übertragseingang C0 (Statuswerk) zu Cn (Rechen-
werk) nötig. Kein Übertrag: CIN=C0, Übertrag: CIN=C1.
Achtung Nr. 2: Bei SUB Befehlen muss Carry In gesetzt sein, da ansonsten nur Einer-
komplement gerechnet wird.

ˆ Die Zielsteuerung zur Ausgabe der Ergebnisse kann über die Befehle in 4 programmiert
werden.

4.3 Die Rechenwerks-Register

Wie Abb. 4 zeigt, besteht das Rechenwerk unseres ERA-Rechners im wesentlichen aus 17 Re-
gistern und einer arithmetisch-logischen Einheit (ALU), die das eigentliche Rechnen erledigt.
Wir werden uns im Folgenden auf die Register konzentrieren und die ALU zunächst nur soweit
betrachten, wie wir es für Datentransporte benötigen.

. Oft wird die Abkürzung ALU als Synonym für das ganze Rechenwerk gebraucht. Man
spricht daher auch manchmal von ALU-Registern.

Der Rechenwerksbaustein Am2901 enthält 16 adressierbare Register sowie das als Hilfsregister
verwendbare Q-Register. Zu jedem Zeitpunkt können über die Adresseingänge A und B des
Am2901 jeweils zwei der 16 Register ausgewählt werden, die dann als Quell- bzw. Zieloperand
von ALU-Operationen dienen können.

In Abb. 1 sehen wir, dass diese Adresseingänge über die beiden Multiplexer A-MUX
und B-MUX unabhängig voneinander entweder an das Mikroinstruktionsregister oder das
(Maschinen-)Instruktionsregister geschaltet werden können. Das heißt, daß ein Rechenwerks-

9
Register entweder fest durch eine Mikroinstruktion ausgewählt werden kann, oder aber durch
den gerade interpretierten Maschinenbefehl. Dadurch wird es möglich, Maschinenbefehle zu
realisieren, die mit einem (oder zwei) vom Maschinenprogrammierer bestimmten Register(n)
arbeiten, ohne dass für jedes mögliche Register ein eigenes Mikroprogramm geschrieben wer-
den muss. Wir haben hier also einen einfachen, in Hardware realisierten Mechanismus zur
Parameterübergabe vor uns, wie er analog auch beim Aufruf von Funktionen in höheren Pro-
grammiersprachen verwendet wird.

. Zur Vereinfachung wird in den Beschreibungen der Maschinenbefehle in den Übungs-,


Klausur- und Praktikumsaufgaben von RA bzw. RB gesprochen, wobei dies jeweils das durch

das Registeradressfeld A (bzw. B) des Maschinenbefehlswortes im Instruktionsregister adressier-
te Rechenwerks-Register“ bedeutet. Register mit fest vorgegebener Nummer werden dagegen
stets mit r0 ... r15 bezeichnet.

Beachten Sie, dass im (Maschinen-)Instruktionsregister das höchstwertige Bit der Registeradres-


sen fest auf den Wert 0 verschaltet ist, so dass ein Maschinenprogrammierer nur die Register 0-7
adressieren kann. Manchmal ist es in einem Mikroprogramm notwendig, temporäre Daten zwi-
schenzuspeichern. Die vom Maschinenprogrammierer verwendbaren Register können dazu nicht
benutzt werden, da die Ausführung des Mikroprogramms sonst unerwartete Nebeneffekte hätte,
nämlich das Verändern eines unbeteiligten“ Registers. Sie würden als Maschinenprogrammie-

rer sicher nicht erwarten, dass z. B. ein Befehl ADD r1,r2 auch das Register 5 verändert.
Durch die Einschränkung in der ERA-Maschine kann der Mikroprogrammierer die Register
8 bis 15 für eigene Zwecke verwenden. Darüber hinaus können sie auch zur Realisierung von
Spezialregistern (z. B. einem Kellerzeiger) verwendet werden.

4.4 Die Datenpfade im Prozessor

Wir haben nun die Endpunkte für unsere Datentransporte (Hauptspeicher, Rechenwerks-
Register) kennengelernt. Es bleibt also nur noch die Frage zu klären, wie Daten zwischen diesen
Endpunkten transportiert werden können, d.h. welche Datenpfade es gibt und wie sie gesteuert
werden.

Im ERA-Rechner werden zwei verschiedene Arten von schaltbaren Datenpfaden verwendet:


Tri-State Busse (z.B. Adress- und Datenbus) und Multiplexer (z.B. A-MUX, K-MUX).

Einheit 1 Einheit 3

S=0 0 1
MUX
Einheit 1 Einheit 2 Einheit 3

LD2 = 0
Einheit 2
OE1 = 0 LD2 = 0 OE3 = 1

a) Tri−State Bus b) Multiplexer

Abbildung 5: Geschaltete Datenpfade

An einem Bus sind mehrere Datenquellen und -senken parallel geschaltet, wobei jede Daten-

10
quelle nur dann Daten auf den Bus ausgibt, wenn ihre Steuerleitung output enable“ (OE)

aktiviert ist (siehe Abb. 5a). Analog hat jede Datensenke ein Übernahmebit load“ (LD), das

die Übernahme der am Bus anliegenden Daten anfordert. Bei der Mikroprogrammierung ist
darauf zu achten, dass maximal eine Quelle Daten auf den Bus legen darf. Dagegen können
durchaus mehrere Einheiten gleichzeitig Daten vom Bus lesen.

Der Adressbus und der Datenbus sind die beiden wichtigsten Datenpfade des ERA-Rechners.
Sie sind zum einen mit dem Hauptspeicher verbunden, zum anderen mit Einheiten des Leitwerks
und des Rechenwerks. Der Zugang der einzelnen Einheiten zum Bus wird über Steuerbits im
Mikroinstruktionsregister freigegeben oder gesperrt.

ˆ Die folgenden Komponenten können eine Adresse an den Adressbus legen:


1. Befehlszähler, durch BZ EA (MI 2) = E
2. Rechenwerksbaustein Am2901, durch ABU S (MI 38) = AB
ˆ Vom Adressbus kann lediglich der Hauptspeicher eine Adresse lesen. Die Übernahme der
Adresse kann dabei nicht durch ein Steuerbit verhindert werden.
ˆ Diese Komponenten können Daten an den Datenbus anlegen:
1. Der Hauptspeicher. Durch das versteckte Freigabesignal erfolgt eine Ausgabe auf
den Bus nur dann, wenn im Takt vorher eine Adresse auf den Adressbus gelegt und
M W E (MI 0) = R gesetzt wurde.
2. Befehlszähler, durch BZ ED (MI 4) = E
3. Rechenwerksbaustein Am2901, durch DBU S (MI 37) = DB
ˆ Vom Datenbus können folgende Komponenten Daten empfangen:
1. Der Hauptspeicher. Er liest nur dann Daten vom Bus, wenn im Takt vorher eine
Adresse auf den Adressbus gelegt und M W E (MI 0) = W gesetzt wurde.
2. Befehlszähler, durch BZ LD (MI 5) = L
3. Rechenwerksbaustein Am2901, durch KM U X (MI 74) = D
4. Instruktionsregister, durch IR LD (MI 1) = L
ˆ Die zur Steuerung verantwortlichen Bits des Mikroinstruktionsformats sind oben jeweils
mit angegeben.

An einen Multiplexer sind Datenquellen und -senken mit getrennten Leitungen angeschlossen
(siehe Abb. 5b). Der Multiplexer selbst ist ein Schaltnetz, das jeweils einen der Dateneingänge
zum Ausgang durchschaltet (bzw. umgekehrt einen einzigen Eingang wahlweise mit einem von
mehreren Ausgängen verbindet; man spricht dann auch von einem Demultiplexer). Welcher
Eingang des Multiplexers mit dem Ausgang verbunden wird, wird durch ein oder mehrere
Steuerbits festgelegt.

Aus Abb. 1 ist zu erkennen, dass es einen Datenpfad vom Datenbus zum D-Eingang des Re-
chenwerksbausteins Am2901 gibt, sowie einen Datenpfad vom Y-Ausgang des Am2901 zum
Adressbus und zum Datenbus. Diese Datenpfade können durch entsprechende Steuerung der
Multiplexer K-MUX und Y-MUX durchgeschaltet werden. Für unsere Datentransport-Befehle
stellen sich also nur noch zwei Fragen:

1. Wie schreibt man die am D-Eingang des Am2901 liegenden Daten in eines der Register?
2. Wie transportiert man den Inhalt eines Registers zum Y-Ausgang des Am2901?

11
4.5 Speichern von Daten in ein Rechenwerks-Register

Abb. 4 zeigt, dass es keine andere Möglichkeit gibt, Daten vom D-Eingang in ein Register zu
transportieren als über die ALU und die RAM-Schiebeeinheit. Tab. 4 zeigt uns, dass wir die
am F-Ausgang der ALU liegenden Daten in ein Register schreiben können, falls wir die ALU-
Zielsteuerung mit dem Bitmuster RAMA oder RAMF programmieren. Dabei muss die Nummer
des Zielregisters an den B-Adresseingang des Am2901 angelegt werden.

Es muss also lediglich noch die ALU so programmiert werden, dass sie die Daten vom D-
Eingang unverändert an den F-Ausgang weitergibt. Das kann erreicht werden, indem man z.B.
eine Addition mit 0 oder eine Oder-Verknüpfung mit 0 durchführt.

4.6 Ausgabe eines Rechenwerks-Registers

Ein erneuter Blick auf Abb. 4 zeigt, dass es prinzipiell zwei Möglichkeiten gibt, den Inhalt eines
Registers an den Y-Ausgang durchzuschalten:

1. Wenn man das Register über den A-Adresseingang des Am2901 adressiert, liegt sein
Inhalt am Datenausgang A der Registereinheit und somit auch am A-Eingang des
Ausgabedaten-Multiplexers im Am2901 an. Dieser Eingang kann durch Programmieren
der ALU-Zielsteuerung auf RAMA (siehe Tab. 4) an den Y-Ausgang durchgeschaltet
werden.

2. Eine weitere Möglichkeit ist, den Wert wiederum durch die ALU zu schleusen. Dazu ist
die ALU wieder so zu programmieren (z.B. Addition / Oder-Verknüpfung mit 0), dass sie
den Wert nicht verändert. Das Ergebnis der Verknüpfung liegt am F-Ausgang der ALU
und somit am F-Eingang des Ausgabedaten-Multiplexers an. Dieser Eingang kann durch
Setzen der ALU-Zielsteuerungs-Bits auf NOP bzw. RAMF (siehe Tab. 4) zum Y-Ausgang
durchgeschaltet werden.

Beim Ausgeben eines Registerinhalts an den Y-Ausgang des Am2901 ist Folgendes zu beachten:
Wird die ALU-Zielsteuerung mit RAMA oder RAMF programmiert, so schreibt der Am2901
das Ergebnis der ALU-Operation auch immer in das Register, das durch den B-Adresseingang
adressiert ist. Das kann zur unerwünschten Veränderung eines Registerinhalts führen.

Aufgaben

Aufgabe 7.1

Erstellen Sie ein Mikroprogramm, das den Befehl MVI imm,RB realisiert. Achtung: Hier ist
der letzte Operand der Zieloperand! Dieser Befehl hat einen unmittelbaren 16 Bit Operanden
(imm) welcher direkt nach dem Maschinenbefehl steht und einen Registeroperanden (RB).
Er lädt den Wert des unmittelbaren Operanden in das angegebene Register. Der unmittelba-
re Operand ist dabei eine 16-Bit Zahl, die im Hauptspeicher unmittelbar auf das eigentliche
Befehlswort folgt. Die Nummer des Zielregisters (0 ... 7) ist im Registeradressfeld B des Be-
fehlsworts codiert. Achten Sie darauf, dass der Befehlszähler im Anschluss auf den nächsten
Befehl verweist und nicht auf die immediate Werte.

12
Aufgabe 7.2

Erstellen Sie ein Mikroprogramm, das den Befehl STR RA,[RB] realisiert. Der Befehl hat
einen Register- und einen Speicheroperanden. Er speichert den Inhalt von RA in eine Haupt-
speicherzelle (Zur Erinnerung: RA ist das Register, das durch Registeradressfeld A des Be-
fehlsworts adressiert wird). Die Adresse dieser Speicherzelle steht in RB (also dem Register,
dessen Nummer im Registeradressfeld B des Befehlsworts steht).

Aufgabe 7.3

Dem Befehl MVI imm,RB sei nun der Op-Code 1 zugeordnet, dem Befehl STR RA,[RB]
der Op-Code 2.

a) Welche Werte müssen demnach in die Speicherzellen 1 und 2 des Mapping-PROMs pro-
grammiert werden?

b) Der Hauptspeicher der Maschine sei mit folgendem Maschinenprogramm belegt:


Adresse Inhalt (hex.)
10 0102
11 0123
12 0100
13 0220
14 0220
15 0123
16 0100
17 0203
Der Maschinenbefehlszähler habe initial den Wert 10. Versuchen Sie, die internen Abläufe
in der mikroprogrammierbaren Maschine bei der Ausführung dieses Maschinenprogramms
nachzuvollziehen.
Welche Register und Speicherzellen werden von dem Programm verändert und welche
Werte besitzen Sie am Ende?
Wie würde das Programmstück in Assemblerschreibweise aussehen?

13