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
|
module decoder_stage (
input clk,
input en,
input [15:0] instr_in,
output reg [3:0] aluOp_out,
output reg [2:0] aluReg1_out,
output reg [2:0] aluReg2_out,
output reg [1:0] aluOpSource1_out, // ALU first operand: 0 = reg, 1 = memory read, 2 = imm8, 3 = PC
output reg [1:0] aluOpSource2_out, // ALU second operand: 0 = reg, 1 = ~reg, 2 = PC, 3 = ???
output reg aluDest_out, // 0 = reg, 1 = PC
output reg [2:0] regDest_out,
output reg regSetH_out,
output reg regSetL_out,
output reg [2:0] regAddr_out,
output reg memReadB_out,
output reg memReadW_out,
output reg memWriteB_out,
output reg memWriteW_out,
output reg [4:0] setRegCond_out, // {should set when condition is true, Z doesn't matter, S doesn't matter, Z must be this, S must be this}
output reg [15:0] imm_out
);
wire [3:0] aluOp_next;
wire [2:0] aluReg1_next;
wire [2:0] aluReg2_next;
wire [1:0] aluOpSource1_next;
wire [1:0] aluOpSource2_next;
wire aluDest_next;
wire [2:0] regDest_next;
wire regSetH_next;
wire regSetL_next;
wire [2:0] regAddr_next;
wire memReadB_next;
wire memReadW_next;
wire memWriteB_next;
wire memWriteW_next;
wire [4:0] setRegCond_next;
wire [15:0] imm_next;
decoder decoder_inst (
.instr(instr_in),
.aluOp(aluOp_next),
.aluReg1(aluReg1_next),
.aluReg2(aluReg2_next),
.aluOpSource1(aluOpSource1_next),
.aluOpSource2(aluOpSource2_next),
.aluDest(aluDest_next),
.regDest(regDest_next),
.regSetH(regSetH_next),
.regSetL(regSetL_next),
.regAddr(regAddr_next),
.memReadB(memReadB_next),
.memReadW(memReadW_next),
.memWriteB(memWriteB_next),
.memWriteW(memWriteW_next),
.setRegCond(setRegCond_next),
.imm(imm_next)
);
always @(posedge clk) begin
if(en) begin
aluOp_out <= aluOp_next;
aluReg1_out <= aluReg1_next;
aluReg2_out <= aluReg2_next;
aluOpSource1_out <= aluOpSource1_next;
aluOpSource2_out <= aluOpSource2_next;
aluDest_out <= aluDest_next;
regDest_out <= regDest_next;
regSetH_out <= regSetH_next;
regSetL_out <= regSetL_next;
regAddr_out <= regAddr_next;
memReadB_out <= memReadB_next;
memReadW_out <= memReadW_next;
memWriteB_out <= memWriteB_next;
memWriteW_out <= memWriteW_next;
setRegCond_out <= setRegCond_next;
imm_out <= imm_next;
end
end
endmodule
|