Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- module machine(clk, reset);
- input clk, reset;
- wire [31:0] PC;
- wire [31:2] next_PC, PC_plus4, PC_target;
- wire [31:0] inst;
- wire [31:0] imm = {{ 16{inst[15]} }, inst[15:0] }; // sign-extended immediate
- wire [4:0] rs = inst[25:21];
- wire [4:0] rt = inst[20:16];
- wire [4:0] rd = inst[15:11];
- wire [4:0] wr_regnum;
- wire [2:0] ALUOp;
- wire RegWrite, BEQ, ALUSrc, MemRead, MemWrite, MemToReg, RegDst, MFC0, MTC0, ERET;
- wire PCSrc, zero, negative;
- wire TakenInterrupt,TimerInterrupt,TimerAddress;
- wire [31:0] rd1_data, rd2_data, B_data, alu_out_data, load_data, wr_data, old_wr_data, rd_data, cycle;
- wire [29:0] newmux1_out, real_next_PC, EPC;
- wire realMemRead,realMemWrite, NotIO;
- register #(30, 30'h100000) PC_reg(PC[31:2], real_next_PC, clk, /* enable */1'b1, reset);
- assign PC[1:0] = 2'b0; // bottom bits hard coded to 00
- adder30 next_PC_adder(PC_plus4, PC[31:2], 30'h1);
- adder30 target_PC_adder(PC_target, PC_plus4, imm[29:0]);
- mux2v #(30) branch_mux(next_PC, PC_plus4, PC_target, PCSrc);
- assign PCSrc = BEQ & zero;
- instruction_memory imem (inst, PC[31:2]);
- mips_decode decode(ALUOp, RegWrite, BEQ, ALUSrc, MemRead, MemWrite, MemToReg, RegDst, MFC0, MTC0, ERET,
- inst);
- regfile rf (rd1_data, rd2_data,
- rs, rt, wr_regnum, wr_data,
- RegWrite, clk, reset);
- mux2v #(32) imm_mux(B_data, rd2_data, imm, ALUSrc);
- alu32 alu(alu_out_data, zero, negative, ALUOp, rd1_data, B_data);
- assign NotIO = ~TimerAddress;
- assign realMemRead = MemRead & NotIO;
- assign realMemWrite = MemWrite & NotIO;
- data_mem data_memory(load_data, alu_out_data, rd2_data, realMemRead, realMemWrite, clk, reset);
- wire [31:0] driven_by_two;
- assign driven_by_two = load_data;
- assign driven_by_two = cycle;
- mux2v #(32) wb_mux(old_wr_data, alu_out_data, driven_by_two, MemToReg);
- mux2v #(5) rd_mux(wr_regnum, rt, rd, RegDst);
- cp0 thecp0(rd_data,EPC,TakenInterrupt,rd2_data, wr_regnum, next_PC,
- MTC0, ERET, TimerInterrupt, clk, reset);
- timer thetimer(TimerInterrupt, cycle, TimerAddress,
- rd2_data, alu_out_data, MemRead, MemWrite, clk, reset);
- mux2v #(32) realwrmux(wr_data, old_wr_data,rd_data,MFC0);
- mux2v #(30) epcmux(newmux1_out,next_PC, EPC, ERET);
- wire[31:0] tempNum = 32'h80000180;
- mux2v #(30) errormux(real_next_PC,newmux1_out,tempNum[31:2],TakenInterrupt);
- endmodule // machine
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement