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
|
module control_unit (
input clk, rst,
input [6:0] opcode,
input [2:0] funct3,
input [6:0] funct7,
input alu_zero,
output pc_we,
output mem_addr_src,
output mem_we,
output instr_we,
output [1:0] result_src,
output [3:0] alu_op,
output [1:0] alu_a_src,
output [1:0] alu_b_src,
output rf_we
);
parameter s00_fetch = 4'h0,
s01_decode = 4'h1,
s02_mem_addr = 4'h2,
s03_mem_read = 4'h3,
s04_mem_wb = 4'h4,
s05_mem_write = 4'h5,
s06_execute_r = 4'h6,
s07_alu_wb = 4'h7,
s08_execute_i = 4'h8,
s09_jal = 4'h9,
s10_beq = 4'ha;
reg [3:0] state, next_state;
always @ (posedge clk or posedge rst) begin
if (rst) state <= s00_fetch;
else state <= next_state;
end
always @ (*) begin
case(state)
s00_fetch: next_state <= s01_decode;
s01_decode: case(opcode)
7'b0000011: next_state <= s02_mem_addr;
7'b0100011: next_state <= s02_mem_addr;
7'b0110011: next_state <= s06_execute_r;
7'b0010011: next_state <= s08_execute_i;
7'b1101111: next_state <= s09_jal;
7'b1100011: next_state <= s10_beq;
endcase
s02_mem_addr: case(opcode)
7'b0000011: next_state <= s03_mem_read;
7'b0100011: next_state <= s05_mem_write;
endcase
s03_mem_read: next_state <= s04_mem_wb;
s04_mem_wb: next_state <= s00_fetch;
s05_mem_write: next_state <= s00_fetch;
s06_execute_r: next_state <= s07_alu_wb;
s07_alu_wb: next_state <= s00_fetch;
s08_execute_i: next_state <= s07_alu_wb;
s09_jal: next_state <= s07_alu_wb;
s10_beq: next_state <= s00_fetch;
endcase
end
/*
always @ (*) begin
case(state)
s00_fetch:
s01_decode:
s02_mem_addr:
s03_mem_read:
s04_mem_wb:
s05_mem_write:
s06_execute_r:
s07_alu_wb:
s08_execute_i:
s09_jal:
s10_beq:
endcase
end
*/
endmodule
|