Professional Documents
Culture Documents
A. Perancangan Prosesor: 1. Instruksi LW
A. Perancangan Prosesor: 1. Instruksi LW
A. Perancangan Prosesor: 1. Instruksi LW
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) 1000 11ss ssst tttt iiii iiii iiii iiii $t = M[$s + imm]
2. Instruksi sw Syntax : sw $t, imm($s) 1010 11ss ssst tttt iiii iiii iiii iiii M[$s + imm] = $t
3. Instruksi add, sub, and, dan or (R-Type) Syntax : <funct> $d, $s, $t 0000 00ss ssst tttt dddd d000 00ff ffff $d = $s <funct> $d
7. Instruksi beq Syntax : Instruction Set : Operasi : beq $s, $t, label 0001 00ss ssst tttt iiii iiii iiii iiii if ($s = $t) then nPC = PC+4+(SignExt(imm) << 2) else nPC = PC+4
8. Instruksi addi Syntax : Instruction Set : Operasi : addi $t, $s, imm 0010 00ss ssst tttt iiii iiii iiii iiii $t = $s + imm
9. Instruksi j Syntax : j label 0000 10ii iiii iiii iiii iiii iiii iiii nPC = PC+4[31:28] & imm & 00
MemtoReg MemWrite Branch ALUControl ALUSrc RegDst RegWrite WE3 RD1 RD2 RegDst
2:0
Op Funct ALUControl
Jump
CLK
CLK
PCPlus4
0 1 0 1
ALUSrc SrcA
MemWrite CLK
MemtoReg
PC
A RD Instruction Memory
Instr
25:21
A1
20:16
Zero
WE A RD
nPC
BTA JTA
0 1
SrcB
ALU
ALUResult
0 1 ReadData Result
20:16 15:11
0 1
WriteReg
4:0
+
15:0
Sign Extend
SignImm
<<2 PCPlus4
BTA
25:0
<<2
Control Unit
Control Unit Jump MemtoReg MemWrite Branch
Funct5:0
Main Decoder:
ALU Decoder:
ALU ALUCtrl[2:0] 000 001 010 011 100 101 110 111 Operasi A AND B A OR B A+B n/a A AND B' A OR B' A-B A<B
A
N
B
N
0
ALUCtrl2
Cout
[N-1]
+ S
Zero Extend
N N N N
== 0 Zero Y
2
N
ALUCtrl1:0
10. Instruksi slt Syntax : slt $d, $s, $t 0000 00ss ssst tttt dddd d000 0010 1011 if ($s < $t) then $d = 1; else $d = 0
Pada penambahan instruksi ini, perubahan ada pada control signal, khususnya pada ALU Decoder: Instr. add sub and or addi lw sw beq j slt Funct[5:0] AluOp[1:0] 10 0000 1X 10 0010 1X 10 0100 1X 10 0101 1X XX XXXX 00 XX XXXX 00 XX XXXX 00 XX XXXX X1 XX XXXX XX 10 1010 1X AluCtrl[2:0] 010 110 000 001 010 010 010 110 XXX 111
Untuk spesifikasi lainnya adalah sama. 11. Instruksi sll Syntax : sll $d, $t, shamt 0000 0000 0000t tttt dddd d0sss ss00 0000 $d = $t << shamt
Pada penambahan instruksi ini modifikasi adalah sebagai berikut: Mengubah ALUCtrl menjadi 4 bit
Funct[5:0] AluOp[1:0] 10 0000 1X 10 0010 1X 10 0100 1X 10 0101 1X XX XXXX 00 XX XXXX 00 XX XXXX 00 XX XXXX X1 XX XXXX XX 10 1010 1X 00 0000 1X
AluCtrl[3:0] 0010 1010 0000 0001 0010 0010 0010 1010 XXXX 1011 0100
A
N
B
N
ALUCtrl3
Cout
<<
Zero Extend
[N-1]
+ S
Menambahkan shamt[4:0] sebagai masukan pada ALU pada datapath dan controller
BranchTaken Branch Zero
3:0
PCPlus4
0 1 0 1
BTA
3
JTA
== 0 Zero Y
BranchTaken
Jump
nPC
2
N
ALUCtrl2:0
MemtoReg MemWrite Branch ALUControl ALUSrc RegDst RegWrite WE3 RD1 RD2 RegDst
3:0
Op Funct ALUControl
CLK
Instr 10:6
CLK ALUSrc SrcA
MemtoReg
PC
A RD Instruction Memory
Instr
25:21
A1
20:16
Zero
0 1
SrcB
ALU
ALUResult
Result
20:16 15:11
0 1
WriteReg
4:0
+
15:0
Sign Extend
SignImm
<<2 PCPlus4
BTA
25:0
<<2
12. Instruksi srl Syntax : srl $d, $t, shamt 0000 0000 0000t tttt dddd d0sss ss00 0010 $d = $t >> shamt
Pada penambahan instruksi ini modifikasi adalah sebagai berikut: Modifikasi control signal Instr. add sub and or addi lw sw beq j slt sll srl Funct[5:0] AluOp[1:0] 10 0000 1X 10 0010 1X 10 0100 1X 10 0101 1X XX XXXX 00 XX XXXX 00 XX XXXX 00 XX XXXX X1 XX XXXX XX 10 1010 1X 00 0000 1X 00 0010 1X AluCtrl[3:0] 0010 1010 0000 0001 0010 0010 0010 1010 XXXX 1011 0100 0101
A
N
B
N
ALUCtrl3
Cout
>> <<
Zero Extend
[N-1]
+ S
== 0 Zero Y
2
N
ALUCtrl2:0
13. Instruksi sra Syntax : sra $d, $t, shamt 0000 0000 0000t tttt dddd d0sss ss00 0011 $d = $t >>> shamt
Pada penambahan instruksi ini modifikasi adalah sebagai berikut: Modifikasi control signal Instr. add sub and or addi lw sw beq j slt sll srl sra Funct[5:0] AluOp[1:0] 10 0000 1X 10 0010 1X 10 0100 1X 10 0101 1X XX XXXX 00 XX XXXX 00 XX XXXX 00 XX XXXX X1 XX XXXX XX 10 1010 1X 00 0000 1X 00 0010 1X 00 0011 1X AluCtrl[3:0] 0010 1010 0000 0001 0010 0010 0010 1010 XXXX 1011 0100 0101 0110
Menambah operasi shift pada ALU ALUCtrl[3:0] 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 Operasi A AND B A OR B A+B n/a B << shamt B >> shamt B >>> shamt n/a A AND B' A OR B' A-B A<B B' << shamt B' >> shamt B' >>> shamt n/a
shamt4:0
5
A
N
B
N
ALUCtrl3
Cout
>>>
>>
<<
Zero Extend
[N-1]
+ S
3
N
ALUCtrl2:0
== 0 Zero Y
10
14. Instruksi sllv Syntax : sllv $d, $s, $t 0000 00ss ssst tttt dddd d000 0000 0100 $d = $t << $s
Pada penambahan instruksi ini modifikasi adalah sebagai berikut: Mengubah control signal, khususnya pada ALU decoder: Instr. add sub and or addi lw sw beq j slt sll srl sra sllv Funct[5:0] AluOp[1:0] 10 0000 1X 10 0010 1X 10 0100 1X 10 0101 1X XX XXXX 00 XX XXXX 00 XX XXXX 00 XX XXXX X1 XX XXXX XX 10 1010 1X 00 0000 1X 00 0010 1X 00 0011 1X 00 0100 1X AluCtrl[3:0] 0010 1010 0000 0001 0010 0010 0010 1010 XXXX 1011 0100 0101 0110 1100
A
N
B
N
1
>>>
ALUCtrl3
N
ALUCtrl3
Cout
>> <<
Zero Extend
[N-1]
+ S
3
N
ALUCtrl2:0
== 0 Zero Y
11
15. Instruksi srlv Syntax : srlv $d, $s, $t 0000 00ss ssst tttt dddd d000 0000 0110 $d = $t >> $s
Pada penambahan instruksi ini modifikasi adalah sebagai berikut: Mengubah control signal, khususnya pada ALU decoder: Instr. add sub and or addi lw sw beq j slt sll srl sra sllv srlv Funct[5:0] AluOp[1:0] 10 0000 1X 10 0010 1X 10 0100 1X 10 0101 1X XX XXXX 00 XX XXXX 00 XX XXXX 00 XX XXXX X1 XX XXXX XX 10 1010 1X 00 0000 1X 00 0010 1X 00 0011 1X 00 0100 1X 00 0110 1X AluCtrl[3:0] 0010 1010 0000 0001 0010 0010 0010 1010 XXXX 1011 0100 0101 0110 1100 1101
shamt4:0 A4:0
5 5
A
N
B
N
1
>>>
ALUCtrl3
N
ALUCtrl3
Cout
>> <<
Zero Extend
[N-1]
+ S
3
N
ALUCtrl2:0
== 0 Zero Y
12
16. Instruksi srav Syntax : srav $d, $s, $t 0000 00ss ssst tttt dddd d000 0000 0111 $d = $t >>> $s
Pada penambahan instruksi ini modifikasi adalah sebagai berikut: Mengubah control signal, khususnya pada ALU decoder: Instr. add sub and or addi lw sw beq j slt sll srl sra sllv srlv srav Funct[5:0] AluOp[1:0] 10 0000 1X 10 0010 1X 10 0100 1X 10 0101 1X XX XXXX 00 XX XXXX 00 XX XXXX 00 XX XXXX X1 XX XXXX XX 10 1010 1X 00 0000 1X 00 0010 1X 00 0011 1X 00 0100 1X 00 0110 1X 00 0111 1X AluCtrl[3:0] 0010 1010 0000 0001 0010 0010 0010 1010 XXXX 1011 0100 0101 0110 1100 1101 1110
shamt4:0 A4:0
5 5 N
ALUCtrl[3:0] 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
Operasi A AND B A OR B A+B n/a B << shamt B >> shamt B >>> shamt n/a A AND B' A OR B' A-B A<B B << A B >> A B >>> A n/a
A
N
B
N
1
>>>
ALUCtrl3
N
ALUCtrl3
Cout
>> <<
Zero Extend
[N-1]
+ S
3
N
ALUCtrl2:0
== 0 Zero Y
13
17. Instruksi xor Syntax : xor $d, $s, $t 0000 00ss ssst tttt dddd d000 0010 0110 $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] add 10 0000 1X sub 10 0010 1X and 10 0100 1X or 10 0101 1X addi XX XXXX 00 lw XX XXXX 00 sw XX XXXX 00 beq XX XXXX X1 j XX XXXX XX slt 10 1010 1X sll 00 0000 1X srl 00 0010 1X sra 00 0011 1X sllv 00 0100 1X srlv 00 0110 1X srav 00 0111 1X xor 10 0110 1X Mengubah isi dari ALU
shamt4:0 A4:0
5 5 N
AluCtrl[3:0] 0010 1010 0000 0001 0010 0010 0010 1010 XXXX 1011 0100 0101 0110 1100 1101 1110 0111
A
N
B
N
1
>>>
0
ALUCtrl3 Cout
<<
[N-1]
ALUCtrl3
>>
+ S
Zero Extend
3
N
ALUCtrl2:0
== 0 Zero Y
14
18. Instruksi nor Syntax : nor $d, $s, $t 0000 00ss ssst tttt dddd d000 0010 0110 $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] add 10 0000 1X sub 10 0010 1X and 10 0100 1X or 10 0101 1X addi XX XXXX 00 lw XX XXXX 00 sw XX XXXX 00 beq XX XXXX X1 j XX XXXX XX slt 10 1010 1X sll 00 0000 1X srl 00 0010 1X sra 00 0011 1X sllv 00 0100 1X srlv 00 0110 1X srav 00 0111 1X xor 10 0110 1X nor 10 0111 1X Mengubah isi dari ALU ALUCtrl[4:0] 0 0000 0 0001 0 0010 0 0011 0 0100 0 0101 0 0110 0 0111 0 1000 1 0000 1 0001 1 0010 1 0011 1 0100 Operasi A AND B A OR B A+B n/a B << shamt B >> shamt B >>> shamt A XOR B A NOR B A AND B' A OR B' A-B A<B B << A AluCtrl[4:0] 0 0010 1 0010 0 0000 0 0001 0 0010 0 0010 0 0010 1 0010 X XXXX 1 0011 0 0100 0 0101 0 0110 1 0100 1 0101 1 0110 0 0111 0 1000
shamt4:0 A4:0
5 5 N
A
N
B
N
1
>>>
0
ALUCtrl4 Cout
<<
[N-1]
ALUCtrl4
>>
+ S
Zero Extend
5
== 0 Zero
3
N
ALUCtrl3:0
15
MemtoReg MemWrite Branch ALUControl ALUSrc RegDst RegWrite WE3 RD1 RD2 RegDst
4:0
Op Funct ALUControl
Jump
CLK
Instr 10:6
CLK ALUSrc SrcA
PCPlus4
0 1 0 1
MemtoReg
PC
A RD Instruction Memory
Instr
25:21
A1
20:16
Zero
nPC
BTA JTA
0 1
SrcB
ALU
ALUResult
Result
20:16 15:11
0 1
WriteReg
4:0
+
15:0
Sign Extend
SignImm
<<2 PCPlus4
BTA
25:0
<<2
19. Instruksi lui Syntax : lui $t, imm 0011 1100 000t tttt iiii iiii iiii iiii $t = imm<<16
Pada penambahan instruksi ini modifikasi adalah sebagai berikut: Pengubahan control signal Main decoder:
16
ALU decoder: Instr. add sub and or addi lw sw beq j slt sll srl sra sllv srlv srav xor nor lui Funct[5:0] AluOp[1:0] 10 0000 1X 10 0010 1X 10 0100 1X 10 0101 1X XX XXXX 00 XX XXXX 00 XX XXXX 00 XX XXXX X1 XX XXXX XX 10 1010 1X 00 0000 1X 00 0010 1X 00 0011 1X 00 0100 1X 00 0110 1X 00 0111 1X 10 0110 1X 10 0111 1X XX XXXX 00 AluCtrl[4:0] 0 0010 1 0010 0 0000 0 0001 0 0010 0 0010 0 0010 1 0010 X XXXX 1 0011 0 0100 0 0101 0 0110 1 0100 1 0101 1 0110 0 0111 0 1000 0 0010
4:0
Op Funct
ALUSrc1:0 RegDst
RegWrite WE3 RD1
ALUControl
Jump
CLK
Instr 10:6
CLK ALUSrc1:0 SrcA
PCPlus4
0 1 0 1
MemtoReg
PC
A RD Instruction Memory
Instr
25:21
A1
20:16
Zero
nPC
BTA JTA
00 SrcB 01 10
ALU
ALUResult
Result
20:16 15:11
0 1
WriteReg
4:0
+
15:0
Sign Extend
SignImm
<<2 PCPlus4
BTA
<<16
25:0
<<2
17
20. Instruksi slti Syntax : slti $t, $s, imm 0010 10ss ssst tttt iiii iiii iiii iiii 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. add sub and or addi lw sw beq j slt sll srl sra sllv srlv srav xor nor lui slti Funct[5:0] AluOp[1:0] 10 0000 10 10 0010 10 10 0100 10 10 0101 10 XX XXXX 00 XX XXXX 00 XX XXXX 00 XX XXXX 01 XX XXXX XX 10 1010 10 00 0000 10 00 0010 10 00 0011 10 00 0100 10 00 0110 10 00 0111 10 10 0110 10 10 0111 10 XX XXXX 00 XX XXXX 11 AluCtrl[4:0] 0 0010 1 0010 0 0000 0 0001 0 0010 0 0010 0 0010 1 0010 X XXXX 1 0011 0 0100 0 0101 0 0110 1 0100 1 0101 1 0110 0 0111 0 1000 0 0010 1 0011
18
4:0
Op Funct
ALUSrc1:0 RegDst
RegWrite WE3 RD1 RD2 RegDst
ALUControl
Jump
CLK
Instr 10:6
CLK ALUSrc1:0 SrcA
PCPlus4
0 1 0 1
MemtoReg
PC
A RD Instruction Memory
Instr
25:21
A1
20:16
Zero
nPC
BTA JTA
00 SrcB 01 10
ALU
ALUResult
Result
20:16 15:11
0 1
WriteReg
4:0
+
15:0
Sign Extend
SignImm
<<2 PCPlus4
BTA
<<16
25:0
<<2
21. Instruksi andi Syntax : andi $t, $s, imm 0011 00ss ssst tttt iiii iiii iiii iiii $t = $s AND ZeroExt(imm)
Pada penambahan instruksi ini modifikasi adalah sebagai berikut: Control signal
Control Unit Jump MemtoReg MemWrite Beq
Funct5:0
19
ALU decoder: Instr. add sub and or addi lw sw beq j slt sll srl sra sllv srlv srav xor nor lui slti andi Funct[5:0] AluOp[2:0] 10 0000 010 10 0010 010 10 0100 010 10 0101 010 XX XXXX 000 XX XXXX 000 XX XXXX 000 XX XXXX 001 XX XXXX XXX 10 1010 010 00 0000 010 00 0010 010 00 0011 010 00 0100 010 00 0110 010 00 0111 010 10 0110 010 10 0111 010 XX XXXX 000 XX XXXX 011 XX XXXX 100 AluCtrl[4:0] 0 0010 1 0010 0 0000 0 0001 0 0010 0 0010 0 0010 1 0010 X XXXX 1 0011 0 0100 0 0101 0 0110 1 0100 1 0101 1 0110 0 0111 0 1000 0 0010 1 0011 0 0000
20
Op Funct
MemtoReg MemWrite Branch ALUControl ExtOp ALUSrc1:0 RegDst RegWrite WE3 RD1 RD2 RegDst
4:0
ALUControl
Jump
CLK
Instr 10:6
CLK ALUSrc1:0 SrcA
PCPlus4
0 1 0 1
MemtoReg
PC
A RD Instruction Memory
Instr
25:21
A1
20:16
Zero
nPC
BTA JTA
00 SrcB 01 10
ALU
ALUResult
Result
20:16 15:11
0 1
WriteReg
4:0
+
15:0
Extend
ImmExt
<<2 PCPlus4
BTA
<<16
ExtOp
25:0
<<2
22. Instruksi ori Syntax : ori $t, $s, imm 0011 01ss ssst tttt iiii iiii iiii iiii $t = $s OR ZeroExt(imm)
Pada penambahan instruksi ini modifikasi adalah sebagai berikut: Control signal Main decoder:
ALU decoder:
21
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:
BranchTaken Branch Zero
4:0
Op Funct
MemtoReg MemWrite Branch ALUControl ExtOp ALUSrc1:0 RegDst RegWrite WE3 RD1 RD2 RegDst
4:0
ALUControl
Jump
CLK
Instr 10:6
CLK ALUSrc1:0 SrcA
PCPlus4
0 1 0 1
MemtoReg
PC
A RD Instruction Memory
Instr
25:21
A1
20:16
Zero
nPC
BTA JTA
00 SrcB 01 10
ALU
ALUResult
Result
20:16 15:11
0 1
WriteReg
4:0
+
15:0
Extend
ImmExt
<<2 PCPlus4
BTA
<<16
ExtOp
25:0
<<2
22
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. add sub and or addi lw sw beq j slt sll srl sra sllv srlv srav xor nor lui slti andi ori xori Funct[5:0] AluOp[2:0] 10 0000 010 10 0010 010 10 0100 010 10 0101 010 XX XXXX 000 XX XXXX 000 XX XXXX 000 XX XXXX 001 XX XXXX XXX 10 1010 010 00 0000 010 00 0010 010 00 0011 010 00 0100 010 00 0110 010 00 0111 010 10 0110 010 10 0111 010 XX XXXX 000 XX XXXX 011 XX XXXX 100 XX XXXX 101 XX XXXX 110 AluCtrl[4:0] 0 0010 1 0010 0 0000 0 0001 0 0010 0 0010 0 0010 1 0010 X XXXX 1 0011 0 0100 0 0101 0 0110 1 0100 1 0101 1 0110 0 0111 0 1000 0 0010 1 0011 0 0000 0 0001 0 0111
23
Op Funct
MemtoReg MemWrite Branch ALUControl ExtOp ALUSrc1:0 RegDst RegWrite WE3 RD1 RD2 RegDst
4:0
ALUControl
Jump
CLK
Instr 10:6
CLK ALUSrc1:0 SrcA
PCPlus4
0 1 0 1
MemtoReg
PC
A RD Instruction Memory
Instr
25:21
A1
20:16
Zero
nPC
BTA JTA
00 SrcB 01 10
ALU
ALUResult
Result
20:16 15:11
0 1
WriteReg
4:0
+
15:0
Extend
ImmExt
<<2 PCPlus4
BTA
<<16
ExtOp
25:0
<<2
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.
Control Unit Jump MemtoReg MemWrite Beq Bne
Funct5:0
24
Main decoder:
ALU decoder: Instr. add sub and or addi lw sw beq j slt sll srl sra sllv srlv srav xor nor lui slti andi ori xori bne Funct[5:0] AluOp[2:0] 10 0000 010 10 0010 010 10 0100 010 10 0101 010 XX XXXX 000 XX XXXX 000 XX XXXX 000 XX XXXX 001 XX XXXX XXX 10 1010 010 00 0000 010 00 0010 010 00 0011 010 00 0100 010 00 0110 010 00 0111 010 10 0110 010 10 0111 010 XX XXXX 000 XX XXXX 011 XX XXXX 100 XX XXXX 101 XX XXXX 110 XX XXXX 001 AluCtrl[4:0] 0 0010 1 0010 0 0000 0 0001 0 0010 0 0010 0 0010 1 0010 X XXXX 1 0011 0 0100 0 0101 0 0110 1 0100 1 0101 1 0110 0 0111 0 1000 0 0010 1 0011 0 0000 0 0001 0 0111 1 0010
Penambahan control signal tersebut juga akan memodifikasi datapath dan controller sebagai berikut
25
BranchTaken
Jump Bne
Control Unit
31:26 5:0
BranchTaken
Op Funct
MemtoReg MemWrite Beq ALUControl ExtOp ALUSrc1:0 RegDst RegWrite WE3 RD1 RD2 RegDst
Bne Zero
4:0
ALUControl
4:0
Beq Zero
Jump
CLK
Instr 10:6
CLK ALUSrc1:0 SrcA
PCPlus4
0 1 0 1
MemtoReg
PC
A RD Instruction Memory
Instr
25:21
A1
20:16
Zero
nPC
BTA JTA
00 SrcB 01 10
ALU
ALUResult
Result
20:16 15:11
0 1
WriteReg
4:0
+
15:0
Extend
ImmExt
<<2 PCPlus4
BTA
<<16
ExtOp
25:0
<<2
25. Instruksi bltz Syntax : Instruction Set : Operasi : (SignExt(Imm)<<2) bltz $s, $t, label 0000 01ss ssst tttt iiii iiii iiii iiii if ($s < $t) then (nPC = PC+4 +
Modifikasi yang dilakukan sebagai berikut: Control signal Untuk menangani instruksi bltz, diperlukan tambahan control signal yang membedakan dengan branch lain.
Control Unit Jump MemtoReg MemWrite Beq Bne Bltz ALUSrc1:0 RegDst1:0 RegWrite ExtOp ALUOp2:0 ALU Decoder ALUControl4:0
Funct5:0
26
Main decoder:
ALU decoder: Instr. add sub and or addi lw sw beq j slt sll srl sra sllv srlv srav xor nor lui slti andi ori xori bne bltz Funct[5:0] AluOp[2:0] 10 0000 010 10 0010 010 10 0100 010 10 0101 010 XX XXXX 000 XX XXXX 000 XX XXXX 000 XX XXXX 001 XX XXXX XXX 10 1010 010 00 0000 010 00 0010 010 00 0011 010 00 0100 010 00 0110 010 00 0111 010 10 0110 010 10 0111 010 XX XXXX 000 XX XXXX 011 XX XXXX 100 XX XXXX 101 XX XXXX 110 XX XXXX 001 XX XXXX 001 AluCtrl[4:0] 0 0010 1 0010 0 0000 0 0001 0 0010 0 0010 0 0010 1 0010 X XXXX 1 0011 0 0100 0 0101 0 0110 1 0100 1 0101 1 0110 0 0111 0 1000 0 0010 1 0011 0 0000 0 0001 0 0111 1 0010 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)
27
ALUCtrl[4:0] 0 0000 0 0001 0 0010 0 0011 0 0100 0 0101 0 0110 0 0111 0 1000 1 0000 1 0001 1 0010 1 0011 1 0100 1 0101 1 0110 1 0111 1 1000
Operasi A AND B A OR B A+B n/a B << shamt B >> shamt B >>> shamt A XOR B A NOR B A AND B' A OR B' A-B A<B B << A B >> A B >>> A A XOR B' A NOR B'
shamt4:0 A4:0
5 5
A
N
B
N
1
>>>
ALUCtrl4
N
ALUCtrl4
Cout
>> <<
Zero Extend
[N-1]
+ S
8
Control Unit Op Funct
== 0 Zero Y LTZ
MemtoReg MemWrite Beq ALUControl ExtOp ALUSrc1:0 RegDst RegWrite WE3 RD1 RD2 RegDst
5
N
ALUCtrl3:0
Y31
Bne Zero
4:0
ALUControl
4:0
Beq Zero
Jump
CLK
Instr 10:6
CLK ALUSrc1:0 SrcA
PCPlus4
0 1 0 1
MemtoReg
PC
A RD Instruction Memory
Instr
25:21
A1
20:16
nPC
BTA JTA
00 SrcB 01 10
ALU
Result
20:16 15:11
0 1
WriteReg
4:0
+
15:0
Extend
ImmExt
<<2 PCPlus4
BTA
<<16
ExtOp
25:0
<<2
28
26. Instruksi bgtz Syntax Instruction Set Operasi : : : bgtz $s, $t, label 0001 11ss ssst tttt iiii iiii iiii iiii 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
Control Unit Jump MemtoReg MemWrite Beq Bne Bltz Bgtz ALUSrc1:0 RegDst1:0 RegWrite ExtOp
Funct5:0
Main decoder:
29
ALU decoder: Instr. add sub and or addi lw sw beq j slt sll srl sra sllv srlv srav xor nor lui slti andi ori xori bne bltz bgtz Funct[5:0] AluOp[2:0] 10 0000 010 10 0010 010 10 0100 010 10 0101 010 XX XXXX 000 XX XXXX 000 XX XXXX 000 XX XXXX 001 XX XXXX XXX 10 1010 010 00 0000 010 00 0010 010 00 0011 010 00 0100 010 00 0110 010 00 0111 010 10 0110 010 10 0111 010 XX XXXX 000 XX XXXX 011 XX XXXX 100 XX XXXX 101 XX XXXX 110 XX XXXX 001 XX XXXX 001 XX XXXX 001 AluCtrl[4:0] 0 0010 1 0010 0 0000 0 0001 0 0010 0 0010 0 0010 1 0010 X XXXX 1 0011 0 0100 0 0101 0 0110 1 0100 1 0101 1 0110 0 0111 0 1000 0 0010 1 0011 0 0000 0 0001 0 0111 1 0010 1 0010 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).
30
BranchTaken Bgtz LTZ Zero Bltz LTZ Jump Bne Bltz Bgtz BranchTaken
31:26 5:0
MemtoReg MemWrite Beq ALUControl ExtOp ALUSrc1:0 RegDst RegWrite WE3 RD1 RD2 RegDst
Bne Zero
4:0
Bne
4:0
ALUControl
Beq Zero
Jump
CLK
Instr 10:6
CLK ALUSrc1:0 SrcA
PCPlus4
0 1 0 1
MemtoReg
PC
A RD Instruction Memory
Instr
25:21
A1
20:16
LTZ Zero
nPC
BTA JTA
00 SrcB 01 10
ALU
ALUResult
Result
20:16 15:11
0 1
WriteReg
4:0
+
15:0
Extend
ImmExt
<<2 PCPlus4
BTA
<<16
ExtOp
25:0
<<2
27. Instruksi blez Syntax Instruction Set Operasi : : : blez $s, $t, label 0001 10ss ssst tttt iiii iiii iiii iiii 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:
31
ALU decoder: Instr. add sub and or addi lw sw beq j slt sll srl sra sllv srlv srav xor nor lui slti andi ori xori bne bltz bgtz blez Funct[5:0] AluOp[2:0] 10 0000 010 10 0010 010 10 0100 010 10 0101 010 XX XXXX 000 XX XXXX 000 XX XXXX 000 XX XXXX 001 XX XXXX XXX 10 1010 010 00 0000 010 00 0010 010 00 0011 010 00 0100 010 00 0110 010 00 0111 010 10 0110 010 10 0111 010 XX XXXX 000 XX XXXX 011 XX XXXX 100 XX XXXX 101 XX XXXX 110 XX XXXX 001 XX XXXX 001 XX XXXX 001 XX XXXX 001 AluCtrl[4:0] 0 0010 1 0010 0 0000 0 0001 0 0010 0 0010 0 0010 1 0010 X XXXX 1 0011 0 0100 0 0101 0 0110 1 0100 1 0101 1 0110 0 0111 0 1000 0 0010 1 0011 0 0000 0 0001 0 0111 1 0010 1 0010 1 0010 1 0010
32
BranchTaken Bgtz LTZ Zero Bltz LTZ Jump Bne Bltz Bgtz BranchTaken
31:26 5:0
MemtoReg MemWrite Beq ALUControl ExtOp ALUSrc1:0 RegDst RegWrite WE3 RD1 RD2 RegDst
Bne Zero
4:0
Bne
4:0
ALUControl
Beq Zero
Jump
CLK
Instr 10:6
CLK ALUSrc1:0 SrcA
PCPlus4
0 1 0 1
MemtoReg
PC
A RD Instruction Memory
Instr
25:21
A1
20:16
LTZ Zero
nPC
BTA JTA
00 SrcB 01 10
ALU
ALUResult
Result
20:16 15:11
0 1
WriteReg
4:0
+
15:0
Extend
ImmExt
<<2 PCPlus4
BTA
<<16
ExtOp
25:0
<<2
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 Instruction Set Operasi : : : jal label 0000 11ii iiii iiii iiii iiii iiii iiii nPC = PC+4[31.28] & imm & 00; $31 = PC+4
Modifikasi yang dilakukan adalah sebagai berikut: Diberikan penambahan pada control signal yaitu jal
Control Unit Jump Jal MemtoReg MemWrite Beq Bne Bltz Bgtz ALUSrc1:0 RegDst1:0 RegWrite ExtOp
Funct5:0
33
ALU decoder: Instr. add sub and or addi lw sw beq j slt sll srl sra sllv srlv srav xor nor lui slti andi ori xori bne bltz bgtz blez jal Funct[5:0] AluOp[2:0] 10 0000 010 10 0010 010 10 0100 010 10 0101 010 XX XXXX 000 XX XXXX 000 XX XXXX 000 XX XXXX 001 XX XXXX XXX 10 1010 010 00 0000 010 00 0010 010 00 0011 010 00 0100 010 00 0110 010 00 0111 010 10 0110 010 10 0111 010 XX XXXX 000 XX XXXX 011 XX XXXX 100 XX XXXX 101 XX XXXX 110 XX XXXX 001 XX XXXX 001 XX XXXX 001 XX XXXX 001 XX XXXX XXX AluCtrl[4:0] 0 0010 1 0010 0 0000 0 0001 0 0010 0 0010 0 0010 1 0010 X XXXX 1 0011 0 0100 0 0101 0 0110 1 0100 1 0101 1 0110 0 0111 0 1000 0 0010 1 0011 0 0000 0 0001 0 0111 1 0010 1 0010 1 0010 1 0010 X XXXX
34
Bne
Jump Jal Control Unit BranchTaken
31:26 5:0
Op Funct
ALUControl
4:0
Beq Zero
Jal
Jump
CLK
Instr 10:6
CLK ALUSrc1:0 SrcA CLK
PCPlus4
MemWrite WE A RD
0 1
MemtoReg
PCPlus4
0 1 0 1
PC
A RD Instruction Memory
Instr
25:21
A1
20:16
nPC
BTA JTA
00 SrcB 01 10
ALU
0 1 ReadData Result
20:16 15:11
$ra = 1 1111
00 01 10
WriteReg
4:0
15:0
Extend
ImmExt
<<2 PCPlus4
BTA
<<16
ExtOp
25:0
<<2
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 Instruction Set Operasi : : : jr $s 0000 00ss sss0 0000 0000 0000 0000 1000 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
35
Control Unit Jump Jal MemtoReg MemWrite Beq Bne Bltz Bgtz ALUSrc1:0 RegDst1:0 RegWrite ExtOp
Funct5:0
Instr. add sub and or addi lw sw beq j slt sll srl sra sllv srlv srav xor nor lui slti andi ori xori bne bltz bgtz blez jal jr
Funct[5:0] AluOp[2:0] 10 0000 010 10 0010 010 10 0100 010 10 0101 010 XX XXXX 000 XX XXXX 000 XX XXXX 000 XX XXXX 001 XX XXXX XXX 10 1010 010 00 0000 010 00 0010 010 00 0011 010 00 0100 010 00 0110 010 00 0111 010 10 0110 010 10 0111 010 XX XXXX 000 XX XXXX 011 XX XXXX 100 XX XXXX 101 XX XXXX 110 XX XXXX 001 XX XXXX 001 XX XXXX 001 XX XXXX 001 XX XXXX XXX 00 1000 010
AluCtrl[4:0] 0 0010 1 0010 0 0000 0 0001 0 0010 0 0010 0 0010 1 0010 X XXXX 1 0011 0 0100 0 0101 0 0110 1 0100 1 0101 1 0110 0 0111 0 1000 0 0010 1 0011 0 0000 0 0001 0 0111 1 0010 1 0010 1 0010 1 0010 X XXXX X XXXX
Jr 0 0 0 0 0 0 0 0 X 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 X 1
36
Bne
Jump Jal Jr
31:26 5:0
Control Unit
BranchTaken
Op Funct
ALUControl
4:0
Beq Zero
Jal
Jr
0 1
Jump 0 1
CLK
Instr 10:6
CLK ALUSrc1:0 SrcA SrcA CLK
PCPlus4
MemWrite WE A RD
0 1
MemtoReg
0 1
PC
A RD Instruction Memory
Instr
25:21
A1
20:16
SrcA
nPC
BTA JTA
PCPlus4
RegDst1:0
00 SrcB 01 10
ALU
0 1 ReadData Result
20:16 15:11
$ra = 1 1111
00 01 10
WriteReg
4:0
15:0
Extend
ImmExt
<<2 PCPlus4
BTA
<<16
ExtOp
25:0
<<2
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 Instruction Set Operasi : : : jalr $d, $s 0000 00ss sss0 0000 1111 1000 0000 1001 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
37
Control Unit Jump Jal MemtoReg MemWrite Beq Bne Bltz Bgtz ALUSrc1:0 RegDst1:0 RegWrite ExtOp
Funct5:0
ALU decoder: Instr. add sub and or addi lw sw beq j slt sll srl sra sllv srlv srav xor nor lui slti andi ori xori bne bltz bgtz blez jal jr jalr Funct[5:0] AluOp[2:0] 10 0000 010 10 0010 010 10 0100 010 10 0101 010 XX XXXX 000 XX XXXX 000 XX XXXX 000 XX XXXX 001 XX XXXX XXX 10 1010 010 00 0000 010 00 0010 010 00 0011 010 00 0100 010 00 0110 010 00 0111 010 10 0110 010 10 0111 010 XX XXXX 000 XX XXXX 011 XX XXXX 100 XX XXXX 101 XX XXXX 110 XX XXXX 001 XX XXXX 001 XX XXXX 001 XX XXXX 001 XX XXXX XXX 00 1000 010 00 1001 010 AluCtrl[4:0] 0 0010 1 0010 0 0000 0 0001 0 0010 0 0010 0 0010 1 0010 X XXXX 1 0011 0 0100 0 0101 0 0110 1 0100 1 0101 1 0110 0 0111 0 1000 0 0010 1 0011 0 0000 0 0001 0 0111 1 0010 1 0010 1 0010 1 0010 X XXXX X XXXX X XXXX Jr 0 0 0 0 0 0 0 0 X 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 X 1 1 Jalr 0 0 0 0 0 X X X X 0 0 0 0 0 0 0 0 0 0 0 0 0 0 X X X X X 0 1
38
Bne
Jump Jal Jr Jalr BranchTaken
31:26 5:0
ALUControl
4:0
Beq Zero
Jal Jalr
Jr
0 1
Jump 0 1
CLK
Instr 10:6
CLK ALUSrc1:0 SrcA SrcA CLK
PCPlus4
MemWrite WE A RD
0 1
MemtoReg
0 1
PC
A RD Instruction Memory
Instr
25:21
A1
20:16
SrcA
nPC
BTA JTA
PCPlus4
RegDst1:0
00 SrcB 01 10
ALU
0 1 ReadData Result
20:16 15:11
$ra = 1 1111
00 01 10
WriteReg
4:0
15:0
Extend
ImmExt
<<2 PCPlus4
BTA
<<16
ExtOp
25:0
<<2
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
Control Unit
Jump Jal MemtoReg MemWrite Beq Bne Bltz Bgtz ALUSrc1:0 RegDst1:0 RegWrite ExtOp
Funct5:0
39
ALU decoder table: Instr. add sub and or addi lw sw beq j slt sll srl sra sllv srlv srav xor nor lui slti andi ori xori bne bltz bgtz blez jal jr jalr Funct[5:0] AluOp[2:0] 10 0000 010 10 0010 010 10 0100 010 10 0101 010 XX XXXX 000 XX XXXX 000 XX XXXX 000 XX XXXX 001 XX XXXX XXX 10 1010 010 00 0000 010 00 0010 010 00 0011 010 00 0100 010 00 0110 010 00 0111 010 10 0110 010 10 0111 010 XX XXXX 000 XX XXXX 011 XX XXXX 100 XX XXXX 101 XX XXXX 110 XX XXXX 001 XX XXXX 001 XX XXXX 001 XX XXXX 001 XX XXXX XXX 00 1000 010 00 1001 010 AluCtrl[4:0] 0 0010 1 0010 0 0000 0 0001 0 0010 0 0010 0 0010 1 0010 X XXXX 1 0011 0 0100 0 0101 0 0110 1 0100 1 0101 1 0110 0 0111 0 1000 0 0010 1 0011 0 0000 0 0001 0 0111 1 0010 1 0010 1 0010 1 0010 X XXXX X XXXX X XXXX Jr 0 0 0 0 0 0 0 0 X 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 X 1 1 Jalr 0 0 0 0 0 X X X X 0 0 0 0 0 0 0 0 0 0 0 0 0 0 X X X X X 0 1
40
ALU
ALUCtrl[4:0] 0 0000 0 0001 0 0010 0 0011 0 0100 0 0101 0 0110 0 0111 0 1000 1 0000 1 0001 1 0010 1 0011 1 0100 1 0101 1 0110 1 0111 1 1000
Operasi A AND B A OR B A+B n/a B << shamt B >> shamt B >>> shamt A XOR B A NOR B A AND B' A OR B' A-B A<B B << A B >> A B >>> A A XOR B' A NOR B'
41
Datapath dan Controller Berikut ini adalah gambar rangkaian datapath Single-Cycle MIPS Processor yang telah dilengkapi nama-nama pada tiap sinyal yang ada:
Bgtz_sig
Bne
Jump Jal Jr Jalr
31:26 5:0
4:0
ALUControl
4:0
Beq Zero
Beq_sig 0 1
Jal_sel
BranchTaken
Jr_sig
Jr
0 1
Branch_sig
Bltz_sig
Bne_sig
Jal Jalr
Jump
CLK
Instr 10:6
CLK ALUSrc1:0
PCPlus4
CLK MemWrite WE A RD
Jal_sig
MemtoReg 0 1
0 1
0 1
PC
A RD Instruction Memory
Instr
25:21
A1
20:16
SrcA
nPC
BTA JTA
RegReadData2
RegDst1:0
PCPlus4
00 SrcB 01 10
ALU
ReadData Result
20:16 15:11
$ra = 1 1111
00 01 10
WriteReg
4:0
Branch_label
15:0
Extend
ImmExt
<<2 PCPlus4
BTA
15:0
<<16
ImmUpper
ExtOp
25:0
<<2
Jump_label
42
ReadData1_out : ReadData2_out : WriteReg_out : ALUResult_out : Result_out Beq_out Bne_out Bltz_out Blez_out Bgtz_out Zero_out LTZ_out J_out Jal_out Jr_out Jalr_out : : : : : : : : : : : :
ARCHITECTURE structural OF SIngleCycleMIPS IS COMPONENT mux2_32bit PORT( sel x y z : : : : IN STD_LOGIC; IN STD_LOGIC_VECTOR(31 DOWNTO 0); IN STD_LOGIC_VECTOR(31 DOWNTO 0); OUT STD_LOGIC_VECTOR(31 DOWNTO 0));
END COMPONENT;
43
COMPONENT mux4_5bit PORT( sel a b c d : : : : : IN STD_LOGIC_VECTOR(1 DOWNTO 0); IN STD_LOGIC_VECTOR(4 DOWNTO 0); IN STD_LOGIC_VECTOR(4 DOWNTO 0); IN STD_LOGIC_VECTOR(4 DOWNTO 0); OUT STD_LOGIC_VECTOR(4 DOWNTO 0));
END COMPONENT; COMPONENT mux4_32bit PORT( sel a b c d : : : : : IN STD_LOGIC_VECTOR(1 DOWNTO 0); IN STD_LOGIC_VECTOR(31 DOWNTO 0); IN STD_LOGIC_VECTOR(31 DOWNTO 0); IN STD_LOGIC_VECTOR(31 DOWNTO 0); OUT STD_LOGIC_VECTOR(31 DOWNTO 0));
END COMPONENT; COMPONENT PCReg PORT( CLK RST PCin PCout : : : : IN STD_LOGIC; IN STD_LOGIC; IN STD_LOGIC_VECTOR(31 DOWNTO 0); OUT STD_LOGIC_VECTOR(31 DOWNTO 0));
END COMPONENT; COMPONENT adder_32bit PORT( x y z : : : IN STD_LOGIC_VECTOR(31 DOWNTO 0); IN STD_LOGIC_VECTOR(31 DOWNTO 0); OUT STD_LOGIC_VECTOR(31 DOWNTO 0));
END COMPONENT; COMPONENT BusMerging PORT( x y z : : : IN STD_LOGIC_VECTOR(3 DOWNTO 0); IN STD_LOGIC_VECTOR(27 DOWNTO 0); OUT STD_LOGIC_VECTOR(31 DOWNTO 0));
END COMPONENT; COMPONENT concat16 PORT( p q : : IN STD_LOGIC_VECTOR(15 DOWNTO 0); OUT STD_LOGIC_VECTOR(31 DOWNTO 0));
END COMPONENT; COMPONENT concat2 PORT( p q : : IN STD_LOGIC_VECTOR(25 DOWNTO 0); OUT STD_LOGIC_VECTOR(27 DOWNTO 0));
END COMPONENT;
44
COMPONENT shiftby2 PORT( p q : : IN STD_LOGIC_VECTOR(15 DOWNTO 0); OUT STD_LOGIC_VECTOR(31 DOWNTO 0));
END COMPONENT; COMPONENT Extend PORT( a b c : : : IN STD_LOGIC; IN STD_LOGIC_VECTOR(15 DOWNTO 0); OUT STD_LOGIC_VECTOR(31 DOWNTO 0));
END COMPONENT; COMPONENT ALU PORT( x y shift z Zero MSB : : : : : : IN STD_LOGIC_VECTOR(31 DOWNTO 0); IN STD_LOGIC_VECTOR(31 DOWNTO 0); IN STD_LOGIC_VECTOR(4 DOWNTO 0); IN STD_LOGIC_VECTOR(4 DOWNTO 0); OUT STD_LOGIC_VECTOR(31 DOWNTO 0); OUT STD_LOGIC; OUT STD_LOGIC);
Control:
END COMPONENT; COMPONENT and3 PORT( a b c d : : : : IN STD_LOGIC; IN STD_LOGIC; IN STD_LOGIC; OUT STD_LOGIC));
45
OUT STD_LOGIC));
END COMPONENT; COMPONENT InstrMemory PORT( A RD : : IN STD_LOGIC_VECTOR(31 DOWNTO 0); OUT STD_LOGIC_VECTOR(31 DOWNTO 0));
END COMPONENT; COMPONENT RegisterFile PORT( CLK RST WE3 A1 A2 A3 WD3 RD1 RD2 : : : : : : : : : IN STD_LOGIC; IN STD_LOGIC; IN STD_LOGIC; IN STD_LOGIC_VECTOR(4 DOWNTO 0); IN STD_LOGIC_VECTOR(4 DOWNTO 0); IN STD_LOGIC_VECTOR(4 DOWNTO 0); IN STD_LOGIC_VECTOR(31 DOWNTO 0); OUT STD_LOGIC_VECTOR(31 DOWNTO 0); OUT STD_LOGIC_VECTOR(31 DOWNTO 0));
END COMPONENT; COMPONENT DataMemory PORT( CLK RST WE A WD RD : : : : : : IN STD_LOGIC; IN STD_LOGIC; IN STD_LOGIC; IN STD_LOGIC_VECTOR(31 DOWNTO 0); IN STD_LOGIC_VECTOR(31 DOWNTO 0); OUT STD_LOGIC_VECTOR(31 DOWNTO 0));
END COMPONENT; COMPONENT ControlUnit IS PORT( Opcode Funct RegDst RegWrite Beq Bne Bltz Bgtz MemtoReg MemWrite ALUCtrl ALUSrc J Jal : : : : : : : : : : : : : : IN STD_LOGIC_VECTOR(5 DOWNTO 0); IN STD_LOGIC_VECTOR(5 DOWNTO 0); OUT STD_LOGIC_VECTOR(1 DOWNTO 0); OUT STD_LOGIC; OUT STD_LOGIC; OUT STD_LOGIC; OUT STD_LOGIC; OUT STD_LOGIC; OUT STD_LOGIC; OUT STD_LOGIC; OUT STD_LOGIC_VECTOR (4 DOWNTO 0); OUT STD_LOGIC(1 DOWNTO 0); OUT STD_LOGIC; OUT STD_LOGIC;
46
Jr Jalr END COMPONENT; SIGNAL PCPlus4 SIGNAL BTA SIGNAL JTA SIGNAL BranchTaken SIGNAL Jr_sig SIGNAL Branch_sig SIGNAL Jr_sig SIGNAL nPC SIGNAL PC SIGNAL Instr
: :
: : : : : : : : : :
STD_LOGIC_VECTOR(31 DOWNTO 0); STD_LOGIC_VECTOR(31 DOWNTO 0); STD_LOGIC_VECTOR(31 DOWNTO 0); STD_LOGIC_VECTOR(31 DOWNTO 0); STD_LOGIC_VECTOR(31 DOWNTO 0); STD_LOGIC_VECTOR(31 DOWNTO 0); STD_LOGIC_VECTOR(31 DOWNTO 0); STD_LOGIC_VECTOR(31 DOWNTO 0); STD_LOGIC_VECTOR(31 DOWNTO 0); STD_LOGIC_VECTOR(31 DOWNTO 0); STD_LOGIC_VECTOR(31 DOWNTO 0); STD_LOGIC_VECTOR(31 DOWNTO 0); STD_LOGIC_VECTOR(31 DOWNTO 0); STD_LOGIC_VECTOR(31 DOWNTO 0); STD_LOGIC_VECTOR(4 DOWNTO 0); STD_LOGIC_VECTOR(31 DOWNTO 0); STD_LOGIC_VECTOR(27 DOWNTO 0); STD_LOGIC_VECTOR(31 DOWNTO 0); STD_LOGIC_VECTOR(31 DOWNTO 0); STD_LOGIC_VECTOR(31 DOWNTO 0); STD_LOGIC; STD_LOGIC; STD_LOGIC; STD_LOGIC_VECTOR(31 DOWNTO 0); STD_LOGIC_VECTOR(31 DOWNTO 0); STD_LOGIC_VECTOR(31 DOWNTO 0); STD_LOGIC; STD_LOGIC; STD_LOGIC; STD_LOGIC; STD_LOGIC; STD_LOGIC_VECTOR(1 DOWNTO 0); STD_LOGIC_VECTOR(1 DOWNTO 0); STD_LOGIC_VECTOR(4 DOWNTO 0); STD_LOGIC; STD_LOGIC; STD_LOGIC; STD_LOGIC; STD_LOGIC; STD_LOGIC; STD_LOGIC;
SIGNAL RegReadData1 : SIGNAL RegReadData2 : SIGNAL ImmExt SIGNAL ImmUpper SIGNAL WriteReg SIGNAL Jump_label SIGNAL SrcA SIGNAL SrcB SIGNAL ALUResult SIGNAL Zero SIGNAL LTZ SIGNAL Jal_sel SIGNAL ReadData SIGNAL WriteData SIGNAL Result SIGNAL Beq_sig SIGNAL Bne_sig SIGNAL Bltz_sig SIGNAL Bgtz_sig SIGNAL RegWrite SIGNAL RegDst SIGNAL ALUSrc SIGNAL ALUCtrl SIGNAL MemWrite SIGNAL MemtoReg SIGNAL ExtOp SIGNAL Beq SIGNAL Bne SIGNAL Bltz SIGNAL Bgtz : : : : : : : : : : : : : : : : : : : : : : : : : : : :
SIGNAL Branch_label :
47
: : : :
--Output signal used for simulation if necessary PC_out Instr_out ALUCtrl_out ReadData1_out ReadData2_out WriteReg_out ALUResult_out Result_out Beq_out Bne_out Bltz_out Blez_out Bgtz_out Zero_out LTZ_out J_out Jal_out Jr_out Jalr_out MemWrite_out RegWrite_out <= PC; <= Instr; <= ALUCtrl; <= SrcA; <= RegReadData2; <= WriteReg; <= ALUResult; <= Result; <= Beq; <= Bne; <= Bltz; <= Blez; <= Bgtz; <= Zero; <= Zero; <= Jump; <= Jal; <= Jr; <= Jalr; <= MemWrite; <= '0' WHEN WriteReg = "00000" ELSE RegWrite;
--Structural description GetJr_sig: mux2_32bit PORT MAP( sel x y z GetBranch_sig: mux2_32bit PORT MAP( sel x y z => BranchTaken, => Jr_sig, => BTA, => Branch_sig); => Jr, => PCPlus4, => SrcA, => Jr_sig);
48
GetJump_sig: mux2_32bit PORT MAP( sel x y z GetPC: PCReg PORT MAP( CLK RST PCin => Clock, => Reset, => nPC, => Jump, => Branch_sig, => JTA, => nPC);
PCout => PC); InstrMem: InstrMemory PORT MAP( A RD GetPCPlus4: adder_32bit PORT MAP( x y z GetJTA: BusMerging PORT MAP( x => PCPlus4(31 DOWNTO 28), y => Jump_label, z => JTA); GetControlSignal: ControlUnit PORT MAP( Opcode Funct RegDst RegWrite Beq Bne Bltz MemtoReg MemWrite ALUCtrl ALUSrc J Jal Jr Jalr => Instr(31 DOWNTO 26), => Instr(5 DOWNTO 0), => RegDst, => RegWrite, => Beq, => Bne, => Bltz, => MemtoReg, => MemWrite, => ALUCtrl, => ALUSrc, => Jump, => Jal, => Jr, => Jalr); => PC, => X"0004", => PCPlus4); => PC, => Instr);
49
RegFile: RegisterFile PORT MAP( CLK RST WE3 A1 A2 A3 WD3 RD1 RD2 GetJumpLabel: concat2 PORT MAP( p q GetImmUpper: concat16 PORT MAP( p q GetImmExt: Extend PORT MAP( a b c GetBranchLabel: shiftby2 PORT MAP( p q GetBTA: adder_32bit PORT MAP( x y z GetWriteReg: mux4_5bit PORT MAP( sel a b c d GetSrcB: mux4_32bit PORT MAP( sel a b c => => => => ALUSrc, RegReadData2, ImmExt, ImmUpper, => => => => => RegDst, Instr(20 DOWNTO 16), Instr(15 DOWNTO 11), "11111", WriteReg); => => => Branch_label, PCPlus4, BTA); => => ImmExt, Branch_label); => => => ExtOp, Instr(15 DOWNTO 0), ImmExt); => => Instr(15 DOWNTO 0), ImmUpper); => => Instr(25 DOWNTO 0), Jump_label); => Clock, => Reset, => RegWrite, => Instr(25 DOWNTO 21), => Instr(20 DOWNTO 16), => WriteReg, => Result, => SrcA, => RegReadData2);
50
=>
SrcB);
=> =>
shift => Control=> z Zero MSB GetBeq_sig: and2 PORT MAP( x y z GetBne_sig: and2 PORT MAP( x y z GetBltz_sig: and2 PORT MAP( x y z GetBgtz_sig: and3 PORT MAP( a b c d GetBranchTaken: or4 PORT MAP( g h i j k DataMem: DataMemory PORT MAP( CLK RST WE A WD => => => => => => => => => => => => => => => => => => => => => => => => => =>
51
RD GetJal_sel: or2 x y Z GetJal_sig: mux2_32bit PORT MAP( sel x y z GetResult: mux2_32bit PORT MAP( sel x y z END structural;
=>
ReadData);
PORT MAP(
52
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 : Instruction Set: Operasi : beq $s, $t, label 0001 00ss ssst tttt iiii iiii iiii iiii 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. beq
AluCtrl[4:0] 1 0010
Jr 0
Jalr X
Dari control signal diatas, maka aliran data pada datapath dan ALU adalah sebagai berikut
BranchTaken Bgtz LTZ Zero
Bgtz_sig
Bne
Jump Jal Jr Jalr
31:26 5:0
BranchTaken (0 or 1??)
Jr_sig
Jr
0 1
Branch_sig
Bltz_sig
Bne_sig
ALUControl
4:0
Beq Zero
Beq_sig 0 1
Jal Jalr
Jump
CLK
Instr 10:6
CLK ALUSrc1:0 SrcA SrcA CLK
PCPlus4
MemWrite
Jal_sig
MemtoReg
0 1
0 1
PC
A RD Instruction Memory
Instr
ReadReg1 ReadReg2
RegDst1:0
25:21
A1
20:16
SrcA
nPC
BTA JTA
PCPlus4
00 SrcB 01 10
ALU
WE A RD ReadData
0 1
Result
20:16 15:11
$ra = 1 1111
00 01 10
WriteReg
4:0
Branch_label
15:0
Extend
ImmExt
<<2 PCPlus4
BTA
15:0
<<16
ImmUpper
ExtOp
25:0
<<2
Jump_label
53
2. Instruksi bne Syntax : Instruction Set: Operasi : bne $s, $t, label 0001 01ss ssst tttt iiii iiii iiii iiii 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. bne
AluCtrl[4:0] 1 0010
Jr 0
Jalr X
Dari control signal diatas, maka aliran data pada datapath dan ALU adalah sebagai berikut
54
Bgtz_sig
Bne
Jump Jal Jr Jalr
31:26 5:0
BranchTaken (0 or 1??)
Jr_sig
Jr
0 1
Branch_sig
Bltz_sig
Bne_sig
ALUControl
4:0
Beq Zero
Beq_sig 0 1
Jal Jalr
Jump
CLK
Instr 10:6
CLK ALUSrc1:0 SrcA SrcA CLK
PCPlus4
MemWrite
Jal_sig
MemtoReg
0 1
0 1
PC
A RD Instruction Memory
Instr
ReadReg1
25:21
SrcA
nPC
BTA JTA
20:16
PCPlus4
00 SrcB 01 10
ALU
WE A RD ReadData
0 1
Result
20:16 15:11
$ra = 1 1111
00 01 10
WriteReg
4:0
Branch_label
15:0
Extend
ImmExt
<<2 PCPlus4
BTA
15:0
<<16
ImmUpper
ExtOp
25:0
<<2
Jump_label
55
3. Instruksi bltz Syntax : Instruction Set: Operasi : bltz $s, $t, label 0000 01ss ssst tttt iiii iiii iiii iiii 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. bltz
AluCtrl[4:0] 1 0010
Jr 0
Jalr X
Dari control signal diatas, maka aliran data pada datapath dan ALU adalah sebagai berikut
BranchTaken Bgtz LTZ Zero
Bgtz_sig
Bne
Jump Jal Jr Jalr
31:26 5:0
BranchTaken (0 or 1??)
Jr_sig
Jr
0 1
Branch_sig
Bltz_sig
Bne_sig
ALUControl
4:0
Beq Zero
Beq_sig 0 1
Jal Jalr
Jump
CLK
Instr 10:6
CLK ALUSrc1:0
PCPlus4
CLK MemWrite
Jal_sig
MemtoReg
0 1
0 1
PC
A RD Instruction Memory
Instr
ReadReg1
SrcA
25:21
WE A RD ReadData
A1
20:16
SrcA
nPC
BTA JTA
ReadReg2
RegDst1:0
PCPlus4
00 SrcB 01 10
0 1
ALU
Result
20:16 15:11
$ra = 1 1111
00 01 10
WriteReg
4:0
Branch_label
15:0
Extend
ImmExt
<<2 PCPlus4
BTA
15:0
<<16
ImmUpper
ExtOp
25:0
<<2
Jump_label
56
4. Instruksi blez Syntax : Instruction Set: Operasi : blez $s, $t, label 0001 10ss ssst tttt iiii iiii iiii iiii 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. blez
AluCtrl[4:0] 1 0010
Jr 0
Jalr X
Dari control signal diatas, maka aliran data pada datapath dan ALU adalah sebagai berikut
57
Bgtz_sig
Bne
Jump Jal Jr Jalr
31:26 5:0
BranchTaken (0 or 1??)
Jr_sig
Jr
0 1
Branch_sig
Bltz_sig
Bne_sig
ALUControl
4:0
Beq Zero
Beq_sig 0 1
Jal Jalr
Jump
CLK
Instr 10:6
CLK ALUSrc1:0 SrcA SrcA CLK
PCPlus4
MemWrite
Jal_sig
MemtoReg
0 1
0 1
PC
A RD Instruction Memory
Instr
ReadReg1
25:21
SrcA
nPC
BTA JTA
20:16
PCPlus4
00 SrcB 01 10
ALU
WE A RD ReadData
0 1
Result
20:16 15:11
$ra = 1 1111
00 01 10
WriteReg
4:0
Branch_label
15:0
Extend
ImmExt
<<2 PCPlus4
BTA
15:0
<<16
ImmUpper
ExtOp
25:0
<<2
Jump_label
58
5. Instruksi bgtz Syntax : Instruction Set: Operasi : bgtz $s, $t, label 0001 11ss ssst tttt iiii iiii iiii iiii 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. bgtz
AluCtrl[4:0] 1 0010
Jr 0
Jalr X
Dari control signal diatas, maka aliran data pada datapath dan ALU adalah sebagai berikut
Bgtz_sig
Bne
Jump Jal Jr Jalr
31:26 5:0
BranchTaken (0 or 1??)
Jr_sig
Jr
0 1
Branch_sig
Bltz_sig
Bne_sig
ALUControl
4:0
Beq Zero
Beq_sig 0 1
Jal Jalr
Jump
CLK
Instr 10:6
CLK ALUSrc1:0 SrcA SrcA CLK
PCPlus4
MemWrite
Jal_sig
MemtoReg
0 1
0 1
PC
A RD Instruction Memory
Instr
ReadReg1 ReadReg2
RegDst1:0
25:21
A1
20:16
SrcA
nPC
BTA JTA
PCPlus4
00 SrcB 01 10
ALU
WE A RD ReadData
0 1
Result
20:16 15:11
$ra = 1 1111
00 01 10
WriteReg
4:0
Branch_label
15:0
Extend
ImmExt
<<2 PCPlus4
BTA
15:0
<<16
ImmUpper
ExtOp
25:0
<<2
Jump_label
59
6. Instruksi j Syntax : j label 0000 10ii iiii iiii iiii iiii iiii iiii nPC = PC+4[31:28] & imm & 00
Untuk menangani instruksi ini, control signal yang dikeluarkan adalah sebagai berikut
Instr. j
AluCtrl[4:0] X XXXX
Jr X
Jalr X
Dari control signal diatas, maka aliran data pada datapath adalah sebagai berikut
60
Bgtz_sig
Bne
Jump Jal Jr Jalr
31:26 5:0
BranchTaken
Jr_sig
Jr
0 1
Branch_sig
Bltz_sig
Bne_sig
ALUControl
4:0
Beq Zero
Beq_sig 0 1
Jal Jalr
Jump
CLK
Instr 10:6
CLK ALUSrc1:0
PCPlus4
CLK MemWrite
Jal_sig
MemtoReg
0 1
0 1
PC
A RD Instruction Memory
Instr
ReadReg1
SrcA
25:21
WE A RD ReadData
A1
20:16
SrcA
nPC
BTA JTA
ReadReg2
RegDst1:0
PCPlus4
00 SrcB 01 10
ALU
ALUResult
0 1
Result
20:16 15:11
$ra = 1 1111
00 01 10
WriteReg
4:0
Branch_label
15:0
Extend
ImmExt
<<2 PCPlus4
BTA
15:0
<<16
ImmUpper
ExtOp
25:0
<<2
Jump_label
Sedangkan, pada ALU tidak ada data yang diolah. 7. Instruksi jal Syntax Instruction Set Operasi : : : jal label 0000 11ii iiii iiii iiii iiii iiii iiii nPC = PC+4[31.28] & imm & 00; $31 = PC+4
Untuk menangani instruksi ini, control signal yang dikeluarkan adalah sebagai berikut
Instr. jal
AluCtrl[4:0] X XXXX
Jr X
Jalr X
Dari control signal diatas, maka aliran data pada datapath adalah sebagai berikut
61
Bgtz_sig
Bne
Jump Jal Jr Jalr
31:26 5:0
BranchTaken
Jr_sig
Jr
0 1
Branch_sig
Bltz_sig
Bne_sig
ALUControl
4:0
Beq Zero
Beq_sig 0 1
Jal=1 Jalr
Jump
CLK
Instr 10:6
CLK ALUSrc1:0 SrcA SrcA CLK
PCPlus4
MemWrite
Jal_sig
MemtoReg
0 1
0 1
PC
A RD Instruction Memory
Instr
ReadReg1
25:21
SrcA
nPC
BTA JTA
20:16
PCPlus4
00 SrcB 01 10
ALU
WE A RD ReadData
0 1
Result
20:16 15:11
$ra = 1 1111
00 01 10
WriteReg
4:0
Branch_label
15:0
Extend
ImmExt
<<2 PCPlus4
BTA
15:0
<<16
ImmUpper
ExtOp
25:0
<<2
Jump_label
8. Instruksi jr Syntax Instruction Set Operasi : : : jr $s 0000 00ss sss0 0000 0000 0000 0000 1000 nPC = $s
Untuk menangani instruksi ini, control signal yang dikeluarkan adalah sebagai berikut
Instr. jr
AluCtrl[4:0] X XXXX
Jr 1
Jalr 0
Dari control signal diatas, maka aliran data pada datapath adalah sebagai berikut
62
Bgtz_sig
Bne
Jump Jal Jr Jalr
31:26 5:0
BranchTaken
Jr_sig
Jr
0 1
Branch_sig
Bltz_sig
Bne_sig
ALUControl
4:0
Beq Zero
Beq_sig 0 1
Jal Jalr
Jump
CLK
Instr 10:6
CLK ALUSrc1:0
PCPlus4
CLK MemWrite
Jal_sig
MemtoReg
0 1
0 1
PC
A RD Instruction Memory
Instr
ReadReg1
SrcA
25:21
WE A RD ReadData
A1
20:16
SrcA
nPC
BTA JTA
ReadReg2
RegDst1:0
PCPlus4
00 SrcB 01 10
ALU
ALUResult
0 1
Result
20:16 15:11
$ra = 1 1111
00 01 10
WriteReg
4:0
Branch_label
15:0
Extend
ImmExt
<<2 PCPlus4
BTA
15:0
<<16
ImmUpper
ExtOp
25:0
<<2
Jump_label
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 Instruction Set Operasi : : : jalr $d, $s 0000 00ss sss0 0000 1111 1000 0000 1001 nPC = $s; $31 = PC+4
Untuk menangani instruksi ini, control signal yang dikeluarkan adalah sebagai berikut
Instr. jalr
AluCtrl[4:0] X XXXX
Jr 1
Jalr 1
63
Dari control signal diatas, maka aliran data pada datapath adalah sebagai berikut
BranchTaken Bgtz LTZ Zero
Bgtz_sig
Bne
Jump Jal Jr Jalr
31:26 5:0
BranchTaken
Jr_sig
Jr
0 1
Branch_sig
Bltz_sig
Bne_sig
ALUControl
4:0
Beq Zero
Beq_sig 0 1
Jal Jalr=1
Jump
CLK
Instr 10:6
CLK ALUSrc1:0
PCPlus4
CLK MemWrite
Jal_sig
MemtoReg
0 1
0 1
PC
A RD Instruction Memory
Instr
ReadReg1
SrcA
25:21
WE A RD ReadData
SrcA
nPC
BTA JTA
20:16
PCPlus4
00 SrcB 01 10
ALU
ALUResult
0 1
Result
20:16 15:11
1 1111
$ra = 1 1111
00 01 10
WriteReg
4:0
Branch_label
15:0
Extend
ImmExt
<<2 PCPlus4
BTA
15:0
<<16
ImmUpper
ExtOp
25:0
<<2
Jump_label