svgb/rtl/gb.sv

127 lines
2.6 KiB
Systemverilog

// Top level gb module
module gb (
input wire clk,
input wire nreset,
// Cartridge bus
output wire cart_clk_o,
output wire cart_nreset_o,
output wire cart_nrd_o,
output wire cart_nwr_o,
output wire cart_ncs_o,
output wire [15:0] cart_addr_o,
inout wire [ 7:0] cart_data_io,
// PPU output to display
output logic ppu_display_enable_o,
output logic [ 1:0] ppu_pixel_o,
output logic ppu_vsync_o,
output logic ppu_hsync_o
);
logic [15:0] cpu_addr;
logic [ 7:0] cpu_rdata;
logic cpu_we;
logic [ 7:0] cpu_wdata;
logic [ 7:0] cpu_ppu_rdata;
logic rom_enable_r;
logic rom_sel;
logic [ 7:0] rom_rdata;
logic hiram_sel;
logic [ 7:0] hiram_rdata;
logic vram_sel;
logic [ 7:0] vram_rdata;
logic cart_sel;
logic [ 7:0] cart_rdata;
cpu cpu_inst (
.clk (clk),
.nreset (nreset),
.addr_o (cpu_addr),
.rdata_i(cpu_rdata),
.we_o (cpu_we),
.wdata_o(cpu_wdata)
);
ppu ppu_inst (
.clk (clk),
.nreset (nreset),
.display_enable_o(ppu_display_enable_o),
.cpu_addr_i (cpu_addr),
.cpu_rdata_o(cpu_ppu_rdata),
.cpu_we_i (cpu_we),
.cpu_wdata_i(cpu_wdata),
.pixel_o (ppu_pixel_o),
.vsync_o (ppu_vsync_o),
.hsync_o (ppu_hsync_o)
);
assign rom_enable_r = '1;
assign rom_sel = rom_enable_r & ~(|cpu_addr[15:8]);
assign vram_sel = (cpu_addr[15:13] == 3'b100);
assign hiram_sel = (&cpu_addr[15:7]) & ~(&cpu_addr[6:0]);
assign cart_sel = (~cpu_addr[15]) & (~cpu_addr[14]) & (~rom_sel);
assign cpu_rdata = rom_rdata |
vram_rdata |
hiram_rdata |
cpu_ppu_rdata |
cart_rdata;
rom #(
.FILE_NAME("DMG_ROM.bin"),
.ADDR_W (8),
.DATA_W (8)
) rom_inst (
.clk (clk),
.nreset (nreset),
.cs_i (rom_sel),
.address_i(cpu_addr[7:0]),
.rdata_o (rom_rdata)
);
ram #(
.ADDR_W (13),
.DATA_W (8)
) vram_inst (
.clk (clk),
.nreset (nreset),
.cs_i (vram_sel),
.address_i (cpu_addr[12:0]),
.rdata_o (vram_rdata),
.we_i (cpu_we),
.wdata_i (cpu_wdata)
);
ram #(
.ADDR_W (7),
.DATA_W (8)
) hiram_inst (
.clk (clk),
.nreset (nreset),
.cs_i (hiram_sel),
.address_i (cpu_addr[6:0]),
.rdata_o (hiram_rdata),
.we_i (cpu_we),
.wdata_i (cpu_wdata)
);
assign cart_rdata = cart_sel ? cart_data_io : '0;
assign cart_clk_o = clk;
assign cart_nreset_o = nreset;
assign cart_nrd_o = 1'b0;
assign cart_nwr_o = 1'b1;
assign cart_ncs_o = ~cart_sel;
assign cart_addr_o = cpu_addr;
endmodule : gb