4-bit Demo Computer: Online Help

Democomputer

Einleitung
Funktionsweise des Democomputers
Die Komponenten
Bedienung
Befehlsliste
Adressierung RAM
Beispiele
Unterschiede zum Vorbild

Einleitung

Dieses Java Applet wurde im Rahmen einer Fallstudie vom 30.4. - 8.5.1999 an der WIS Luzern von Michel Marti und Benno Kurmann programmiert. Es emuliert den 4-Bit Democomputer von Prof. Dyntar, Dozent am ZTL Horw. Dieser Computer zeigt auf einfache Art und Weise, wie ein Miniprogramm von einem Computer abgearbeitet wird. Anhand von Lämpchen ist nach jedem Prozessortakt ersichtlich, welche Bits auf Bus, Register und externem Speicher gesetzt sind.


Funktionsweise des Democomputers

Der Democomputer arbeitet ein Programm ab, das im ROM gespeichert ist. Ein ROM-Wort ist 4 Bit breit, das heisst es sind 24 = 16 Zustände pro Wort möglich. Dies entspricht auch genau dem implementierten Befehlssatz, der aus 16 Befehlen besteht.
Im Democomputer wird zwischen Einwort- und Zweiwortbefehlen unterschieden:

  • Einwortbefehl : Benötigt keine Argumente.
  • Zweiwortbefehl: Benötigt noch ein Argument (Datenwort oder Adresse), welches an der dem Befehl folgenden Adresse im ROM stehen muss.

Nachdem ein Programm programmiert wurde und der Democomputer gestartet wird, holt sich die CPU den Befehl aus der ROM-Adresse 0 ins Instruktionsregister. Dieser Vorgang wird als "Fetch" bezeichnet. Anschliessend wird dieser Befehl ausgeführt, was als "Execute" bezeichnet wird.
Um einen Befehl abzuarbeiten, benötigt der Microprocessor (CPU) mehrere Prozessortaktzyklen. Im Democomputer gelten folgende Taktzyklen für die Ausführung eines Befehls :

1.a) Fetch-Phase : 4 Taktzyklen

  • ROM-Adresse auf den Adressbus legen
  • Befehl aus dem ROM auf den Datenbus legen / Controlbus auf READ setzen
  • Befehl ins Instruktionsregister schreiben / Befehl dekodieren
  • Programm Counter um 1 erhöhen

1.b) zweites Fetch, falls es sich um einen Zweiwortbefehl handelt : 3 Taktzyklen

  • ROM-Adresse auf den Datenbus legen
  • Argument aus dem ROM auf den Datenbus legen und intern speichern
  • Programm Counter um 1 erhöhen

2. Execute-Phase : 1 bis 3 Taktzyklen

  • Abhängig vom Befehl


Die Komponenten

Microprocessor
Dieses Modul stellt eine einfache CPU dar. Sie besteht aus folgenden Elementen :

  • Register 0 : Ein 4 Bit Datenregister, welches einen Überlauf als "Carry" anzeigt.
  • Register 1 : Ein 4 Bit Datenregister ohne Carry-Bit.
  • Instruction Register : Zeigt den Befehl, der momentan abgearbeitet wird.
  • Programm Counter : Zeigt die ROM-Adresse, welche als nächstes geholt werden soll. Der Counter ist 5 Bit breit, es werden jedoch nur 4 benötigt.
  • Reset-Knopf : Setzt alle Komponenten, ausser ROM, RAM und IN, in den Ursprungszustand zurück.
  • Clock-Knopf : CPU-Taktzyklen manuell geben
  • Auto Knopf : Legt fest, ob der CPU-Takt manuell (Clock-Knopf) oder automatisch abläuft.

ROM
In diesem Modul kann mit der Maus eine Folge von maximal zehn 4-Bit Befehlen programmiert werden.

RAM
Das Modul besteht aus vier 4-Bit Wörtern, welche von der CPU zum Speichern von Daten benutzt werden können.

