Redstone 8-Bit Rippel Carry CPU

Hier bekommst du Bilder Videos und Beschreibungen vom Aktuellen zustand der CPU.

Minecraft redstoune 8Bit CPU / Prozessor Rippel Carry

Arbeitsablauf

Im Gegensatz zu meinen Logisim Microprozessor führt die Minecraft CPU 1 Befehl pro Takt aus wo der Logisim Microprozessor 10 Takte für einen Befehl braucht was der höheren Komplexität geschuldet ist. 1.Am Anfang der Ausführung wird der Programm-Counter um 1 erhöht und dessen Zustand an den ROM Speicher geleitet. 2.Die ROM Dekodiert die Adresse und legt 20 Bit auf den Bus, die aus 4Bit für den Befehl und 2x8 Bit für die Operanden bestehen. 3.Die Steuereinheit Dekodiert den Befehl und gibt Steuersignale an die ALU und die Register aus. 4.Die ALU führt den Befehl aus und Schreibt das Ergebnis in ein Register. 5.Jetzt beginnt alles von vorne.

Die ALU

In der ALU sind alle Logischen und Armteetischen Funktionen realisiert allerdings werden nicht alle genutzt so ist beispielsweise die Shift und Rotations-Einheit vorhanden aber nicht angeschlossen. Das Addieren und Subtrahieren wird über einen Rippel-Carry Addierer gelöst welcher nicht sonderlich schnell ist aber einen simplen und Modularen Aufbau besitzt. ALU Operationen werden immer über die zwei 8Bit Register AL und BL durchgeführt beide lassen sich unabhängig Invertieren welches den Effekt hat das die Register nicht getauscht werden müssen um bestimmte Subtraktionen durchzuführen.

Der Speicher

Die ROM

Die CPU verfügt über einen Adressraum von 8 Bit welches eine Befehlsmenge von 255 ergibt das mag wenig erscheinen reicht zu Testzwecken aber vollkommen aus. So gibt es auch keine Möglichkeit werte Langfristig zu Speichern da sich das Programm und die Daten in einer Rom befinden. Die Architektur der CPU lässt sich nicht richtig einordnen so Befinden sich die Daten zwar im selben Speicher wie die Befehle, aber diese sind nur in Kombination möglich. Das heist das kein Ladebefehl eine bestimmte Adresse lädt sondern der Befehl liefert die Daten die er Kopiert und schreibt diese ins Ziel.

Die Register

Die Register sind unabhängig vom 8 Bit Adressraum der ROM, da sie nur von den Operanden adressiert werden aber nicht vom Programm Counter. Es gibt insgesamt 7 Register die verschieden Zwecke erfühlen sie teilen sich auf in: table 1 Programm Counter – PC - Indirekter Schreibzugriff 2 ALU Register – AL, BL – Schreib und Lesezugriff, ALU Berechnung 4 Allgemein Register – CL, DL, EL, FL - Schreib und Lesezugriff table ALU Operationen können nur auf das AL und BL Register ausgefürt werden, die Regsiter CL-FL dienen zu Speichern von Ergebnissen und vorhalten von Daten. Alle Register von AL-FL können untereinander Kopiert werden oder mit Werten aus den ROM geladen werden (MOV und MOVX). Das Programm Counter Register kann lediglich durch einen Sprungbefehl geladen werden, der Wert der in das Programm Counter Register geladen wird bringt der Sprungbefehl mit und kann nicht aus einen Register kommen. Mit dieser Einschränkung ist eine Bestimmung der Sprungadresse zu Ausführung nicht möglich und somit eine Indirekter Sprung ausgeschlossen.

Die Logisim CPU hat im Gegensatz einen Durchgehenden 16 Bit Adressraum der sich auf RAM, Bios ROM und Register aufteilt.

Die Steuereinheit

Das komplexeste Bauteile der CPU, sie verbindet alle Bauteile mit einander und sorgt für die richtigen Steuersignale zum richtigen Zeitpunkt. Am Anfang der Befehls Ausführung wird der Programm-Counter / PC erhöht dadurch werden die Daten an der selektierten Adresse an die Steuereinheit weitergeleitet. Ein solches Daten Paket besteht aus 4 Befehls Bits die den Aktuelle Befehl widerspiegeln und zwei 8 Bit Operanden. Die Operanden Spiegeln entweder die genutzten Adresse wider oder bringen Daten mit die in ein Register geschrieben werden sollen, in manchen fällen wird nur ein Operand benötigt bei einen Sprung Befehl wird nur die Adresse in den ersten Operand gespeichert.

Vergleicher und Sprungeinheit

Der Vergleicher greift wie alle ALU Operationen auf die Register AL und BL zu, er vergleicht auf A < B , A > B ,A = B . Das Ergebnis wird permanent geprüft und an die Sprungeinheit geleitet, welche im falle einer Übereinstimmung ein Signal an den Prgramm-Counter leitet welches den Aktuellen Wert vom BUS in den Speicher übernimmt und mit der Ausführung an dieser stelle fortfährt. Da am Anfang eines neuen Arbeitsablauf der Programm Counter um 1 erhöht wird muss die Sprungadresse ein Geringer sein als das eigentliche Ziel. Das bedeutet wenn die Adresse 13 in der ROM angesprungen werden soll muss die Adresse 12 geladen werden.

Programmierung

