MPR Projekt 9 - Entwicklerdokumentation

 

Gliederung

  1. Implementierung der Befehle
    1. Der MOVE-Befehl
    2. Der DEC-Befehl
    3. Der CMP-Befehl
    4. Der SCF-Befehl
    5. Der RLC-Befehl
    6. Der JMPNC-Befehl
  2. Optimierungsmöglichkeiten


Projektüberblick MPR Frames anzeigen
Zurück zur Homepage

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.



Projektüberblick MPR Frames anzeigen Zum Seitenanfang
Zurück zur Homepage

MOVE IMM RB Opcode: F4

F40
  1. 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
  1. Die Konstante aus dem Hauptspeicher wird vom Datenbus über den D-Eingang als Quelloperand R in die ALU eingelesen.
  2. 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.
  3. 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.
  4. 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.
  5. Sowohl das Maschinen- als auch das Mikrostatusregister sind während dieser ALU - Operation schreibgeschützt.
  6. Der Befehlszähler wird inkrementiert. 
  7. 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.



Projektüberblick MPR Frames anzeigen Zum Seitenanfang
Zurück zur Homepage

DEC RB Opcode: 44

440
  1. 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.
  2. 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.
  3. Sowohl das Maschinen- als auch das Mikrostatusregister sind während dieser ALU - Operation schreibgeschützt.
  4. 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. 



Projektüberblick MPR Frames anzeigen Zum Seitenanfang
Zurück zur Homepage

CMP IMM RB Opcode: 30

300
  1. 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. 
  2. Der Inhalt des Maschinenstatusregisters wird gelöscht.
301
  1. Die Konstante aus dem Hauptspeicher wird über den Datenbus und den D-Eingang als Quelloperand R an die ALU übergeben.
  2. Als Zielregister wird in RB rD angegeben.
  3. 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.
  4. Das Ergebnis der ALU - Operation wird unverändert im Register  rD abgespeichert. Dazu wird die Zielsteuerung DEST auf RAMA gesetzt.
  5. Sowohl das Maschinen- als auch das Mikrostatusregister sind während dieser ALU - Operation schreibgeschützt.
  6. Der Befehlszähler wird inkrementiert. 
302
  1. 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.
  2. Im Feld RA der Mikroinstruktion wird rD als zweiter Operand angegeben.
  3. Das CarryIn wird  auf 1 gesetzt.
  4. 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.
  5. Die Flags im Maschinenstatusregister werden gesetzt. Der Bedingungscode wird dabei auf 38h gesetzt, so daß das Carry negiert gespeichert wird. 
  6. 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. 



Projektüberblick MPR Frames anzeigen Zum Seitenanfang
Zurück zur Homepage

SCF Opcode: F5

F50
  1. Die Konstante FFFFh aus dem Konstantenfeld des  Mikroinstruktionsregisters wird über den Datenbus und den D-Eingang als Quelloperand R an die ALU übergeben.
  2. Als Zielregister wird inRB rD angegeben.
  3. 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.
  4. 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.
  5. Sowohl das Maschinen- als auch das Mikrostatusregister sind während dieser ALU - Operation schreibgeschützt.
  6. 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.



Projektüberblick MPR Frames anzeigen Zum Seitenanfang
Zurück zur Homepage

RLC RB Opcode: 64

640
  1. 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.
  2. 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.
  3. 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
  4. Der Schreibschutz für das Maschinenstatusregister ist aufgehoben.
  5. 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.



Projektüberblick MPR Frames anzeigen Zum Seitenanfang
Zurück zur Homepage

JMPNC IMM Opcode: 8d

8D0
  1. 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.
  2. Das Sprungziel ist als Konstante im BAR angegeben, ihr Wert ist 8D2.
Carry-Flag = 1
8D1
  1. Der Befehlszähler wird inkrementiert.
  2. Mittels JZ erfolgt der Sprung in das Mikroprogramm IFetch.
Carry-Flag = 0
8D2
  1. 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
  1. Den Wert (die Speicheradresse) aus dem Hauptspeicher über den Datenbus in den Befehlszähler einlesen. Dazu wird BZ_LD auf L gesetzt.
  2. Mittels JZ erfolgt der Sprung in das Mikroprogramm IFETCH.


Projektüberblick MPR Frames anzeigen Zum Seitenanfang
Zurück zur Homepage

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 %


Projektüberblick MPR Frames anzeigen Zum Seitenanfang
Zurück zur Homepage