module R_CPU(
input clk,rst,
output reg [31:0]PC,
output [31:0]new_PC,
output [5:0] OP,func,
output [4:0] rs,rt,rd,shamt,
output reg [2:0] ALU_OP,
output [31:0] ALU_F,A,B,
output reg R_ZF,R_OF,
output [31:0] Inst_code
);
wire ZF,OF;
reg Write_Reg;
initial begin PC =32'h0000_0000; end
//更新PC
assign new_PC = PC +4;//clk信号下降沿打入new_PC的值,rst信号上升沿代表复位操作
always @(negedge clk,posedge rst)
begin
if(rst)
PC <=32'h0000_0000;else
PC <= new_PC;
end
Get_Inst your_instance_name(.clka(clk),// input clka.addra(PC[7:2]),// input [5 : 0] addra.douta(Inst_code)// output [31 : 0] douta);
assign OP = Inst_code[31:26];
assign rs = Inst_code[25:21];
assign rt = Inst_code[20:16];
assign rd = Inst_code[15:11];
assign shamt = Inst_code[10:6];
assign func = Inst_code[5:0];//ALU_OP信号的选择
always@(*) begin
ALU_OP =3'b000;if(OP ==6'b000000)begin
Write_Reg =1'b1;case(func)6'b100000: begin ALU_OP=3'b100; end
6'b100010: begin ALU_OP=3'b101; end
6'b100100: begin ALU_OP=3'b000; end
6'b100101: begin ALU_OP=3'b001; end
6'b100110: begin ALU_OP=3'b010; end
6'b100111: begin ALU_OP=3'b011; end
6'b101011: begin ALU_OP=3'b110; end
6'b000100: begin ALU_OP=3'b111; end
endcase
end
end
Registor uu1(rs,rt,rd,Write_Reg,ALU_F,clk,rst,A,B);//clk信号下降沿数据写入
ALU uu2(ALU_OP,A,B,ALU_F,ZF,OF);//在clk信号的下降沿将标志位打入标志寄存器
initial begin
R_ZF =1'b0;
R_OF =1'b0;
end
always @(negedge clk,posedge rst) begin
if(rst) begin
R_ZF <=0;//默认情况下结果不为0
R_OF <=0;//默认情况下不溢出
end
else begin
R_ZF <= ZF;
R_OF <= OF;
end
end
endmodule