summaryrefslogtreecommitdiff
path: root/decoder_stage.v
blob: 18ed1955cba839fff9aaada6616a829d9a518ce4 (plain)
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