yayacemu/chip8.sv

144 lines
2.5 KiB
Systemverilog
Raw Normal View History

2024-02-01 02:57:11 +00:00
module chip8 (
input wire clk_in,
input wire rst_in
2024-02-01 03:04:52 +00:00
);
2024-04-07 02:36:24 +00:00
bit [7:0] vram[0:1023];
2024-02-01 03:04:52 +00:00
bit [7:0] memory[0:4095];
bit keyboard[15:0];
bit [7:0] sound_timer;
bit [15:0] program_counter;
int cycle_counter;
2024-04-06 21:38:23 +00:00
bit rom_ready;
bit font_ready;
bit system_ready;
bit halt;
2024-02-01 03:04:52 +00:00
bit [7:0] random_number;
2024-04-06 21:38:23 +00:00
and(system_ready, rom_ready, font_ready);
2024-02-01 03:04:52 +00:00
beeper beeper (sound_timer);
cpu cpu (
2024-04-06 21:38:23 +00:00
system_ready,
2024-02-01 03:04:52 +00:00
memory,
clk_in,
keyboard,
random_number,
cycle_counter,
program_counter,
vram,
2024-04-06 21:38:23 +00:00
sound_timer
2024-02-01 03:04:52 +00:00
);
gpu gpu (vram);
keyboard kb (
clk_in,
keyboard
);
rng randy (
clk_in,
program_counter,
keyboard,
cycle_counter,
random_number
);
2024-04-06 21:38:23 +00:00
rom_loader loader (clk_in, rst_in, memory, rom_ready);
2024-02-01 03:04:52 +00:00
2024-04-06 21:38:23 +00:00
always_ff @(negedge clk_in) begin
if (~font_ready) begin
bit [7:0] fontset[79:0] = {
8'hF0,
8'h90,
8'h90,
8'h90,
8'hF0, // 0
8'h20,
8'h60,
8'h20,
8'h20,
8'h70, // 1
8'hF0,
8'h10,
8'hF0,
8'h80,
8'hF0, // 2
8'hF0,
8'h10,
8'hF0,
8'h10,
8'hF0, // 3
8'h90,
8'h90,
8'hF0,
8'h10,
8'h10, // 4
8'hF0,
8'h80,
8'hF0,
8'h10,
8'hF0, // 5
8'hF0,
8'h80,
8'hF0,
8'h90,
8'hF0, // 6
8'hF0,
8'h10,
8'h20,
8'h40,
8'h40, // 7
8'hF0,
8'h90,
8'hF0,
8'h90,
8'hF0, // 8
8'hF0,
8'h90,
8'hF0,
8'h10,
8'hF0, // 9
8'hF0,
8'h90,
8'hF0,
8'h90,
8'h90, // A
8'hE0,
8'h90,
8'hE0,
8'h90,
8'hE0, // B
8'hF0,
8'h80,
8'h80,
8'h80,
8'hF0, // C
8'hE0,
8'h90,
8'h90,
8'h90,
8'hE0, // D
8'hF0,
8'h80,
8'hF0,
8'h80,
8'hF0, // E
8'hF0,
8'h80,
8'hF0,
8'h80,
8'h80 // F
};
// Load fontset into memory
for (int i = 0; i < 80; i++) begin
memory[i] = fontset[79-i];
end
2024-04-06 21:38:23 +00:00
font_ready = 1;
2024-02-01 02:57:11 +00:00
end
2024-02-01 03:04:52 +00:00
end
2024-02-01 02:57:11 +00:00
endmodule