MPR Projekt 9 - Entwicklerdokumentation
Gliederung
- Implementierung der Befehle
- Der MOVE-Befehl
- Der DEC-Befehl
- Der CMP-Befehl
- Der SCF-Befehl
- Der RLC-Befehl
- Der JMPNC-Befehl
- Optimierungsmöglichkeiten
Implementierung der Befehle
Die Implementierung der Befehle und deren Test erfolgte ausschließlich mit dem Simulationsprogramm der mikroprogrammierbaren Maschine MIC (Version 5.2) auf eigenen Rechnern. Die Funktion
der einzelnen Befehle ist in der Benutzerdokumentation ausführlich beschrieben.
MOVE IMM RB
Opcode: F4
F40 |
- Die Konstante wird im Hauptspeicher adressiert. Die Speicheradresse befindet sich als Folgeadresse im Befehlszähler. Durch setzen des
Kontrollbits
BZ_EA auf E wird sein Inhalt auf den Adreßbus ausgegeben Das Datum ist aber erst im nächsten Takt
verfügbar, da der Hauptspeicher es erst dann auf den Datenbus legt.
|
F41 |
- Die Konstante aus dem Hauptspeicher wird vom Datenbus über den D-Eingang als Quelloperand R in die ALU eingelesen.
- Das in
RB bezeichnete Register (die Adresse von RB liegt im Instruktionsregister) wird als Zielregister für die
ALU-Operation verwendet, dazu wird BSEL auf IR gesetzt.
- Im Feld Quelloperandensteuerung wird
DZ für die Operanden Herkunft angegeben. Die Beiden Operanden werden mittels der Operation
ADD verknüpft.
Der Wert der Konstanten wird, durch die damit erfolgende Addition mit Null nicht verändert.
- Das Ergebnis der ALU - Operation wird unverändert in das Register geschrieben, das in in
RB bezeichnet ist. Dazu wird die
Zielsteuerung DEST auf RAMA gesetzt.
- Sowohl das Maschinen- als auch das Mikrostatusregister sind während dieser ALU - Operation schreibgeschützt.
- Der Befehlszähler wird inkrementiert.
- Mittels
JZ erfolgt der Sprung in das Mikroprogramm IFetch.
|
Bemerkung: Angegeben wurde als Opcode eigentlich 00. Da aber an dieser Stelle eigentlich das Mikroprogramm IFetch steht, wurde der Opcode
in Absprache mit dem Betreuer auf F4 geändert.
DEC RB
Opcode: 44
440 |
- Als Quelloperandenherkunft für die wird
ZB angegeben. Im Feld BSEL wird IR angegeben, damit wird die
Adresse für das Register RB aus dem Instruktionsregister entnommen. Das Register RB wird als Quelloperand S in
die ALU geladen.
- Mittels
SUBR wird nun die Differenz zwischen B und 0 (am R-Eingang) mit CarryIn = 0 gebildet. Das Ergebnis in das
Register geschrieben das in RB adressiert ist.
- Sowohl das Maschinen- als auch das Mikrostatusregister sind während dieser ALU - Operation schreibgeschützt.
- Mittels
JZ erfolgt der Sprung in das Mikroprogramm IFetch.
|
Bemerkung: Es ist natürlich ebenso möglich, bei der Subtraktion, statt 0 als zweiten Operanden 1 anzugeben und das CarryIn auf 1
zu setzen. Der zweite Operand müßte dann als Konstante angegeben und über den Datenbus eingelesen werden. Dafür würde aber
ein Takt mehr benötigt werden, da es nicht möglich ist den D Eingang der ALU mit einem Register zu verknüpfen das in RB angegeben
ist.
CMP IMM RB
Opcode: 30
300 |
- Die Konstante wird im Hauptspeicher adressiert. Die Speicheradresse befindet sich als Folgeadresse im Befehlszähler. Durch setzen des
Kontrollbits
BZ_EA auf
E wird sein Inhalt auf den Adreßbus ausgegeben Das Datum ist aber erst im nächsten Takt verfügbar, da der Hauptspeicher
es erst dann auf den Datenbus legt.
- Der Inhalt des Maschinenstatusregisters wird gelöscht.
|
301 |
- Die Konstante aus dem Hauptspeicher wird über den Datenbus und den D-Eingang als Quelloperand R an die ALU übergeben.
- Als Zielregister wird in
RB rD angegeben.
- Im Feld Quelloperandensteuerung wird
DZ für die Operanden Herkunft angegeben. Die Beiden Operanden werden mittels der Operation
ADD verknüpft. Der Wert der Konstanten wird, durch die damit erfolgende Addition mit Null nicht verändert.
- Das Ergebnis der ALU - Operation wird unverändert im Register
rD abgespeichert. Dazu wird die Zielsteuerung
DEST auf RAMA gesetzt.
- Sowohl das Maschinen- als auch das Mikrostatusregister sind während dieser ALU - Operation schreibgeschützt.
- Der Befehlszähler wird inkrementiert.
|
302 |
- Als Quelloperandenherkunft für die ALU - Operation wird
AB angegeben. Im Feld BSEL wird IR angegeben,
damit wird die Adresse für das Register RB aus dem Instruktionsregister entnommen. Das Register RB wird als
Quelloperand S in die ALU geladen.
- Im Feld
RA der Mikroinstruktion wird rD als zweiter Operand angegeben.
- Das CarryIn wird auf 1 gesetzt.
- Nun wird mittels
SUBR der Wert aus rD von dem Wert aus dem Register RB subtrahiert. Damit das Ergebnis
nicht zurückgeschrieben wird, wird in der Zielsteuerung NOP angegeben.
- Die Flags im Maschinenstatusregister werden gesetzt. Der Bedingungscode wird dabei auf
38h gesetzt, so daß das Carry negiert
gespeichert wird.
- Mittels
JZ erfolgt der Sprung in das Mikroprogramm IFetch.
|
Bemerkung: bei einer Subtraktion A - B, bei welcher der Operand A größer oder gleich dem Operanden B, wird im
Maschinenstatusregister das Carry Flag gesetzt. Laut Vorgabe für den Befehl CMP
soll das Carry Flag aber gesetzt werden, wenn gilt,
daß A kleiner B ist. Daher muß das Carry Flag negiert abgespeichert werden. Die Alternative würde darin bestehen das Carry Flag
manuell zu manipulieren, was aber einen zusätzlichen Takt kosten würde.
SCF
Opcode: F5
F50 |
- Die Konstante
FFFFh aus dem Konstantenfeld des Mikroinstruktionsregisters wird über den Datenbus und den D-Eingang als
Quelloperand R an die ALU übergeben.
- Als Zielregister wird in
RB rD angegeben.
- Im Feld Quelloperandensteuerung wird
DZ für die Operanden Herkunft angegeben. Die Beiden Operanden werden mittels der Operation
ADD verknüpft. Der Wert der Konstanten wird, durch die damit erfolgende Addition mit Null nicht verändert.
- Mittels
RAMU wird das Ergebniss dieser Operation um ein Bit nach links geschoben. In dem Feld für die Schiebesteuerung
SHCRTL wird als Code LSCRIO angegeben, so daß das MSB der Konstante (also 1) in das Carry geschoben
wird.
- Sowohl das Maschinen- als auch das Mikrostatusregister sind während dieser ALU - Operation schreibgeschützt.
- Mittels
JZ erfolgt der Sprung in das Mikroprogramm IFetch.
|
Bemerkung: Es wurden für diesen Befehl keine genauen Angaben darüber gemacht, ob im Maschinenstatusregister andere Flags als das
Carry gesetzt werden sollen oder nicht. Wir haben uns dafür entschieden, nur das Carry Flag zu setzen und die anderen Flags nicht zu
verändern. Da das Carry-Flag im Maschinenstatusregister nicht direkt manipuliert werden kann, muß man den Umweg über die
Schiebeoperation gehen. Alternativ bestünde die Möglichkeit, den Inhalt des Maschinenstatusregisters in das Mikrostatusregister zu
laden. Nachdem dort das Carry gesetzt wurde, müßte der Inhalt des Mikrostatusregisters in das Maschinenstatusregister
zurückgeschrieben werden. Dieses Verfahren nimmt allerdings 3 Takte in Anspruch.
RLC RB
Opcode: 64
640 |
- Im Feld
BSEL wird IR angegeben, damit wird die Adresse für das Register RB aus dem
Instruktionsregister entnommen. Das Register RB wird als Quell
operand S in die ALU geladen.
- Im Feld Quelloperandensteuerung wird
BZ für die Operanden Herkunft angegeben. Die Beiden Operanden werden mittels der Operation
ADD verknüpft. Der Wert der Konstanten wird, durch die damit erfolgende Addition mit Null nicht verändert.
- Mittels
RAMU wird das Ergebnis dieser Operation um ein Bit nach links geschoben. In dem Feld für die Schiebesteuerung
SHCRTL wird als Code LSCRIO angegeben, so daß über das Carry rotiert wird
- Der Schreibschutz für das Maschinenstatusregister ist aufgehoben.
- Mittels
JZ erfolgt der Sprung in das Mikroprogramm IFetch.
|
Bemerkung: Es wurden für diesen Befehl keine genauen Angaben darüber gemacht, ob im Maschinenstatusregister andere Flags als das
Carry gesetzt werden sollen oder nicht. In der konkreten Implementierung werden diese Flags gesetzt, da sie von nachfolgenden Befehlen (z.B. Bedingte
Sprünge) durchaus sinnvoll genutzt werden können.
JMPNC IMM
Opcode: 8d
8D0 |
- Mittels
CJP erfolgt ein bedingter Sprung wenn das Carry - Bit nicht gesetzt ist. Dazu muß das Bit CCEN auf
C gesetzt werden und als Conditioncode ist im Feld SRTEST 2A anzugeben.
- Das Sprungziel ist als Konstante im BAR angegeben, ihr Wert ist
8D2 .
|
Carry-Flag = 1 |
8D1 |
- Der Befehlszähler wird inkrementiert.
- Mittels
JZ erfolgt der Sprung in das Mikroprogramm IFetch.
|
Carry-Flag = 0 |
8D2 |
- Die Konstante wird im Hauptspeicher adressiert. Die Speicheradresse befindet sich als Folgeadresse im Befehlszähler. Durch setzen des
Kontrollbits
BZ_EA auf
E wird sein Inhalt auf den Adreßbus ausgegeben Das Datum ist aber erst im nächsten Takt verfügbar, da der Hauptspeicher
es erst dann auf den Datenbus legt.
|
8D3 |
- Den Wert (die Speicheradresse) aus dem Hauptspeicher über den Datenbus in den Befehlszähler einlesen. Dazu wird
BZ_LD auf
L gesetzt.
- Mittels
JZ erfolgt der Sprung in das Mikroprogramm IFETCH .
|
Optimierungsmöglichkeiten
Eine einfache und effiziente Optimierungsmöglichkeit würde darin bestehen, das jedes Mikroprogramm das IFETCH - Mikroprogramm selbst
implementiert. Dies liegt darin begründet, daß sich die Ausführung bei einigen der Befehlen teilweise parallelisieren
läßt. Für die von uns implementierten Befehle ergeben sich die folgenden Ausführungszeiten:
Befehl |
Ausführungszeit mit |
IFETCH Aufruf |
eigenem Inst.-Fetch |
MOVE |
5 Taktzyklen |
5 Taktzyklen |
DEC |
4 Taktzyklen |
3 Taktzyklen |
CMP |
6 Taktzyklen |
5 Taktzyklen |
SCF |
4 Taktzyklen |
3 Taktzyklen |
RLC |
4 Taktzyklen |
3 Taktzyklen |
JMPNC |
6-5 Taktzyklen |
6-5 Taktzyklen |
Der Befehl CMP ließe sich darüber hinaus dadurch beschleunigen, das man das dst Register nicht RB sondern in RA angibt. Die Ursache
hierfür ist das sich der D-Eingang und ein in RA angegebenes Register mittels einer ALU-Operation miteinander verknüpfen lassen, der
D-Eingang und ein in RB angegebenes Register aber nicht. Im zweiten Fall muß der Operand der am D-Eingang anliegt erst in einem Register
zwischengespeichert werden bevor die ALU-Operation ausgeführt werden kann. Dies kostet einen zusätzlichen Takt. Allerdings hat diese
Methode den Nachteil eines uneinheitlichen Befehlsformates in Bezug auf die Adressierungen.
Befehl |
Ausführungszeit mit |
RB als Ziel |
RA als Ziel |
CMP |
6 Taktzyklen |
5 Taktzyklen |
Leider lassen sich die die beiden Optimierungsmöglichkeiten für den CMP Befehl nicht kombinieren, für die Befehle könnten sich
durch die Optimierungen folgende Leistungsverbesserungen ergeben:
Befehl |
Ausführungszeit |
Zeitgewinn
in Prozent |
unoptimiert |
optimiert |
MOVE |
5 Taktzyklen |
5 Taktzyklen |
0 % |
DEC |
4 Taktzyklen |
3 Taktzyklen |
33 % |
CMP |
6 Taktzyklen |
5 Taktzyklen |
20 % |
SCF |
4 Taktzyklen |
3 Taktzyklen |
33 % |
RLC |
4 Taktzyklen |
3 Taktzyklen |
33 % |
JMPNC |
6-5 Taktzyklen |
6-5 Taktzyklen |
0 % |