Die Programmierung wird durch setzen von Fackeln in der ROM vorgenommen. Jeder Befehl bringt 1-2 8 Bit Operanden mit die Werte, Adressen von Registern oder Sprungziele enthalten. Bei den Befehlen handelt es sich um einen RISC Assembler, die Benennung der Register und die Darstellung wie sie unten verwendet wird ist an den Intel Syntax angelehnt. So steht links das Ziel wo das Ergebnis des Befehls landet welches bei vielen Befehlen auch eine Operanden darstellt, deshalb ist darauf zu achten das der Operand gesichert wird bevor er verwendet wird da dieser überschrieben wird.

Assembler Befehle

Die Assembler Befehle

MOVX
Verschiebt Operand in das Ziel Register Hilfs oder Haupt Register.

MOV
Verschiebt die Register(AL – FL) untereinander

ADD
Additions Befehl addiert das AL und BL Register miteinander.

SUB
Subtraktions Befehl subtrahiert das BL Register vom BL Register.

AND
Logische AND / UND Funktion verknüpft das AL und BL Register Bit weise miteinander.

OR
Logische OR / ODER Funktion verknüpft das AL und BL Register Bit weise miteinander.

XOR
Logische XOR / EXOR Funktion verknüpft das AL und BL Register Bit weise miteinander.

NOT
Logische NOT / NICHT Funktion verknüpft das AL oder BL Register und schreibt es ins Ziel.

JMP
Fester Sprung zu übergebener Adresse.

JZ
Springe wenn AL und BL gleich = 0 zu übergebener Adresse.

JB
Springe wenn AL kleiner BL zu übergebener Adresse.

JA
Springe wenn AL größer BL zu übergebener Adresse.

Beispiel Programm: Multiplikation

Da die CPU nur Addition und Subtraktion als Rechenoperation unterstützt, muss die Multiplikation über ein Programm realisiert werden. Grundsätzlich ist eine Multiplikation nur eine n mal ausgeführte Addition.


Register Belegung
CL 	=	Multiplikator
DL	=	Muktiplikant
EL	=	Ergebnissen
FL	=	Addition Zähler

Register Belegung CL = Multiplikator
DL = Muktiplikant
EL = Ergebnissen
FL = Addition Zähler


0001	MOVX AL, 0000 0000	//erste Addition vorbereiten
0010	MOV 	BL, DL
0011	ADD 	EL			//erste Addition 0 + Multiplikant
0100	MOV 	AL, FL		
0101	MOVX BL, 0000 0001
0110	ADD 	FL			//Addition Zähler um 1 erhöhen
0111	MOV 	AL, FL
1000	MOV 	BL, CL
1001	JZ	0000 1100		//Addition Zähler und Multiplikator vergleichen
1010	MOV 	AL, EL		//Wenn nicht Gleich Schleife erneut durchlaufen
1011	MOV 	BL, DL
1100	JMP	0000 0010
1101	...

0001 MOVX AL, 0000 0000 //erste Addition vorbereiten
0010 MOV BL, DL
0011 ADD EL //erste Addition 0 + Multiplikant
0100 MOV AL, FL
0101 MOVX BL, 0000 0001
0110 ADD FL //Addition Zähler um 1 erhöhen
0111 MOV AL, FL
1000 MOV BL, CL
1001 JZ 0000 1100 //Addition Zähler und Multiplikator vergleichen
1010 MOV AL, EL //Wenn nicht Gleich Schleife erneut durchlaufen
1011 MOV BL, DL
1100 JMP 0000 0010
1101 ...

Multiplikation Optimierung

Um die Multiplikation zu beschleunigen sollte darauf geachtet werden das der Multiplikator kleiner ist als der Multiplikant. So dauert eine Multiplikation von ( 20x3 ) 20 Schleifen Durchläufe aber die Multiplikation von ( 3x20 ) nur 3 Schleifen Durchläufe. Die 6 Code Zeilen führen einen 2 Vergleiche aus : 1. AL == BL 2. AL < BL bei beiden abfragen wird die Optimierung übersprungen, anderenfalls werden CL und DL getauscht.

Der Optimierungsablauf benötigt bei: Gleich : 3 Takte Bei AL < BL : 4 Takte Bei AL > BL : 6 Takte


Register Belegung
CL 	=	Multiplikator
DL	=	Muktiplikant
EL	=	Ergebnissen		//Nicht beeinflusst
FL	=	Addition Zähler	//Nicht beeinflusst

Register Belegung CL = Multiplikator
DL = Muktiplikant
EL = Ergebnissen //Nicht beeinflusst
FL = Addition Zähler //Nicht beeinflusst


0001	MOV 	AL, CL		//Multiplikator in AL Laden
0010	MOV 	BL, DL		//Multipkikant in BL Laden
0011	JZ 	0000 0110		//Springe wenn AL == BL
0100	JB 	0000 0110		//Springe wenn AL < BL
0101	MOV 	CL, BL		//Tausche CL mit DL
0110	MOV 	DL, AL
0111	...

0001 MOV AL, CL //Multiplikator in AL Laden
0010 MOV BL, DL //Multipkikant in BL Laden
0011 JZ 0000 0110 //Springe wenn AL == BL
0100 JB 0000 0110 //Springe wenn AL < BL
0101 MOV CL, BL //Tausche CL mit DL
0110 MOV DL, AL
0111 ...