Small Skale Integration SSI 1000 Transistoren
Medium Skale Integration MSI
Large Skale Integration LSI
Very Large Skale Integration VLSI
Ultra Large Skale Integration ULSI
Extra Large Skale Integration ELSI
Giga Skale Integration GSI
Befehlszähler:
Eingang: PC (t)
Ausgang: PC (t+1)
Befehlsspeicher
Eingang: von Befehlszähler: PC (t)
Ausgang: Bus - Zum Befehlsdekodierer und weiteren - 32 Bit Bus
Datum: Der Befehl selber
Befehlsdekodierer
Liegt an Bit 31 bis 26
Bit Bit 31 bis 26: OpCode: 6 Bit Opcode
Ausgang
RegDst (1 Bit)
RegWrite (1 Bit)
MemToReg (1 Bit)
MemWrite (1 Bit)
Branch (1 Bit)
ALUSrc (1 Bit)
Ausgang
ALUOp geht in Funktionsdekodierer 2 Bit - 00, 01, 10, 11
Funktionsdekodierer
Eingang: Func Bit 5 bis Bit 0, vom Befehlswort - 100 000 - add, 100 010 - sub ...
ALU-Op geht vom Befehlsdekodierer, wieder 2 Bit 00, 01, 10, 11 - und wenn 10 steht, dann func
Ausgang: ALU-Operation: Das geht an die ALU - 010 - add, 110 - sub, 000 - and .. 3 Bit
Pfad vom Befehl
Befehlszähler PC (t) -> Befehlsspeicher -> ...
Befehlszähler PC (t) -> Addierer (1) Links Unten +4 -> Befehlszähler P(t+1)
Befehlszähler -> Vorzeichenerweiturungseineit -> 2 Bit Shifter - Addierer (2) -> DeMultiplexer -> Befehlszähler
Wichtig
1.) Vorzeichenerweiturungseineit
2.) 2 Bit Shifter
3.) Addierer
1.) Vorzeichenerweiturungseineit
2.) 2 Bit Shifter
3.) Addierer
4.) MUX
1.) Vorzeichenerweiturungseineit: Weil man zurückspringen kann
2.) 2 Bit Shifter: Wahrscheinlich: Weil man das +4 macht man mit dem wahrscheinlich - 2 Bit
3.) Addierer: Der Addierer macht bei Jump Relativ und Indirekt macht der eben die Addition zum Befehl
4.) MUX
Registersatz:
rs-Feld
rt-Feld
rd-Feld
Das kann man ausrechnen, weil
OpCode: Bit 31 bis 26
31 bis 26
25
20
15
10
5
31 bis 26: Opcode
25 bis 21: RS-Register
20 bis 16: RT-Register
15 bis 11: RD-Register
10 bis 6: SA - Verschiebewerte
5 bis 0: Func
Target Address - das ist was spezielles, während das sonst dazu addiert wird
wird das hier ersetzt
Wir haben den Jump Befehl - beim Intel
Das ist hier Branch - branch wir springen immer zum Label
Daswesen wird das ersetzt - durch Absolute Addresse
Deswegen haben wir Target - das ist beim Computer die Symboltabelle vom Compiler zum Assemmbler
Da wird die Target direkt in den Befehlszähler geschrieben
Target Address: OpCode: Bit 31 bis Bit 26, der Rest Target Address
Jetzt gibt es die I-Typ Befehle
Das heisst, wir haben
OpCode
Bit 31 bis 26: Opcode
Bit 25 bis 21: RS-Feld
Bit 20 bis 16: RT-Feld
Jetzt bleibt was übrig
Bit 15 bis 0: Das sind 16 Bit - das ist der Immdiate Wert
Das gibt es auch bei LDI
Wenn man zum beispiel den Atmega 8 nimmt, dann gibt
ld, lds, ldd, ldi
ld: Load: Mit Register, indirekt
lds: Load: s ist ein Anti D Buchstabe, und S - steht für Direkt - weil das Indirekt mit den Register - so schön dynamisch, steht gegen das S und das heisst, das D steht für indirekt
ldd - das ist der König - das steht für: Indizieiert, Befehlszählerrelativ oder Indizieiert
Dreiaddressformat R-Typ Befehls, rs, rt, rd - wir zwei Quelloperanden, 1 Zielopoeranden
Zweiaddressformat: zwei address: Immidiat: Zwei Quelloparanden, oder ziel und Quelle, und einen 16 Bit Immediate wert
Einaddressformat: Wir haben einen J-Typ - J-Typ kommt von Jump meint Branch das heisst, absolute Addresse
Nulladdressformat: NOP ist Null address - CLC STC - 0 Address
Jetzt gibt aber Maschinen, da gibt es keine Dreiaddressbefehle
Der Atmega8 schreibt ld r16, X+
Und der Witz, das ist kein syntaktischer Zucker. Der hat nur 2 Addressformat
Und der TI9900 ist Speicher Speicherarchitektur, der hat immer noch 2 oder 3
Es gibt aber Akkumulatorarchitektur
Oder Stackarchitektur, da ist das anders
ich muss machen PUSH r0, PUSH r1 - und ADD
Und Steht für POP t1, POP t0 Add t1, t0 PUSH t1
Mehryzyklus
I1: WB
I2: MEM
I3: EX
I4: ID
I5: IF
Einyklus alles in einem
Mehryzklus
I1: 0 IF 1 ID 2 EX 3 MEM 4 WB
I2 5 IF 6 ID 7 EX 8 MEM 9 WB
Pipeliningin:
I1: 0 IF 1 ID 2 EX 3 MEM 4 WB
I2 0 - 1 IF 2 ID 3 EX 4 MEM 5 WB
Das kann zur Datenabhängigkeit führen
weil:
WB - Write Back Mem steht für Memory Access
Hier schreibt I1 in Register
In ID liesst I2 von Register
addi $t1, $t2, 2
add $t4, $t1, $t3
subi $t3, $t5, 3
subi $t3, $t6, 3
Echte Datenabhängigkeit
I1 und I2 Weil der I2 liesst von $t1 und da schreibt I1 rein
Ausgabeabhängigkeit: I3 und I4: Weil beide Schreiben in $t3
Gegenabhängkeit: Der I2 liesst von $t3 da hat subi schon reingeschrieben