blob: 1d42449cd71727eebaf05654b3c185424a9c17f7 [file] [log] [blame]
module ConfigurationRegister #(
parameter WIDTH = 32,
parameter ADDRESS = 12'b0,
parameter DEFAULT = 32'b0
)(
input wire clk,
input wire rst,
// Peripheral Bus
input wire enable,
input wire peripheralBus_we,
input wire peripheralBus_oe,
input wire[11:0] peripheralBus_address,
input wire[3:0] peripheralBus_byteSelect,
output wire[31:0] peripheralBus_dataRead,
input wire[31:0] peripheralBus_dataWrite,
output wire requestOutput,
output wire[WIDTH-1:0] currentValue
);
wire[31:0] dataMask = {
peripheralBus_byteSelect[3] ? 8'hFF : 8'h00,
peripheralBus_byteSelect[2] ? 8'hFF : 8'h00,
peripheralBus_byteSelect[1] ? 8'hFF : 8'h00,
peripheralBus_byteSelect[0] ? 8'hFF : 8'h00
};
reg[WIDTH-1:0] registerValue;
wire[31:0] maskedWriteData = (peripheralBus_dataWrite & dataMask) | (registerValue & ~dataMask);
wire registerSelect = enable && ({ peripheralBus_address[11:2], 2'b00 } == ADDRESS);
wire we = registerSelect && peripheralBus_we && !peripheralBus_oe;
wire oe = registerSelect && peripheralBus_oe && !peripheralBus_we;
always @(posedge clk) begin
if (rst) begin
registerValue <= DEFAULT;
end else begin
if (we) registerValue <= maskedWriteData[WIDTH-1:0];
end
end
wire[31:0] baseReadData;
generate
if (WIDTH == 32) begin
assign baseReadData = registerValue;
end else begin
wire[32-WIDTH-1:0] zeroPadding = 'b0;
assign baseReadData = { zeroPadding, registerValue };
end
endgenerate
assign peripheralBus_dataRead = oe ? baseReadData & dataMask : 32'b0;
assign requestOutput = oe;
assign currentValue = registerValue;
endmodule