-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain_control.v
135 lines (133 loc) · 4.21 KB
/
main_control.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
`timescale 1ns / 1ps
module main_control(
input [4:0]opcode,
input [2:0]f3,
output reg [1:0]aluop,
output reg regwrite,regsrc,memread,memwrite,pc_rs1_sel,branch,alusrc,
output reg [2:0]immsel
);
always@(*)begin
case(opcode)
5'b01100:begin//R
aluop=2'b10;
regwrite=1'b1;
memwrite=1'b0;
regsrc=1'b0;//直接拿到 aluresult的结果存回寄存器堆中
memread=1'b0;
immsel=3'b0;//不需要用到符号位的扩展
alusrc=1'b0;//0是寄存器操作数
pc_rs1_sel=1'b0;
branch<=1'b0;
end
5'b00100:begin ///立即数运算
aluop=2'b01;
regwrite=1'b1;
memwrite=1'b0;
regsrc=1'b0;
memread=1'b0;
case(f3)
3'b101:begin
immsel=3'b001;
end
3'b001:begin
immsel=3'b001;
end
default:begin
immsel=3'b000;
end
endcase
alusrc=1'b1;
pc_rs1_sel=1'b0;
branch<=1'b0;
end
5'b00000:begin //ld指令
aluop=2'b00;
regwrite=1'b1;
memwrite=1'b0;
regsrc=1'b1;
memread=1'b1;
immsel=3'b000;
alusrc=1'b1;
pc_rs1_sel=1'b0;
branch<=1'b0;
end
5'b01000:begin //store指令
aluop=2'b00;
regwrite=1'b0;
memwrite=1'b1;
regsrc=1'b0;
memread=1'b0;
immsel=3'b010;
alusrc=1'b1;
pc_rs1_sel=1'b0;
branch<=1'b0;
end
5'b11000:begin //分支
aluop=2'b00; //分支无所谓了,因为我们的分支又单独的比较模块,不需要
regwrite=1'b0;
memwrite=1'b0;
regsrc=1'b0;
memread=1'b0;
immsel=3'b011;
alusrc=1'b0;
pc_rs1_sel=1'b0;
branch<=1'b1;
end
5'b11011:begin//J指令立即数扩展编码为4
aluop=2'b11; //无需计算直接旁路
regwrite=1'b1;
memread=1'b0;
memwrite=1'b0;
regsrc=1'b0;
alusrc=1'b0;
immsel= 3'b100;
pc_rs1_sel=1'b0;
branch<=1'b1;
end
5'b11001:begin//jalr
aluop=2'b11; //无需计算直接旁路
regwrite=1'b1;
regsrc=1'b0;
memread=1'b0;
memwrite=1'b0;
alusrc=1'b0;
immsel=3'b100;
pc_rs1_sel=1'b1;
branch<=1'b1;
end
5'b01101:begin///U立即数编号5
aluop=2'b11;//旁路直接拿去第二个数据
regwrite=1'b1;
memwrite=1'b0;
regsrc=1'b1;
memread=1'b0;
immsel=3'b101;
alusrc=1'b1;
pc_rs1_sel=1'b0;
branch<=1'b0;
end
5'b00101:begin//立即数编号5
aluop=2'b00;
regwrite=1'b1;
memwrite=1'b0;
regsrc=1'b0;
memread=1'b0;
immsel=3'b101;
alusrc=1'b1;
pc_rs1_sel=1'b0;
branch<=1'b0;
end
default:begin
aluop=2'b00;
regwrite=1'b0;
memwrite=1'b0;
regsrc=1'b0;
memread=1'b0;
immsel=3'b000;
alusrc=1'b0;
pc_rs1_sel=1'b0;
branch<=1'b0;
end
endcase
end
endmodule