I/O
Im IN - Element kann mit der Maus ein Wort eingegeben werden, welches die CPU holen kann.
Das OUT-Element zeigt an, wenn die CPU ein Datenwort an den Out-Port des Democomputers gelegt hat.

Bus
Der Zustand der verschiedenen Busse wird am oberen und unteren Ende des CPU Moduls angezeigt.

  • Datenbus : 4-Bit Bus, auf welchem Datenwörter zwischen den Komponenten ausgetauscht werden.
  • Adressbus : 5-Bit Bus, mit dem die Elemente in den verschiedenen Komponenten adressiert werden.
  • Controlbus (Steuerbus) : 2-Bit Bus der steuert, ob ein Lese- oder Schreibzugriff erfolgen soll.

 

Bedienung

Vor dem Start müssen Sie das ROM programmieren. Benutzen Sie dazu die Codes der Befehlsliste. Sie programmieren das ROM, indem Sie mit der Maus auf die gewünschten "Lämpchen" klicken. Falls Ihr Programm den Input-Port anspricht, versichern Sie sich, dass Sie auch dort den gewünschten Wert programmiert haben.
Das Programm können Sie manuell oder automatisch ablaufen lassen.

- Automatisch : Klicken Sie auf den Auto-Knopf in der Microprocessor-Einheit
- Manuell : Klicken Sie auf den Clock-Knopf in der Microprocessor-Einheit. Mit jedem Klick wird der nächste Prozessortakt ausgeführt.

Es ist jederzeit mitten in der Programmabarbeitung möglich, die ROM-Programmierung zu ändern oder zwischen Auto und Manuell umzuschalten. Nachdem die letzte ROM Adresse ausgeführt wurde, springt die CPU automatisch wieder an ROM-Adresse 0.
Mit dem Reset-Knopf werden alle Elemente ausser ROM, RAM und Input-Port auf 0 gesetzt.

Die Geschwindigkeit des Auto-Modus kann im HTML-File, welches das Applet startet, als Parameter eingestellt werden. "Delay value" gibt die Wartezeit zwischen den Taktzyklen in Millisekunden an.
Als Beispiel eine Wartezeit von 200ms :

 

Befehlsliste

Mnemonic Code Anz. Worte CPU-Zyklen Beschreibung
Datentransferbefehle:
MVI R0 0100 2 8 unmittelbar folgendes Wort in Register 0
MVI R1 0101 2 8 Unmittelbar folgendes Wort in Register 1
STO R0 0000 2 10 Register 0 in RAM; 2. Wort RAM-Adresse
STO R1 0001 2 10 Register 1 in RAM, 2. Wort RAM-Adresse
LD R0 0010 2 10 RAM in Register 0; 2. Wort RAM-Adresse
LD R1 0011 2 10 RAM in Register 1; 2. Wort RAM-Adresse
MOV R1,R0 1001 1 5 Register 0 in Register 1 kopieren
MOV R0,R1 1010 1 5 Register 1 in Register 0 kopieren
Input-/Outputbefehle:
IN 1000 1 7 Input-Port in Register 0
OUT 1011 1 7 Register 0 in Output-Port
Arithmetische Befehle:
ADD R1 1101 1 5 Register 1 + Register 0 (ohne carry), Resultat in R0
Rotationsbefehle:
ASL 1110 1 5 Register 0 links schieben, Überlauf in carry
RAR 1111 1 5 R0 rechts schieben, LSB in carry
Sprungbefehle:
LMP 0110 2 8 Sprung zu ROM-Adresse in 2. Wort
JC 0111 2 8 Sprung zu ROM-Adresse in 2. Wort wenn carry = 1
JNC 1111 2 8 Sprung zu ROM-Adresse in 2. Wort wenn carry = 0

 

Adressierung Ram

Die RAM-Adressen im Democomputer sind 16-19. Diese Adressen lassen sich nicht mit 4 Bit abbilden und können folglich im ROM nicht als Argument übergeben werden. Deshalb gelten für RAM-Adressen im ROM eigene Regeln :

0000 - 0011 entsprechen den RAM-Adressen 16 - 19

 

Beispiele

Programm 1

