Files
MipsPipelineProcessor/PipelineProcessor.srcs/sources_1/new/RegisterFile.v
2024-07-10 12:06:19 +08:00

47 lines
1.3 KiB
Verilog

`timescale 1ns / 1ps
module RegisterFile (
input clk,
input [4:0] read_addr1,
input [4:0] read_addr2,
input write_enable,
input [4:0] write_addr,
input [31:0] write_data,
input write_ra,
input [4:0] write_ra_addr,
input [31:0] write_ra_data,
output [31:0] read_output1,
output [31:0] read_output2
);
reg [31:0] registers[31:1];
assign read_output1 = (read_addr1 == 5'b00000) ? 32'h00000000 :
(read_addr1 == write_ra_addr) ? write_ra_data :
(read_addr1 == write_addr) ? write_data : registers[read_addr1];
assign read_output2 = (read_addr2 == 5'b00000) ? 32'h00000000 :
(read_addr2 == write_ra_addr) ? write_ra_data :
(read_addr2 == write_addr) ? write_data : registers[read_addr2];
always @(posedge clk) begin
if (write_addr == write_ra_addr) begin
if (write_ra) begin
registers[write_ra_addr] <= write_ra_data;
end else begin
if (write_enable) begin
registers[write_addr] <= write_data;
end
end
end else begin
if (write_ra) begin
registers[write_ra_addr] <= write_ra_data;
end
if (write_enable) begin
registers[write_addr] <= write_data;
end
end
end
endmodule