mirror of
https://github.com/Polprzewodnikowy/SummerCart64.git
synced 2024-12-01 17:44:14 +01:00
82 lines
2.8 KiB
Verilog
82 lines
2.8 KiB
Verilog
`include "../constants.vh"
|
|
|
|
module n64_bank_decoder (
|
|
input [31:0] i_address,
|
|
output reg [25:0] o_translated_address,
|
|
output reg [3:0] o_bank,
|
|
output reg o_bank_prefetch,
|
|
output o_sram_request,
|
|
input i_ddipl_enable,
|
|
input i_sram_enable,
|
|
input i_sram_768k_mode,
|
|
input i_flashram_enable,
|
|
input i_sd_enable,
|
|
input i_eeprom_enable,
|
|
input [23:0] i_ddipl_address,
|
|
input [23:0] i_sram_address
|
|
);
|
|
|
|
localparam [31:0] DDIPL_BASE = 32'h0600_0000;
|
|
localparam [31:0] DDIPL_END = 32'h063F_FFFF;
|
|
|
|
localparam [31:0] SRAM_BASE = 32'h0800_0000;
|
|
localparam [31:0] SRAM_END = 32'h0800_7FFF;
|
|
localparam [31:0] SRAM_768K_END = 32'h0801_7FFF;
|
|
|
|
localparam [31:0] ROM_BASE = 32'h1000_0000;
|
|
localparam [31:0] ROM_END = 32'h13FF_FFFF;
|
|
|
|
localparam [31:0] CART_BASE = 32'h1E00_0000;
|
|
localparam [31:0] CART_END = 32'h1E00_3FFF;
|
|
|
|
localparam [31:0] EEPROM_BASE = 32'h1E00_4000;
|
|
localparam [31:0] EEPROM_END = 32'h1E00_47FF;
|
|
|
|
localparam [31:0] SD_BASE = 32'h1E00_8000;
|
|
localparam [31:0] SD_END = 32'h1E00_83FF;
|
|
|
|
wire [25:0] w_ddipl_translated_address = i_address[25:0] + {i_ddipl_address, 2'd0};
|
|
wire [25:0] w_sram_translated_address = i_address[25:0] + {i_sram_address, 2'd0};
|
|
|
|
always @(*) begin
|
|
o_bank = `BANK_INVALID;
|
|
o_bank_prefetch = 1'b0;
|
|
o_translated_address = i_address[25:0];
|
|
o_sram_request = 1'b0;
|
|
|
|
if ((i_address >= DDIPL_BASE) && (i_address <= DDIPL_END) && i_ddipl_enable) begin
|
|
o_translated_address = w_ddipl_translated_address;
|
|
o_bank = `BANK_SDRAM;
|
|
o_bank_prefetch = 1'b1;
|
|
end
|
|
|
|
if ((i_address >= SRAM_BASE) && ((i_address <= SRAM_END) || ((i_sram_768k_mode && (i_address <= SRAM_768K_END))))) begin
|
|
if (i_sram_enable && !i_flashram_enable) begin
|
|
o_translated_address = w_sram_translated_address;
|
|
o_bank = `BANK_SDRAM;
|
|
o_bank_prefetch = 1'b1;
|
|
o_sram_request = 1'b1;
|
|
end
|
|
end
|
|
|
|
if ((i_address >= ROM_BASE) && (i_address <= ROM_END)) begin
|
|
o_bank = `BANK_SDRAM;
|
|
o_bank_prefetch = 1'b1;
|
|
end
|
|
|
|
if ((i_address >= CART_BASE) && (i_address <= CART_END)) begin
|
|
o_bank = `BANK_CART;
|
|
end
|
|
|
|
if ((i_address >= EEPROM_BASE) && (i_address <= EEPROM_END) && i_eeprom_enable) begin
|
|
o_bank = `BANK_EEPROM;
|
|
o_bank_prefetch = 1'b1;
|
|
end
|
|
|
|
if ((i_address >= SD_BASE) && (i_address <= SD_END) && i_sd_enable) begin
|
|
o_bank = `BANK_SD;
|
|
end
|
|
end
|
|
|
|
endmodule
|