From 9804af7796781f700f35665b7f43d53b1ea78689 Mon Sep 17 00:00:00 2001 From: Nicholas Orlowsky Date: Sat, 6 Apr 2024 16:38:23 -0500 Subject: [PATCH] use 1 bit map for screen --- .gitmodules | 3 +++ chip8.sv | 25 ++++++++++++++----------- cpu.sv | 23 ++++++++--------------- gpu.sv | 4 ++-- keyboard.sv | 2 +- makefile | 3 --- rom_loader.sv | 29 ++++++++++++++++++++--------- the-bomb | 1 + yayacemu.cpp | 4 ++-- 9 files changed, 51 insertions(+), 43 deletions(-) create mode 100644 .gitmodules create mode 160000 the-bomb diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..4466bb6 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "the-bomb"] + path = the-bomb + url = git@github.com:nickorlow/the-bomb.git diff --git a/chip8.sv b/chip8.sv index 62870bf..3d00bf0 100644 --- a/chip8.sv +++ b/chip8.sv @@ -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, @@ -25,7 +31,7 @@ module chip8 ( cycle_counter, program_counter, vram, - sound_timer + sound_timer ); gpu gpu (vram); keyboard kb ( @@ -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, @@ -130,11 +136,8 @@ module chip8 ( for (int i = 0; i < 80; i++) begin 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 diff --git a/cpu.sv b/cpu.sv index 7fb3a2c..ba35783 100644 --- a/cpu.sv +++ b/cpu.sv @@ -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 @@ -294,5 +286,6 @@ module cpu ( if (!halt) program_counter += 2; cycle_counter++; +end end endmodule diff --git a/gpu.sv b/gpu.sv index 4ebbd8f..e0e16d8 100644 --- a/gpu.sv +++ b/gpu.sv @@ -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(); diff --git a/keyboard.sv b/keyboard.sv index 0131148..2104940 100644 --- a/keyboard.sv +++ b/keyboard.sv @@ -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]; diff --git a/makefile b/makefile index 6c8603b..266fbf7 100644 --- a/makefile +++ b/makefile @@ -17,6 +17,3 @@ clean: format: verible-verilog-format *.sv --inplace && clang-format *.cpp -i - - - diff --git a/rom_loader.sv b/rom_loader.sv index 5bdf540..51ceeaf 100644 --- a/rom_loader.sv +++ b/rom_loader.sv @@ -1,19 +1,30 @@ 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(); - $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 - memory['h200+i] = get_next_instr(); + 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 + memory['h200+i] = get_next_instr(); + end + close_rom(); + $display("HW : ROM loaded successfully"); + rom_ready = 1; end - close_rom(); - $display("HW : ROM loaded successfully"); end endmodule diff --git a/the-bomb b/the-bomb new file mode 160000 index 0000000..69d8de4 --- /dev/null +++ b/the-bomb @@ -0,0 +1 @@ +Subproject commit 69d8de45d344738425b88d9f8506a6c5c715a7ca diff --git a/yayacemu.cpp b/yayacemu.cpp index 3021574..e40d11d 100644 --- a/yayacemu.cpp +++ b/yayacemu.cpp @@ -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);