use 1 bit map for screen

This commit is contained in:
Nicholas Orlowsky 2024-04-06 16:38:23 -05:00
parent f949c2515b
commit 9804af7796
Signed by: nickorlow
GPG key ID: 838827D8C4611687
9 changed files with 51 additions and 43 deletions

3
.gitmodules vendored Normal file
View file

@ -0,0 +1,3 @@
[submodule "the-bomb"]
path = the-bomb
url = git@github.com:nickorlow/the-bomb.git

View file

@ -3,7 +3,7 @@ module chip8 (
input wire rst_in
);
bit [31:0] vram[0:2047];
bit vram[0:2047];
bit [7:0] memory[0:4095];
bit keyboard[15:0];
@ -12,12 +12,18 @@ module chip8 (
bit [15:0] program_counter;
int cycle_counter;
bit rom_ready;
bit font_ready;
bit system_ready;
bit halt;
bit [7:0] random_number;
and(system_ready, rom_ready, font_ready);
beeper beeper (sound_timer);
cpu cpu (
rst_in,
system_ready,
memory,
clk_in,
keyboard,
@ -39,10 +45,10 @@ module chip8 (
cycle_counter,
random_number
);
rom_loader loader (memory);
rom_loader loader (clk_in, rst_in, memory, rom_ready);
always_ff @(posedge clk_in) begin
if (rst_in) begin
always_ff @(negedge clk_in) begin
if (~font_ready) begin
bit [7:0] fontset[79:0] = {
8'hF0,
8'h90,
@ -131,10 +137,7 @@ module chip8 (
memory[i] = fontset[79-i];
end
// Initialize keyboard bits
for (int i = 0; i < 15; i++) begin
keyboard[i] = 0;
end
font_ready = 1;
end
end
endmodule

23
cpu.sv
View file

@ -1,12 +1,12 @@
module cpu (
input wire rst_in,
input wire system_ready,
output bit [7:0] memory[0:4095],
input wire clk_in,
input wire keyboard[15:0],
input wire [7:0] random_number,
output int cycle_counter,
output wire [15:0] program_counter,
output wire [31:0] vram[0:2047],
output wire vram[0:2047],
output wire [7:0] sound_timer
);
@ -29,19 +29,11 @@ module cpu (
logic [31:0] x_cord;
logic [31:0] y_cord;
logic [7:0] size;
logic [31:0] screen_pixel;
logic screen_pixel;
logic [7:0] sprite_pixel;
always_ff @(posedge clk_in) begin
if (rst_in) begin
halt = 0;
watch_key = 255;
sound_timer = 0;
delay_timer = 0;
cycle_counter = 0;
program_counter = 'h200;
stack_pointer = 4'b0000;
end
always_ff @(negedge clk_in) begin
if (system_ready) begin
opcode = {memory[program_counter+0], memory[program_counter+1]};
$display("HW : opcode is 0x%h (%b)", opcode, opcode);
$display("HW : PC %0d 0x%h", program_counter, program_counter);
@ -199,10 +191,10 @@ module cpu (
sprite_pixel = memory[{16'h0000, index_reg}+r] & ('h80 >> c);
if (|sprite_pixel) begin
if (screen_pixel == 32'hFFFFFFFF) begin
if (screen_pixel == 1) begin
registers[15] = 1;
end
vram[((r+y_cord)*64)+(x_cord+c)] ^= 32'hFFFFFFFF;
vram[((r+y_cord)*64)+(x_cord+c)] ^= 1;
end
end
end
@ -295,4 +287,5 @@ module cpu (
cycle_counter++;
end
end
endmodule

4
gpu.sv
View file

@ -1,9 +1,9 @@
module gpu (
input wire [31:0] vram[0:2047]
input wire vram[0:2047]
);
import "DPI-C" function void init_screen();
import "DPI-C" function void draw_screen(logic [31:0] vram[0:2047]);
import "DPI-C" function void draw_screen(logic vram[0:2047]);
initial begin
init_screen();

View file

@ -5,7 +5,7 @@ module keyboard (
import "DPI-C" function bit [7:0] get_key();
always_ff @(posedge clk_in) begin
always_ff @(negedge clk_in) begin
bit [7:0] keyval = get_key();
if (&keyval != 1) begin
keyboard[keyval[3:0]] = keyval[7];

View file

@ -17,6 +17,3 @@ clean:
format:
verible-verilog-format *.sv --inplace && clang-format *.cpp -i

View file

@ -1,13 +1,22 @@
module rom_loader (
output bit [7:0] memory[0:4095]
input wire clk_in,
input wire rst_in,
output bit [7:0] memory[0:4095],
output bit rom_ready
);
import "DPI-C" function int load_rom();
import "DPI-C" function bit [7:0] get_next_instr();
import "DPI-C" function void close_rom();
int rom_size;
initial begin
int rom_size = load_rom();
always @(negedge clk_in) begin
if (rst_in) begin
rom_ready = 0;
end
if (~rom_ready) begin
rom_size = load_rom();
$display("HW : ROM size is %0d bytes (%0d bits) (%0d instructions)", rom_size,
rom_size * 8, rom_size / 2);
for (int i = 0; i < rom_size; i++) begin
@ -15,5 +24,7 @@ module rom_loader (
end
close_rom();
$display("HW : ROM loaded successfully");
rom_ready = 1;
end
end
endmodule

1
the-bomb Submodule

@ -0,0 +1 @@
Subproject commit 69d8de45d344738425b88d9f8506a6c5c715a7ca

View file

@ -41,10 +41,10 @@ void set_beep(const svBit beep) {
SDL_SetTextureColorMod(texture, 255, 255, 255);
}
void draw_screen(const svLogicVecVal *vram) {
void draw_screen(const svLogic *vram) {
uint32_t *screen = (uint32_t *)malloc(SCREEN_WIDTH * SCREEN_HEIGHT * 32);
for (int i = 0; i < SCREEN_WIDTH * SCREEN_HEIGHT; i++) {
screen[i] = vram[i].aval;
screen[i] = vram[i] == 1 ? 0xFFFFFFFF : 0x00000000;
}
SDL_UpdateTexture(texture, NULL, screen, sizeof(screen[0]) * SCREEN_WIDTH);
SDL_RenderClear(renderer);