Programmieren von MiniRISC-Prozessor in Assemblersprache - BME MIT

Die Seite wird erstellt Elina Wegner
 
WEITER LESEN
Programmieren von MiniRISC-Prozessor in Assemblersprache - BME MIT
Digitaltechnik (VIMIAA02)                                                          Übung 8. Woche

          Programmieren von MiniRISC-Prozessor in Assemblersprache

F1. Die integrierte Entwicklungsumgebung des MiniRISC-Prozessors lässt sich auf der Webseite des
Faches Digitaltechnik herunterladen. Die Umgebung beinhaltet alle Elemente, die benötigt sind, das
Assembler-Programmieren kennen zu lernen und einfache Aufgaben lösen zu können. Die
Einführungsaufgabe ist der ggT(a,b) Algorithmus, der während Übung 8 kennen gelernt wurde. Da der
Befehlssatz des MiniRISC-Prozessors auch keine Operation für Dividieren beinhaltet, können wir nur
den vereinfachten Algorithmus realisieren, der auch die Basis der Hardwarelösung war.
                                  ggT(a,b) = ggT (a-b, b), falls a > b
                                  ggT(a,b) = ggT (a, b-a), falls b > a,
wo ggT bezeichnet den größten gemeinsamen Teiler. Die Berechnungsschritte werden weitergemacht,
bis die Inhalte der zwei Register übereinstimmen. In diesem Fall geben sie beide den Wert von ggT.
Entwerfen wir das Programm für die Berechnung von ggT(a,b) auf Assemblersprache auf dem
MiniRISC-Prozessor!
Die zwei Operanden werden an den Schaltern angegeben. Das Einlesen des ersten Operands wird
durch BT0, das Einlesen des zweiten Operands durch BT1 freigegeben. An den LEDs werden während
des Einlesens die Operanden, während der Iterationsschritte die Teilergebnisse, und nach der
Berechnung das Ergebnis im Binärformat angezeigt. Während des Algorithmus werden die
Iterationsschritte mit 1 Sekunde Ablauf durchgeführt und die Teilergebnisse werden angezeigt.
F1.a Vorschlagen wir Datenstrukturen fürs System, das ggT(a,b) kalkuliert! Aus den 3 Methoden, die
kennen gelernt wurden, soll die Dritte programmiert werden.
       1. Durchführung mit dem Austausch von Registerinhalten a ↔ b, mit einfacherem Abzieher
       2. Durchführung mit komplexer SUB - RSUB Einheit (a – b bzw. b – a in einer Einheit)
       3. Durchführung mit zwei Abziehereinheiten
In Wirklichkeit verfügt der MiniRISC-Prozessor nicht über zwei Abziehereinheiten, aber während der
Durchführung verwenden wir dieses Modell. Das heißt, dass weder Inhaltsaustausch noch Abziehen
mit umgekehrter Reihenfolge durchgeführt wird. Zuerst wird ein Test auf (a-b) durchgeführt, und
anhand dessen wird die Erfrischung a(a-b) oder b(b-a) gemacht. Nur eine von den beiden, aber
unabhängig davon bleibt der Algorithmus gültig.
F1.b Erstellen wir Pläne für die Teilaufgaben: Einlesen der Operanden, Startbefehl, Durchführung des
Berechnungsalgorithmus!
Die Aufgabe lässt sich auf 4 Teilaufgaben verteilen, die können als selbständiges Programm in ein Paar
Linien realisiert werden:
    1. Einlesen des ersten Operands
       Der Benutzer stellt den Wert von Operand „a“ an den Schaltern und dann gibt das dem
       Prozessor mit dem Drücken von BT0 an. Der Prozessor wartet auf dieses Signieren mit stetigem
       Beobachten/Testen des Zustands der Taste. Falls die Taste aktiv wird, wird der 8-Bit Wert der
       Schalter in ein Arbeitsregister eingelesen. Für den Benutzer wird der eingelesene Wert an den
       LEDs angezeigt.

 4. November 2020                                      http://www.mit.bme.hu/oktatas/targyak/vimiaa02
Digitaltechnik (VIMIAA02)                                                          Übung 8. Woche

    2. Einlesen des zweiten Operands
       Dieselbe Funktion, wie während des ersten Schrittes, aber jetzt wird das Einlesen durch BT1
       freigegeben.
    3. Einlesen des Startbefehls:
       Warten auf den Startbefehl, der durch BT2 ausgegeben wird
    4. Berechnung mit Iteration
    5. Ergebnisanzeige
