// PCd模块的代码
module PC(
// input
input clk,
input reset,
input PCWre,
input [31:0] immediate, addrFromReg,
input [25:0] addrFromJ,
input [1:0] selectSignal,
// output
output reg[31:0] addr,
output [31:0] pc4
);
// reg[27:0] tmp;
integer i;
assign pc4 = addr + 4;
always @(negedge clk) begin
// always @(selectSignal or PCWre or negedge reset) begin
if(reset == 0) begin
addr <= 0; // Reset,指令地址初值为0
end else if(PCWre) begin
// pc4 = addr + 4;
case(selectSignal)
2'b00: addr = addr + 4;
2'b01: addr = addr + 4 + immediate * 4;
2'b10: addr = addrFromReg;
2'b11:begin
// $display("when triggled pc4", pc4);
addr[0] = 0;
addr[1] = 0;
for(i = 0; i < 26; i = i + 1) begin
addr[i+2] = addrFromJ[i];
end
for(i = 27; i< 32; i = i + 1) begin
addr[i] = pc4[i];
end
$display("when triggled addr", addr);
end
default: begin end
endcase
end
$display("curPC: ", addr, "nextPC:", pc4);
end
endmodule
module InstructionMemory(
input [31:0] Iaddr, // 指令存储器地址输入端口
// input [31:0] IDataIn, // 指令存储器数据输入端口(指令代码输入端口)
input RW, // 指令存储器读写控制信号,为1读,为0写
output reg[31:0] IDataOut // 指令存储器数据输出端口(指令代码输出端口)
);
reg[7:0] storage [127:0];
always @(RW or Iaddr ) begin
if(RW == 0) begin //write
/* 本次实验不需要用到写指令功能
storage[Iaddr] <= IDataIn[7:0];
storage[Iaddr + 1] <= IDataIn[15:8];
storage[Iaddr + 2] <= IDataIn[23:16];
storage[Iaddr + 3] <= IDataIn[31:24];
*/
end
else begin // read
IDataOut[7:0] <= storage[Iaddr + 3];
IDataOut[15:8] <= storage[Iaddr + 2];
IDataOut[23:16] <= storage[Iaddr + 1];
IDataOut[31:24] <= storage[Iaddr];
end
end
initial begin
$readmemb("F:/ECOP_Experiment/MultiCycleCPU/ins.txt",storage);
end
endmodule
module IR(
input [31:0] inData,
input clk, IRWre,
output reg[31:0] outData
);
reg[31:0] storage;
always @(posedge clk) begin
if(IRWre ==