1
+ module mips
2
+ (input clk, rst,
3
+ input [31 :0 ] instr, rd_dm,
4
+ output we_dm,
5
+ output [31 :0 ] pc_current, alu_out, wd_dm);
6
+ wire pc_src, jump, link, jump_reg ,reg_dst, we_reg, alu_src, we_hi, we_lo, hi2reg, lo2reg, zero, dm2reg;
7
+ wire [2 :0 ] alu_ctrl;
8
+ datapath DP (clk, rst, pc_src, jump, link, jump_reg ,reg_dst, we_reg, alu_src, we_hi, we_lo, hi2reg, lo2reg, dm2reg, alu_ctrl, instr[25 :0 ], rd_dm, zero, pc_current, alu_out, wd_dm);
9
+ controlunit CU (zero, instr[31 :26 ], instr[5 :0 ], pc_src, jump, link, jump_reg ,reg_dst, we_reg, alu_src, we_hi, we_lo, hi2reg, lo2reg, we_dm, dm2reg, alu_ctrl);
10
+ endmodule
11
+
12
+ module datapath
13
+ (input clk, rst, pc_src, jump, link, jump_reg, reg_dst, we_reg, alu_src, we_hi, we_lo, hi2reg, lo2reg, dm2reg,
14
+ input [2 :0 ] alu_ctrl,
15
+ input [25 :0 ] instr,
16
+ input [31 :0 ] rd_dm,
17
+ output zero,
18
+ output [31 :0 ] pc_current, alu_out, wd_dm);
19
+ wire [4 :0 ] wa_rf, jal_rf;
20
+ wire [31 :0 ] pc_pre, pc_next, pc_plus4, jra, jta, sext_imm, ba, bta, alu_pa, alu_pb, hi_dat, lo_dat, hi_res, lo_res, wd_rf, wd_rf_res;
21
+ wire [63 :0 ] product;
22
+ assign jta = {pc_plus4[31 :28 ], instr[25 :0 ], 2'b00 };
23
+ assign ba = {sext_imm[29 :0 ], 2'b00 };
24
+ // Next PC Logic
25
+ mux2 #(32 ) pc_jr_mux (jump_reg, pc_plus4, alu_pa, jra);
26
+ mux2 #(32 ) pc_src_mux (pc_src, jra, bta, pc_pre);
27
+ mux2 #(32 ) pc_jmp_mux (jump, pc_pre, jta, pc_next);
28
+ dreg #(32 ) pc_reg (clk, rst, 1 , pc_next, pc_current);
29
+ adder #(32 ) pc_add4 (pc_current, 4 , pc_plus4);
30
+ adder #(32 ) pc_add_bra (pc_plus4, ba, bta);
31
+ signext se (instr[15 :0 ], sext_imm);
32
+ // RF Logic
33
+ mux2 #(5 ) rf_wa_mux (reg_dst, instr[20 :16 ], instr[15 :11 ], wa_rf);
34
+ mux2 #(5 ) rf_jal_mux (link, wa_rf, 31 , jal_rf);
35
+ mux2 #(32 ) rf_wd_mux (link, lo_res, pc_plus4, wd_rf_res);
36
+ regfile #(32 ) rf (clk, we_reg, jal_rf, instr[25 :21 ], instr[20 :16 ], wd_rf_res, alu_pa, wd_dm);
37
+ // ALU Logic
38
+ mux2 #(32 ) alu_pb_mux (alu_src, wd_dm, sext_imm, alu_pb);
39
+ alu #(32 ) alu (alu_ctrl, alu_pa, alu_pb, zero, alu_out);
40
+ multi #(32 ) multi (alu_pa, alu_pb, product[63 :32 ], product[31 :0 ]);
41
+ dreg #(32 ) high (clk, rst, we_hi, product[63 :32 ], hi_dat);
42
+ dreg #(32 ) low (clk, rst, we_lo, product[31 :0 ], lo_dat);
43
+ mux2 #(32 ) wd_rf_mux (dm2reg, alu_out, rd_dm, wd_rf);
44
+ mux2 #(32 ) hi_mux (hi2reg, wd_rf, hi_dat, hi_res);
45
+ mux2 #(32 ) lo_mux (lo2reg, hi_res, lo_dat, lo_res);
46
+ endmodule
47
+
48
+ module controlunit
49
+ (input zero,
50
+ input [5 :0 ] op, funct,
51
+ output pc_src, jump, link, jump_reg, reg_dst, we_reg, alu_src, we_hi, we_lo, hi2reg, lo2reg, we_dm, dm2reg,
52
+ output [2 :0 ] alu_ctrl);
53
+ wire branch;
54
+ wire [1 :0 ] alu_op;
55
+ assign pc_src = branch & zero;
56
+ maindec MD (op, branch, jump, link, reg_dst, we_reg, alu_src, we_dm, dm2reg, alu_op);
57
+ auxdec AD (alu_op, funct, jump_reg ,we_hi, we_lo, hi2reg, lo2reg, alu_ctrl);
58
+ endmodule
0 commit comments