Report Uts
-
Upload
atrianggada -
Category
Documents
-
view
76 -
download
3
Transcript of Report Uts
1UTS EL3043 - Arditto Trianggada / 13209046
A. Perancangan Prosesor
Prosesor yang akan dirancang adalah MIPS Single-Cycle Processor yang dapat menopang 30 buah
instruksi. Tahapan-tahapan perancangan adalah sebagai berikut:
1. Instruksi lw
Syntax : lw $t, imm($s)
Instruction Set : 1000 11ss ssst tttt iiii iiii iiii iiii
Operasi : $t = M[$s + imm]
Datapath dan controller:
2. Instruksi sw
Syntax : sw $t, imm($s)
Instruction Set : 1010 11ss ssst tttt iiii iiii iiii iiii
Operasi : M[$s + imm] = $t
Datapath dan controller:
2UTS EL3043 - Arditto Trianggada / 13209046
3. Instruksi add, sub, and, dan or (R-Type)
Syntax : <funct> $d, $s, $t
Instruction Set : 0000 00ss ssst tttt dddd d000 00ff ffff
Operasi : $d = $s <funct> $d
Datapath dan controller:
3UTS EL3043 - Arditto Trianggada / 13209046
7. Instruksi beq
Syntax : beq $s, $t, label
Instruction Set : 0001 00ss ssst tttt iiii iiii iiii iiii
Operasi : if ($s = $t) then nPC = PC+4+(SignExt(imm) << 2)
else nPC = PC+4
Datapath dan controller:
8. Instruksi addi
Syntax : addi $t, $s, imm
Instruction Set : 0010 00ss ssst tttt iiii iiii iiii iiii
Operasi : $t = $s + imm
Datapath dan controller:
4UTS EL3043 - Arditto Trianggada / 13209046
9. Instruksi j
Syntax : j label
Instruction Set : 0000 10ii iiii iiii iiii iiii iiii iiii
Operasi : nPC = PC+4[31:28] & imm & “00”
Datapath dan controller:
SignImm
A RD
Instruction
Memory
+4
A1
A3
WD3
RD2
RD1WE3
A2
CLK
Sign Extend
Register
File
A RD
DataMemory
WD
WE 0
1
0
1Instr 25:21
20:16
15:0
5:0
SrcB
20:16
15:11
+
ALUResultReadData
WriteData
SrcA
PCPlus4
BTA
WriteReg
Result
31:26
RegDst
Branch
MemWrite MemtoReg
ALUSrc
RegWrite
Op
Funct
Control
UnitZero
BranchTaken
CLK
ALUControl2:0
ALU
0
1
25:0<<2
27:0
31:28
JTA
Jump
BTA
PCPlus4
0
1
0
1
4:0
<<2
Bus
Merging
CLK
PC
PCPlus4
ALUControl2:0
Branch
MemWrite
MemtoReg
BranchTaken
Jump
RegDst
ALUSrc
nPC
Zero
Control Unit
RegDst
Branch
MemWrite
MemtoReg
ALUSrc1:0
Opcode5:0
Control Unit
ALUControl2:0
Funct5:0
Main
Decoder
ALUOp2:0
ALU
Decoder
RegWrite
Jump
5UTS EL3043 - Arditto Trianggada / 13209046
Main Decoder:
ALU Decoder:
ALU
ALUCtrl[2:0] Operasi
000 A AND B
001 A OR B
010 A + B
011 n/a
100 A AND B'
101 A OR B'
110 A - B
111 A < B
+
2 01
A B
Cout
Y
3
01
ALUCtrl2
ALUCtrl1:0
[N-1] S
NN
N
N
N NNN
N
2
Zero
Extend
== 0
Zero
6UTS EL3043 - Arditto Trianggada / 13209046
10. Instruksi slt
Syntax : slt $d, $s, $t
Instruction Set : 0000 00ss ssst tttt dddd d000 0010 1011
Operasi : if ($s < $t) then $d = 1; else $d = 0
Pada penambahan instruksi ini, perubahan ada pada control signal, khususnya pada ALU Decoder:
Instr. Funct[5:0] AluOp[1:0] AluCtrl[2:0]
add 10 0000 1X 010
sub 10 0010 1X 110
and 10 0100 1X 000
or 10 0101 1X 001
addi XX XXXX 00 010
lw XX XXXX 00 010
sw XX XXXX 00 010
beq XX XXXX X1 110
j XX XXXX XX XXX
slt 10 1010 1X 111
Untuk spesifikasi lainnya adalah sama.
11. Instruksi sll
Syntax : sll $d, $t, shamt
Instruction Set : 0000 0000 0000t tttt dddd d0sss ss00 0000
Operasi : $d = $t << shamt
Pada penambahan instruksi ini modifikasi adalah sebagai berikut:
Mengubah ALUCtrl menjadi 4 bit
Instr. Funct[5:0] AluOp[1:0] AluCtrl[3:0]
add 10 0000 1X 0010
sub 10 0010 1X 1010
and 10 0100 1X 0000
or 10 0101 1X 0001
addi XX XXXX 00 0010
lw XX XXXX 00 0010
sw XX XXXX 00 0010
beq XX XXXX X1 1010
j XX XXXX XX XXXX
slt 10 1010 1X 1011
sll 00 0000 1X 0100
7UTS EL3043 - Arditto Trianggada / 13209046
Menambah operasi shift pada isi ALU
+
2 01
A B
Cout
Y
3
01
[N-1] S
NN
N
N
N NNN
N
2
Zero
Extend
== 0
Zero
4
<<
N
shamt4:0
5
ALUCtrl3
ALUCtrl2:0
Menambahkan shamt[4:0] sebagai masukan pada ALU pada datapath dan controller
SignImm
A RD
Instruction
Memory
+4
A1
A3
WD3
RD2
RD1WE3
A2
CLK
Sign Extend
Register
File
A RD
DataMemory
WD
WE 0
1
0
1Instr 25:21
20:16
15:0
5:0
SrcB
20:16
15:11
+
ALUResultReadData
WriteData
SrcA
PCPlus4
BTA
WriteReg
Result
31:26
RegDst
Branch
MemWrite MemtoReg
ALUSrc
RegWrite
Op
Funct
Control
UnitZero
BranchTaken
CLK
ALUControl3:0
ALU
0
1
25:0<<2
27:0
31:28
JTA
Jump
BTA
PCPlus4
0
1
0
1
4:0
<<2
Bus
Merging
CLK
PC
PCPlus4
ALUControl3:0
Branch
MemWrite
MemtoReg
BranchTaken
Jump
RegDst
ALUSrc
nPC
Zero
Instr 10:6
8UTS EL3043 - Arditto Trianggada / 13209046
12. Instruksi srl
Syntax : srl $d, $t, shamt
Instruction Set : 0000 0000 0000t tttt dddd d0sss ss00 0010
Operasi : $d = $t >> shamt
Pada penambahan instruksi ini modifikasi adalah sebagai berikut:
Modifikasi control signal
Instr. Funct[5:0] AluOp[1:0] AluCtrl[3:0]
add 10 0000 1X 0010
sub 10 0010 1X 1010
and 10 0100 1X 0000
or 10 0101 1X 0001
addi XX XXXX 00 0010
lw XX XXXX 00 0010
sw XX XXXX 00 0010
beq XX XXXX X1 1010
j XX XXXX XX XXXX
slt 10 1010 1X 1011
sll 00 0000 1X 0100
srl 00 0010 1X 0101
Menambah operasi shift pada ALU
+
2 01
A B
Cout
Y
3
01
[N-1] S
NN
N
N
N NNN
N
2
Zero
Extend
== 0
Zero
4
<<
N
shamt4:0
5
ALUCtrl3
ALUCtrl2:0
5
>>
N
9UTS EL3043 - Arditto Trianggada / 13209046
13. Instruksi sra
Syntax : sra $d, $t, shamt
Instruction Set : 0000 0000 0000t tttt dddd d0sss ss00 0011
Operasi : $d = $t >>> shamt
Pada penambahan instruksi ini modifikasi adalah sebagai berikut:
Modifikasi control signal
Instr. Funct[5:0] AluOp[1:0] AluCtrl[3:0]
add 10 0000 1X 0010
sub 10 0010 1X 1010
and 10 0100 1X 0000
or 10 0101 1X 0001
addi XX XXXX 00 0010
lw XX XXXX 00 0010
sw XX XXXX 00 0010
beq XX XXXX X1 1010
j XX XXXX XX XXXX
slt 10 1010 1X 1011
sll 00 0000 1X 0100
srl 00 0010 1X 0101
sra 00 0011 1X 0110
Menambah operasi shift pada ALU
ALUCtrl[3:0] Operasi
0000 A AND B
0001 A OR B
0010 A + B
0011 n/a
0100 B << shamt
0101 B >> shamt
0110 B >>> shamt
0111 n/a
1000 A AND B'
1001 A OR B'
1010 A - B
1011 A < B
1100 B' << shamt
1101 B' >> shamt
1110 B' >>> shamt
1111 n/a
+
2 01
A B
Cout
Y
3
01
[N-1] S
NN
N
N
N NNN
N
2
Zero
Extend
== 0
Zero
4
<<
N
shamt4:0
5
ALUCtrl3
ALUCtrl2:0
5
>>
N
6
>>>
N
10UTS EL3043 - Arditto Trianggada / 13209046
14. Instruksi sllv
Syntax : sllv $d, $s, $t
Instruction Set : 0000 00ss ssst tttt dddd d000 0000 0100
Operasi : $d = $t << $s
Pada penambahan instruksi ini modifikasi adalah sebagai berikut:
Mengubah control signal, khususnya pada ALU decoder:
Instr. Funct[5:0] AluOp[1:0] AluCtrl[3:0]
add 10 0000 1X 0010
sub 10 0010 1X 1010
and 10 0100 1X 0000
or 10 0101 1X 0001
addi XX XXXX 00 0010
lw XX XXXX 00 0010
sw XX XXXX 00 0010
beq XX XXXX X1 1010
j XX XXXX XX XXXX
slt 10 1010 1X 1011
sll 00 0000 1X 0100
srl 00 0010 1X 0101
sra 00 0011 1X 0110
sllv 00 0100 1X 1100
Mengubah isi dari operasi ALU
+
2 01
A B
Cout
Y
3
01
[N-1] S
NN
N
N
N NNN
N
2
Zero
Extend
== 0
Zero
4
<<
N
shamt4:0
ALUCtrl3
ALUCtrl2:0
5
>>
N
6
>>>
N
01
A4:0
5 5
ALUCtrl3
11UTS EL3043 - Arditto Trianggada / 13209046
15. Instruksi srlv
Syntax : srlv $d, $s, $t
Instruction Set : 0000 00ss ssst tttt dddd d000 0000 0110
Operasi : $d = $t >> $s
Pada penambahan instruksi ini modifikasi adalah sebagai berikut:
Mengubah control signal, khususnya pada ALU decoder:
Instr. Funct[5:0] AluOp[1:0] AluCtrl[3:0]
add 10 0000 1X 0010
sub 10 0010 1X 1010
and 10 0100 1X 0000
or 10 0101 1X 0001
addi XX XXXX 00 0010
lw XX XXXX 00 0010
sw XX XXXX 00 0010
beq XX XXXX X1 1010
j XX XXXX XX XXXX
slt 10 1010 1X 1011
sll 00 0000 1X 0100
srl 00 0010 1X 0101
sra 00 0011 1X 0110
sllv 00 0100 1X 1100
srlv 00 0110 1X 1101
+
2 01
A B
Cout
Y
3
01
[N-1] S
NN
N
N
N NNN
N
2
Zero
Extend
== 0
Zero
4
<<
N
shamt4:0
ALUCtrl3
ALUCtrl2:0
5
>>
N
6
>>>
N
01
A4:0
5 5
ALUCtrl3
12UTS EL3043 - Arditto Trianggada / 13209046
16. Instruksi srav
Syntax : srav $d, $s, $t
Instruction Set : 0000 00ss ssst tttt dddd d000 0000 0111
Operasi : $d = $t >>> $s
Pada penambahan instruksi ini modifikasi adalah sebagai berikut:
Mengubah control signal, khususnya pada ALU decoder:
Instr. Funct[5:0] AluOp[1:0] AluCtrl[3:0]
add 10 0000 1X 0010
sub 10 0010 1X 1010
and 10 0100 1X 0000
or 10 0101 1X 0001
addi XX XXXX 00 0010
lw XX XXXX 00 0010
sw XX XXXX 00 0010
beq XX XXXX X1 1010
j XX XXXX XX XXXX
slt 10 1010 1X 1011
sll 00 0000 1X 0100
srl 00 0010 1X 0101
sra 00 0011 1X 0110
sllv 00 0100 1X 1100
srlv 00 0110 1X 1101
srav 00 0111 1X 1110
ALUCtrl[3:0] Operasi
0000 A AND B
0001 A OR B
0010 A + B
0011 n/a
0100 B << shamt
0101 B >> shamt
0110 B >>> shamt
0111 n/a
1000 A AND B'
1001 A OR B'
1010 A - B
1011 A < B
1100 B << A
1101 B >> A
1110 B >>> A
1111 n/a
+
2 01
A B
Cout
Y
3
01
[N-1] S
NN
N
N
N NNN
N
2
Zero
Extend
== 0
Zero
4
<<
N
shamt4:0
ALUCtrl3
ALUCtrl2:0
5
>>
N
6
>>>
N
01
A4:0
5 5
ALUCtrl3
13UTS EL3043 - Arditto Trianggada / 13209046
17. Instruksi xor
Syntax : xor $d, $s, $t
Instruction Set : 0000 00ss ssst tttt dddd d000 0010 0110
Operasi : $d = $s XOR $t
Pada penambahan instruksi ini modifikasi adalah sebagai berikut
Mengubah control signal, khususnya ALU decoder
Instr. Funct[5:0] AluOp[1:0] AluCtrl[3:0]
add 10 0000 1X 0010
sub 10 0010 1X 1010
and 10 0100 1X 0000
or 10 0101 1X 0001
addi XX XXXX 00 0010
lw XX XXXX 00 0010
sw XX XXXX 00 0010
beq XX XXXX X1 1010
j XX XXXX XX XXXX
slt 10 1010 1X 1011
sll 00 0000 1X 0100
srl 00 0010 1X 0101
sra 00 0011 1X 0110
sllv 00 0100 1X 1100
srlv 00 0110 1X 1101
srav 00 0111 1X 1110
xor 10 0110 1X 0111
Mengubah isi dari ALU
+
2 01
A B
Cout
Y
3
01
[N-1] S
NN
N
N
N NNN
N
2
Zero
Extend
== 0
Zero
4
<<
N
shamt4:0
ALUCtrl3
ALUCtrl2:0
5
>>
N
6
>>>
N
01
A4:0
5 5
ALUCtrl3
7
N
14UTS EL3043 - Arditto Trianggada / 13209046
18. Instruksi nor
Syntax : nor $d, $s, $t
Instruction Set : 0000 00ss ssst tttt dddd d000 0010 0110
Operasi : $d = $s NOR $t
Pada penambahan instruksi ini modifikasi adalah sebagai berikut:
Mengubah control signal, khususnya ALU decoder
Instr. Funct[5:0] AluOp[1:0] AluCtrl[4:0]
add 10 0000 1X 0 0010
sub 10 0010 1X 1 0010
and 10 0100 1X 0 0000
or 10 0101 1X 0 0001
addi XX XXXX 00 0 0010
lw XX XXXX 00 0 0010
sw XX XXXX 00 0 0010
beq XX XXXX X1 1 0010
j XX XXXX XX X XXXX
slt 10 1010 1X 1 0011
sll 00 0000 1X 0 0100
srl 00 0010 1X 0 0101
sra 00 0011 1X 0 0110
sllv 00 0100 1X 1 0100
srlv 00 0110 1X 1 0101
srav 00 0111 1X 1 0110
xor 10 0110 1X 0 0111
nor 10 0111 1X 0 1000
Mengubah isi dari ALU
ALUCtrl[4:0] Operasi
0 0000 A AND B
0 0001 A OR B
0 0010 A + B
0 0011 n/a
0 0100 B << shamt
0 0101 B >> shamt
0 0110 B >>> shamt
0 0111 A XOR B
0 1000 A NOR B
1 0000 A AND B'
1 0001 A OR B'
1 0010 A - B
1 0011 A < B
1 0100 B << A
+
2 01
A B
Cout
Y
3
01
[N-1] S
NN
N
N
N NNN
N
2
Zero
Extend
== 0
Zero
4
<<
N
shamt4:0
ALUCtrl4
ALUCtrl3:0
5
>>
N
6
>>>
N
01
A4:0
5 5
ALUCtrl4
7
N
8
N
15UTS EL3043 - Arditto Trianggada / 13209046
1 0101 B >> A
1 0110 B >>> A
1 0111 A XOR B'
1 1000 A NOR B'
Datapath dan controller
SignImm
A RD
Instruction
Memory
+4
A1
A3
WD3
RD2
RD1WE3
A2
CLK
Sign Extend
Register
File
A RD
DataMemory
WD
WE 0
1
0
1Instr 25:21
20:16
15:0
5:0
SrcB
20:16
15:11
+
ALUResultReadData
WriteData
SrcA
PCPlus4
BTA
WriteReg
Result
31:26
RegDst
Branch
MemWrite MemtoReg
ALUSrc
RegWrite
Op
Funct
Control
UnitZero
BranchTaken
CLK
ALUControl4:0
ALU
0
1
25:0<<2
27:0
31:28
JTA
Jump
BTA
PCPlus4
0
1
0
1
4:0
<<2
Bus
Merging
CLK
PC
PCPlus4
ALUControl4:0
Branch
MemWrite
MemtoReg
BranchTaken
Jump
RegDst
ALUSrc
nPC
Zero
Instr 10:6
19. Instruksi lui
Syntax : lui $t, imm
Instruction Set : 0011 1100 000t tttt iiii iiii iiii iiii
Operasi : $t = imm<<16
Pada penambahan instruksi ini modifikasi adalah sebagai berikut:
Pengubahan control signal
Main decoder:
16UTS EL3043 - Arditto Trianggada / 13209046
ALU decoder:
Instr. Funct[5:0] AluOp[1:0] AluCtrl[4:0]
add 10 0000 1X 0 0010
sub 10 0010 1X 1 0010
and 10 0100 1X 0 0000
or 10 0101 1X 0 0001
addi XX XXXX 00 0 0010
lw XX XXXX 00 0 0010
sw XX XXXX 00 0 0010
beq XX XXXX X1 1 0010
j XX XXXX XX X XXXX
slt 10 1010 1X 1 0011
sll 00 0000 1X 0 0100
srl 00 0010 1X 0 0101
sra 00 0011 1X 0 0110
sllv 00 0100 1X 1 0100
srlv 00 0110 1X 1 0101
srav 00 0111 1X 1 0110
xor 10 0110 1X 0 0111
nor 10 0111 1X 0 1000
lui XX XXXX 00 0 0010
Datapath dan controller
SignImm
A RD
Instruction
Memory
+4
A1
A3
WD3
RD2
RD1WE3
A2
CLK
Sign Extend
Register
File
A RD
DataMemory
WD
WE 0
1
0
1Instr 25:21
20:16
15:0
5:0
SrcB
20:16
15:11
+
ALUResultReadData
WriteData
SrcA
PCPlus4
BTA
WriteReg
Result
31:26
RegDst
Branch
MemWrite MemtoRegRegWrite
Op
Funct
Control
UnitZero
BranchTaken
CLK
ALUControl4:0
ALU
0
1
25:0<<2
27:0
31:28
JTA
Jump
BTA
PCPlus4
0
1
0001
4:0
<<2
Bus
Merging
CLK
PC
PCPlus4
ALUControl4:0
Branch
MemWrite
MemtoReg
BranchTaken
Jump
RegDst
ALUSrc1:0
nPC
Zero
Instr 10:6
10
<<16
ALUSrc1:0
17UTS EL3043 - Arditto Trianggada / 13209046
20. Instruksi slti
Syntax : slti $t, $s, imm
Instruction Set : 0010 10ss ssst tttt iiii iiii iiii iiii
Operasi : if ($s < SignExt(imm)) then $t = 1; else $t = 0
Pada penambahan instruksi ini modifikasi adalah sebagai berikut:
Control signal
Main decoder:
ALU decoder:
Instr. Funct[5:0] AluOp[1:0] AluCtrl[4:0]
add 10 0000 10 0 0010
sub 10 0010 10 1 0010
and 10 0100 10 0 0000
or 10 0101 10 0 0001
addi XX XXXX 00 0 0010
lw XX XXXX 00 0 0010
sw XX XXXX 00 0 0010
beq XX XXXX 01 1 0010
j XX XXXX XX X XXXX
slt 10 1010 10 1 0011
sll 00 0000 10 0 0100
srl 00 0010 10 0 0101
sra 00 0011 10 0 0110
sllv 00 0100 10 1 0100
srlv 00 0110 10 1 0101
srav 00 0111 10 1 0110
xor 10 0110 10 0 0111
nor 10 0111 10 0 1000
lui XX XXXX 00 0 0010
slti XX XXXX 11 1 0011
18UTS EL3043 - Arditto Trianggada / 13209046
Datapath dan controller (tetap)
SignImm
A RD
Instruction
Memory
+4
A1
A3
WD3
RD2
RD1WE3
A2
CLK
Sign Extend
Register
File
A RD
DataMemory
WD
WE 0
1
0
1Instr 25:21
20:16
15:0
5:0
SrcB
20:16
15:11
+
ALUResultReadData
WriteData
SrcA
PCPlus4
BTA
WriteReg
Result
31:26
RegDst
Branch
MemWrite MemtoRegRegWrite
Op
Funct
Control
UnitZero
BranchTaken
CLK
ALUControl4:0
ALU
0
1
25:0<<2
27:0
31:28
JTA
Jump
BTA
PCPlus4
0
1
0001
4:0
<<2
Bus
Merging
CLK
PC
PCPlus4
ALUControl4:0
Branch
MemWrite
MemtoReg
BranchTaken
Jump
RegDst
ALUSrc1:0
nPC
Zero
Instr 10:6
10
<<16
ALUSrc1:0
21. Instruksi andi
Syntax : andi $t, $s, imm
Instruction Set : 0011 00ss ssst tttt iiii iiii iiii iiii
Operasi : $t = $s AND ZeroExt(imm)
Pada penambahan instruksi ini modifikasi adalah sebagai berikut:
Control signal
RegDst
Beq
MemWrite
MemtoReg
ALUSrc1:0
Opcode5:0
Control Unit
ALUControl4:0
Funct5:0
Main
Decoder
ALUOp2:0
ALU
Decoder
RegWrite
Jump
ExtOp
19UTS EL3043 - Arditto Trianggada / 13209046
Main decoder (ALUOp menjadi 3-bit):
ALU decoder:
Instr. Funct[5:0] AluOp[2:0] AluCtrl[4:0]
add 10 0000 010 0 0010
sub 10 0010 010 1 0010
and 10 0100 010 0 0000
or 10 0101 010 0 0001
addi XX XXXX 000 0 0010
lw XX XXXX 000 0 0010
sw XX XXXX 000 0 0010
beq XX XXXX 001 1 0010
j XX XXXX XXX X XXXX
slt 10 1010 010 1 0011
sll 00 0000 010 0 0100
srl 00 0010 010 0 0101
sra 00 0011 010 0 0110
sllv 00 0100 010 1 0100
srlv 00 0110 010 1 0101
srav 00 0111 010 1 0110
xor 10 0110 010 0 0111
nor 10 0111 010 0 1000
lui XX XXXX 000 0 0010
slti XX XXXX 011 1 0011
andi XX XXXX 100 0 0000
Datapath dan controller
20UTS EL3043 - Arditto Trianggada / 13209046
ImmExt
A RD
Instruction
Memory
+4
A1
A3
WD3
RD2
RD1WE3
A2
CLK
Extend
Register
File
A RD
DataMemory
WD
WE 0
1
0
1Instr 25:21
20:16
15:0
5:0
SrcB
20:16
15:11
+
ALUResultReadData
WriteData
SrcA
PCPlus4
BTA
WriteReg
Result
31:26
RegDst
Branch
MemWrite MemtoRegRegWrite
Op
Funct
Control
UnitZero
BranchTaken
CLK
ALUControl4:0
ALU
0
1
25:0<<2
27:0
31:28
JTA
Jump
BTA
PCPlus4
0
1
0001
4:0
<<2
Bus
Merging
CLK
PC
PCPlus4
ALUControl4:0
Branch
MemWrite
MemtoReg
BranchTaken
Jump
RegDst
ALUSrc1:0
nPC
Zero
Instr 10:6
10
<<16
ALUSrc1:0
ExtOp
ExtOp
22. Instruksi ori
Syntax : ori $t, $s, imm
Instruction Set : 0011 01ss ssst tttt iiii iiii iiii iiii
Operasi : $t = $s OR ZeroExt(imm)
Pada penambahan instruksi ini modifikasi adalah sebagai berikut:
Control signal
Main decoder:
ALU decoder:
21UTS EL3043 - Arditto Trianggada / 13209046
Instr. Funct[5:0] AluOp[2:0] AluCtrl[4:0]
add 10 0000 010 0 0010
sub 10 0010 010 1 0010
and 10 0100 010 0 0000
or 10 0101 010 0 0001
addi XX XXXX 000 0 0010
lw XX XXXX 000 0 0010
sw XX XXXX 000 0 0010
beq XX XXXX 001 1 0010
j XX XXXX XXX X XXXX
slt 10 1010 010 1 0011
sll 00 0000 010 0 0100
srl 00 0010 010 0 0101
sra 00 0011 010 0 0110
sllv 00 0100 010 1 0100
srlv 00 0110 010 1 0101
srav 00 0111 010 1 0110
xor 10 0110 010 0 0111
nor 10 0111 010 0 1000
lui XX XXXX 000 0 0010
slti XX XXXX 011 1 0011
andi XX XXXX 100 0 0000
ori XX XXXX 101 0 0001
Datapath dan controller adalah sama dengan penambahan andi:
ImmExt
A RD
Instruction
Memory
+4
A1
A3
WD3
RD2
RD1WE3
A2
CLK
Extend
Register
File
A RD
DataMemory
WD
WE 0
1
0
1Instr 25:21
20:16
15:0
5:0
SrcB
20:16
15:11
+
ALUResultReadData
WriteData
SrcA
PCPlus4
BTA
WriteReg
Result
31:26
RegDst
Branch
MemWrite MemtoRegRegWrite
Op
Funct
Control
UnitZero
BranchTaken
CLK
ALUControl4:0
ALU
0
1
25:0<<2
27:0
31:28
JTA
Jump
BTA
PCPlus4
0
1
0001
4:0
<<2
Bus
Merging
CLK
PC
PCPlus4
ALUControl4:0
Branch
MemWrite
MemtoReg
BranchTaken
Jump
RegDst
ALUSrc1:0
nPC
Zero
Instr 10:6
10
<<16
ALUSrc1:0
ExtOp
ExtOp
22UTS EL3043 - Arditto Trianggada / 13209046
23. Instruksi xori
Syntax : xori $t, $s, imm Instruction Set : 0011 01ss ssst tttt iiii iiii iiii iiii
Operasi : $t = $s XOR ZeroExt(imm)
Pada penambahan instruksi ini modifikasi adalah sebagai berikut:
Control signal
Main decoder:
ALU decoder:
Instr. Funct[5:0] AluOp[2:0] AluCtrl[4:0]
add 10 0000 010 0 0010
sub 10 0010 010 1 0010
and 10 0100 010 0 0000
or 10 0101 010 0 0001
addi XX XXXX 000 0 0010
lw XX XXXX 000 0 0010
sw XX XXXX 000 0 0010
beq XX XXXX 001 1 0010
j XX XXXX XXX X XXXX
slt 10 1010 010 1 0011
sll 00 0000 010 0 0100
srl 00 0010 010 0 0101
sra 00 0011 010 0 0110
sllv 00 0100 010 1 0100
srlv 00 0110 010 1 0101
srav 00 0111 010 1 0110
xor 10 0110 010 0 0111
nor 10 0111 010 0 1000
lui XX XXXX 000 0 0010
slti XX XXXX 011 1 0011
andi XX XXXX 100 0 0000
ori XX XXXX 101 0 0001
xori XX XXXX 110 0 0111
23UTS EL3043 - Arditto Trianggada / 13209046
Datapath dan controller adalah sama dengan penambahan andi:
ImmExt
A RD
Instruction
Memory
+4
A1
A3
WD3
RD2
RD1WE3
A2
CLK
Extend
Register
File
A RD
DataMemory
WD
WE 0
1
0
1Instr 25:21
20:16
15:0
5:0
SrcB
20:16
15:11
+
ALUResultReadData
WriteData
SrcA
PCPlus4
BTA
WriteReg
Result
31:26
RegDst
Branch
MemWrite MemtoRegRegWrite
Op
Funct
Control
UnitZero
BranchTaken
CLK
ALUControl4:0
ALU
0
1
25:0<<2
27:0
31:28
JTA
Jump
BTA
PCPlus4
0
1
0001
4:0
<<2
Bus
Merging
CLK
PC
PCPlus4
ALUControl4:0
Branch
MemWrite
MemtoReg
BranchTaken
Jump
RegDst
ALUSrc1:0
nPC
Zero
Instr 10:6
10
<<16
ALUSrc1:0
ExtOp
ExtOp
24. Instruksi bne
Syntax : bne $s, $t, label
Instruction Set : 0001 01ss ssst tttt iiii iiii iiii iiii
Operasi : if ($s /= $t) then (nPC = PC+4 +
(SignExt(Imm)<<2)
Modifikasi yang dilakukan sebagai berikut:
Control signal
Untuk menangani instruksi bne, diperlukan tambahan control signal yang membedakan antara beq
dan bne.
RegDst1:0
Beq
MemWrite
MemtoReg
ALUSrc1:0
Opcode5:0
Control Unit
ALUControl4:0
Funct5:0
Main
Decoder
ALUOp2:0
ALU
Decoder
RegWrite
Jump
Bne
ExtOp
24UTS EL3043 - Arditto Trianggada / 13209046
Main decoder:
ALU decoder:
Instr. Funct[5:0] AluOp[2:0] AluCtrl[4:0]
add 10 0000 010 0 0010
sub 10 0010 010 1 0010
and 10 0100 010 0 0000
or 10 0101 010 0 0001
addi XX XXXX 000 0 0010
lw XX XXXX 000 0 0010
sw XX XXXX 000 0 0010
beq XX XXXX 001 1 0010
j XX XXXX XXX X XXXX
slt 10 1010 010 1 0011
sll 00 0000 010 0 0100
srl 00 0010 010 0 0101
sra 00 0011 010 0 0110
sllv 00 0100 010 1 0100
srlv 00 0110 010 1 0101
srav 00 0111 010 1 0110
xor 10 0110 010 0 0111
nor 10 0111 010 0 1000
lui XX XXXX 000 0 0010
slti XX XXXX 011 1 0011
andi XX XXXX 100 0 0000
ori XX XXXX 101 0 0001
xori XX XXXX 110 0 0111
bne XX XXXX 001 1 0010
Penambahan control signal tersebut juga akan memodifikasi datapath dan controller sebagai
berikut
25UTS EL3043 - Arditto Trianggada / 13209046
ImmExt
A RD
Instruction
Memory
+4
A1
A3
WD3
RD2
RD1WE3
A2
CLK
Extend
Register
File
A RD
DataMemory
WD
WE 0
1
0
1Instr 25:21
20:16
15:0
5:0
SrcB
20:16
15:11
+
ALUResultReadData
WriteData
SrcA
PCPlus4
BTA
WriteReg
Result
31:26
RegDst
Beq
MemWrite MemtoRegRegWrite
Op
Funct
Control
Unit
Zero
Bra
nch
Ta
ke
n
CLK
ALUControl4:0
ALU
0
1
25:0<<2
27:0
31:28
JTA
Jump
BTA
PCPlus4
0
1
0001
4:0
<<2
Bus
Merging
CLK
PC
PCPlus4
ALUControl4:0
Beq
MemWrite
MemtoReg
BranchTaken
Jump
RegDst
ALUSrc1:0
nPC
Zero
Instr 10:6
10
<<16
ALUSrc1:0
ExtOp
ExtOp
Bne
Zero
Bne
25. Instruksi bltz
Syntax : bltz $s, $t, label
Instruction Set : 0000 01ss ssst tttt iiii iiii iiii iiii
Operasi : if ($s < $t) then (nPC = PC+4 +
(SignExt(Imm)<<2)
Modifikasi yang dilakukan sebagai berikut:
Control signal
Untuk menangani instruksi bltz, diperlukan tambahan control signal yang membedakan dengan
branch lain.
RegDst1:0
Beq
MemWrite
MemtoReg
ALUSrc1:0
Opcode5:0
Control Unit
ALUControl4:0
Funct5:0
Main
Decoder
ALUOp2:0
ALU
Decoder
RegWrite
Jump
Bne
Bltz
ExtOp
26UTS EL3043 - Arditto Trianggada / 13209046
Main decoder:
ALU decoder:
Instr. Funct[5:0] AluOp[2:0] AluCtrl[4:0]
add 10 0000 010 0 0010
sub 10 0010 010 1 0010
and 10 0100 010 0 0000
or 10 0101 010 0 0001
addi XX XXXX 000 0 0010
lw XX XXXX 000 0 0010
sw XX XXXX 000 0 0010
beq XX XXXX 001 1 0010
j XX XXXX XXX X XXXX
slt 10 1010 010 1 0011
sll 00 0000 010 0 0100
srl 00 0010 010 0 0101
sra 00 0011 010 0 0110
sllv 00 0100 010 1 0100
srlv 00 0110 010 1 0101
srav 00 0111 010 1 0110
xor 10 0110 010 0 0111
nor 10 0111 010 0 1000
lui XX XXXX 000 0 0010
slti XX XXXX 011 1 0011
andi XX XXXX 100 0 0000
ori XX XXXX 101 0 0001
xori XX XXXX 110 0 0111
bne XX XXXX 001 1 0010
bltz XX XXXX 001 1 0010
Pada ALU, ditambahkan sebuah keluaran yang memiliki lebar 1-bit yang menandakan apakah A
lebih kecil daripada B (LTZ=1 when A-B<0)
27UTS EL3043 - Arditto Trianggada / 13209046
ALUCtrl[4:0] Operasi
0 0000 A AND B
0 0001 A OR B
0 0010 A + B
0 0011 n/a
0 0100 B << shamt
0 0101 B >> shamt
0 0110 B >>> shamt
0 0111 A XOR B
0 1000 A NOR B
1 0000 A AND B'
1 0001 A OR B'
1 0010 A - B
1 0011 A < B
1 0100 B << A
1 0101 B >> A
1 0110 B >>> A
1 0111 A XOR B'
1 1000 A NOR B'
Modifikasi pada datapath dan controller: branch taken saat LTZ=1
ImmExt
A RD
Instruction
Memory
+4
A1
A3
WD3
RD2
RD1WE3
A2
CLK
Extend
Register
File
A RD
DataMemory
WD
WE 0
1
0
1Instr 25:21
20:16
15:0
5:0
SrcB
20:16
15:11
+
ALUResultReadData
WriteData
SrcA
PCPlus4
BTA
WriteReg
Result
31:26
RegDst
Beq
MemWrite MemtoRegRegWrite
Op
Funct
Control
Unit
Zero
BranchTaken
CLK
ALUControl4:0
ALU
0
1
25:0<<2
27:0
31:28
JTA
Jump
BTA
PCPlus4
0
1
0001
4:0
<<2
Bus
Merging
CLK
PC
PCPlus4
ALUControl4:0
Beq
MemWrite
MemtoReg
BranchTaken
Jump
RegDst
ALUSrc1:0
nPC
Zero
Instr 10:6
10
<<16
ALUSrc1:0
ExtOp
ExtOp
Bne
Zero
Bne
LTZ
Bltz
LTZ
Bltz
+
2 01
A B
Cout
Y
3
01
[N-1] S
NN
N
N
N NNN
N
2
Zero
Extend
== 0
Zero
4<<
N
shamt4:0
ALUCtrl4
ALUCtrl3:0
5
>>
N
6
>>>
N
01
A4:0
5 5
ALUCtrl4
7
N
8
N
LTZ
Y31N
28UTS EL3043 - Arditto Trianggada / 13209046
26. Instruksi bgtz
Syntax : bgtz $s, $t, label
Instruction Set : 0001 11ss ssst tttt iiii iiii iiii iiii
Operasi : if ($s > $t) then (nPC = PC+4 +
(SignExt(Imm)<<2)
Modifikasi yang dilakukan sebagai berikut:
Control signal
Untuk menangani instruksi bgtz, diperlukan tambahan control signal yang membedakan dengan
branch lain
RegDst1:0
Beq
MemWrite
MemtoReg
ALUSrc1:0
Opcode5:0
Control Unit
ALUControl4:0
Funct5:0
Main
Decoder
ALUOp2:0
ALU
Decoder
RegWrite
Jump
Bne
Bltz
ExtOp
Bgtz
Main decoder:
29UTS EL3043 - Arditto Trianggada / 13209046
ALU decoder:
Instr. Funct[5:0] AluOp[2:0] AluCtrl[4:0]
add 10 0000 010 0 0010
sub 10 0010 010 1 0010
and 10 0100 010 0 0000
or 10 0101 010 0 0001
addi XX XXXX 000 0 0010
lw XX XXXX 000 0 0010
sw XX XXXX 000 0 0010
beq XX XXXX 001 1 0010
j XX XXXX XXX X XXXX
slt 10 1010 010 1 0011
sll 00 0000 010 0 0100
srl 00 0010 010 0 0101
sra 00 0011 010 0 0110
sllv 00 0100 010 1 0100
srlv 00 0110 010 1 0101
srav 00 0111 010 1 0110
xor 10 0110 010 0 0111
nor 10 0111 010 0 1000
lui XX XXXX 000 0 0010
slti XX XXXX 011 1 0011
andi XX XXXX 100 0 0000
ori XX XXXX 101 0 0001
xori XX XXXX 110 0 0111
bne XX XXXX 001 1 0010
bltz XX XXXX 001 1 0010
bgtz XX XXXX 001 1 0010
Datapath dan controller
Pada instruksi bgt ini, branch akan taken jika nilai isi dari register $s lebih besar daripada $t. Atau
dengan kata lain, hasil pengurangan $s - $t akan bernilai positif (LTZ=0) dan nilai hasil pengurangan
tersebut tidak sama dengan nol (Zero=0).
30UTS EL3043 - Arditto Trianggada / 13209046
ImmExt
A RD
Instruction
Memory
+4
A1
A3
WD3
RD2
RD1WE3
A2
CLK
Extend
Register
File
A RD
DataMemory
WD
WE 0
1
0
1Instr 25:21
20:16
15:0
5:0
SrcB
20:16
15:11
+
ALUResultReadData
WriteData
SrcA
PCPlus4
BTA
WriteReg
Result
31:26
RegDst
Beq
MemWrite MemtoRegRegWrite
Op
Funct
Control
Unit
Zero
BranchTaken
CLK
ALUControl4:0
ALU
0
1
25:0<<2
27:0
31:28
JTA
Jump
BTA
PCPlus4
0
1
0001
4:0
<<2
Bus
Merging
CLK
PC
PCPlus4
ALUControl4:0
Beq
MemWrite
MemtoReg
BranchTaken
Jump
RegDst
ALUSrc1:0
nPC
Zero
Instr 10:6
10
<<16
ALUSrc1:0
ExtOp
ExtOp
Bne
Zero
Bne
LTZ
Bltz
LTZ
Bltz
Bne
Zero
LTZ
Bgtz
Bgtz
27. Instruksi blez
Syntax : blez $s, $t, label
Instruction Set : 0001 10ss ssst tttt iiii iiii iiii iiii
Operasi : if ($s <= $t) then (nPC = PC+4 +
(SignExt(Imm)<<2)
Modifikasi:
Penambahan control signal
Untuk penambahan instruksi blezini, tidak dilakukan penambahan control signal melainkan
mengaktifkan signal Beq dan Bltz sekaligus ketika instruksi blez dilakukan.
Main decoder:
31UTS EL3043 - Arditto Trianggada / 13209046
ALU decoder:
Instr. Funct[5:0] AluOp[2:0] AluCtrl[4:0]
add 10 0000 010 0 0010
sub 10 0010 010 1 0010
and 10 0100 010 0 0000
or 10 0101 010 0 0001
addi XX XXXX 000 0 0010
lw XX XXXX 000 0 0010
sw XX XXXX 000 0 0010
beq XX XXXX 001 1 0010
j XX XXXX XXX X XXXX
slt 10 1010 010 1 0011
sll 00 0000 010 0 0100
srl 00 0010 010 0 0101
sra 00 0011 010 0 0110
sllv 00 0100 010 1 0100
srlv 00 0110 010 1 0101
srav 00 0111 010 1 0110
xor 10 0110 010 0 0111
nor 10 0111 010 0 1000
lui XX XXXX 000 0 0010
slti XX XXXX 011 1 0011
andi XX XXXX 100 0 0000
ori XX XXXX 101 0 0001
xori XX XXXX 110 0 0111
bne XX XXXX 001 1 0010
bltz XX XXXX 001 1 0010
bgtz XX XXXX 001 1 0010
blez XX XXXX 001 1 0010
32UTS EL3043 - Arditto Trianggada / 13209046
ImmExt
A RD
Instruction
Memory
+4
A1
A3
WD3
RD2
RD1WE3
A2
CLK
Extend
Register
File
A RD
DataMemory
WD
WE 0
1
0
1Instr 25:21
20:16
15:0
5:0
SrcB
20:16
15:11
+
ALUResultReadData
WriteData
SrcA
PCPlus4
BTA
WriteReg
Result
31:26
RegDst
Beq
MemWrite MemtoRegRegWrite
Op
Funct
Control
Unit
Zero
BranchTaken
CLK
ALUControl4:0
ALU
0
1
25:0<<2
27:0
31:28
JTA
Jump
BTA
PCPlus4
0
1
0001
4:0
<<2
Bus
Merging
CLK
PC
PCPlus4
ALUControl4:0
Beq
MemWrite
MemtoReg
BranchTaken
Jump
RegDst
ALUSrc1:0
nPC
Zero
Instr 10:6
10
<<16
ALUSrc1:0
ExtOp
ExtOp
Bne
Zero
Bne
LTZ
Bltz
LTZ
Bltz
Bne
Zero
LTZ
Bgtz
Bgtz
Dapat dilihat, ketika instruksi blez diberikan (control signal Beq dan Bltz bernilai 1), branch akan
taken jika nilai isi $s < $t atau $s = $t.
28. Instruksi jal
Syntax : jal label
Instruction Set : 0000 11ii iiii iiii iiii iiii iiii iiii
Operasi : nPC = PC+4[31.28] & imm & “00”; $31 = PC+4
Modifikasi yang dilakukan adalah sebagai berikut:
Diberikan penambahan pada control signal yaitu jal
RegDst1:0
Beq
MemWrite
MemtoReg
ALUSrc1:0
Opcode5:0
Control Unit
ALUControl4:0
Funct5:0
Main
Decoder
ALUOp2:0
ALU
Decoder
RegWrite
Jump
Jal
Bne
Bltz
ExtOp
Bgtz
33UTS EL3043 - Arditto Trianggada / 13209046
Pada Main decoder, RegDst diubah menjadi 2-bit:
ALU decoder:
Instr. Funct[5:0] AluOp[2:0] AluCtrl[4:0]
add 10 0000 010 0 0010
sub 10 0010 010 1 0010
and 10 0100 010 0 0000
or 10 0101 010 0 0001
addi XX XXXX 000 0 0010
lw XX XXXX 000 0 0010
sw XX XXXX 000 0 0010
beq XX XXXX 001 1 0010
j XX XXXX XXX X XXXX
slt 10 1010 010 1 0011
sll 00 0000 010 0 0100
srl 00 0010 010 0 0101
sra 00 0011 010 0 0110
sllv 00 0100 010 1 0100
srlv 00 0110 010 1 0101
srav 00 0111 010 1 0110
xor 10 0110 010 0 0111
nor 10 0111 010 0 1000
lui XX XXXX 000 0 0010
slti XX XXXX 011 1 0011
andi XX XXXX 100 0 0000
ori XX XXXX 101 0 0001
xori XX XXXX 110 0 0111
bne XX XXXX 001 1 0010
bltz XX XXXX 001 1 0010
bgtz XX XXXX 001 1 0010
blez XX XXXX 001 1 0010
jal XX XXXX XXX X XXXX
34UTS EL3043 - Arditto Trianggada / 13209046
Datapath dan controller
ImmExt
A RD
Instruction
Memory
+4
A1
A3
WD3
RD2
RD1WE3
A2
CLK
Extend
Register
File
A RD
DataMemory
WD
WE0
1
0
1Instr 25:21
20:16
15:0
5:0
SrcB
20:16
15:11
+
ALUResultReadData
WriteData
SrcA
PCPlus4
BTA
WriteReg
Result
31:26
RegDst
Beq
MemWriteMemtoReg
RegWrite
Op
Funct
Control
Unit
Zero
BranchTaken
CLK
ALUControl4:0
ALU
0
1
25:0<<2
27:0
31:28
JTA
Jump
BTA
PCPlus4
00
01
0001
4:0
<<2
Bus
Merging
CLK
PC
PCPlus4
ALUControl4:0
Beq
MemWrite
MemtoReg
BranchTaken
Jump
RegDst1:0
ALUSrc1:0
nPC
Zero
Instr 10:6
10
<<16
ALUSrc1:0
ExtOp
ExtOp
Bne
Zero
Bne
LTZ
Bltz
LTZ
Bltz
Jal
Zero
LTZ
Bgtz
Bgtz
01
Jal
10$ra = 1 1111
PCPlus4
Dari datapath di atas, dapat dilihat bahwa nPC akan di-update seperti pada instruksi j. Namun, selain
itu akan terjadi pemasukan nilai PC+4 ke dalam register dengan alamat $ra atau $31.
29. Instruksi jr
Syntax : jr $s
Instruction Set : 0000 00ss sss0 0000 0000 0000 0000 1000
Operasi : nPC = $s
Modifikasi:
Dilakukan penambahan control signal yaitu jr yang adalah keluaran pada bagian ALU decoder,
sedangkan keluaran Main decoder-nya adalah sama dengan instruksi R-Type yang lain
35UTS EL3043 - Arditto Trianggada / 13209046
RegDst1:0
Beq
MemWrite
MemtoReg
ALUSrc1:0
Opcode5:0
Control Unit
ALUControl4:0
Funct5:0
Main
Decoder
ALUOp2:0
ALU
Decoder
RegWrite
Jump
Jal
Bne
Bltz
Jr
ExtOp
Bgtz
Instr. Funct[5:0] AluOp[2:0] AluCtrl[4:0] Jr
add 10 0000 010 0 0010 0
sub 10 0010 010 1 0010 0
and 10 0100 010 0 0000 0
or 10 0101 010 0 0001 0
addi XX XXXX 000 0 0010 0
lw XX XXXX 000 0 0010 0
sw XX XXXX 000 0 0010 0
beq XX XXXX 001 1 0010 0
j XX XXXX XXX X XXXX X
slt 10 1010 010 1 0011 0
sll 00 0000 010 0 0100 0
srl 00 0010 010 0 0101 0
sra 00 0011 010 0 0110 0
sllv 00 0100 010 1 0100 0
srlv 00 0110 010 1 0101 0
srav 00 0111 010 1 0110 0
xor 10 0110 010 0 0111 0
nor 10 0111 010 0 1000 0
lui XX XXXX 000 0 0010 0
slti XX XXXX 011 1 0011 0
andi XX XXXX 100 0 0000 0
ori XX XXXX 101 0 0001 0
xori XX XXXX 110 0 0111 0
bne XX XXXX 001 1 0010 0
bltz XX XXXX 001 1 0010 0
bgtz XX XXXX 001 1 0010 0
blez XX XXXX 001 1 0010 0
jal XX XXXX XXX X XXXX X
jr 00 1000 010 X XXXX 1
36UTS EL3043 - Arditto Trianggada / 13209046
Datapath dan controller
ImmExt
A RD
Instruction
Memory
+4
A1
A3
WD3
RD2
RD1WE3
A2
CLK
Extend
Register
File
A RD
DataMemory
WD
WE0
1
0
1Instr 25:21
20:16
15:0
5:0
SrcB
20:16
15:11
+
ALUResultReadData
WriteData
SrcA
PCPlus4
BTA
WriteReg
Result
31:26
RegDst
Beq
MemWriteMemtoReg
RegWrite
Op
Funct
Control
Unit
Zero
BranchTaken
CLK
ALUControl4:0
ALU
0
1
25:0<<2
27:0
31:28
JTA
Jump
BTA
PC
Plu
s4
00
01
0001
4:0
<<2
Bus
Merging
CLK
PC
PCPlus4
ALUControl4:0
Beq
MemWrite
MemtoReg
BranchTaken
Jump
RegDst1:0
ALUSrc1:0
nPC
Zero
Instr 10:6
10
<<16
ALUSrc1:0
ExtOp
ExtOp
Bne
Zero
Bne
LTZ
Bltz
LTZ
Bltz
Jal
Zero
LTZ
Bgtz
Bgtz
01
Jal
10$ra = 1 1111
PCPlus4
0
1
SrcA
SrcA
Jr
Jr
Dari gambar di atas, dapat dilihat bahwa nPC akan di-update dengan nilai masukan instruksi yaitu
nilai pada register $s yang di by-pass ke masukan multiplexer dengan control signal jr sebagai
selector. Kemudian, hasil operasi pada ALU tidak akan mengubah nilai di dalam register walaupun
control signal keluaran dari ALU decodernya sama seperti R-Type karena nilai $d disetting dengan
nilai $zero atau $0 yang telah di-hardwired-kan ke logika 0.
30. Instruksi jalr
Syntax : jalr $d, $s
Instruction Set : 0000 00ss sss0 0000 1111 1000 0000 1001
Operasi : nPC = $s; $31 = PC+4
Modifikasi:
Dilakukan penambahan control signal yaitu jalr yang adalah keluaran pada bagian ALU decoder,
sedangkan keluaran Main decoder-nya adalah sama dengan instruksi R-Type yang lain
37UTS EL3043 - Arditto Trianggada / 13209046
RegDst1:0
Beq
MemWrite
MemtoReg
ALUSrc1:0
Opcode5:0
Control Unit
ALUControl2:0
Funct5:0
Main
Decoder
ALUOp2:0
ALU
Decoder
RegWrite
Jump
Jal
Bne
Bltz
Jr
Jalr
ExtOp
Bgtz
ALU decoder:
Instr. Funct[5:0] AluOp[2:0] AluCtrl[4:0] Jr Jalr
add 10 0000 010 0 0010 0 0
sub 10 0010 010 1 0010 0 0
and 10 0100 010 0 0000 0 0
or 10 0101 010 0 0001 0 0
addi XX XXXX 000 0 0010 0 0
lw XX XXXX 000 0 0010 0 X
sw XX XXXX 000 0 0010 0 X
beq XX XXXX 001 1 0010 0 X
j XX XXXX XXX X XXXX X X
slt 10 1010 010 1 0011 0 0
sll 00 0000 010 0 0100 0 0
srl 00 0010 010 0 0101 0 0
sra 00 0011 010 0 0110 0 0
sllv 00 0100 010 1 0100 0 0
srlv 00 0110 010 1 0101 0 0
srav 00 0111 010 1 0110 0 0
xor 10 0110 010 0 0111 0 0
nor 10 0111 010 0 1000 0 0
lui XX XXXX 000 0 0010 0 0
slti XX XXXX 011 1 0011 0 0
andi XX XXXX 100 0 0000 0 0
ori XX XXXX 101 0 0001 0 0
xori XX XXXX 110 0 0111 0 0
bne XX XXXX 001 1 0010 0 X
bltz XX XXXX 001 1 0010 0 X
bgtz XX XXXX 001 1 0010 0 X
blez XX XXXX 001 1 0010 0 X
jal XX XXXX XXX X XXXX X X
jr 00 1000 010 X XXXX 1 0
jalr 00 1001 010 X XXXX 1 1
38UTS EL3043 - Arditto Trianggada / 13209046
Datapath dan controller:
ImmExt
A RD
Instruction
Memory
+4
A1
A3
WD3
RD2
RD1WE3
A2
CLK
Extend
Register
File
A RD
DataMemory
WD
WE0
1
0
1Instr 25:21
20:16
15:0
5:0
SrcB
20:16
15:11
+
ALUResultReadData
WriteData
SrcA
PCPlus4
BTA
WriteReg
Result
31:26
RegDst
Beq
MemWriteMemtoReg
RegWrite
Op
Funct
Control
Unit
Zero
BranchTaken
CLK
ALUControl4:0
ALU
0
1
25:0<<2
27:0
31:28
JTA
Jump
BTA
PC
Plu
s4
00
01
0001
4:0
<<2
Bus
Merging
CLK
PC
PCPlus4
ALUControl4:0
Beq
MemWrite
MemtoReg
BranchTaken
Jump
RegDst1:0
ALUSrc1:0
nPC
Zero
Instr 10:6
10
<<16
ALUSrc1:0
ExtOp
ExtOp
Bne
Zero
Bne
LTZ
Bltz
LTZ
Bltz
Jal
Zero
LTZ
Bgtz
Bgtz
01
Jal
10$ra = 1 1111
PCPlus4
0
1
SrcA
SrcA
Jr
Jr
Jalr
Jalr
Perbedaannya adalah, tambahan control signal yaitu jalr akan dijadikan input gerbang OR jal yang
keluarannya kemudian menjadi select mux yang memilih nilai antara PC+4 atau ALUResult. Dengan
begitu, mux tersebut meneruskan nilai PC+4 jika salah satu antara jal dan jalr bernilai 1.
Di samping itu, nilai PC+4 akan dimasukkan ke dalam register $d yang secara eksplisit dalam instruksi
dimasukkan nilainya yaitu 1 1111 atau $31.
Final Design
Dari langkah-langkah di atas didapat hasil modifikasi utuh pada Single-Cycle MIPS Processor sebagai
berikut:
Control Unit
RegDst1:0
Beq
MemWrite
MemtoReg
ALUSrc1:0
Opcode5:0
Control Unit
ALUControl2:0
Funct5:0
Main
Decoder
ALUOp2:0
ALU
Decoder
RegWrite
Jump
Jal
Bne
Bltz
Jr
Jalr
ExtOp
Bgtz
39UTS EL3043 - Arditto Trianggada / 13209046
Main decoder table:
ALU decoder table:
Instr. Funct[5:0] AluOp[2:0] AluCtrl[4:0] Jr Jalr
add 10 0000 010 0 0010 0 0
sub 10 0010 010 1 0010 0 0
and 10 0100 010 0 0000 0 0
or 10 0101 010 0 0001 0 0
addi XX XXXX 000 0 0010 0 0
lw XX XXXX 000 0 0010 0 X
sw XX XXXX 000 0 0010 0 X
beq XX XXXX 001 1 0010 0 X
j XX XXXX XXX X XXXX X X
slt 10 1010 010 1 0011 0 0
sll 00 0000 010 0 0100 0 0
srl 00 0010 010 0 0101 0 0
sra 00 0011 010 0 0110 0 0
sllv 00 0100 010 1 0100 0 0
srlv 00 0110 010 1 0101 0 0
srav 00 0111 010 1 0110 0 0
xor 10 0110 010 0 0111 0 0
nor 10 0111 010 0 1000 0 0
lui XX XXXX 000 0 0010 0 0
slti XX XXXX 011 1 0011 0 0
andi XX XXXX 100 0 0000 0 0
ori XX XXXX 101 0 0001 0 0
xori XX XXXX 110 0 0111 0 0
bne XX XXXX 001 1 0010 0 X
bltz XX XXXX 001 1 0010 0 X
bgtz XX XXXX 001 1 0010 0 X
blez XX XXXX 001 1 0010 0 X
jal XX XXXX XXX X XXXX X X
jr 00 1000 010 X XXXX 1 0
jalr 00 1001 010 X XXXX 1 1
40UTS EL3043 - Arditto Trianggada / 13209046
ALU
ALUCtrl[4:0] Operasi
0 0000 A AND B
0 0001 A OR B
0 0010 A + B
0 0011 n/a
0 0100 B << shamt
0 0101 B >> shamt
0 0110 B >>> shamt
0 0111 A XOR B
0 1000 A NOR B
1 0000 A AND B'
1 0001 A OR B'
1 0010 A - B
1 0011 A < B
1 0100 B << A
1 0101 B >> A
1 0110 B >>> A
1 0111 A XOR B'
1 1000 A NOR B'
41UTS EL3043 - Arditto Trianggada / 13209046
Datapath dan Controller
Berikut ini adalah gambar rangkaian datapath Single-Cycle MIPS Processor yang telah dilengkapi
nama-nama pada tiap sinyal yang ada:
ImmExt
A RD
Instruction
Memory
+4
A1
A3
WD3
RD2
RD1WE3
A2
CLK
Extend
Register
File
A RD
DataMemory
WD
WE0
1
0
1Instr 25:21
20:16
15:0
5:0
SrcB
20:16
15:11
+
ALUResultReadData
WriteData
SrcA
PCPlus4
BTA
WriteReg
Result
31:26
RegDst
Beq
MemWrite
MemtoReg
RegWrite
Op
Funct
Control
Unit
Zero
BranchTaken
CLK
ALUControl4:0
ALU
0
1
25:0<<2
27:0
31:28
JTA
Jump
BTA
PC
Plu
s4
00
01
0001
4:0
<<2
Bus
Merging
CLK
PC
PCPlus4
ALUControl4:0
Beq
MemWrite
MemtoReg
BranchTaken
Jump
RegDst1:0
ALUSrc1:0
nPC
Zero
Instr 10:6
10
<<16
ALUSrc1:0
ExtOp
ExtOp
Bne
Zero
Bne
LTZ
Bltz
LTZ
Bltz
Jal
Zero
LTZ
Bgtz
Bgtz
01
Jal
10$ra = 1 1111
PCPlus4
0
1
SrcA
SrcA
Jr
Jr
Jalr
Jalr
ImmUpper
Jump_label
Branch_label
RegReadData2
Jr_
sig
Bra
nch
_sig
Bgtz_sig
Beq_sig
Bltz_sig
Bne_sig
Ja
l_se
l
15:0
Jal_sig
42UTS EL3043 - Arditto Trianggada / 13209046
B. Deskripsi Struktural VHDL
Deskripsi Structural:
LIBRARY IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
ENTITY SingleCycleMIPS IS
PORT( Clock : IN STD_LOGIC;
Reset : IN STD_LOGIC);
--Output pin for simulation
PC_out : OUT STD_LOGIC_VECTOR(31 DOWNTO 0);
Instr_out : OUT STD_LOGIC_VECTOR(31 DOWNTO 0);
ALUCtrl_out : OUT STD_LOGIC_VECTOR(4 DOWNTO 0);
ReadData1_out : OUT STD_LOGIC_VECTOR(31 DOWNTO 0);
ReadData2_out : OUT STD_LOGIC_VECTOR(31 DOWNTO 0);
WriteReg_out : OUT STD_LOGIC_VECTOR(4 DOWNTO 0);
ALUResult_out : OUT STD_LOGIC_VECTOR(31 DOWNTO 0);
Result_out : OUT STD_LOGIC_VECTOR(31 DOWNTO 0);
Beq_out : OUT STD_LOGIC;
Bne_out : OUT STD_LOGIC;
Bltz_out : OUT STD_LOGIC;
Blez_out : OUT STD_LOGIC;
Bgtz_out : OUT STD_LOGIC;
Zero_out : OUT STD_LOGIC;
LTZ_out : OUT STD_LOGIC;
J_out : OUT STD_LOGIC;
Jal_out : OUT STD_LOGIC;
Jr_out : OUT STD_LOGIC;
Jalr_out : OUT STD_LOGIC;
RegWrite_out : OUT STD_LOGIC;
MemWrite_out : OUT STD_LOGIC);
END SingleCycleMIPS;
ARCHITECTURE structural OF SIngleCycleMIPS IS
COMPONENT mux2_32bit
PORT( sel : IN STD_LOGIC;
x : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
y : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
z : OUT STD_LOGIC_VECTOR(31 DOWNTO 0));
END COMPONENT;
43UTS EL3043 - Arditto Trianggada / 13209046
COMPONENT mux4_5bit
PORT( sel : IN STD_LOGIC_VECTOR(1 DOWNTO 0);
a : IN STD_LOGIC_VECTOR(4 DOWNTO 0);
b : IN STD_LOGIC_VECTOR(4 DOWNTO 0);
c : IN STD_LOGIC_VECTOR(4 DOWNTO 0);
d : OUT STD_LOGIC_VECTOR(4 DOWNTO 0));
END COMPONENT;
COMPONENT mux4_32bit
PORT( sel : IN STD_LOGIC_VECTOR(1 DOWNTO 0);
a : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
b : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
c : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
d : OUT STD_LOGIC_VECTOR(31 DOWNTO 0));
END COMPONENT;
COMPONENT PCReg
PORT( CLK : IN STD_LOGIC;
RST : IN STD_LOGIC;
PCin : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
PCout : OUT STD_LOGIC_VECTOR(31 DOWNTO 0));
END COMPONENT;
COMPONENT adder_32bit
PORT( x : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
y : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
z : OUT STD_LOGIC_VECTOR(31 DOWNTO 0));
END COMPONENT;
COMPONENT BusMerging
PORT( x : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
y : IN STD_LOGIC_VECTOR(27 DOWNTO 0);
z : OUT STD_LOGIC_VECTOR(31 DOWNTO 0));
END COMPONENT;
COMPONENT concat16
PORT( p : IN STD_LOGIC_VECTOR(15 DOWNTO 0);
q : OUT STD_LOGIC_VECTOR(31 DOWNTO 0));
END COMPONENT;
COMPONENT concat2
PORT( p : IN STD_LOGIC_VECTOR(25 DOWNTO 0);
q : OUT STD_LOGIC_VECTOR(27 DOWNTO 0));
END COMPONENT;
44UTS EL3043 - Arditto Trianggada / 13209046
COMPONENT shiftby2
PORT( p : IN STD_LOGIC_VECTOR(15 DOWNTO 0);
q : OUT STD_LOGIC_VECTOR(31 DOWNTO 0));
END COMPONENT;
COMPONENT Extend
PORT( a : IN STD_LOGIC;
b : IN STD_LOGIC_VECTOR(15 DOWNTO 0);
c : OUT STD_LOGIC_VECTOR(31 DOWNTO 0));
END COMPONENT;
COMPONENT ALU
PORT( x : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
y : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
shift : IN STD_LOGIC_VECTOR(4 DOWNTO 0);
Control: IN STD_LOGIC_VECTOR(4 DOWNTO 0);
z : OUT STD_LOGIC_VECTOR(31 DOWNTO 0);
Zero : OUT STD_LOGIC;
MSB : OUT STD_LOGIC);
END COMPONENT;
COMPONENT and2
PORT( x : IN STD_LOGIC;
y : IN STD_LOGIC;
z : OUT STD_LOGIC));
END COMPONENT;
COMPONENT and3
PORT( a : IN STD_LOGIC;
b : IN STD_LOGIC;
c : IN STD_LOGIC;
d : OUT STD_LOGIC));
END COMPONENT;
COMPONENT or2
PORT( x : IN STD_LOGIC;
y : IN STD_LOGIC;
z : OUT STD_LOGIC));
END COMPONENT;
COMPONENT or4
PORT( g : IN STD_LOGIC;
h : IN STD_LOGIC;
i : IN STD_LOGIC;
j : IN STD_LOGIC;
45UTS EL3043 - Arditto Trianggada / 13209046
k : OUT STD_LOGIC));
END COMPONENT;
COMPONENT InstrMemory
PORT( A : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
RD : OUT STD_LOGIC_VECTOR(31 DOWNTO 0));
END COMPONENT;
COMPONENT RegisterFile
PORT( CLK : IN STD_LOGIC;
RST : IN STD_LOGIC;
WE3 : IN STD_LOGIC;
A1 : IN STD_LOGIC_VECTOR(4 DOWNTO 0);
A2 : IN STD_LOGIC_VECTOR(4 DOWNTO 0);
A3 : IN STD_LOGIC_VECTOR(4 DOWNTO 0);
WD3 : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
RD1 : OUT STD_LOGIC_VECTOR(31 DOWNTO 0);
RD2 : OUT STD_LOGIC_VECTOR(31 DOWNTO 0));
END COMPONENT;
COMPONENT DataMemory
PORT( CLK : IN STD_LOGIC;
RST : IN STD_LOGIC;
WE : IN STD_LOGIC;
A : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
WD : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
RD : OUT STD_LOGIC_VECTOR(31 DOWNTO 0));
END COMPONENT;
COMPONENT ControlUnit IS
PORT(
Opcode : IN STD_LOGIC_VECTOR(5 DOWNTO 0);
Funct : IN STD_LOGIC_VECTOR(5 DOWNTO 0);
RegDst : OUT STD_LOGIC_VECTOR(1 DOWNTO 0);
RegWrite : OUT STD_LOGIC;
Beq : OUT STD_LOGIC;
Bne : OUT STD_LOGIC;
Bltz : OUT STD_LOGIC;
Bgtz : OUT STD_LOGIC;
MemtoReg : OUT STD_LOGIC;
MemWrite : OUT STD_LOGIC;
ALUCtrl : OUT STD_LOGIC_VECTOR (4 DOWNTO 0);
ALUSrc : OUT STD_LOGIC(1 DOWNTO 0);
J : OUT STD_LOGIC;
Jal : OUT STD_LOGIC;
46UTS EL3043 - Arditto Trianggada / 13209046
Jr : OUT STD_LOGIC;
Jalr : OUT STD_LOGIC;
END COMPONENT;
SIGNAL PCPlus4 : STD_LOGIC_VECTOR(31 DOWNTO 0);
SIGNAL BTA : STD_LOGIC_VECTOR(31 DOWNTO 0);
SIGNAL JTA : STD_LOGIC_VECTOR(31 DOWNTO 0);
SIGNAL BranchTaken : STD_LOGIC_VECTOR(31 DOWNTO 0);
SIGNAL Jr_sig : STD_LOGIC_VECTOR(31 DOWNTO 0);
SIGNAL Branch_sig : STD_LOGIC_VECTOR(31 DOWNTO 0);
SIGNAL Jr_sig : STD_LOGIC_VECTOR(31 DOWNTO 0);
SIGNAL nPC : STD_LOGIC_VECTOR(31 DOWNTO 0);
SIGNAL PC : STD_LOGIC_VECTOR(31 DOWNTO 0);
SIGNAL Instr : STD_LOGIC_VECTOR(31 DOWNTO 0);
SIGNAL RegReadData1 : STD_LOGIC_VECTOR(31 DOWNTO 0);
SIGNAL RegReadData2 : STD_LOGIC_VECTOR(31 DOWNTO 0);
SIGNAL ImmExt : STD_LOGIC_VECTOR(31 DOWNTO 0);
SIGNAL ImmUpper : STD_LOGIC_VECTOR(31 DOWNTO 0);
SIGNAL WriteReg : STD_LOGIC_VECTOR(4 DOWNTO 0);
SIGNAL Branch_label : STD_LOGIC_VECTOR(31 DOWNTO 0);
SIGNAL Jump_label : STD_LOGIC_VECTOR(27 DOWNTO 0);
SIGNAL SrcA : STD_LOGIC_VECTOR(31 DOWNTO 0);
SIGNAL SrcB : STD_LOGIC_VECTOR(31 DOWNTO 0);
SIGNAL ALUResult : STD_LOGIC_VECTOR(31 DOWNTO 0);
SIGNAL Zero : STD_LOGIC;
SIGNAL LTZ : STD_LOGIC;
SIGNAL Jal_sel : STD_LOGIC;
SIGNAL ReadData : STD_LOGIC_VECTOR(31 DOWNTO 0);
SIGNAL WriteData : STD_LOGIC_VECTOR(31 DOWNTO 0);
SIGNAL Result : STD_LOGIC_VECTOR(31 DOWNTO 0);
SIGNAL Beq_sig : STD_LOGIC;
SIGNAL Bne_sig : STD_LOGIC;
SIGNAL Bltz_sig : STD_LOGIC;
SIGNAL Bgtz_sig : STD_LOGIC;
SIGNAL RegWrite : STD_LOGIC;
SIGNAL RegDst : STD_LOGIC_VECTOR(1 DOWNTO 0);
SIGNAL ALUSrc : STD_LOGIC_VECTOR(1 DOWNTO 0);
SIGNAL ALUCtrl : STD_LOGIC_VECTOR(4 DOWNTO 0);
SIGNAL MemWrite : STD_LOGIC;
SIGNAL MemtoReg : STD_LOGIC;
SIGNAL ExtOp : STD_LOGIC;
SIGNAL Beq : STD_LOGIC;
SIGNAL Bne : STD_LOGIC;
SIGNAL Bltz : STD_LOGIC;
SIGNAL Bgtz : STD_LOGIC;
47UTS EL3043 - Arditto Trianggada / 13209046
SIGNAL Jump : STD_LOGIC;
SIGNAL Jal : STD_LOGIC;
SIGNAL Jr : STD_LOGIC;
SIGNAL Jalr : STD_LOGIC;
BEGIN
--Output signal used for simulation if necessary
PC_out <= PC;
Instr_out <= Instr;
ALUCtrl_out <= ALUCtrl;
ReadData1_out <= SrcA;
ReadData2_out <= RegReadData2;
WriteReg_out <= WriteReg;
ALUResult_out <= ALUResult;
Result_out <= Result;
Beq_out <= Beq;
Bne_out <= Bne;
Bltz_out <= Bltz;
Blez_out <= Blez;
Bgtz_out <= Bgtz;
Zero_out <= Zero;
LTZ_out <= Zero;
J_out <= Jump;
Jal_out <= Jal;
Jr_out <= Jr;
Jalr_out <= Jalr;
MemWrite_out <= MemWrite;
RegWrite_out <= '0' WHEN WriteReg = "00000" ELSE RegWrite;
--Structural description
GetJr_sig: mux2_32bit
PORT MAP( sel => Jr,
x => PCPlus4,
y => SrcA,
z => Jr_sig);
GetBranch_sig: mux2_32bit
PORT MAP( sel => BranchTaken,
x => Jr_sig,
y => BTA,
z => Branch_sig);
48UTS EL3043 - Arditto Trianggada / 13209046
GetJump_sig: mux2_32bit
PORT MAP( sel => Jump,
x => Branch_sig,
y => JTA,
z => nPC);
GetPC: PCReg
PORT MAP( CLK => Clock,
RST => Reset,
PCin => nPC,
PCout => PC);
InstrMem: InstrMemory
PORT MAP( A => PC,
RD => Instr);
GetPCPlus4: adder_32bit
PORT MAP( x => PC,
y => X"0004",
z => PCPlus4);
GetJTA: BusMerging
PORT MAP( x => PCPlus4(31 DOWNTO 28),
y => Jump_label,
z => JTA);
GetControlSignal: ControlUnit
PORT MAP( Opcode => Instr(31 DOWNTO 26),
Funct => Instr(5 DOWNTO 0),
RegDst => RegDst,
RegWrite => RegWrite,
Beq => Beq,
Bne => Bne,
Bltz => Bltz,
MemtoReg => MemtoReg,
MemWrite => MemWrite,
ALUCtrl => ALUCtrl,
ALUSrc => ALUSrc,
J => Jump,
Jal => Jal,
Jr => Jr,
Jalr => Jalr);
49UTS EL3043 - Arditto Trianggada / 13209046
RegFile: RegisterFile
PORT MAP( CLK => Clock,
RST => Reset,
WE3 => RegWrite,
A1 => Instr(25 DOWNTO 21),
A2 => Instr(20 DOWNTO 16),
A3 => WriteReg,
WD3 => Result,
RD1 => SrcA,
RD2 => RegReadData2);
GetJumpLabel: concat2
PORT MAP( p => Instr(25 DOWNTO 0),
q => Jump_label);
GetImmUpper: concat16
PORT MAP( p => Instr(15 DOWNTO 0),
q => ImmUpper);
GetImmExt: Extend
PORT MAP( a => ExtOp,
b => Instr(15 DOWNTO 0),
c => ImmExt);
GetBranchLabel: shiftby2
PORT MAP( p => ImmExt,
q => Branch_label);
GetBTA: adder_32bit
PORT MAP( x => Branch_label,
y => PCPlus4,
z => BTA);
GetWriteReg: mux4_5bit
PORT MAP( sel => RegDst,
a => Instr(20 DOWNTO 16),
b => Instr(15 DOWNTO 11),
c => "11111",
d => WriteReg);
GetSrcB: mux4_32bit
PORT MAP( sel => ALUSrc,
a => RegReadData2,
b => ImmExt,
c => ImmUpper,
50UTS EL3043 - Arditto Trianggada / 13209046
d => SrcB);
GetALUResult: ALU
PORT MAP( x => SrcA,
y => SrcB,
shift => Instr(10 DOWNTO 6),
Control=> ALUCtrl,
z => ALUResult,
Zero => Zero,
MSB => LTZ);
GetBeq_sig: and2
PORT MAP( x => Beq,
y => Zero,
z => Beq_sig);
GetBne_sig: and2
PORT MAP( x => Bne,
y => NOT Zero,
z => Bne_sig);
GetBltz_sig: and2
PORT MAP( x => Bltz,
y => LTZ,
z => Bltz_sig);
GetBgtz_sig: and3
PORT MAP( a => Bgtz,
b => NOT Zero,
c => NOT LTZ,
d => Bgtz_sig);
GetBranchTaken: or4
PORT MAP( g => Beq_sig,
h => Bne_sig,
i => Bltz_sig,
j => Bgtz_sig,
k => BranchTaken);
DataMem: DataMemory
PORT MAP( CLK => Clock,
RST => Reset,
WE => MemWrite,
A => ALUResult,
WD => RegReadData2,
51UTS EL3043 - Arditto Trianggada / 13209046
RD => ReadData);
GetJal_sel: or2
PORT MAP( x => Jal,
y => Jalr,
Z => Jal_sel);
GetJal_sig: mux2_32bit
PORT MAP( sel => Jal_sel,
x => ALUResult,
y => PCPlus4,
z => Jal_sig);
GetResult: mux2_32bit
PORT MAP( sel => MemtoReg,
x => Jal_sig,
y => ReadData,
z => Result);
END structural;
52UTS EL3043 - Arditto Trianggada / 13209046
C. Dataflow Instruksi
Pada bagian ini, akan dijelaskan aliran data dari instruksi beq, bne, bltz, blez, bgtz, j, jal, jr, dan jalr.
1. Instruksi beq
Syntax : beq $s, $t, label
Instruction Set: 0001 00ss ssst tttt iiii iiii iiii iiii
Operasi : if ($s = $t) then nPC = PC+4+(SignExt(imm) <<2)
else nPC = PC+4
Untuk menangani instruksi ini, control signal yang dikeluarkan adalah sebagai berikut
Instr. Funct[5:0] AluOp[2:0] AluCtrl[4:0] Jr Jalr
beq XX XXXX 001 1 0010 0 X
Dari control signal diatas, maka aliran data pada datapath dan ALU adalah sebagai berikut
ImmExt
A RD
Instruction
Memory
+4
A1
A3
WD3
RD2
RD1WE3
A2
CLK
Extend
Register
File
A RD
DataMemory
WD
WE0
1
0
1Instr 25:21
20:16
15:0
5:0
SrcB
20:16
15:11
+
ALUResultReadData
WriteData
SrcA
PCPlus4
BTA
WriteReg
Result
31:26
RegDst
Beq
MemWrite
MemtoReg
RegWrite
Op
Funct
Control
Unit
Zero
BranchTaken
CLK
ALUControl4:0
ALU
0
1
25:0<<2
27:0
31:28
JTA
Jump
BTA
PC
Plu
s4
00
01
0001
4:0
<<2
Bus
Merging
CLK
PC
PCPlus4
ALUControl4:0
Beq
MemWrite
MemtoReg
BranchTaken (0 or 1??)
Jump
RegDst1:0
ALUSrc1:0
nPC
Zero
Instr 10:6
10
<<16
ALUSrc1:0
ExtOp
ExtOp
Bne
Zero
Bne
LTZ
Bltz
LTZ
Bltz
Jal
Zero
LTZ
Bgtz
Bgtz
01
Jal
10$ra = 1 1111
PCPlus4
0
1
SrcA
SrcA
Jr
Jr
Jalr
Jalr
ImmUpper
Jump_label
Branch_label
ReadReg1
ReadReg2
Jr_
sig
Bra
nch
_sig
Bgtz_sig
Beq_sig
Bltz_sig
Bne_sig
Jal_sig
15:0
53UTS EL3043 - Arditto Trianggada / 13209046
2. Instruksi bne
Syntax : bne $s, $t, label
Instruction Set: 0001 01ss ssst tttt iiii iiii iiii iiii
Operasi : if ($s /= $t) then nPC = PC+4+(SignExt(imm) <<2)
else nPC = PC+4
Untuk menangani instruksi ini, control signal yang dikeluarkan adalah sebagai berikut
Instr. Funct[5:0] AluOp[2:0] AluCtrl[4:0] Jr Jalr
bne XX XXXX 001 1 0010 0 X
Dari control signal diatas, maka aliran data pada datapath dan ALU adalah sebagai berikut
54UTS EL3043 - Arditto Trianggada / 13209046
ImmExt
A RD
Instruction
Memory
+4
A1
A3
WD3
RD2
RD1WE3
A2
CLK
Extend
Register
File
A RD
DataMemory
WD
WE0
1
0
1Instr 25:21
20:16
15:0
5:0
SrcB
20:16
15:11
+
ALUResultReadData
WriteData
SrcA
PCPlus4
BTA
WriteReg
Result
31:26
RegDst
Beq
MemWrite
MemtoReg
RegWrite
Op
Funct
Control
Unit
Zero
BranchTaken
CLK
ALUControl4:0
ALU
0
1
25:0<<2
27:0
31:28
JTA
Jump
BTA
PC
Plu
s4
00
01
0001
4:0
<<2
Bus
Merging
CLK
PC
PCPlus4
ALUControl4:0
Beq
MemWrite
MemtoReg
BranchTaken (0 or 1??)
Jump
RegDst1:0
ALUSrc1:0
nPC
Zero
Instr 10:6
10
<<16
ALUSrc1:0
ExtOp
ExtOp
Bne
Zero
Bne
LTZ
Bltz
LTZ
Bltz
Jal
Zero
LTZ
Bgtz
Bgtz
01
Jal
10$ra = 1 1111
PCPlus4
0
1
SrcA
SrcA
Jr
Jr
Jalr
Jalr
ImmUpper
Jump_label
Branch_label
ReadReg1
ReadReg2
Jr_
sig
Bra
nch
_sig
Bgtz_sig
Beq_sig
Bltz_sig
Bne_sig
Jal_sig
15:0
55UTS EL3043 - Arditto Trianggada / 13209046
3. Instruksi bltz
Syntax : bltz $s, $t, label
Instruction Set: 0000 01ss ssst tttt iiii iiii iiii iiii
Operasi : if ($s < $t) then nPC = PC+4+(SignExt(imm) <<2)
else nPC = PC+4
Untuk menangani instruksi ini, control signal yang dikeluarkan adalah sebagai berikut
Instr. Funct[5:0] AluOp[2:0] AluCtrl[4:0] Jr Jalr
bltz XX XXXX 001 1 0010 0 X
Dari control signal diatas, maka aliran data pada datapath dan ALU adalah sebagai berikut
ImmExt
A RD
Instruction
Memory
+4
A1
A3
WD3
RD2
RD1WE3
A2
CLK
Extend
Register
File
A RD
DataMemory
WD
WE0
1
0
1Instr 25:21
20:16
15:0
5:0
SrcB
20:16
15:11
+
ALUResultReadData
WriteData
SrcA
PCPlus4
BTA
WriteReg
Result
31:26
RegDst
Beq
MemWrite
MemtoReg
RegWrite
Op
Funct
Control
Unit
Zero
BranchTaken
CLK
ALUControl4:0
ALU
0
1
25:0<<2
27:0
31:28
JTA
Jump
BTA
PC
Plu
s4
00
01
0001
4:0
<<2
Bus
Merging
CLK
PC
PCPlus4
ALUControl4:0
Beq
MemWrite
MemtoReg
BranchTaken (0 or 1??)
Jump
RegDst1:0
ALUSrc1:0
nPC
Zero
Instr 10:6
10
<<16
ALUSrc1:0
ExtOp
ExtOp
Bne
Zero
Bne
LTZ
Bltz
LTZ
Bltz
Jal
Zero
LTZ
Bgtz
Bgtz
01
Jal
10$ra = 1 1111
PCPlus4
0
1
SrcA
SrcA
Jr
Jr
Jalr
Jalr
ImmUpper
Jump_label
Branch_label
ReadReg1
ReadReg2
Jr_
sig
Bra
nch
_sig
Bgtz_sig
Beq_sig
Bltz_sig
Bne_sig
Jal_sig
15:0
56UTS EL3043 - Arditto Trianggada / 13209046
4. Instruksi blez
Syntax : blez $s, $t, label
Instruction Set: 0001 10ss ssst tttt iiii iiii iiii iiii
Operasi : if ($s <= $t) then nPC = PC+4+(SignExt(imm) <<2)
else nPC = PC+4
Untuk menangani instruksi ini, control signal yang dikeluarkan adalah sebagai berikut
Instr. Funct[5:0] AluOp[2:0] AluCtrl[4:0] Jr Jalr
blez XX XXXX 001 1 0010 0 X
Dari control signal diatas, maka aliran data pada datapath dan ALU adalah sebagai berikut
57UTS EL3043 - Arditto Trianggada / 13209046
ImmExt
A RD
Instruction
Memory
+4
A1
A3
WD3
RD2
RD1WE3
A2
CLK
Extend
Register
File
A RD
DataMemory
WD
WE0
1
0
1Instr 25:21
20:16
15:0
5:0
SrcB
20:16
15:11
+
ALUResultReadData
WriteData
SrcA
PCPlus4
BTA
WriteReg
Result
31:26
RegDst
Beq
MemWrite
MemtoReg
RegWrite
Op
Funct
Control
Unit
Zero
BranchTaken
CLK
ALUControl4:0
ALU
0
1
25:0<<2
27:0
31:28
JTA
Jump
BTA
PC
Plu
s4
00
01
0001
4:0
<<2
Bus
Merging
CLK
PC
PCPlus4
ALUControl4:0
Beq
MemWrite
MemtoReg
BranchTaken (0 or 1??)
Jump
RegDst1:0
ALUSrc1:0
nPC
Zero
Instr 10:6
10
<<16
ALUSrc1:0
ExtOp
ExtOp
Bne
Zero
Bne
LTZ
Bltz
LTZ
Bltz
Jal
Zero
LTZ
Bgtz
Bgtz
01
Jal
10$ra = 1 1111
PCPlus4
0
1
SrcA
SrcA
Jr
Jr
Jalr
Jalr
ImmUpper
Jump_label
Branch_label
ReadReg1
ReadReg2
Jr_
sig
Bra
nch
_sig
Bgtz_sig
Beq_sig
Bltz_sig
Bne_sig
Jal_sig
15:0
58UTS EL3043 - Arditto Trianggada / 13209046
5. Instruksi bgtz
Syntax : bgtz $s, $t, label
Instruction Set: 0001 11ss ssst tttt iiii iiii iiii iiii
Operasi : if ($s > $t) then nPC = PC+4+(SignExt(imm) <<2)
else nPC = PC+4
Untuk menangani instruksi ini, control signal yang dikeluarkan adalah sebagai berikut
Instr. Funct[5:0] AluOp[2:0] AluCtrl[4:0] Jr Jalr
bgtz XX XXXX 001 1 0010 0 X
Dari control signal diatas, maka aliran data pada datapath dan ALU adalah sebagai berikut
ImmExt
A RD
Instruction
Memory
+4
A1
A3
WD3
RD2
RD1WE3
A2
CLK
Extend
Register
File
A RD
DataMemory
WD
WE0
1
0
1Instr 25:21
20:16
15:0
5:0
SrcB
20:16
15:11
+
ALUResultReadData
WriteData
SrcA
PCPlus4
BTA
WriteReg
Result
31:26
RegDst
Beq
MemWrite
MemtoReg
RegWrite
Op
Funct
Control
Unit
Zero
BranchTaken
CLK
ALUControl4:0
ALU
0
1
25:0<<2
27:0
31:28
JTA
Jump
BTA
PC
Plu
s4
00
01
0001
4:0
<<2
Bus
Merging
CLK
PC
PCPlus4
ALUControl4:0
Beq
MemWrite
MemtoReg
BranchTaken (0 or 1??)
Jump
RegDst1:0
ALUSrc1:0
nPC
Zero
Instr 10:6
10
<<16
ALUSrc1:0
ExtOp
ExtOp
Bne
Zero
Bne
LTZ
Bltz
LTZ
Bltz
Jal
Zero
LTZ
Bgtz
Bgtz
01
Jal
10$ra = 1 1111
PCPlus4
0
1
SrcA
SrcA
Jr
Jr
Jalr
Jalr
ImmUpper
Jump_label
Branch_label
ReadReg1
ReadReg2
Jr_
sig
Bra
nch
_sig
Bgtz_sig
Beq_sig
Bltz_sig
Bne_sig
Jal_sig
15:0
59UTS EL3043 - Arditto Trianggada / 13209046
6. Instruksi j
Syntax : j label
Instruction Set : 0000 10ii iiii iiii iiii iiii iiii iiii
Operasi : nPC = PC+4[31:28] & imm & “00”
Untuk menangani instruksi ini, control signal yang dikeluarkan adalah sebagai berikut
Instr. Funct[5:0] AluOp[2:0] AluCtrl[4:0] Jr Jalr
j XX XXXX XXX X XXXX X X
Dari control signal diatas, maka aliran data pada datapath adalah sebagai berikut
60UTS EL3043 - Arditto Trianggada / 13209046
ImmExt
A RD
Instruction
Memory
+4
A1
A3
WD3
RD2
RD1WE3
A2
CLK
Extend
Register
File
A RD
DataMemory
WD
WE0
1
0
1Instr 25:21
20:16
15:0
5:0
SrcB
20:16
15:11
+
ALUResultReadData
WriteData
SrcA
PCPlus4
BTA
WriteReg
Result
31:26
RegDst
Beq
MemWrite
MemtoReg
RegWrite
Op
Funct
Control
Unit
Zero
BranchTaken
CLK
ALUControl4:0
ALU
0
1
25:0<<2
27:0
31:28
JTA
Jump
BTA
PC
Plu
s4
00
01
0001
4:0
<<2
Bus
Merging
CLK
PC
PCPlus4
ALUControl4:0
Beq
MemWrite
MemtoReg
BranchTaken
Jump
RegDst1:0
ALUSrc1:0
nPC
Zero
Instr 10:6
10
<<16
ALUSrc1:0
ExtOp
ExtOp
Bne
Zero
Bne
LTZ
Bltz
LTZ
Bltz
Jal
Zero
LTZ
Bgtz
Bgtz
01
Jal
10$ra = 1 1111
PCPlus4
0
1
SrcA
SrcA
Jr
Jr
Jalr
Jalr
ImmUpper
Jump_label
Branch_label
ReadReg1
ReadReg2
Jr_
sig
Bra
nch
_sig
Bgtz_sig
Beq_sig
Bltz_sig
Bne_sig
Jal_sig
15:0
Sedangkan, pada ALU tidak ada data yang diolah.
7. Instruksi jal
Syntax : jal label
Instruction Set : 0000 11ii iiii iiii iiii iiii iiii iiii
Operasi : nPC = PC+4[31.28] & imm & “00”; $31 = PC+4
Untuk menangani instruksi ini, control signal yang dikeluarkan adalah sebagai berikut
Instr. Funct[5:0] AluOp[2:0] AluCtrl[4:0] Jr Jalr
jal XX XXXX XXX X XXXX X X
Dari control signal diatas, maka aliran data pada datapath adalah sebagai berikut
61UTS EL3043 - Arditto Trianggada / 13209046
ImmExt
A RD
Instruction
Memory
+4
A1
A3
WD3
RD2
RD1WE3
A2
CLK
Extend
Register
File
A RD
DataMemory
WD
WE0
1
0
1Instr 25:21
20:16
15:0
5:0
SrcB
20:16
15:11
+
ALUResultReadData
WriteData
SrcA
PCPlus4
BTA
WriteReg
Result
31:26
RegDst
Beq
MemWrite
MemtoReg
RegWrite
Op
Funct
Control
Unit
Zero
BranchTaken
CLK
ALUControl4:0
ALU
0
1
25:0<<2
27:0
31:28
JTA
Jump
BTA
PC
Plu
s4
00
01
0001
4:0
<<2
Bus
Merging
CLK
PC
PCPlus4
ALUControl4:0
Beq
MemWrite
MemtoReg
BranchTaken
Jump
RegDst1:0
ALUSrc1:0
nPC
Zero
Instr 10:6
10
<<16
ALUSrc1:0
ExtOp
ExtOp
Bne
Zero
Bne
LTZ
Bltz
LTZ
Bltz
Jal=1
Zero
LTZ
Bgtz
Bgtz
01
Jal
10$ra = 1 1111
PCPlus4
0
1
SrcA
SrcA
Jr
Jr
Jalr
Jalr
ImmUpper
Jump_label
Branch_label
ReadReg1
ReadReg2
Jr_
sig
Bra
nch_
sig
Bgtz_sig
Beq_sig
Bltz_sig
Bne_sig
Jal_sig
15:0
Sedangkan, pada ALU tidak ada data yang diolah.
8. Instruksi jr
Syntax : jr $s
Instruction Set : 0000 00ss sss0 0000 0000 0000 0000 1000
Operasi : nPC = $s
Untuk menangani instruksi ini, control signal yang dikeluarkan adalah sebagai berikut
Instr. Funct[5:0] AluOp[2:0] AluCtrl[4:0] Jr Jalr
jr 00 1000 010 X XXXX 1 0
Dari control signal diatas, maka aliran data pada datapath adalah sebagai berikut
62UTS EL3043 - Arditto Trianggada / 13209046
ImmExt
A RD
Instruction
Memory
+4
A1
A3
WD3
RD2
RD1WE3
A2
CLK
Extend
Register
File
A RD
DataMemory
WD
WE0
1
0
1Instr 25:21
20:16
15:0
5:0
SrcB
20:16
15:11
+
ALUResultReadData
WriteData
SrcA
PCPlus4
BTA
WriteReg
Result
31:26
RegDst
Beq
MemWrite
MemtoReg
RegWrite
Op
Funct
Control
Unit
Zero
BranchTaken
CLK
ALUControl4:0
ALU
0
1
25:0<<2
27:0
31:28
JTA
Jump
BTA
PC
Plu
s4
00
01
0001
4:0
<<2
Bus
Merging
CLK
PC
PCPlus4
ALUControl4:0
Beq
MemWrite
MemtoReg
BranchTaken
Jump
RegDst1:0
ALUSrc1:0
nPC
Zero
Instr 10:6
10
<<16
ALUSrc1:0
ExtOp
ExtOp
Bne
Zero
Bne
LTZ
Bltz
LTZ
Bltz
Jal
Zero
LTZ
Bgtz
Bgtz
01
Jal
10$ra = 1 1111
PCPlus4
0
1
SrcA
SrcA
Jr
Jr
Jalr
Jalr
ImmUpper
Jump_label
Branch_label
ReadReg1
ReadReg2
Jr_
sig
Bra
nch
_sig
Bgtz_sig
Beq_sig
Bltz_sig
Bne_sig
Jal_sig
15:0
Pada aliran data instruksi jr, nPC akan diupdate dengan nilai SrcA yang merupaka nilai isi dari register
pada $s. Dis amping itu, jr yang merupakan instruksi R-Type dimana memiliki nilai RegDst=01, tetap
tidak akan mengubah isi register karena pada kode biner nya nilai $d = 0. Oleh karena itu pengisian
register dilakukan pada alamat $0 yang telah di-hardwired-kan dengan logika 0 sehingga tidak
mempengaruhi isi register.
9. Instuksi jalr
Syntax : jalr $d, $s
Instruction Set : 0000 00ss sss0 0000 1111 1000 0000 1001
Operasi : nPC = $s; $31 = PC+4
Untuk menangani instruksi ini, control signal yang dikeluarkan adalah sebagai berikut
Instr. Funct[5:0] AluOp[2:0] AluCtrl[4:0] Jr Jalr
jalr 00 1001 010 X XXXX 1 1
63UTS EL3043 - Arditto Trianggada / 13209046
Dari control signal diatas, maka aliran data pada datapath adalah sebagai berikut
ImmExt
A RD
Instruction
Memory
+4
A1
A3
WD3
RD2
RD1WE3
A2
CLK
Extend
Register
File
A RD
DataMemory
WD
WE0
1
0
1Instr 25:21
20:16
15:0
5:0
SrcB
20:16
15:11
+
ALUResultReadData
WriteData
SrcA
PCPlus4
BTA
WriteReg
Result
31:26
RegDst
Beq
MemWrite
MemtoReg
RegWrite
Op
Funct
Control
Unit
Zero
BranchTaken
CLK
ALUControl4:0
ALU
0
1
25:0<<2
27:0
31:28
JTA
Jump
BTA
PC
Plu
s4
00
01
0001
4:0
<<2
Bus
Merging
CLK
PC
PCPlus4
ALUControl4:0
Beq
MemWrite
MemtoReg
BranchTaken
Jump
RegDst1:0
ALUSrc1:0
nPC
Zero
Instr 10:6
10
<<16
ALUSrc1:0
ExtOp
ExtOp
Bne
Zero
Bne
LTZ
Bltz
LTZ
Bltz
Jal
Zero
LTZ
Bgtz
Bgtz
01
Jal
10$ra = 1 1111
PCPlus4
0
1
SrcA
SrcA
Jr
Jr
Jalr=1
Jalr
ImmUpper
Jump_label
Branch_label
ReadReg1
ReadReg2
Jr_
sig
Bra
nch
_sig
Bgtz_sig
Beq_sig
Bltz_sig
Bne_sig
Jal_sig
15:0
1 1111