# Computer Architecture Lab/Summer2006/PitterDeinhart/ThreeDesigns
## DREI MIKROPROC. ARCHITEKTUREN:
### 1. SPEAR (www.ecs.tuwien.ac.at/spear)
#### Quellen:

http://www.ecs.tuwien.ac.at/spear/downloads/papers/Handbook.pdf
SPEAR bedeutet Scaleabel Processor for Embedded Applications in Real-Time Environments. Wurde auf TU Wien E182-2 mit besonderen Augenmerk auf Anpassbarkeit und EchtzeitfÃ¤higkeit entwickelt.

#### Blockschaltbild:

[INSERT spear-blockschalt.png]

#### Speicher:

Bis zu 128KB addressierbar. Im Prozessorkern selber 4KB Befehls- und Datenspeicher.
Maschinenbefehle und Daten sind immer 16 Bit breit, Speicher wird Wortweise angesprochen.

#### Register:

Es gibt 32 Register auf die alle Befehle zugreifen koennen, 6 davon haben spezielle Aufgaben (3x Framepointer, 2x Unterprogramme, 1x Trap/ISR

#### Pipeline:

Der SPEAR hat eine 3-stufige Pipeline.

#### Befehlssatz:

Es gibt 80 Befehle, einige davon sind bedingte Befehle. Alle sind 16 Bit breit. Mit diesen kann man z.b. ein Register mit einem anderen oder einer Konstante vergleichen (CMP_EQ). Abhaengig vom ergebnis kann man dann z.b. ein bedingtes move verwenden (MOV_CT bzw. MOV_CF .. Contition True/False).
Es gibt 2 load Befehle: LDL: 000nnnnnnnnrrrrr LDH: 001nnnnnnnnrrrrr
Es gibt 29 Befehle die mit 2 Registern oder einem Register und einer 5Bit Konstante arbeiten, z.b.:
MOV_CT: 100011rrrrrRRRRR (contitional move) ADDI_CT: 100100nnnnnrrrrr (Contitional add)
Weitere 7 Befehle arbeiten mit einer 4Bit Konstante und einem Register, z.b.:
BCLR r1,n4: 1010001nnnnRRRRR (clears n4-th bit in r1)
Weitere 32 Befehle operieren nur auf einem Register, z.b.:
NOT: 10110000000rrrrr NOT_CT: 10111100000rrrrr (conditional not)
Dazu gibt es noch 3 Jump Befehle, die ein 10Bit Offset verwenden, z.b.:
JMPI_CT: 111010aaaaaaaaaa (continal relative jump)
Schliesslich gibt es noch 3 Befehle um den Program Counter aus einem bestimmten register neu zu setzen (return from subroutine). z.b.:
RTSX: 1011111101011101 (register 29 -> program counter)
Zuletzt sind noch NOP(No Operation) und IllOp(Illegal Opcode) zu erwähnen: NOP: 1111111000000000 IllOp: 1111111111111111

### 2. ATMEL ATMEGA16
#### Quellen:

* ecs.tuwien.ac.at/lehre/Microcontroller/Docs/ATmega16/AVR_Instruction_Set.pdf (link is to archive of original displayed page location)
* circuitcellar.com/avr2006/devices.html

#### Blockschaltbild:

[INSERT atmega16-blockschalt.png]

#### Speicher:

Der ATmega16 hat 16KB flash, 512B EEPROM, 1KB SRAM.

#### Register:

32 8Bit breite General Purpose Working Registers, wobei 6 davon als 3 16Bit registern (X,Y,Z) verwendet werden koennen. Diese koennen z.b. zur Addressierung benutzt werden.
Dazu gibt es noch ein Status Register und einen Stack Pointer.

#### Pipeline:

Die Pipeline hat nur einen einzigen Schritt.

#### Befehlssatz:

Der ATMEGA16 hat 131 Befehle, die meisten davon kann er in einem einzigen Clock-Cycle verarbeiten.
Die meisten Befehle sind 16 Bit breit. Nur JMP und CALL sind 32 Bit breit, und brauchen daher einen Clock-Cycle mehr:
JMP: 1001010kkkkk110k kkkkkkkkkkkkkkkk
CALL: 1001010kkkkk111k kkkkkkkkkkkkkkkk
Die normale, 16 Bit breiten Instructionen sehen z.b. so aus:
IN: 10110AAdddddAAAA (loads data from io space A into register d) OUT: 10111AArrrrrAAAA INC: 1001010ddddd0011 (increments register d)
Was auffällt ist, dass die einzelnen Bits etwas verstreut angeordnet sind. TODO FIXME: warum ist das so?

### 3. Intel 8051 Microcontroller
#### Quellen:

* http://www.goblack.de/desy/mc8051chip/
* http://www.win.tue.nl/~aeb/comp/8051/instruction-set.pdf#search=%22Instruction%20Set%208051%22
Der Befehlssatz ist stark auf die Lösung von Steuerungsaufgaben zugeschnitten, doch neben speziellen Befehlen zur Einzelbitverarbeitung stehen auch Befehle zur Multiplikation und Division zur Verfügung.

#### Blockschaltbild:

[INSERT 8051.png]

#### Speicher:

384 Bytes internes RAM. 256 Bytes davon beherrbergen die Registerbänke und den Stack. Weiters ist der 128 Bytes umfassende SFR-Speicherbereich darin enthalten. Darin befinden sich die Prozessorregister und die Steuerregister für die Tore, die Interruptlogik, die Timer und die D/A und A/D-Wandler.
Der Programmspeicher kann maximal 65535 Speicherzellen = 64kByte umfassen.

#### Die Prozessorregister der 8051 CPU:

Die Prozessorregister gehören schaltungstechnisch zu der CPU, jedoch liegen sie bei der 8051 CPU im Adreßraum des RAM-Speichers, der sich auf dem Chip befindet. Dadurch ergibt sich die besondere Möglichkeit, die Register einmal über die zugehörigen Sonderbefehle zu erreichen, aber auch über Adressen des internen Speicherraumes. Die Register sind 8-Bit lang, Ausnahme der DPTR und der nur indirekt zugängliche PC, beide sind 16-Bit lang.
* A Der Akkumulator (SFR)
* B Das Hilfsregister bei Multiplikation und Division (SFR)
* R0-R7 Die Speicher der Registerbänke 0-3 (unterer interner RAM)
* PSW Das ProgramStatusWord (SFR)
* SP Der Stackpointer (SFR)
* DPTR Der 16 Bit Datenpointer, bestehend aus DPL und DPH (SFR)
Im ProgramStatusWord der 8051-Controller befinden sich folgende flags:
* C Das CarryFlag (Übertrag), z.B.: C=1, bei Übertrag von Bit 7 nach Bit'8'
* AC Das AuxilliaryCarry (HilfsÜbertragsflag), z.B.: AC=1, bei Übertrag von Bit 3 nach Bit 4
* F0 Freies Flag für Benutzer
* RS1 Registerbank_Selekt_Bit 1 zum Umschalten der aktiven Registerbank
* RS0 Registerbank_Selekt_Bit 0 zum Umschalten der aktiven Registerbank
* OV Das OverflowFlag, z.B.: OV=1, bei ungleiche Überträge von 7-'8' und 6-7
* F1 Freies Flag für Benutzer
* P Das ParityFlag, z.B.: P=1, wenn Anzahl der 1 Bits in A gerade

#### Befehle des 8051:
##### 1. Transportbefehle

* Register <-> Registerbefehle, z.B. mov R0, A
* Register <-> Speicher, z.B. mov @R0, A
* Register <-> Ein-/Ausgabe, z.B. mov SBUF, R3
* Speicher <-> Ein-/Ausgabe, z.B. mov @R0, P0
* Bit <-> Bit, z.B. mov C, P3.4

##### 2. Arithmetische und logische Befehle

* Addition, Subtraktion, Inkrement und Dekrement, z.B. addc A,40H
* Multiplikation, Division, z.B. mul AB
* Logische Funktionen, z.B. orl A,B

##### 3. Sprungbefehle

* Unbedingte Sprünge, z.B. ajmp addr11
* Bedingte Sprünge, z.B. jnz
* Unbedingte Unterprogrammaufrufe, z.B. acall addr11
* Beendigung von Unterprogrammen, z.B. ret

#### Die 5 Adressierungsarten des 8051:

Die Adressierungsarten werden an dem Befehl mov (move - bewege nach) erläutert, der bei der Intel-Assemblermnemonik in folgender Weise benutzt wird, mov Ziel, Quelle
* Registeradressierung: z.B. mov A, R3 (Register wird in den Accu geladen)
* Direkte Adressierung: z.B. mov 40h, #77h (Die Konstante 70h wird auf den internen Speicherplatz 40h geschrieben)
* Registerindirekte Adressierung: z.B. mov A, @R0 (Der Inhalt auf den R0 zeigt, wird in den Accu gebracht)
* Die unmittelbare Adressierung: z.B. mov A, #77h (Konstante wird direkt in den Accu geschrieben)
* Adressierung über Basis- plus Indexregister: z.B. movc A, A+@DPTR (Für Zugriff auf Programmspeicher. Indexregister = Accumulator, Basisregister kann PC oder DPTR sein)