MPR Projekt 9 - Spezifikation
Gliederung
- Zielplattform
- Arbeitsumgebung
- Hilfsmittel
- Spezifikation der Befehle
- Der MOVE-Befehl
- Der DEC-Befehl
- Der CMP-Befehl
- Der SCF-Befehl
- Der RLC-Befehl
- Der JMPNC-Befehl
- Das BSCANF-Programm
Zielplattform
Aufbau des mikroprogrammierbaren TGI Rechners
Der mikroprogrammierte Rechner besteht aus einem Leitwerk zur Generierung der Steuersignale für die einzelnen Komponenten des Rechners, einem
Rechenwerk zur Verarbeitung von 16 Bit Integer-Daten, einem Speicherwerk mit einem 64K * 16 Bit großen Hauptspeicher und einem Ein/Ausgabewerk,
über das die Kommunikation mit dem PC erfolgt. Die einzelnen Werke sind über einen 16 Bit breiten Datenbus und einen 16 Bit breiten
Adreßbus miteinander verbunden.
Das Leitwerk
Das Leitwerk besteht aus dem Sequenzerbaustein Am2910, einem 4K * 80 Bit großen Mikroprogrammspeicher und dem Mikroinstrukiosregister. Im
Mikroprogrammspeicher sind die Mikroprogramme, bestehend aus einer Folge Mikroinstruktionen, abgelegt. In jedem Taktzyklus wird eine Mikroinstruktion
ausgewählt und alle in ihr zusammengefaßten Mikrooperationen werden gleichzeitig zur Ausführung angestoßen. Die Auswahl der im
nächsten Taktzyklus auszuführenden Mikroinstruktion erfolgt durch das Mikroleitwerk, das in jedem Taktzyklus eine Speicherzelle des
Mikroprogrammspeichers adressiert.
Weiterhin enthält das Mikroleitwerk einen Befehlszähler BZ und ein 16 Bit breites Instruktionsregister für die zu implementierenden
Maschinenbefehle. Der Befehlszähler addressiert die Maschinenbefehle im Hauptspeicher. Der Inhalt des Befehlzählers kann inkrementiert
werden oder auf den Daten- bzw. den Adressbus ausgegeben werden. Es ist ebenso möglich Adressen vom Datenbus in den Befehlszähler zu laden.
Das Instruktionsregister enthält den Maschinenbefehl der gerade ausgeführt wird.
Die Programme, die mit den Maschinenbefehlen der Zielmaschine geschrieben werden können, stehen zusammen mit den zu verarbeitenden Daten im
Hauptspeicher.
Das Rechenwerk
Zur Verarbeitung der Daten steht ein 16 Bit breites Rechenwerk, auf Basis von 4 kaskadierbaren Rechenwerksbausteinen vom Typ Am2901 und einem
Wortrandlogikbaustein Am2904, zur Verfügung. Das Rechenwerk unterstützt einfache arithmetische und logische Operationen. Darüberhinaus
können Schiebeoperationen ausgeführt werden. Seine Daten erhält das Rechenwerk aus einer Registerdatei oder vom Datenbus. Ergebnisse
können in die Registerdatei zurückgeschrieben werden oder auf den Daten bzw. den Adreßbus ausgegeben werden. Die Registerdatei
enthält 16 Register von je 16 Bit.
Der Wortrandlogikbaustein Am2904 enthält zwei unabhängige Statusregister. Ein Maschienenstatusregister, dessen Werte von
Maschienenbefehlen verwendet werden können, und ein Mikrostatusregister, das von Mikroprogrammen verwendet werden kann. Sie enthalten folgende
Flags:
OVR |
Overflow - Flag |
N |
Negative - Flag |
Z |
Zero - Flag |
C |
Carry - Flag |
Arbeitsumgebung
Die Erstellung der Mikroprogramme erfolgt mit dem Simulationsprogramm der mikroprogrammierbaren Maschine MIC (Version 5.2) auf eigenen Rechnern. Implementierung,
Test und Optimierung erfolgen ausschließlich mit diesem Programm.
Hilfsmittel
- Praktikumsbeschreibung:
- Skripten zur Vorlesung:
Titel: Technische Grundlagen Informatik - Wintersemester 1998/99
Verfasser: Prof. Dr. Arndt Bode
Herausgeber: Lehrstuhl für Rechnertechnik und Rechnerorganisation
- Übungsblätter aus der Zentralübung:
Übungsblätter zur Mikroprogrammierung
Verantwortlicher: Herr Wismueller
Wintersemester 1998/99
Spezifikation der Befehle
MOVE IMM RB
Opcode: F4
1. Takt |
- Konstante im Hauptspeicher adressieren. Die Speicheradresse befindet sich als Folgeadresse im Befehlszähler. Das Datum ist aber erst im
nächsten Takt verfügbar, da der Hauptspeicher es erst dann auf den Datenbus legt.
|
2. Takt |
- 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
angegeben.
- Der Konstantenwert wird mit "0" addiert. Das hat zur Folge, daß der Wert unverändert bleibt und im gleichen Takt in das Zielregister
gespeichert wird (RB).
- Sowohl das Maschinen- als auch das Mikrostatusregister sind während dieser ALU - Operation schreibgeschützt.
- Der Befehlszähler wird inkrementiert.
- 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
1. Takt |
- Das in RB bezeichnete Register (die Adresse von RB liegt im Instruktionsregister) wird als Quelloperand S in die ALU geladen.
- Es wird die Differenz zwischen B und 0 (am R-Eingang) mit CarryIn = 0 gebildet und das Ergebnis in das Register geschrieben das in RB (im
Instruktionsregister) adressiert ist.
- Sowohl das Maschinen- als auch das Mikrostatusregister sind während dieser ALU - Operation schreibgeschützt.
- 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
1. Takt |
- Konstante im Hauptspeicher adressieren. Die Speicheradresse befindet sich als Folgeadresse im Befehlszähler. 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.
|
2. Takt |
- 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.
- Der Konstantenwert wird nun mit "0" addiert. Das hat zur Folge, daß der Wert unverändert bleibt und im gleichen Takt in rD
abgespeichert wird.
- Sowohl das Maschinen- als auch das Mikrostatusregister sind während dieser ALU - Operation schreibgeschützt.
- Der Befehlszähler wird inkrementiert.
|
3. Takt |
- Der Wert des in RB (im Instruktionsregister) bezeichneten Registers und die Konstante aus rD werden als Quelloperanden für die ALU
adressiert.
- Das CarryIn ist auf 1 zu setzen.
- Nun wird der Wert aus rD von dem Wert aus dem Register RB subtrahiert. Das Ergebnis wird nicht zurückgeschrieben.
- Die Flags im Maschinenstatusregister werden gesetzt. Der Bedingungscode wird dabei so gewählt, daß das Carry negiert gespeichert
wird.
- 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
1. Takt |
- Die Konstante
FFFFh aus dem MIR wird über den Datenbus und den D-Eingang als Quelloperand R an die ALU übergeben.
- Als Zielregister wird in RB rD angegeben.
- Der Konstantenwert wird nun mit "0" addiert. Das hat zur Folge, daß der Wert unverändert bleibt.
- Das Ergebnis dieser Operation wird nun über das Carry-Flag nach links rotiert, so daß im Carry-Flag der Wert 1 steht.
- Sowohl das Maschinen- als auch das Mikrostatusregister sind während dieser ALU - Operation schreibgeschützt.
|
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
1. Takt |
- Das in RB bezeichnete Register (die Adresse von RB liegt im Instruktionsregister) wird als Quelloperand S in die ALU geladen.
- Der Inhalt dieses Registers wird mit 0 addiert (bei CarryIn = 0) , so daß er sich nicht verändert.
- Das Ergebnis wird anschließend nach links geschoben.
- Die Schiebesteuerung wird so gesteuert das über das Carry rotiert wird.
- Der Schreibschutz für das Maschinenstatusregister ist aufgehoben.
- 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 RB
Opcode: 8D
1. Takt |
- Maschinenstatusregister auslesen und überprüfen ob das das Carry - Flag gesetzt ist.
- Wenn das Carry - Flag gesetzt ist erfolgt ein Sprung nach "WEITER".
|
Carry-Flag = 0 |
2. Takt |
- Konstante im Hauptspeicher adressieren. Die Speicheradresse befindet sich als Folgeadresse im Befehlszähler. Das Datum ist aber erst im
nächsten Takt verfügbar, da der Hauptspeicher es erst dann auf den Datenbus legt.
|
3. Takt |
- Den Wert (die Speicheradresse) aus dem Hauptspeicher über den Datenbus in den Befehlszähler einlesen.
- Sprung in das Mikroprogramm
IFETCH .
|
Carry-Flag = 1 |
2. Takt
"WEITER" |
- Befehlszähler inkrementieren.
- Sprung in das Mikroprogramm
IFETCH .
|
Nachbildung von BSCANF
Das Maschinenprogramm das den Befehl BSCANF
implementiert erwartet, daß der zu überprüfende Wert im Register r0
liegt. Im Register r1 steht dann das Ergebnis.
Zunächst wird mittels scf das Carry Flag im Maschinenstatusregister gesetzt. Das ist wichtig, da sonst das Programm nicht terminiert, wenn
der zu überprüfende Wert keine binäre 1 enthält. Mittels MOVE
wird nun die Konstante 10 hex in das Register r1
geschrieben. Der Wert im Register r0 wird nun nach links geschoben. Anschließend wird das Register r1 dekrementiert.
Ist das Carry Flag nun noch nicht gesetzt (d.h. es wurde noch keine binäre 1 in das Carry Bit geschoben), so erfolgt ein Sprung zu dem Befehl
RLC
. Wurde es hingegen gesetzt so stoppt die Ausführung des Programms und das Ergebnis liegt vor.
Pseudocode:
01 SCF
02 MOVE x 1
03 0010
04 RLC x 0
05 DEC x 1 06 IMPNC 07 0004