Zu dem Blockschaltbild -
1.) R-Typ
2.) I-Typ
3.) J-Typ
So weit ich hier sehe, ist kein J-Typ implementiert
1.) R-Typ: Register
2.) I-Typ: Immidiate
3.) J-Typ: Jump Absolut wert im speicher zu dem gesprungen wird
Klassischer Additionsbefehl
1.) Intel: ADD AX, BX
2.) MIPS32: add $r0, $r1, $r2
oder: add $r0, $r0, $r1
Addition:
x = 5 + 4
9 = 5 + 4
c = a + b
1.) zwei Quelloperanten
2.) Ein Zieloperant
Vier Grundrechenarten auf die ganzen und natuerlichen Zahlen
1.) Addition
2.) Subtraktion
3.) Multiplikation
4.) Division
3 Operanten/Operanden! - 2 quell, 1 Ziel
Operantenschreibweise beim Computer
1.) zwei Operanten schreibweise
2.) drei Operanden schreibweise
intel x86/i386/i586/amd64, Atmel Atmega 8: 2 - Einer der Quelloperanten entspricht dem Ziel
MIPS32: 2 Quelloperand, ein Ziel
Kommt auf das gleiche raus
Mikroarchitektur: Implementierung der CPU - egal, etwa: Heimlich kodiert im befehl, bei 2 Operanden, als 3
Oder sie loesen das Intern, sie koennen beliebig Schaltwerke bauen, oder schaltung, die schreibt und laedt, egal
Vorsicht!
Akkumulatorarchitektur
1.) Ein Operanden schreibweise
ausgangspunkt ist der Akku - besonders ausgezeichnetes, Allzweckregister
Akku: Ein Operand, der andere ist immer der Akku
wie kommt das da rein: Datentransferbefehl
vor jeder Arithmetischen Operation immer ein Datentransferbefehl fuer den akku
2.) Stack und Kellerarchitektur - 8087 intel
PUSH r0
PUSH r1
ADD
Kein Operand. nur bei Push und Pop landen auf Stack, Add, die letzten beiden Werte oben auf
Stack, ziel wieder auf Stack
1.) R-Typ typisch arithemtisch
1.) Ein Ziel, zwei quellen - alles Register
r: Register
rs: Quelloperand - r Register, s source
rt: Quelloperand - r Register, t source - man kann schreiben s1, s2, aber das mehr zeichen => s/t
rd: Zieloperand - r Register, d - destination
befehl:
Opcode rs, rt, rd
Befehl: 32 Bit
Opcode: 6 Bit
rs: 5 Bit
rt: 5 Bit
rd: 5 Bit
da, es 32 Bit register gibt, genuegen 5 Bit, um alle Register an zu sprechen, 2^5 = 32
Bit 31 bis Bit 26: OpCode
Bit 25 bis Bit 21: rs
Bit 20 bis Bit 16: rt
Bit 15 bis Bit 11: rd
...
Der Registersatz, hat
1.) Daten
2.) register Select - Entspricht - Addresse im RAM kann 32 Werte annehmen, fuer 32 Register, 2^5
weil, im Befehl: 2 Quellregister, 1 Zielregister ...
Die Werte, mit denen beim MIPS32 gehandelt werden, sind 32 Bit breit ^= 4G
Das sind die Werte selber, auf die Operiert wird, uebliche groessen beim Computer sind
4 Bit - 1 Nibble - absolut selten in der Vergangenheit
8 Bit - 1 Byte - Mikrocontroller
16 Bit - 1 Wort - zum Beispiel x86, erster IBM PC, ohne MMU und speicherschutz, vor Linux, Minix/MS-DOS
32 Bit - 1 Doppelwort - i386, IBM PC nachfolger, mit MMU und Paging, auf das Linus Torvalds Linux gemacht hat, mit Speicherschutz, MMU
64 Bit - amd64 - moderne Computer, intel core i3, i5, ...
Gut, operieren z.B. MIPS32, auf Werte, die 32 Bit breit sind 0 .. 4G -1,
Werte: inhalte
Wo liegen die Werte: Speicherplatz, register
Speicherplatz: Addresse
Register: Registerselect
32 register - heisst, Registerselect 5 Bit - 32 Register im Registersatz ansprechbar 2^5 = 32
Es sind in 32 Register, werte mit 32 bit ansprechbar, die Register selber: Anzahl 32
2^5
rs, rt, rd
jeweils 5 Bit, um jeweils eines der 32 Register aus zu waehlen, die jeweils werte mit 32 bit kodiert enthalten, 0 .. 4G - 1
R-Typ befehl
31 .. 26: Opcode (immer 6 Bit)
25 .. 21: rs (5 Bit)
20 .. 16: rt (5 Bit)
16 .. 11: rd (5 Bit)
11 .. 6:
5 .. 0: func feld
OK - Datenpfad
Prozessor:
1.) Rechenwerk
2.) Leitwerk
komplexes schaltwerk
1.) Operationswerk
2.) Steuerwerk
Einfaches Schaltwerk
1.) Schaltwerk
2.) uebergangsschaltnetz - zum naechsten Zustand
3.) Ausgangsschaltnetz - fuer die Ausgabe
komplexes schaltwerk
1.) Operationswerk: Kann Register enthalten
2.) Steuerwerk
Prozessor:
1.) Rechenwerk: Universelles Operationswerk
2.) Leitwerk: Umschaltbares Steuerwerk
1.) Rechenwerk: Komplexes Schaltwerk: Kann register enthalten
Rechenwerk: ALU + Registersatz
2.) umschaltbares Steuerwerk: holt Befehle aus dem Speicher, Befehle genuegen im gegensatz zu den Eingaben
beim einfachsten Schaltwerk oder Komplexen Schaltwerk, in jedem Fall sehr einheitlichen Definitionen/...
Rechenwerk = universelles Operationswerk
Rechenwerk = ALU + Registersatz
R-Typ befehl: 3 operanden
c = a + b
$r3 = $r1 + $r2
add $r3, $r1, $r2
Datenpfad, Vorsicht:
1.) Datum im Register selber
2.) Auswahl des Register
Macht: 6
1.) Zwei quellregister
2.) ein Ziel register
macht 3
1.) Datum selber, 32 Bit
2.) Register Select, Register Auswahl, 5 Bit
macht 2
2*3 = 6
Jetzt Addition findet auf zwei Quellregister statt und landet im Zielregister
Die Operation findet in der ALU statt
Zwei quellregister aus dem Registersatz werden selektiert und ihre Werte werden in der ALU arithmetisch logisch
verarbeitet verknuepft und landen als Wert im Registersatz naemlich dort im Zielregister, selektiert wie jedes
Register, mit 5 Bit, ankommt, ein 32 Bit Wert
Gut:
Registersatz -> ALU -> Registersatz
Datenpfad, R-Typ
4 x MUX!
MUX gesteuert ueber - Befehlsdekodierer
Ich nenne sie
MUX1,
MUX2,
MUX3,
MUX4
Nummierung: Von west nach ost - links nach rechts
Norden nach sueden, oben nach unten
An Zustandselementen - Register, Speicher - WE
WE - Write enable
WE - Writenable: HIGH, in das Zustandselement wird geschrieben
Jederzeit landen die Daten sowohl an den Eingaengen vom Speicher, ...
... als auch von registern
blos: WE - HIGH - am registersatz, daten uebernehmen
WE - HIGH am speicher, daten im Speicher uebernehmen
dadurch dass z.B. HIGH am Registersatz, LOW am Speicher, WE - Daten im Registersatz uebernehemen, nicht im Speicher
MemWrite: 1 Bit: Befehlsdekoder - Speicher, speicher: WE - heisst, Memory Write
RegWrite: 1 Bit: Befehlsdekoder - Registersatz, we - heisst, Registerset write
so, ob daten, hier und Dort uebernehmen, die am gleichen Datenpfad, ausgang letzte Komponente, WE
ausgang: Entweder datum hi oder hot - MUX
MUX: 1 Bit, Steuerbit s
s = 0, A, Hi
s = 1, B, Hot
Gut: R-Typ
Register-Select ^= Name - lese-Register, Quelloperand
^= Name - Schreiberegister, zieloperand
op rs rt rd sa func
rs: Bit 25 bis Bit 21 geht in Lese-Register-1 Registersatz, Auswahl
rt: Bit 20 bis Bit 16 geht in Lese-Register-2 registersatz, auswahl
laesst
Lese-daten-1 - 32 bit wert aktiv werden, sind sie so oder so, werden selektiert
Lese-Daten-2 - 32 Bit wert aktiv werden, sind sie so oder so
Jetzt kommt MUX2, MUX2: ALUSrc
Hi und Hot
0: Hi: Operand 2 - ist Lese-Daten-2 ALU, 2. Quelloperand
add $r0, $r1, $r4
indem Falle $r4
ALU-Src
src: Quelle
ALU-src- Quelle des 2. ALU Quelloperanden, 1. immer aus Registersatz, Lese-Daten-1
ALU-src: MUX, Selektion: Entweder aus Registersatz, vor der ALU, ALU, Src, woher, Quelle, bei ALU
1. Operand, immer Registersatz, zweiter: I-Typ Befehl
Gut: R-Typ:
Jetzt Ergebnis an ALU, MUX 3.
Moegliche Alternative:
Store
Load/Store
I-Typ
I-Typ braucht 2 Register, nicht wie gemeint, 1 und eine Addresse
wird gleich erklaert
Die Daten der ALU, Zieloperand, gehen gleichzeitig
1.) In den Datenspeicher
2.) MUX3
Da nicht in Datenspeicher, WE von Datenspeicher = 0, daten nicht im Datenspeicher uebernommen
MUX3: hi, MemToReg
MemToReg: Heisst: Memory 2 Register, als from Memory to register?
1.) I-Typ: Speichern
2.) I-Typ: Laden
oder
1.) I-Typ: Speichern
2.) I-Typ: Laden
3.) I-Typ: Add Immidiate
I-Typ, nachher, aber, waehrend einer I-Typ, Speichern, muss bei Speichern Addresse,
dann waere WE enable = 1, von Speicher
2. I-Typ lesen von speicher, aber jetzt MUX3, = 1, hot, jetzt lesedaten vom Speicher
nach MUX3, in schreibedaten, WE von Registersatz = 1, von Befehlsdekodierer u.
schreiberegister, register select von zieloperand, rd - 3. operand
Aber Vorsicht MUX 1, es kaeme zu kollision
bei i-typ 2 Register, Befehl
wenn sie 3 Register haben, 5 bit Select
5 Bit + 5 Bit + 5 Bit
brauchen sie 5 Bit mehr, als bei 2 Registern select
5 Bit + 5 bit
31 .. 26: opcode
25 .. 21: rs
20 .. 16: rt
15 .. 11: rd
..
bei 3
31 .. 26: opcode
25 .. 21: rs
20 .. 16: rt
15 .. 0: immidiate: 16 Bit konstante aber kein register
..
Deswegen steht der letzte Operand bei R-Typ, das Ziel bei 15 .. 11, bei I-Typ, bei 20 .. 16
hier MUX1, entweder 20:16 oder 15 .. 11 fuer zieloperand, gesteuert ueber: RegDst - Registerdestination, Befehlsdekodierer
R-typ: opcode rs rt rd sa func
I-Typ: opcode rs rt immidiate
immidiate, 16 bit
beim ersteren
i-typ:
zwei Register, Ziel und Quelle und ein 16 Bit direktwert
Im Gegensatz zu einem j-Typ, gibt es keinen 32 - 6 = 26 Bit Direkten wert
Dieser wert ist ausser bei absoluten sprungzielen unbequem, weil wir mit 32 bit rechnen, auch noch
16 bit werte haben. Der nur bei absoluten werten
so. I-Typ: 16 Bit breiter immidiate Wert
16 Bit = 32k Werte.
Dieser ist zweier Komplement, zweier komplement = 1 Komplement +1
einer komplement
1010 = 0101
zweier komplement
0101 +1 = 0110
Oder positive ganzzahl, wenn Vorzeichen gesetzt, dann 2er Komplement
wenn nicht 15 bit positive Ganzzahl, natuerliche
warum Vorzeichenerweiterungseinheit?
weil 16 Bit, aber nachher 32
Wenn man 2er komplement hat, so oder so und/oder natuerliche, 16 Bit
man muss aufpassen bei fuellen oben MSB... zu 32 bit
I-Typ: Speichern, "schreiben" - store
16 Bit immidiate von Befehl
31 .. 26: Opcode
25 .. 21: rs
21 .. 16: rt
15 .. 0: immidiate
15 .. 0 immidiate geht durch vorzeichenerweiterungseinheit, wird 32 Bit
jetzt kommt MUX2, ALU-Src, dies Mal, von Vorzeichenerweiterungseinheit, nicht Registersatz, Op2
wird mit operand1, addiert
das ist Addressierung: Register mit festen relativem wert
Register + Fester Relativer Wert
Operand 1, register satz, wie immer geht, in ALU, muss + immidiate
Geht zusammen Addition in ALU, Zieloperand, dies Mal addresse vom Arbeitsspeicher, datenspeicher, Heap, bildet Addresse
jetzt WE Write enable von Datenspeicher = 1, in Datenspeicher wird geschrieben, blos what?
Register 2 - operand 2, direkt rein.
Store - Addresse im RAM und Register, fertig
Die Addresse im RAM aus immdiate und Register, 2, damit Ende
Rest regelt sich, dass WE bei registersatz nicht aktiv, auch, wenn daten dahin
Load: wie gerade eben.
Hier zwei Moeglichkeiten, gaebe es:
Wie bei R-Typ addiere ich beide quellregister, und tue sie in die ALU, und sie bilden addresse
Addresse vom RAM, immer von ALU-Ergbnis Operand 3
Oder wie gerade eben, store
immdiate
immdiate durch vorzeichenerweiterungseinheit
MUX2 = 1
--> Immidiate + lese-daten 1, registersatz, Addresse,
aber, WE am RAM = 0.
Dafuer MemToReg, MUX3, = 1. Bedeutet, jetzt nicht ALU-Ergebnis in registersatz, sondern RAM und jetzt wie gehabt, wie vorher
Was die Spruenge und Befehle im Programmspeicher betrifft
Vorsicht!
neumann: daten und Programmspeicher gemeinsam
Harvard: Gemeinsam
Atmega8: Harvard: SRAM und Programmspeicher
Programmspeicher nicht fluechtig
Ganz anderer Pfad, Spruenge
Auch Immdiate
Aber das zeigt nich in den Datenspeicher
Programmablauf:
Befehl, Befehl, Befehl, ...
Da Befehl, 32 Bit
Speicher 4 bit, immer +4, +4, +4, Programmzaehler
Befehlszaehler -> Addierer 1, +4
jetzt MUX4,
MUX4, ist Branch
Wozu? normaler Befehl +4, +4, ...
Ich muss wissen, will ich verzweigen oder weiter gerade aus.
Wegen Bedingten Spruengen?
Nein Generell. Unabhaengig, ob bedingt oder nicht
Bei verzweigungen und Spruengen liegt die Addresse nicht an der naechsten stelle.
Sie steht im Befehl. bei normalen Befehlen nicht, immr +4
Deswegen MUX4: Befehlsdekodierer, Branch
Hueh: 0: +4
Hot: Vorzeichenerweiterungseinheit, - immdiate, positiv negativ zu 32 Bit
Dann um 2 nach links
warum? Bei direktwerten nicht, im Befehl, Addition, aber befehl kann nicht an Stelle
n+1, n+2, n+3 liegen, weil Befehl immer 4 byte, also shift nach links
Dann geht das in addierer 2. Warum?
Zunaechst spruenge sind relativ. Das heisst, zum aktuellen Befehlszaehler, aber das ist irrefuehrend
Da der naechste Befehl ohne Sprung, +4, +4, +4
geht es immer durch addierer 1. +4
jetzt koennte man die Verzweigung zum aktuell letzten Befehlszaehler addieren, in Addierer 2
Tatsaechlich geht der PC immer durch Addierer 1, +4 und jetzt relativ
immdiate geht durch vorzeichenerweiterung, 16 nach 32 Bit, dann << 2 nach links, wegen 4 Byte Grenze,
dann addierer, relativ dazu addieren, aber zu addierer 1 +4, fertig
jetzt kommt MUX4, und macht die verzweigung
Befehle
lb
lbu
lh
lhu
lw
ld*
la*
li*
sb
sh
sw
sd*
add
addi
addiu
sub
mult
multu
div
divu
and
andi
or
ori
xor
xori
Verzweigungen:
breq, brne
blt, ble
bgt, bge
beqe*, bnez*
bgtz, bgez
bltz, blez
das eine mit entspricht null, das andere vergleich Register, Register
Zu gegebener Massen, war da ein Fehler drin, den jeder Intel Programmierer kennt
2^16 = 64k
Jedes Intel Segment ist 64k. das weiss, jeder, das liegt daran, der fehler, dass ich die 2er Potenzen bis 8192 auswendig kenne
1 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192
und jetzt wird es spannend, folgen sie meinen Uebungen, Binaerzahlen um zu rechnen, rechne ich bei Bit 14 und Bit 15 immer
8192*2
8192*4
seltsam, 8192 ist Bit 13
Und 16384 Das weiss ich noch auswendig 14
ebenso wie 32k bit 15
32k bit 15, ist Bit 15, 32k, warum dann 64k
weil 64 k ist
1111 1111 1111 1111
32 k:
1000 0000 0000 0000
rechnet man
0111 1111 1111 1111
kommt man auf 32k-1, zusammen mit der 0, 32k
0111 1111 1111 1111
kommt man auf 2x32k = 64k
Das ist in der Eile passiert, tut mir leid, jeder Intel Programmer weiss, die Segmente sind 64k
Das ist nicht so besonders spannend, meine Erklaerungen zum MIPS32, sind gut und absolut richtig
Ansonsten muss man sich nur noch merken
1.) Der Opcode ist immer 6 Bit breit - also das, was entscheidet, welcher Befehl kommt, im 32 Bit Befehl
2.) Es gibt: Befehlsdekodierer
3.) Es gibt: Funktionsdekodierer
Der Befehlsdekodierer ist fuer das Grobe ausserhalb der ALU zustaendig, WE an Speicher und Registersatz
Der Funktionsdekodierer wird von dem Befehsldekodierer mit gesteuert
Man koennte ihn wohl auch gleich im befehlsdekodierer unterbringen
Er steuert die ALU feiner
1.) Es gibt eine Grobe Steuerung fuer das wichtigste
2.) eine feine Steuerung, fuer das besondere
1.) Der Befehlsdekodierer erkennt einen befehl fuer die ALU - R-Typ, 2 Operanden, arithmetisch/logisch
2.) Das teilt er dem Funktionsdekodierer mit, und 2 mit 2 Bit
00 - addition
01 - subtraktion
10 - nutze das func-feld
11 - n/a
na: not applicable/not accessable = nicht machbar = unsinn
nc: not connected, an bauteilen
Der R-Typ Befehl
31 .. 26: opcode
25 .. 21: rs
20 .. 16: rt
15 .. 11: rd
10 .. 6: sa
6 .. 0: func
func: Im Befehl genaue Steuerung fuer den Funktionsdekodierer
Zwischen Befehlsdekodierer und Funktionsdekodierer 2 Bit
00 - immer Addition - Addition, das groebste, essentiell, rudimentaer
01 - subtration ebenso
Aber Arithmetisch logisch:
Addition, Subtraktion, multiplaktion, division
AND, OR, XOR, NOT, NOR
SHIFT RIGHT, LEFT, ROTATE RIGHT, LEFT
...
Deswegen:
10 - an Befehlsdekodierer: func feld
Das geht so:
100 000 - add - dieser ist redudant - 00 beudetet immer add, zwischen (1) und (2) 10 nutze func feld, hier noch mal add
100 010 - sub
100 100 - and
100 101 - or
101 010 - slt
100 000 - 4 0
100 010 - 4 2
100 100 - 4 4
100 101 - 4 5
101 011 - 5 2
Das kann man sich nicht merken. Also wer linux kann, kann sich rechte merken
rwx
111 - rwx
110 - rw
101 - rx
100 - r
011 - wx
010 - w
001 - x
000 - nichts
da kann man sich 4 0, 4 2... noch merken
vom Funktionskekodier an ALU
001 add
110 sub
000 and
001 or
111 slt
das ist vom Funktionsdekodier an ALU
Das andere func Feld im Befehl
und 2 Bit Befehlsdekodierer Funktionsdekodier
und 5 Bit Opcode
MIPS32 in VHDL
Re: MIPS32 in VHDL
- Attachments
-
- 1609-067.jpg (148.59 KiB) Viewed 939 times
Re: MIPS32 in VHDL
Code: Select all
architecture behaviour of ALU is
component ripplecarrychainadder32
port (
a: in std_logic_vector (31 downto 0);
b: in std_logic_vector (31 downto 0);
c: out std_logic_vector (31 downto 0);
s: in std_logic;
t: out std_logic
);
end component;
component sub32
port (
a: in std_logic_vector (31 downto 0);
b: in std_logic_vector (31 downto 0);
c: out std_logic_vector (31 downto 0);
t: out std_logic
);
end component;
component and32
port (
a: in std_logic_vector (31 downto 0);
b: in std_logic_vector (31 downto 0);
c: out std_logic_vector (31 downto 0)
);
end component;
component or32
port (
a: in std_logic_vector (31 downto 0);
b: in std_logic_vector (31 downto 0);
c: out std_logic_vector (31 downto 0)
);
end component;
component MUX32_2_1
port (
c: out std_logic_vector (31 downto 0);
b: in std_logic_vector (31 downto 0);
a: in std_logic_vector (31 downto 0);
x: in std_logic
);
end component;
signal z11, z10, z9, z8, z7, z6, z5, z4, z3, z2, z1, z12: std_logic;
signal x11, x10, x9, x8, x7, x6, x5, x4, x3, x2, x1: std_logic;
signal csub: std_logic_vector (31 downto 0);
signal cor: std_logic_vector (31 downto 0);
signal cmux1: std_logic_vector (31 downto 0);
signal cmux2: std_logic_vector (31 downto 0);
signal cmux3: std_logic_vector (31 downto 0);
signal cmux4: std_logic_vector (31 downto 0);
signal cmux5: std_logic_vector (31 downto 0);
signal cmux6: std_logic_vector (31 downto 0);
signal cmux7: std_logic_vector (31 downto 0);
signal cmux8: std_logic_vector (31 downto 0);
signal cmux9: std_logic_vector (31 downto 0);
signal cmux10: std_logic_vector (31 downto 0);
signal cadd: std_logic_vector (31 downto 0);
signal cand: std_logic_vector (31 downto 0);
signal sadd: std_logic;
signal d: std_logic_vector (31 downto 0);
begin
-- 010 add
-- 110 sub
-- 000 and
-- 001 or
-- 111 slt set less than
mux1: MUX32_2_1 PORT MAP (a=>cadd, b=>csub, c=>cmux1, x=>x1);
mux2: MUX32_2_1 PORT MAP (a=>cand, b=>cor, c=>cmux2, x=>x2);
mux3: MUX32_2_1 PORT MAP (a=>cxor, b=>cnor, c=>cmux3, x=>x3);
mux4: MUX32_2_1 PORT MAP (a=>cmult, b=>cdiv, c=> cmux4, x=>x4);
mux5: MUX32_2_1 PORT MAP (a=>csll, b=>csrl, c=>cmux5, x=>x5);
mux6: MUX32_2_1 PORT MAP (a=>csra, b=>cslt, c=>cmux6, x=>x6);
mux7: MUX32_2_1 PORT MAP (a=>cmux1, b=>cmux2, c=>cmux7, x=>x7);
mux8: MUX32_2_1 PORT MAP (a=>cmux3, b=>cmux4, c=>cmux8, x=>x8);
mux9: MUX32_2_1 PORT MAP (a=>cmux5, b=>cmux6, c=>cmux9, x=>x9);
mux10: MUX32_2_1 PORT MAP (a=>cmux7, b=>cmux8, c=>cmux10, x=>x10);
mux11: MUX32_2_1 PORT MAP (a=>cmux9, b=>cmux10, c=>d, x=>x11);
x1 <= not z1 and z2;
x2 <= not z3 and z4;
x3 <= not z7 and z6;
x4 <= not z11 and z12;
x5 <= not x8 and x10;
x6 <= not x9 and x5;
x7 <= not x1 and x2;
x8 <= not x3 and x4;
x9 <= not x5 and x6;
x10 <= not x7 and x8;
x11 <= not x9 and x10;
and1: and32 PORT MAP (a=>a, b=>b, c=>cand);
or1: or32 PORT MAP (a=>a, b=>b, c=>cor);
add1: ripplecarrychainadder32 PORT MAP (a=>a, b=>b, s=>sadd, t=>globalcarryflag, c=>cadd);
xor1: xor32 PORT MAP (a=>a, b=>b, c=>cor);
div1: div32 PORT MAP (a=>a, b=>b, c=>cdiv);
nor1: xor32 PORT MAP (a=>a, b=>b, c=>cnor);
sub1: sub32 PORT MAP (a=>a, b=>b, t=>globalcarryflag, c=>csub);
sll1: sub32 PORT MAP (a=>a, b=>b, t=>globalcarryflag, c=>csll);
sra1: sub32 PORT MAP (a=>a, b=>b, t=>globalcarryflag, c=>csra);
srl1: sub32 PORT MAP (a=>a, b=>b, t=>globalcarryflag, c=>csrl);
mult1: sub32 PORT MAP (a=>a, b=>b, t=>globalcarryflag, c=>cmult);
slt1: sub32 PORT MAP (a=>a, b=>b, t=>globalcarryflag, c=>cslt);
-- z s3s2s1s0
-- 3 0 0 0 0 and
-- 4 0 0 0 1 or
-- 1 0 0 1 0 add
-- 7 0 0 1 1 xor
-- 12 0 1 0 0 div
-- 6 0 1 0 1 nor
-- 2 0 1 1 0 sub
-- 8 0 1 1 1 sll
-- 9 1 0 0 0 sra
-- 10 1 0 0 1 srl
-- 11 1 0 1 0 mult
-- 5 1 1 1 1 slt
z3 <= (not s (3) and not s (2) and not s (1) and not s (0));
z4 <= (not s (3) and not s (2) and not s (1) and s (0));
z1 <= (not s (3) and not s (2) and s (1) and not s (0));
z7 <= (not s (3) and not s (2) and s (1) and s (0));
z12 <= (not s (3) and s (2) and not s (1) and not s (0));
z6 <= (not s (3) and s (2) and not s (1) and s (0));
z2 <= (not s (3) and s (2) and s (1) and not s (0));
z8 <= (not s (3) and s (2) and s (1) and s (0));
z9 <= (s (3) and not s (2) and not s (1) and not s (0));
z10 <= (s (3) and not s (2) and not s (1) and s (0));
z11 <= (s (3) and not s (2) and s (1) and not s (0));
z5 <= (s (3) and s (2) and s (1) and s (0));
sadd <= '0';
c <= d;
nul <= d (31);
testnull: FOR i IN 30 DOWNTO 0 GENERATE
nul <= d (i) nor nul;
END GENERATE;
end;
library ieee;
use ieee.std_logic_1164.all;
entity opdecode is
port (
opcode: in std_logic_vector (5 downto 0);
memtoreg: out std_logic;
memwrite: out std_logic;
branch: out std_logic;
alusrc: out std_logic;
regdst: out std_logic;
regwrite: out std_logic;
aluop: out std_logic_vector (1 downto 0)
);
end;
architecture behaviour of opdecode is
signal x0: std_logic;
signal x1: std_logic;
signal x2: std_logic;
begin
-- addi
-- 001000 rs rt imm
-- op5 op4 op3 op2 op1 op0
-- 0 0 1 0 0 0
-- x0: nothing
-- x1: addi
-- x0 <= '0'
-- x1 <= not opcode (5) and not opcode (4) and opcode (3) and not opcode (2) and not opcode (1) and not opcode (0)
-- memtoreg <= x0 or ...;
-- memwrite <= x0 or ...;
-- branch <= x0 or ...;
-- ...
-- (regdst: Bit 20 bis 16) immdiate - rs, rt, rd oder rs, rd/tr immidiate
x0 <= '0';
x1 <= not opcode (5) and not opcode (4) and opcode (3) and not opcode (2) and not opcode (1) and not opcode (0);
x2 <= not opcode (5) and not opcode (4) and not opcode (3) and not opcode (2) and not opcode (1) and not opcode (0);
memtoreg <= x0;
memwrite <= x0;
branch <= x0;
alusrc <= x0 or x1;
regdst <= x0 or not x1; ---? Bei immidiate - 15:15 - ist aber x1
regwrite <= x0 or x1 or x2;
-- aluop
-- 00 -- add
-- 01 -- sub
-- 10 -- nutze das func feld
-- 11
-- x1 x2 alup
-- 0 0 xx
-- 0 1 0
-- 1 0 0
-- 1 1 0
aluop (1) <= not (x2 or x1);
aluop (0) <= not (x2 or x1);
end;
library ieee;
use ieee.std_logic_1164.all;
entity funcdecode is
port (
aluop: in std_logic_vector (1 downto 0);
func: in std_logic_vector (5 downto 0);
aluoperation: out std_logic_vector (3 downto 0)
);
end;
architecture behaviour of funcdecode is
signal x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12: std_logic;
begin
-- 00 add
-- 01 sub
-- 10 nutze das func feld
-- 010 - add
-- 110 - sub
-- 000 - and
-- 001 - or
-- 111 - slt
-- add
x0 <= '0';
-- x1 : add
-- x2 : sub
-- x3 : and
-- x4 : or
-- x5 : nor
-- x6 : slt
-- x7 : xor
-- x8 : sll
-- x9 : srl
-- x10: sra
-- x11: mult
-- x12: div
-- aluop: 10 ...
-- ... func:
-- 100 000 - add 4 0
-- 100 010 - sub 4 2
-- 100 100 - and 4 4
-- 100 101 - or 4 5
-- 100 111 - nor 4 7
-- 101 010 - slt 5 2
-- 100 110 - xor 4 6
-- 000 000 - sll 0 0
-- 000 011 - sra 0 3
-- 000 010 - srl 0 2
-- 011 000 - mult 3 0
-- 011 010 - div 3 2
x1 <= (not aluop (1) and not aluop (0)) or
(alup (1) and not alup (0) and func (5) and not func (4) and not func (3) and not func (2) and not func (1) and not func (0)); -- add
x2 <= (not aluop (1) and aluop (0)) or
(alup (1) and not alup (0) and func (5) and not func (4) and not func (3) and not func (2) and func (1) and not func (0)); -- sub
x3 <= (alup (1) and not alup (0) and func (5) and not func (4) and not func (3) and func (2) and not func (1) and not func (0)); -- and
x4 <= (alup (1) and not alup (0) and func (5) and not func (4) and not func (3) and func (2) and not func (1) and func (0)); -- or
x5 <= (alup (1) and not alup (0) and func (5) and not func (4) and not func (3) and not func (2) and func (1) and not func (0)); -- slt
x6 <= (alup (1) and not alup (0) and func (5) and not func (4) and not func (3) and func (2) and func (1) and func (0)); -- nor
x7 <= (alup (1) and not alup (0) and func (5) and not func (4) and not func (3) and func (2) and func (1) and not func (0)); -- xor
x8 <= (alup (1) and not alup (0) and not func (5) and not func (4) and not func (3) and not func (2) and not func (1) and not func (0)); -- sll
x9 <= (alup (1) and not alup (0) and not func (5) and not func (4) and not func (3) and not func (2) and func (1) and func (0)); -- sra
x10 <= (alup (1) and not alup (0) and not func (5) and not func (4) and not func (3) and not func (2) and func (1) and not func (0)); -- srl
x11 <= (alup (1) and not alup (0) and not func (5) and func (4) and func (3) and not func (2) and not func (1) and not func (0)); -- mult
x12 <= (alup (1) and not alup (0) and not func (5) and func (4) and func (3) and not func (2) and func (1) and not func (0)); -- div
-- also
-- a1 a0 ao2 ao1 ao0
-- 0 0 0 1 0
-- 0 1 1 1 0
-- ... func feld
-- 010 - add
-- 110 - sub
-- 000 - and
-- 001 - or
-- 111 - slt
-- vier bit
-- 0010 - add
-- 0110 - sub
-- 0000 - and
-- 0001 - or
-- 1111 - slt
-- selber erweitert:
-- x
-- 3 0 0 0 0 and
-- 4 0 0 0 1 or
-- 1 0 0 1 0 add
-- 7 0 0 1 1 xor
-- 12 0 1 0 0 div
-- 6 0 1 0 1 nor
-- 2 0 1 1 0 sub
-- 8 0 1 1 1 sll
-- 9 1 0 0 0 sra
-- 10 1 0 0 1 srl
-- 11 1 0 1 0 mult
-- 5 1 1 1 1 slt
aluoperation (3) <= x0 or x9 or x10 or x11 or x5;
aluoperation (2) <= x0 or x12 or x6 or x2 or x8 or x5;
aluoperation (1) <= x0 or x1 or x7 or x2 or x8 or x11 or x5;
aluoperation (0) <= x0 or x4 or x7 or x6 or x8 or x10 or x5;
end;
Code: Select all
architecture behaviour of ALU is
component ripplecarrychainadder32
port (
a: in std_logic_vector (31 downto 0);
b: in std_logic_vector (31 downto 0);
c: out std_logic_vector (31 downto 0);
s: in std_logic;
t: out std_logic
);
end component;
component sub32
port (
a: in std_logic_vector (31 downto 0);
b: in std_logic_vector (31 downto 0);
c: out std_logic_vector (31 downto 0);
t: out std_logic
);
end component;
component and32
port (
a: in std_logic_vector (31 downto 0);
b: in std_logic_vector (31 downto 0);
c: out std_logic_vector (31 downto 0)
);
end component;
component or32
port (
a: in std_logic_vector (31 downto 0);
b: in std_logic_vector (31 downto 0);
c: out std_logic_vector (31 downto 0)
);
end component;
component xor32
port (
a: in std_logic_vector (31 downto 0);
b: in std_logic_vector (31 downto 0);
c: out std_logic_vector (31 downto 0)
);
end component;
component nor32
port (
a: in std_logic_vector (31 downto 0);
b: in std_logic_vector (31 downto 0);
c: out std_logic_vector (31 downto 0)
);
end component;
component sll32
port (
a: in std_logic_vector (31 downto 0);
b: in std_logic_vector (31 downto 0);
c: out std_logic_vector (31 downto 0)
);
end component;
component srl32
port (
a: in std_logic_vector (31 downto 0);
b: in std_logic_vector (31 downto 0);
c: out std_logic_vector (31 downto 0)
);
end component;
component MUX32_2_1
port (
c: out std_logic_vector (31 downto 0);
b: in std_logic_vector (31 downto 0);
a: in std_logic_vector (31 downto 0);
x: in std_logic
);
end component;
signal z11, z10, z9, z8, z7, z6, z5, z4, z3, z2, z1, z12: std_logic;
signal x11, x10, x9, x8, x7, x6, x5, x4, x3, x2, x1: std_logic;
signal csub: std_logic_vector (31 downto 0);
signal cor: std_logic_vector (31 downto 0);
signal cmux1: std_logic_vector (31 downto 0);
signal cmux2: std_logic_vector (31 downto 0);
signal cmux3: std_logic_vector (31 downto 0);
signal cmux4: std_logic_vector (31 downto 0);
signal cmux5: std_logic_vector (31 downto 0);
signal cmux6: std_logic_vector (31 downto 0);
signal cmux7: std_logic_vector (31 downto 0);
signal cmux8: std_logic_vector (31 downto 0);
signal cmux9: std_logic_vector (31 downto 0);
signal cmux10: std_logic_vector (31 downto 0);
signal cadd: std_logic_vector (31 downto 0);
signal cand: std_logic_vector (31 downto 0);
signal sadd: std_logic;
signal d: std_logic_vector (31 downto 0);
begin
-- 010 add
-- 110 sub
-- 000 and
-- 001 or
-- 111 slt set less than
mux1: MUX32_2_1 PORT MAP (a=>cadd, b=>csub, c=>cmux1, x=>x1);
mux2: MUX32_2_1 PORT MAP (a=>cand, b=>cor, c=>cmux2, x=>x2);
mux3: MUX32_2_1 PORT MAP (a=>cxor, b=>cnor, c=>cmux3, x=>x3);
mux4: MUX32_2_1 PORT MAP (a=>cmult, b=>cdiv, c=> cmux4, x=>x4);
mux5: MUX32_2_1 PORT MAP (a=>csll, b=>csrl, c=>cmux5, x=>x5);
mux6: MUX32_2_1 PORT MAP (a=>csra, b=>cslt, c=>cmux6, x=>x6);
mux7: MUX32_2_1 PORT MAP (a=>cmux1, b=>cmux2, c=>cmux7, x=>x7);
mux8: MUX32_2_1 PORT MAP (a=>cmux3, b=>cmux4, c=>cmux8, x=>x8);
mux9: MUX32_2_1 PORT MAP (a=>cmux5, b=>cmux6, c=>cmux9, x=>x9);
mux10: MUX32_2_1 PORT MAP (a=>cmux7, b=>cmux8, c=>cmux10, x=>x10);
mux11: MUX32_2_1 PORT MAP (a=>cmux9, b=>cmux10, c=>d, x=>x11);
x1 <= not z1 and z2;
x2 <= not z3 and z4;
x3 <= not z7 and z6;
x4 <= not z11 and z12;
x5 <= not x8 and x10;
x6 <= not x9 and x5;
x7 <= not x1 and x2;
x8 <= not x3 and x4;
x9 <= not x5 and x6;
x10 <= not x7 and x8;
x11 <= not x9 and x10;
and1: and32 PORT MAP (a=>a, b=>b, c=>cand);
or1: or32 PORT MAP (a=>a, b=>b, c=>cor);
add1: ripplecarrychainadder32 PORT MAP (a=>a, b=>b, s=>sadd, t=>globalcarryflag, c=>cadd);
xor1: xor32 PORT MAP (a=>a, b=>b, c=>cor);
div1: div32 PORT MAP (a=>a, b=>b, c=>cdiv);
nor1: xor32 PORT MAP (a=>a, b=>b, c=>cnor);
sub1: sub32 PORT MAP (a=>a, b=>b, t=>globalcarryflag, c=>csub);
sll1: sub32 PORT MAP (a=>a, b=>b, t=>globalcarryflag, c=>csll);
sra1: sub32 PORT MAP (a=>a, b=>b, t=>globalcarryflag, c=>csra);
srl1: sub32 PORT MAP (a=>a, b=>b, t=>globalcarryflag, c=>csrl);
mult1: sub32 PORT MAP (a=>a, b=>b, t=>globalcarryflag, c=>cmult);
slt1: sub32 PORT MAP (a=>a, b=>b, t=>globalcarryflag, c=>cslt);
-- z s3s2s1s0
-- 3 0 0 0 0 and
-- 4 0 0 0 1 or
-- 1 0 0 1 0 add
-- 7 0 0 1 1 xor
-- 12 0 1 0 0 div
-- 6 0 1 0 1 nor
-- 2 0 1 1 0 sub
-- 8 0 1 1 1 sll
-- 9 1 0 0 0 sra
-- 10 1 0 0 1 srl
-- 11 1 0 1 0 mult
-- 5 1 1 1 1 slt
z3 <= (not s (3) and not s (2) and not s (1) and not s (0));
z4 <= (not s (3) and not s (2) and not s (1) and s (0));
z1 <= (not s (3) and not s (2) and s (1) and not s (0));
z7 <= (not s (3) and not s (2) and s (1) and s (0));
z12 <= (not s (3) and s (2) and not s (1) and not s (0));
z6 <= (not s (3) and s (2) and not s (1) and s (0));
z2 <= (not s (3) and s (2) and s (1) and not s (0));
z8 <= (not s (3) and s (2) and s (1) and s (0));
z9 <= (s (3) and not s (2) and not s (1) and not s (0));
z10 <= (s (3) and not s (2) and not s (1) and s (0));
z11 <= (s (3) and not s (2) and s (1) and not s (0));
z5 <= (s (3) and s (2) and s (1) and s (0));
sadd <= '0';
c <= d;
nul <= d (31);
testnull: FOR i IN 30 DOWNTO 0 GENERATE
nul <= d (i) nor nul;
END GENERATE;
end;
Code: Select all
library ieee;
use ieee.std_logic_1164.all;
entity funcdecode is
port (
aluop: in std_logic_vector (1 downto 0);
func: in std_logic_vector (5 downto 0);
aluoperation: out std_logic_vector (3 downto 0)
);
end;
architecture behaviour of funcdecode is
signal x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12: std_logic;
begin
-- 00 add
-- 01 sub
-- 10 nutze das func feld
-- 010 - add
-- 110 - sub
-- 000 - and
-- 001 - or
-- 111 - slt
-- add
x0 <= '0';
-- x1 : add
-- x2 : sub
-- x3 : and
-- x4 : or
-- x5 : nor
-- x6 : slt
-- x7 : xor
-- x8 : sll
-- x9 : srl
-- x10: sra
-- x11: mult
-- x12: div
-- aluop: 10 ...
-- ... func:
-- 100 000 - add 4 0
-- 100 010 - sub 4 2
-- 100 100 - and 4 4
-- 100 101 - or 4 5
-- 100 111 - nor 4 7
-- 101 010 - slt 5 2
-- 100 110 - xor 4 6
-- 000 000 - sll 0 0
-- 000 011 - sra 0 3
-- 000 010 - srl 0 2
-- 011 000 - mult 3 0
-- 011 010 - div 3 2
x1 <= (not aluop (1) and not aluop (0)) or
(alup (1) and not alup (0) and func (5) and not func (4) and not func (3) and not func (2) and not func (1) and not func (0)); -- add
x2 <= (not aluop (1) and aluop (0)) or
(alup (1) and not alup (0) and func (5) and not func (4) and not func (3) and not func (2) and func (1) and not func (0)); -- sub
x3 <= (alup (1) and not alup (0) and func (5) and not func (4) and not func (3) and func (2) and not func (1) and not func (0)); -- and
x4 <= (alup (1) and not alup (0) and func (5) and not func (4) and not func (3) and func (2) and not func (1) and func (0)); -- or
x5 <= (alup (1) and not alup (0) and func (5) and not func (4) and not func (3) and not func (2) and func (1) and not func (0)); -- slt
x6 <= (alup (1) and not alup (0) and func (5) and not func (4) and not func (3) and func (2) and func (1) and func (0)); -- nor
x7 <= (alup (1) and not alup (0) and func (5) and not func (4) and not func (3) and func (2) and func (1) and not func (0)); -- xor
x8 <= (alup (1) and not alup (0) and not func (5) and not func (4) and not func (3) and not func (2) and not func (1) and not func (0)); -- sll
x9 <= (alup (1) and not alup (0) and not func (5) and not func (4) and not func (3) and not func (2) and func (1) and func (0)); -- sra
x10 <= (alup (1) and not alup (0) and not func (5) and not func (4) and not func (3) and not func (2) and func (1) and not func (0)); -- srl
x11 <= (alup (1) and not alup (0) and not func (5) and func (4) and func (3) and not func (2) and not func (1) and not func (0)); -- mult
x12 <= (alup (1) and not alup (0) and not func (5) and func (4) and func (3) and not func (2) and func (1) and not func (0)); -- div
-- also
-- a1 a0 ao2 ao1 ao0
-- 0 0 0 1 0
-- 0 1 1 1 0
-- ... func feld
-- 010 - add
-- 110 - sub
-- 000 - and
-- 001 - or
-- 111 - slt
-- vier bit
-- 0010 - add
-- 0110 - sub
-- 0000 - and
-- 0001 - or
-- 1111 - slt
-- selber erweitert:
-- x
-- 3 0 0 0 0 and
-- 4 0 0 0 1 or
-- 1 0 0 1 0 add
-- 7 0 0 1 1 xor
-- 12 0 1 0 0 div
-- 6 0 1 0 1 nor
-- 2 0 1 1 0 sub
-- 8 0 1 1 1 sll
-- 9 1 0 0 0 sra
-- 10 1 0 0 1 srl
-- 11 1 0 1 0 mult
-- 5 1 1 1 1 slt
aluoperation (3) <= x0 or x9 or x10 or x11 or x5;
aluoperation (2) <= x0 or x12 or x6 or x2 or x8 or x5;
aluoperation (1) <= x0 or x1 or x7 or x2 or x8 or x11 or x5;
aluoperation (0) <= x0 or x4 or x7 or x6 or x8 or x10 or x5;
end;
Code: Select all
entity ALU is
port (
a: in std_logic_vector (31 downto 0);
b: in std_logic_vector (31 downto 0);
c: out std_logic_vector (31 downto 0);
s: in std_logic_vector (3 downto 0);
t: out std_logic;
nul: inout std_logic;
globalcarryflag: out std_logic
);
end;
architecture behaviour of ALU is
component ripplecarrychainadder32
port (
a: in std_logic_vector (31 downto 0);
b: in std_logic_vector (31 downto 0);
c: out std_logic_vector (31 downto 0);
s: in std_logic;
t: out std_logic
);
end component;
component sub32
port (
a: in std_logic_vector (31 downto 0);
b: in std_logic_vector (31 downto 0);
c: out std_logic_vector (31 downto 0);
t: out std_logic
);
end component;
component and32
port (
a: in std_logic_vector (31 downto 0);
b: in std_logic_vector (31 downto 0);
c: out std_logic_vector (31 downto 0)
);
end component;
component or32
port (
a: in std_logic_vector (31 downto 0);
b: in std_logic_vector (31 downto 0);
c: out std_logic_vector (31 downto 0)
);
end component;
component xor32
port (
a: in std_logic_vector (31 downto 0);
b: in std_logic_vector (31 downto 0);
c: out std_logic_vector (31 downto 0)
);
end component;
component nor32
port (
a: in std_logic_vector (31 downto 0);
b: in std_logic_vector (31 downto 0);
c: out std_logic_vector (31 downto 0)
);
end component;
component sll32
port (
a: in std_logic_vector (31 downto 0);
b: in std_logic_vector (31 downto 0);
c: out std_logic_vector (31 downto 0)
);
end component;
component srl32
port (
a: in std_logic_vector (31 downto 0);
b: in std_logic_vector (31 downto 0);
c: out std_logic_vector (31 downto 0)
);
end component;
component sra32
port (
a: in std_logic_vector (31 downto 0);
b: in std_logic_vector (31 downto 0);
c: out std_logic_vector (31 downto 0)
);
end component;
component slt32
port (
a: in std_logic_vector (31 downto 0);
b: in std_logic_vector (31 downto 0);
c: out std_logic_vector (31 downto 0)
);
end component;
component mult32
port (
a: in std_logic_vector (31 downto 0);
b: in std_logic_vector (31 downto 0);
c: out std_logic_vector (31 downto 0)
);
end component;
component div32
port (
a: in std_logic_vector (31 downto 0);
b: in std_logic_vector (31 downto 0);
c: out std_logic_vector (31 downto 0)
);
end component;
component MUX32_2_1
port (
c: out std_logic_vector (31 downto 0);
b: in std_logic_vector (31 downto 0);
a: in std_logic_vector (31 downto 0);
x: in std_logic
);
end component;
signal z11, z10, z9, z8, z7, z6, z5, z4, z3, z2, z1, z12: std_logic;
signal x11, x10, x9, x8, x7, x6, x5, x4, x3, x2, x1: std_logic;
signal csub: std_logic_vector (31 downto 0);
signal cor: std_logic_vector (31 downto 0);
signal cmux1: std_logic_vector (31 downto 0);
signal cmux2: std_logic_vector (31 downto 0);
signal cmux3: std_logic_vector (31 downto 0);
signal cmux4: std_logic_vector (31 downto 0);
signal cmux5: std_logic_vector (31 downto 0);
signal cmux6: std_logic_vector (31 downto 0);
signal cmux7: std_logic_vector (31 downto 0);
signal cmux8: std_logic_vector (31 downto 0);
signal cmux9: std_logic_vector (31 downto 0);
signal cmux10: std_logic_vector (31 downto 0);
signal cadd: std_logic_vector (31 downto 0);
signal cand: std_logic_vector (31 downto 0);
signal cmult: std_logic_vector (31 downto 0);
signal cdiv: std_logic_vector (31 downto 0);
signal csll: std_logic_vector (31 downto 0);
signal csrl: std_logic_vector (31 downto 0);
signal csra: std_logic_vector (31 downto 0);
signal cslt: std_logic_vector (31 downto 0);
signal cxor: std_logic_vector (31 downto 0);
signal cnor: std_logic_vector (31 downto 0);
signal sadd: std_logic;
signal d: std_logic_vector (31 downto 0);
begin
-- 010 add
-- 110 sub
-- 000 and
-- 001 or
-- 111 slt set less than
mux1: MUX32_2_1 PORT MAP (a=>cadd, b=>csub, c=>cmux1, x=>x1);
mux2: MUX32_2_1 PORT MAP (a=>cand, b=>cor, c=>cmux2, x=>x2);
mux3: MUX32_2_1 PORT MAP (a=>cxor, b=>cnor, c=>cmux3, x=>x3);
mux4: MUX32_2_1 PORT MAP (a=>cmult, b=>cdiv, c=> cmux4, x=>x4);
mux5: MUX32_2_1 PORT MAP (a=>csll, b=>csrl, c=>cmux5, x=>x5);
mux6: MUX32_2_1 PORT MAP (a=>csra, b=>cslt, c=>cmux6, x=>x6);
mux7: MUX32_2_1 PORT MAP (a=>cmux1, b=>cmux2, c=>cmux7, x=>x7);
mux8: MUX32_2_1 PORT MAP (a=>cmux3, b=>cmux4, c=>cmux8, x=>x8);
mux9: MUX32_2_1 PORT MAP (a=>cmux5, b=>cmux6, c=>cmux9, x=>x9);
mux10: MUX32_2_1 PORT MAP (a=>cmux7, b=>cmux8, c=>cmux10, x=>x10);
mux11: MUX32_2_1 PORT MAP (a=>cmux9, b=>cmux10, c=>d, x=>x11);
x1 <= not z1 and z2;
x2 <= not z3 and z4;
x3 <= not z7 and z6;
x4 <= not z11 and z12;
x5 <= not x8 and x10;
x6 <= not x9 and x5;
x7 <= not x1 and x2;
x8 <= not x3 and x4;
x9 <= not x5 and x6;
x10 <= not x7 and x8;
x11 <= not x9 and x10;
and1: and32 PORT MAP (a=>a, b=>b, c=>cand);
or1: or32 PORT MAP (a=>a, b=>b, c=>cor);
add1: ripplecarrychainadder32 PORT MAP (a=>a, b=>b, s=>sadd, t=>globalcarryflag, c=>cadd);
xor1: xor32 PORT MAP (a=>a, b=>b, c=>cor);
div1: div32 PORT MAP (a=>a, b=>b, c=>cdiv);
nor1: xor32 PORT MAP (a=>a, b=>b, c=>cnor);
sub1: sub32 PORT MAP (a=>a, b=>b, t=>globalcarryflag, c=>csub);
sll1: sub32 PORT MAP (a=>a, b=>b, t=>globalcarryflag, c=>csll);
sra1: sub32 PORT MAP (a=>a, b=>b, t=>globalcarryflag, c=>csra);
srl1: sub32 PORT MAP (a=>a, b=>b, t=>globalcarryflag, c=>csrl);
mult1: sub32 PORT MAP (a=>a, b=>b, t=>globalcarryflag, c=>cmult);
slt1: sub32 PORT MAP (a=>a, b=>b, t=>globalcarryflag, c=>cslt);
-- z s3s2s1s0
-- 3 0 0 0 0 and
-- 4 0 0 0 1 or
-- 1 0 0 1 0 add
-- 7 0 0 1 1 xor
-- 12 0 1 0 0 div
-- 6 0 1 0 1 nor
-- 2 0 1 1 0 sub
-- 8 0 1 1 1 sll
-- 9 1 0 0 0 sra
-- 10 1 0 0 1 srl
-- 11 1 0 1 0 mult
-- 5 1 1 1 1 slt
z3 <= (not s (3) and not s (2) and not s (1) and not s (0));
z4 <= (not s (3) and not s (2) and not s (1) and s (0));
z1 <= (not s (3) and not s (2) and s (1) and not s (0));
z7 <= (not s (3) and not s (2) and s (1) and s (0));
z12 <= (not s (3) and s (2) and not s (1) and not s (0));
z6 <= (not s (3) and s (2) and not s (1) and s (0));
z2 <= (not s (3) and s (2) and s (1) and not s (0));
z8 <= (not s (3) and s (2) and s (1) and s (0));
z9 <= (s (3) and not s (2) and not s (1) and not s (0));
z10 <= (s (3) and not s (2) and not s (1) and s (0));
z11 <= (s (3) and not s (2) and s (1) and not s (0));
z5 <= (s (3) and s (2) and s (1) and s (0));
sadd <= '0';
c <= d;
nul <= d (31);
testnull: FOR i IN 30 DOWNTO 0 GENERATE
nul <= d (i) nor nul;
END GENERATE;
end;
Code: Select all
library ieee;
use ieee.std_logic_1164.all;
entity funcdecode is
port (
aluop: in std_logic_vector (1 downto 0);
func: in std_logic_vector (5 downto 0);
aluoperation: out std_logic_vector (3 downto 0)
);
end;
architecture behaviour of funcdecode is
signal x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12: std_logic;
begin
-- 00 add
-- 01 sub
-- 10 nutze das func feld
-- 010 - add
-- 110 - sub
-- 000 - and
-- 001 - or
-- 111 - slt
-- add
x0 <= '0';
-- x1 : add
-- x2 : sub
-- x3 : and
-- x4 : or
-- x5 : nor
-- x6 : slt
-- x7 : xor
-- x8 : sll
-- x9 : srl
-- x10: sra
-- x11: mult
-- x12: div
-- aluop: 10 ...
-- ... func:
-- 100 000 - add 4 0
-- 100 010 - sub 4 2
-- 100 100 - and 4 4
-- 100 101 - or 4 5
-- 100 111 - nor 4 7
-- 101 010 - slt 5 2
-- 100 110 - xor 4 6
-- 000 000 - sll 0 0
-- 000 011 - sra 0 3
-- 000 010 - srl 0 2
-- 011 000 - mult 3 0
-- 011 010 - div 3 2
x1 <= (not aluop (1) and not aluop (0)) or
(aluop (1) and not aluop (0) and func (5) and not func (4) and not func (3) and not func (2) and not func (1) and not func (0)); -- add
x2 <= (not aluop (1) and aluop (0)) or
(aluop (1) and not aluop (0) and func (5) and not func (4) and not func (3) and not func (2) and func (1) and not func (0)); -- sub
x3 <= (aluop (1) and not aluop (0) and func (5) and not func (4) and not func (3) and func (2) and not func (1) and not func (0)); -- and
x4 <= (aluop (1) and not aluop (0) and func (5) and not func (4) and not func (3) and func (2) and not func (1) and func (0)); -- or
x5 <= (aluop (1) and not aluop (0) and func (5) and not func (4) and not func (3) and not func (2) and func (1) and not func (0)); -- slt
x6 <= (aluop (1) and not aluop (0) and func (5) and not func (4) and not func (3) and func (2) and func (1) and func (0)); -- nor
x7 <= (aluop (1) and not aluop (0) and func (5) and not func (4) and not func (3) and func (2) and func (1) and not func (0)); -- xor
x8 <= (aluop (1) and not aluop (0) and not func (5) and not func (4) and not func (3) and not func (2) and not func (1) and not func (0)); -- sll
x9 <= (aluop (1) and not aluop (0) and not func (5) and not func (4) and not func (3) and not func (2) and func (1) and func (0)); -- sra
x10 <= (aluop (1) and not aluop (0) and not func (5) and not func (4) and not func (3) and not func (2) and func (1) and not func (0)); -- srl
x11 <= (aluop (1) and not aluop (0) and not func (5) and func (4) and func (3) and not func (2) and not func (1) and not func (0)); -- mult
x12 <= (aluop (1) and not aluop (0) and not func (5) and func (4) and func (3) and not func (2) and func (1) and not func (0)); -- div
-- also
-- a1 a0 ao2 ao1 ao0
-- 0 0 0 1 0
-- 0 1 1 1 0
-- ... func feld
-- 010 - add
-- 110 - sub
-- 000 - and
-- 001 - or
-- 111 - slt
-- vier bit
-- 0010 - add
-- 0110 - sub
-- 0000 - and
-- 0001 - or
-- 1111 - slt
-- selber erweitert:
-- x
-- 3 0 0 0 0 and
-- 4 0 0 0 1 or
-- 1 0 0 1 0 add
-- 7 0 0 1 1 xor
-- 12 0 1 0 0 div
-- 6 0 1 0 1 nor
-- 2 0 1 1 0 sub
-- 8 0 1 1 1 sll
-- 9 1 0 0 0 sra
-- 10 1 0 0 1 srl
-- 11 1 0 1 0 mult
-- 5 1 1 1 1 slt
aluoperation (3) <= x0 or x9 or x10 or x11 or x5;
aluoperation (2) <= x0 or x12 or x6 or x2 or x8 or x5;
aluoperation (1) <= x0 or x1 or x7 or x2 or x8 or x11 or x5;
aluoperation (0) <= x0 or x4 or x7 or x6 or x8 or x10 or x5;
end;
Code: Select all
library ieee;
use ieee.std_logic_1164.all;
entity or32 is
port (
a: in std_logic_vector (31 downto 0);
b: in std_logic_vector (31 downto 0);
c: out std_logic_vector (31 downto 0)
);
end;
architecture behaviour of or32 is
begin
genor32: FOR i IN 31 DOWNTO 0 GENERATE
c (i) <= b (i) or a (i);
END GENERATE;
end;
library ieee;
use ieee.std_logic_1164.all;
entity nor32 is
port (
a: in std_logic_vector (31 downto 0);
b: in std_logic_vector (31 downto 0);
c: out std_logic_vector (31 downto 0)
);
end;
architecture behaviour of nor32 is
begin
genor32: FOR i IN 31 DOWNTO 0 GENERATE
c (i) <= b (i) nor a (i);
END GENERATE;
end;
library ieee;
use ieee.std_logic_1164.all;
entity xor32 is
port (
a: in std_logic_vector (31 downto 0);
b: in std_logic_vector (31 downto 0);
c: out std_logic_vector (31 downto 0)
);
end;
architecture behaviour of xor32 is
begin
genor32: FOR i IN 31 DOWNTO 0 GENERATE
c (i) <= b (i) xor a (i);
END GENERATE;
end;
library ieee;
use ieee.std_logic_1164.all;
entity sll32 is
port (
a: in std_logic_vector (31 downto 0);
b: in std_logic_vector (31 downto 0);
c: out std_logic_vector (31 downto 0)
);
end;
architecture behaviour of sll32 is
begin
genor32: FOR i IN 30 DOWNTO 0 GENERATE
c (i) <= a (i+1);
END GENERATE;
end;
library ieee;
use ieee.std_logic_1164.all;
entity srl32 is
port (
a: in std_logic_vector (31 downto 0);
b: in std_logic_vector (31 downto 0);
c: out std_logic_vector (31 downto 0)
);
end;
architecture behaviour of srl32 is
begin
genor32: FOR i IN 31 DOWNTO 1 GENERATE
c (i) <= a (i-1);
END GENERATE;
end;
library ieee;
use ieee.std_logic_1164.all;
entity slt32 is
port (
a: in std_logic_vector (31 downto 0);
b: in std_logic_vector (31 downto 0);
c: out std_logic_vector (31 downto 0)
);
end;
architecture behaviour of slt32 is
-- not implemented yet
begin
genor32: FOR i IN 31 DOWNTO 1 GENERATE
c (i) <= a (i-1);
END GENERATE;
end;
library ieee;
use ieee.std_logic_1164.all;
entity sra32 is
port (
a: in std_logic_vector (31 downto 0);
b: in std_logic_vector (31 downto 0);
c: out std_logic_vector (31 downto 0)
);
end;
architecture behaviour of sra32 is
-- not implemented yet
begin
genor32: FOR i IN 31 DOWNTO 1 GENERATE
c (i) <= a (i-1);
END GENERATE;
end;
library ieee;
use ieee.std_logic_1164.all;
entity mult32 is
port (
a: in std_logic_vector (31 downto 0);
b: in std_logic_vector (31 downto 0);
c: out std_logic_vector (31 downto 0)
);
end;
architecture behaviour of mult32 is
-- not implemented yet, comes soon
begin
genor32: FOR i IN 31 DOWNTO 1 GENERATE
c (i) <= a (i-1);
END GENERATE;
end;
library ieee;
use ieee.std_logic_1164.all;
entity div32 is
port (
a: in std_logic_vector (31 downto 0);
b: in std_logic_vector (31 downto 0);
c: out std_logic_vector (31 downto 0)
);
end;
architecture behaviour of div32 is
-- not implemented yet
begin
genor32: FOR i IN 31 DOWNTO 1 GENERATE
c (i) <= a (i-1);
END GENERATE;
end;
kleiner nachtrag - das funcfeld und die operation - add und sub - 00 und 01 sind es nicht wegen dem rudimentaeren, sondern sie sind es, wegen addi und subi, was ein anderes verhalten beim befehlsdekodierer ausloest, bei allen klassischen arith/logic Befehlen wird das func feld genutzt, und op ist immer 000 000, sie werden das gleich in der implementation sehen
es geht deswegen nicht, weil - das Befehlsdekoder sich bei addi anders verhaelt
ich mache die cpu jetzt so, dass sie nicht alle befehle gleich implementiert, dabei wird sie andi erst mal nicht koennen, nicht sofort, was einfach waere, aber laden und speichern und verzweigungen wenigstens teilweise kann, verzweigung
das befehlsdekoder kommt gleich. Es liegt in der natur der Sache, dass die CPU bisher all das kann, wenn es das Befehlsdekoder kann
Code: Select all
library ieee;
use ieee.std_logic_1164.all;
entity opdecode is
port (
opcode: in std_logic_vector (5 downto 0);
memtoreg: out std_logic;
memwrite: out std_logic;
branch: out std_logic;
alusrc: out std_logic;
regdst: out std_logic;
regwrite: out std_logic;
aluop: out std_logic_vector (1 downto 0)
);
end;
architecture behaviour of opdecode is
signal x0: std_logic;
signal x1: std_logic;
signal x2: std_logic;
begin
-- addi
-- 001000 rs rt imm
-- op5 op4 op3 op2 op1 op0
-- 0 0 1 0 0 0
-- x0: nothing
-- x1: addi
-- x0 <= '0'
-- x1 <= not opcode (5) and not opcode (4) and opcode (3) and not opcode (2) and not opcode (1) and not opcode (0)
-- memtoreg <= x0 or ...;
-- memwrite <= x0 or ...;
-- branch <= x0 or ...;
-- ...
-- (regdst: Bit 20 bis 16) immdiate - rs, rt, rd oder rs, rd/tr immidiate
x0 <= '0';
x1 <= not opcode (5) and not opcode (4) and opcode (3) and not opcode (2) and not opcode (1) and not opcode (0);
x2 <= not opcode (5) and not opcode (4) and not opcode (3) and not opcode (2) and not opcode (1) and not opcode (0);
-- gehoert in funktionsdekodierer
-- x2, 1 alle opcode 0
-- opcode, func feld
-- 00 000, 100 000 - add
-- 00 100, xxx xxx - addi
-- 00 000, 100 100 - and
-- 00 000, 100 111 - nor
-- 00 000, 100 101 - or
-- 00 000, 101 010 - slt
-- 00 000, 101 011 - sub
-- 00 000, 100 110 - xor
-- 00 000, 000 000 - sll
-- 00 000, 000 010 - srl
-- 00 000, 000 011 - sra
-- 00 000, 011 010 - div
-- 00 000, 011 000 - mult
-- gehoert in funktionsdekodierer
-- y1 <= func (5) and not func (4) and not func (3) and not func (2) and not func (1) and not func (0); -- add
-- y2 <= func (5) and not func (4) and not func (3) and func (2) and not func (1) and not func (0); -- and
-- y3 <= func (5) and not func (4) and not func (3) and func (2) and func (1) and func (0); -- nor
-- y4 <= func (5) and not func (4) and not func (3) and func (2) and not func (1) and func (0); -- or
-- y5 <= func (5) and not func (4) and not func (3) and not func (2) and func (1) and not func (0); -- slt
-- y6 <= func (5) and not func (4) and not func (3) and not func (2) and func (1) and func (0); -- sub
-- y7 <= func (5) and not func (4) and not func (3) and func (2) and func (1) and not func (0); -- xor
-- y8 <= not func (5) and not func (4) and not func (3) and not func (2) and not func (1) and not func (0); -- sll
-- y9 <= not func (5) and not func (4) and not func (3) and not func (2) and func (1) and not func (0); -- slr
-- y10 <= not func (5) and not func (4) and not func (3) and not func (2) and func (1) and func (0); -- sra
-- y11 <= not func (5) and func (4) and func (3) and not func (2) and func (1) and not func (0); -- div
-- y12 <= not func (5) and func (4) and func (3) and not func (2) and not func (1) and not func (0); -- mult
memtoreg <= x0;
memwrite <= x0;
branch <= x0;
alusrc <= x0 or x1;
regdst <= x0 or not x1; ---? Bei immidiate - 15:15 - ist aber x1
regwrite <= x0 or x1 or x2;
-- aluop
-- 00 -- add
-- 01 -- sub
-- 10 -- nutze das func feld
-- 11
-- aluop x
-- 0 0 - (0)
-- 0 1 1
-- 1 0 2
-- x x -
aluop (1) <= x0 or x1;
aluop (0) <= x0 or x2;
end;
library ieee;
use ieee.std_logic_1164.all;
entity funcdecode is
port (
aluop: in std_logic_vector (1 downto 0);
func: in std_logic_vector (5 downto 0);
aluoperation: out std_logic_vector (3 downto 0)
);
end;
architecture behaviour of funcdecode is
signal x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12: std_logic;
begin
-- 00 add
-- 01 sub
-- 10 nutze das func feld
-- 010 - add
-- 110 - sub
-- 000 - and
-- 001 - or
-- 111 - slt
-- add
x0 <= '0';
-- x1 : add
-- x2 : sub
-- x3 : and
-- x4 : or
-- x5 : nor
-- x6 : slt
-- x7 : xor
-- x8 : sll
-- x9 : srl
-- x10: sra
-- x11: mult
-- x12: div
-- aluop: 10 ...
-- ... func:
-- 100 000 - add 4 0
-- 100 010 - sub 4 2
-- 100 100 - and 4 4
-- 100 101 - or 4 5
-- 100 111 - nor 4 7
-- 101 010 - slt 5 2
-- 100 110 - xor 4 6
-- 000 000 - sll 0 0
-- 000 011 - sra 0 3
-- 000 010 - srl 0 2
-- 011 000 - mult 3 0
-- 011 010 - div 3 2
x1 <= (not aluop (1) and not aluop (0)) or
(aluop (1) and not aluop (0) and func (5) and not func (4) and not func (3) and not func (2) and not func (1) and not func (0)); -- add
x2 <= (not aluop (1) and aluop (0)) or
(aluop (1) and not aluop (0) and func (5) and not func (4) and not func (3) and not func (2) and func (1) and not func (0)); -- sub
x3 <= (aluop (1) and not aluop (0) and func (5) and not func (4) and not func (3) and func (2) and not func (1) and not func (0)); -- and
x4 <= (aluop (1) and not aluop (0) and func (5) and not func (4) and not func (3) and func (2) and not func (1) and func (0)); -- or
x5 <= (aluop (1) and not aluop (0) and func (5) and not func (4) and not func (3) and not func (2) and func (1) and not func (0)); -- slt
x6 <= (aluop (1) and not aluop (0) and func (5) and not func (4) and not func (3) and func (2) and func (1) and func (0)); -- nor
x7 <= (aluop (1) and not aluop (0) and func (5) and not func (4) and not func (3) and func (2) and func (1) and not func (0)); -- xor
x8 <= (aluop (1) and not aluop (0) and not func (5) and not func (4) and not func (3) and not func (2) and not func (1) and not func (0)); -- sll
x9 <= (aluop (1) and not aluop (0) and not func (5) and not func (4) and not func (3) and not func (2) and func (1) and func (0)); -- sra
x10 <= (aluop (1) and not aluop (0) and not func (5) and not func (4) and not func (3) and not func (2) and func (1) and not func (0)); -- srl
x11 <= (aluop (1) and not aluop (0) and not func (5) and func (4) and func (3) and not func (2) and not func (1) and not func (0)); -- mult
x12 <= (aluop (1) and not aluop (0) and not func (5) and func (4) and func (3) and not func (2) and func (1) and not func (0)); -- div
-- x2, 1 alle opcode 0
-- opcode, func feld
-- 00 000, 100 000 - add
-- 00 100, xxx xxx - addi
-- 00 000, 100 100 - and
-- 00 000, 100 111 - nor
-- 00 000, 100 101 - or
-- 00 000, 101 010 - slt
-- 00 000, 101 011 - sub
-- 00 000, 100 110 - xor
-- 00 000, 000 000 - sll
-- 00 000, 000 010 - srl
-- 00 000, 000 011 - sra
-- 00 000, 011 010 - div
-- 00 000, 011 000 - mult
-- gehoert in funktionsdekodierer
-- y1 <= func (5) and not func (4) and not func (3) and not func (2) and not func (1) and not func (0); -- add
-- y2 <= func (5) and not func (4) and not func (3) and func (2) and not func (1) and not func (0); -- and
-- y3 <= func (5) and not func (4) and not func (3) and func (2) and func (1) and func (0); -- nor
-- y4 <= func (5) and not func (4) and not func (3) and func (2) and not func (1) and func (0); -- or
-- y5 <= func (5) and not func (4) and not func (3) and not func (2) and func (1) and not func (0); -- slt
-- y6 <= func (5) and not func (4) and not func (3) and not func (2) and func (1) and func (0); -- sub
-- y7 <= func (5) and not func (4) and not func (3) and func (2) and func (1) and not func (0); -- xor
-- y8 <= not func (5) and not func (4) and not func (3) and not func (2) and not func (1) and not func (0); -- sll
-- y9 <= not func (5) and not func (4) and not func (3) and not func (2) and func (1) and not func (0); -- slr
-- y10 <= not func (5) and not func (4) and not func (3) and not func (2) and func (1) and func (0); -- sra
-- y11 <= not func (5) and func (4) and func (3) and not func (2) and func (1) and not func (0); -- div
-- y12 <= not func (5) and func (4) and func (3) and not func (2) and not func (1) and not func (0); -- mult
-- also
-- a1 a0 ao2 ao1 ao0
-- 0 0 0 1 0
-- 0 1 1 1 0
-- ... func feld
-- 010 - add
-- 110 - sub
-- 000 - and
-- 001 - or
-- 111 - slt
-- vier bit
-- 0010 - add
-- 0110 - sub
-- 0000 - and
-- 0001 - or
-- 1111 - slt
-- selber erweitert:
-- x
-- 3 0 0 0 0 and
-- 4 0 0 0 1 or
-- 1 0 0 1 0 add
-- 7 0 0 1 1 xor
-- 12 0 1 0 0 div
-- 6 0 1 0 1 nor
-- 2 0 1 1 0 sub
-- 8 0 1 1 1 sll
-- 9 1 0 0 0 sra
-- 10 1 0 0 1 srl
-- 11 1 0 1 0 mult
-- 5 1 1 1 1 slt
aluoperation (3) <= x0 or x9 or x10 or x11 or x5;
aluoperation (2) <= x0 or x12 or x6 or x2 or x8 or x5;
aluoperation (1) <= x0 or x1 or x7 or x2 or x8 or x11 or x5;
aluoperation (0) <= x0 or x4 or x7 or x6 or x8 or x10 or x5;
end;
Re: MIPS32 in VHDL
Code: Select all
-- mit store - word - kurze pause
entity opdecode is
port (
opcode: in std_logic_vector (5 downto 0);
memtoreg: out std_logic;
memwrite: out std_logic;
branch: out std_logic;
alusrc: out std_logic;
regdst: out std_logic;
regwrite: out std_logic;
aluop: out std_logic_vector (1 downto 0)
);
end;
architecture behaviour of opdecode is
signal x0: std_logic;
signal x1: std_logic;
signal x2: std_logic;
begin
-- addi
-- 001000 rs rt imm
-- op5 op4 op3 op2 op1 op0
-- 0 0 1 0 0 0
-- x0: nothing
-- x1: addi
-- x0 <= '0'
-- x1 <= not opcode (5) and not opcode (4) and opcode (3) and not opcode (2) and not opcode (1) and not opcode (0)
-- memtoreg <= x0 or ...;
-- memwrite <= x0 or ...;
-- branch <= x0 or ...;
-- ...
-- (regdst: Bit 20 bis 16) immdiate - rs, rt, rd oder rs, rd/tr immidiate
x0 <= '0';
x1 <= not opcode (5) and not opcode (4) and opcode (3) and not opcode (2) and not opcode (1) and not opcode (0);
-- gehoert in funktionsdekodierer
-- x2, 1 alle opcode 0
-- opcode, func feld
-- 00 000, 100 000 - add
-- 00 100, xxx xxx - addi
-- 00 000, 100 100 - and
-- 00 000, 100 111 - nor
-- 00 000, 100 101 - or
-- 00 000, 101 010 - slt
-- 00 000, 101 011 - sub
-- 00 000, 100 110 - xor
-- 00 000, 000 000 - sll
-- 00 000, 000 010 - srl
-- 00 000, 000 011 - sra
-- 00 000, 011 010 - div
-- 00 000, 011 000 - mult
-- gehoert in funktionsdekodierer
-- y1 <= func (5) and not func (4) and not func (3) and not func (2) and not func (1) and not func (0); -- add
-- y2 <= func (5) and not func (4) and not func (3) and func (2) and not func (1) and not func (0); -- and
-- y3 <= func (5) and not func (4) and not func (3) and func (2) and func (1) and func (0); -- nor
-- y4 <= func (5) and not func (4) and not func (3) and func (2) and not func (1) and func (0); -- or
-- y5 <= func (5) and not func (4) and not func (3) and not func (2) and func (1) and not func (0); -- slt
-- y6 <= func (5) and not func (4) and not func (3) and not func (2) and func (1) and func (0); -- sub
-- y7 <= func (5) and not func (4) and not func (3) and func (2) and func (1) and not func (0); -- xor
-- y8 <= not func (5) and not func (4) and not func (3) and not func (2) and not func (1) and not func (0); -- sll
-- y9 <= not func (5) and not func (4) and not func (3) and not func (2) and func (1) and not func (0); -- slr
-- y10 <= not func (5) and not func (4) and not func (3) and not func (2) and func (1) and func (0); -- sra
-- y11 <= not func (5) and func (4) and func (3) and not func (2) and func (1) and not func (0); -- div
-- y12 <= not func (5) and func (4) and func (3) and not func (2) and not func (1) and not func (0); -- mult
memtoreg <= x0 and (not x1 or not x2);
memwrite <= x0 and (not x1 or x2);
branch <= x0 and (not x1 or not x2);
alusrc <= x0 or (not x1 or x2); -- weil 0 +4
regdst <= x0 or (not x1 or x2); ---? Bei immidiate - 15:15 - ist aber x1
regwrite <= x0 or (x1 or not x2);
-- LOAD WORD
-- STORE WORD
-- MUX 1 - HIGH - ALUSrc
-- MUX 2 - MemToReg - LOW
-- WE - Datenspeicher - MemWrite - HIGH
-- WE - Registersatz - Regwrite - LOW
-- MUX 3 - Achtung - LOW - 20:16 von oben her gesehen, also LOw
-- MUX 4 - Branch LOW
x2 <= opcode (5) and not opcode (4) and opcode (3) and not opcode (2) and not opcode (1) and not opcode (0);
-- aluop
-- 00 -- add
-- 01 -- sub
-- 10 -- nutze das func feld
-- 11
-- aluop x
-- 0 0 - (0)
-- 0 1 1
-- 1 0 2
-- x x -
aluop (1) <= x0 or x1;
aluop (0) <= x0 or x2;
end;