Files
super6502/hw/fpga/memory_mapper.sv
Byron Lathi be497ecaa9 Add reset input to memory mapper
Upon reset the memory mapper is automatically disabled, but the mappings
are not cleared.
2022-04-07 10:35:16 -05:00

59 lines
1.0 KiB
Systemverilog

/*
* This is based off of the 74LS610, but is not identical.
Some of the inputs are flipped so that they are all active high,
and some outputs are reordered.
Notably, when MM is low, MA is present on MO0-MO4, not 8 to 11.
*/
module memory_mapper(
input clk,
input rst,
input rw,
input cs,
input MM_cs,
input [3:0] RS,
input [3:0] MA,
input logic [11:0] data_in,
output logic [11:0] data_out,
output logic [11:0] MO
);
logic [11:0] RAM [16];
logic MM;
always_ff @(posedge clk) begin
if (rst) begin
MM <= '0;
end else begin
if (MM_cs & ~rw) begin // can't read MM but do you really need too?
MM = |data_in;
end
if (cs & ~rw) begin // write to registers
RAM[RS] <= data_in;
end else if (cs & rw) begin // read registers
data_out <= RAM[RS];
end
end
end
always_comb begin
if (MM) begin // normal mode
MO = RAM[MA];
end else begin // passthrough mode
MO = {8'b0, MA};
end
end
endmodule