kopiert ein Wort in Register 0 und schreibt dieses Wort anschliessend an die 2. Adresse im RAM


ROM Beschreibung CPU-Zykus Erklärung Phase
0100 Folgendes Wort in R0 1 Adresse 0 (aus dem Programm Counter) wird auf den Adressbus gelegt. Chip select ROM leuchtet.




fetch
    2 Wert aus ROM-Adresse 0 wird auf den Datenbus gelegt (0100). Contolbus wird auf READ gesetzt.
    3 Wort aus dem Datenbus wird ins Instruktionsregister kopiert. Der Befehl wird dekodiert.
    4 Programm Counter wird um 1 erhöht.
0111 Datenwort für R0 5 Adresse 1 (aus dem Prg Counter) wird auf den Adressbus gelegt.
    6 Wert aus ROM-Adresse 1 wird auf den Datenbus gelegt (0111). CPU speichert Datenwort intern.
    7 Programm Counter wird um 1 erhöht.
    8 Datenwort (0111) wird in Register 0 geschrieben. execute
0000 R0 in RAM 1 Adresse 2 (aus dem Programm Counter) wird auf den Adressbus gelegt. Chip select ROM leuchtet.




fetch
    2 Wert aus ROM-Adresse 2 wird auf den Datenbus gelegt (0000). Contolbus wird auf READ gesetzt.
    3 Wort aus dem Datenbus wird ins Instruktionsregister kopiert. Der Befehl wird dekodiert.
    4 Programm Counter wird um 1 erhöht.
0001 RAM-Adresse 5 Adresse 3 (aus dem Prg Counter) wird auf den Adressbus gelegt.
    6 Wert aus ROM-Adresse 3 wird auf den Datenbus gelegt (0001). CPU speichert Datenwort intern.
    7 Programm Counter wird um 1 erhöht.
    8 Die RAM-Adresse wird auf den Adressbus gelegt. Chip select auf RAM.
execute
    9 Die Daten aus R0 (0111) werden auf den Datenbus gelegt.
    10 Der Controlbus wird auf WRITE gesetzt. Das Datenwort wird in RAM Adresse 17 geschrieben



Programm 2

multipliziert den Wert am Input-Port solange mit 2, bis ein Registerüberlauf eintritt. Dann erfolgt eine Division durch 2. Das Resultat wird in Register 1 gespeichert und ins RAM kopiert. Auf eine Aufspaltung in einzelne Prozessorzyklen wird verzichtet.


ROM
Adresse
Befehl
Im ROM
Erklärung
0 1000 Schreibt Wort an Input-Port in Register 0
1 1110 Schiebt alle Bits in Register 0 eine Stelle nach links.
(Entspricht der Operation * 2)
2 1100 Wenn Carry-Bit = 0, springe zu ...
3 0001 ... ROM Adresse 1
4 1111 Schiebt alle Bits in Register 0 eine Stelle nach rechts
5 1001 Kopiert Register 0 in Register 1
6 0001 Schreibt Register 1 an...
7 0000 ...RAM Adresse 16
8 0110 Springt zu...
9 0000 ...ROM Adresse 0 (Endlos Loop)



Unterschiede zum Vorbild

  • Der Programm Counter springt nach der ROM-Adresse 9 automatisch wieder auf 0. Im Original wird gnadenlos bis 31 weitergezählt, falls man mit einem JMP über Adresse 10 hinausspringt.
  • Ein Chipselect passiert automatisch, wenn eine entsprechende Adresse auf dem Adressbus liegt. Wenn z.B. dem Befehl LD R0 unerlaubterweise eine IO Adresse mitgegeben wird, wird die IO-Komponente sehr wohl selektiert, die Daten werden aber nicht ins Register geschrieben. Im Original-Computer wird ein Chipselect RAM schon auf Grund des Befehls LD R0 ausgeführt.

4-bit Demo-Computer Applet

For more information see the Learning aids for 'Holzcomputer' (chapter 7) on the Website of Prof. Peter Fischer

© Werner Randelshofer. All Rights Reserved.