-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathController.v
152 lines (141 loc) · 2.17 KB
/
Controller.v
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
// build control unit
module Controller
(
Opcode,
Is_Imm,
WB_En,
MEM_R_En,
MEM_W_En,
EXE_Cmd,
BR_Type
);
// input and output ports
input [5:0] Opcode;
output Is_Imm;
output WB_En;
output MEM_R_En;
output MEM_W_En;
output [3:0] EXE_Cmd;
output [1:0] BR_Type;
// registers
reg Is_Imm;
reg WB_En;
reg MEM_R_En;
reg MEM_W_En;
reg [3:0] EXE_Cmd;
reg [1:0] BR_Type;
// define cases
parameter NOP = 0;
parameter ADD = 1;
parameter SUB = 3;
parameter AND = 5;
parameter OR = 6;
parameter NOR = 7;
parameter XOR = 8;
parameter SLA = 9;
parameter SLL = 10;
parameter SRA = 11;
parameter SRL = 12;
parameter ADDI = 32;
parameter SUBI = 33;
parameter LD = 36;
parameter ST = 37;
parameter BEZ = 40;
parameter BNE = 41;
parameter JMP = 42;
// define branch types
parameter NO_BRANCH_Code = 2'b0;
parameter BEZ_Code = 2'b01;
parameter BNE_Code = 2'b10;
parameter JMP_Code = 2'b11;
// build module
always @(*)
begin
case(Opcode)
ADDI:
Is_Imm = 1;
SUBI:
Is_Imm = 1;
LD:
Is_Imm = 1;
ST:
Is_Imm = 1;
BEZ:
Is_Imm = 1;
BNE:
Is_Imm = 1;
JMP:
Is_Imm = 1;
default:
Is_Imm = 0;
endcase
case(Opcode)
NOP:
WB_En = 0;
ST:
WB_En = 0;
BEZ:
WB_En = 0;
BNE:
WB_En = 0;
JMP:
WB_En = 0;
default:
WB_En = 1;
endcase
case(Opcode)
LD:
MEM_R_En = 1;
default:
MEM_R_En = 0;
endcase
case(Opcode)
ST:
MEM_W_En = 1;
default:
MEM_W_En = 0;
endcase
case(Opcode)
ADD:
EXE_Cmd = 4'b0000;
SUB:
EXE_Cmd = 4'b0010;
AND:
EXE_Cmd = 4'b0100;
OR:
EXE_Cmd = 4'b0101;
NOR:
EXE_Cmd = 4'b0110;
XOR:
EXE_Cmd = 4'b0111;
SLA:
EXE_Cmd = 4'b1000;
SLL:
EXE_Cmd = 4'b1000;
SRA:
EXE_Cmd = 4'b1001;
SRL:
EXE_Cmd = 4'b1010;
ADDI:
EXE_Cmd = 4'b0000;
SUBI:
EXE_Cmd = 4'b0010;
LD:
EXE_Cmd = 4'b0000;
ST:
EXE_Cmd = 4'b0000;
default:
EXE_Cmd = {4{1'bx}};
endcase
case(Opcode)
BEZ:
BR_Type = BEZ_Code;
BNE:
BR_Type = BNE_Code;
JMP:
BR_Type = JMP_Code;
default:
BR_Type = NO_BRANCH_Code;
endcase
end
endmodule