Files
ComputerComposition/Experiments/Shared/Datapath.v
2025-11-06 09:35:54 +08:00

24 lines
1.0 KiB
Verilog

module Datapath(
input clk,
input [31:0] Instr,
input RegWr,
input MemToReg,
input MemWrEn,
input ALUBSrc,
input srcReg,
input [1:0] ExtOp,
input [2:0] AluCtrl,
output Zero
);
wire [31:0] busA_out, busB_out, ext_out, alu_in_b, alu_result, ram_data_out, reg_write_data;
wire [4:0] rj = Instr[9:5];
wire [4:0] rk_or_rd_store = Instr[14:10];
wire [4:0] rd_write = Instr[4:0];
Registers u_Registers(.clk(clk), .RegWr(RegWr), .Ra(rj), .Rb(srcReg ? Instr[4:0] : rk_or_rd_store), .Rw(rd_write), .busW(reg_write_data), .busA(busA_out), .busB(busB_out));
Ext u_Ext(.DataIn(Instr), .ExtOp(ExtOp), .DataOut(ext_out));
assign alu_in_b = ALUBSrc ? ext_out : busB_out;
ALU u_ALU(.a(busA_out), .b(alu_in_b), .AluCtrl(AluCtrl), .AddResult(alu_result), .Zero(Zero));
DataRAM u_DataRAM(.clk(clk), .MemWrEn(MemWrEn), .addr(alu_result), .data_in(busB_out), .data_out(ram_data_out));
assign reg_write_data = MemToReg ? ram_data_out : alu_result;
endmodule