module pc_reg(
input wire clk,
input wire rst,
output reg[5:0] pc,
output reg ce
);
always @ (posedge clk) begin
if (ce == 1'b0) begin
pc <=6'h00;
end else begin
pc<=pc + 1'b1;
end
end
always @ (posedge clk) begin
if (rst == 1'b1) begin
ce <= 1'b0;
end else begin
ce <= 1'b1;
end
end
endmodule
module rom(
input wire ce,
input wire[5:0] addr,
output reg[31:0] inst
);
reg [31:0] rom[63:0];
initial $readmemh ( "rom.data" , rom );always @ (*) begin
if (ce == 1'b0) begin
inst <=32'h0;
end else begin
inst <=rom[addr];
end
end
endmodule
include "defines. v"
module pc_reg(
input wire clk,
input wire rst,
output reg[`InstAddrBus] pc,
output reg ce
);
always @ (posedge clk) begin
if (ce == `ChipDisable) begin
pc<=32'h00000000;
end else begin
pc <= pc + 4'h4;
end
end
always @ (posedge clk) begin
if (rst == `RstEnable) begin
ce <= `ChipDisable;
end else begin
ce <= `ChipEnable;
end
end
endmodule
include "defines.v"
module if_id (
input wire clk,
input wire rst,
input wire[`InstAddrBus]if_pc ,
input wire[`InstBus ] if_inst,
output reg[`InstAddrBus ] id_pc,
output reg[`InstBus] id_inst\
);
always @ (posedge clk) begin
if (rst == RstEnable) begin
id_pc <= `ZeroWord;
id_inst <= `Zeroword;
end else begin
id_pc <= if_pc;
id_inst <= if_inst;
end
end
endmodule
第四关代码
module regfile(
input wire clk,
input wire rst,
input wire we,
input wire[`RegAddrBus] waddr,
input wire[`RegBus] wdata,
input wire re1,
input wire [`RegAddrBus] raddr1,
output reg [`RegBus] rdata1,
input wire re2,
inputwire[`RegAddrBus] raddr2,
output reg [`RegBus] rdata2
);
reg[`RegBus] regs[0:`RegNum-1];
always @ (posedge clk) begin
if (rst = `RstDisable) begin
if((we ==`WriteEnable) && (waddr != `RegNumLog2'h0)) begin
regs[waddr] <=wdata;
end
end
end
always @ (*) begin
if(rst == `RstEnable) begin
rdata1 <= `ZeroWord;
end else if( raddr1 = `RegNumLog2'h0) begin
rdata1 <= `ZeroWord ;
end else if((raddr1 == waddr)&& (we = `WriteEnable) && (re1 ==`ReadEnable)) begin
rdata1 <= wdata ;
end else if(re1 ==`ReadEnable) begin rdata1 <= regs [raddr1] ;
end else begin
rdata1 <= 'ZeroWord;
end
end
always @ (*) begin
if(rst == `RstEnable) begin
rdata2 <= `ZeroWord;
end else if( raddr2 = `RegNumLog2'h0) begin
rdata2 <= `ZeroWord ;
end else if((raddr2 == waddr)&& (we = `WriteEnable) && (re2 ==`ReadEnable)) begin
rdata2 <= wdata ;
end else if(re2 ==`ReadEnable) begin rdata2 <= regs [raddr2] ;
end else begin
rdata2 <= 'ZeroWord;
end
end
endmodule