Die erste drei Aufgaben sind Schleifen mit Abfragen. Das 8-Bit Register der Drücktastenperipherie wird
eingelesen. Aus dem niedrigsten 4 Bits wird die Taste getestet, die aktuell ist. Falls das Testergebnis
positiv ist, werden die Daten der 8-Bit-Schalterperipherie in ein Arbeitsregister geladen.
Beim Startbefehl gibt es solches Dateneinlesen nicht, es wird einfach auf die Freigabe des
Weitertretens gewartet. Die Struktur des ASM-Blocks, d.h. Warten auf die Bedingung in der Schleife,
dann Einlesen, ist die Folgende:

F1.c Erstellen wir den Assembler-Kode.
Im Programm werden die folgenden Peripherien verwendet: LD, SW, BT, also LEDs, Schalter und
Drücktasten. Der Einbau der Register lässt sich auf die einfachste Weise während des Erstellens von
einem neuen Dokument lösen. Später lässt sich die Tabelle auf Seite 2 im Help-Dokument (F1)
benutzen.

Einlesen der Operanden:

 4. November 2020                                     http://www.mit.bme.hu/oktatas/targyak/vimiaa02
Digitaltechnik (VIMIAA02)                                                      Übung 8. Woche

Die Berechnungsschritte vom ggT-Algorithmus: Stetige Iteration, am Ende Ergebnisanzeige und Sprung
auf den ersten Befehl.

Das kann auf Assemblersprache folgenderweise programmiert werden:

 4. November 2020                                  http://www.mit.bme.hu/oktatas/targyak/vimiaa02
Digitaltechnik (VIMIAA02)                                                              Übung 8. Woche

F1.d. Das Programm soll ergänzt werden so dass die Iterationsschritte ungefähr 1 Sekunde dauern!
Am Berechnungsanfang der Iteration wird ein Software-Verzögerung/Timing/Warten eingebaut. Diese
Timings beanspruchen kein präzises Timing, nur ungefähr präzise Einstellung. Das Warten wird durch
„Zähler“ realisiert, die in Registern realisiert werden. Die Realisation wird durch das Testen des Inhalts,
d.h. zum Beispiel durch die Überprüfung des Endwerts gelöst.
Die Frequenz des Taktsignals beträgt im MiniRISC-Prozessor 16 MHz, die Periodenlänge ist 62,5 ns. Ein
Befehl dauert 3 Perioden (FETCH-DECODE-EXECUTE), d.h. 3*62,5 ns = 187,5ns. Das Timing, das durch
Register erledigt wird, benötigt 2 Befehle: eine INC/DEC Operation und einen Endwerttest.
Die Einstellung des Anfangswerts läuft nur einmal ab, also soll diese Zeit nur im Falle von sehr präziser
Einstellung in Betracht gezogen werden.

Wenn die zwei Befehlszyklen in Betracht gezogen werden, lässt sich durch die Benutzung von 1
Register ungefähr 100 s Warten realisieren. Mit einem anderen Anfangswert lässt sich diese Zeit
beliebig abkürzen.
Für längeres Timing ergeben sich zwei Möglichkeiten:
                1. Verschachtelte Schleifen fürs Warten
                2. Zähler, die durch Übertragung verbunden sind. Diese Zähler sind 16-24-32-Bit
                   Zähler, arithmetische Befehle ADC/SBC werden verwendet.
Hinsichtlich der Programmorganisierung ist Lösung 2 vorteilhafter. Weiterhin wird diese Lösung
verwendet.
Wir möchten 1 Sekunde warten, also 16 000 000 Taktperioden. Der Endwert eines 24-Bit Binärzählers
(Kaskadierung von 3 Stücke von 8-Bit-Zählern) ist 16 777 216. Es ist ungefähr 1 Sekunde. Die
Berechnungsschleife besteht aus 4 Befehlen. Es wird unter 4*3=12 Taktzyklen durchgeführt. Deshalb
wird der Zähler in jedem Zyklus um 12 erhöht, um die Zeit der Zyklusdurchführung in Betracht zu
ziehen. So bekommen wir ohne weitere Berechnungen das 1 Sekunde Timing.
Bemerkung: Da der 24-Bit Zähler den Endwert erreicht, ist die erste 3 Schritte weglassbar, weil das
Zählen in jedem Zyklus würde weitergemacht werden, angefangen mit dem Wert des letzten
Iterationsschrittes.

 4. November 2020                                       http://www.mit.bme.hu/oktatas/targyak/vimiaa02
Digitaltechnik (VIMIAA02)                                Übung 8. Woche

4. November 2020            http://www.mit.bme.hu/oktatas/targyak/vimiaa02
Sie können auch lesen