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

23
cpu.sv
View file

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

4
gpu.sv
View file

@ -1,9 +1,9 @@
module gpu ( 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 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 initial begin
init_screen(); init_screen();

View file

@ -5,7 +5,7 @@ module keyboard (
import "DPI-C" function bit [7:0] get_key(); 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(); bit [7:0] keyval = get_key();
if (&keyval != 1) begin if (&keyval != 1) begin
keyboard[keyval[3:0]] = keyval[7]; keyboard[keyval[3:0]] = keyval[7];

View file

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

View file

@ -1,19 +1,30 @@
module rom_loader ( 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 int load_rom();
import "DPI-C" function bit [7:0] get_next_instr(); import "DPI-C" function bit [7:0] get_next_instr();
import "DPI-C" function void close_rom(); import "DPI-C" function void close_rom();
int rom_size;
initial begin always @(negedge clk_in) begin
int rom_size = load_rom(); if (rst_in) begin
$display("HW : ROM size is %0d bytes (%0d bits) (%0d instructions)", rom_size, rom_ready = 0;
rom_size * 8, rom_size / 2); end
for (int i = 0; i < rom_size; i++) begin
memory['h200+i] = get_next_instr(); 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 end
close_rom();
$display("HW : ROM loaded successfully");
end end
endmodule 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); 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); uint32_t *screen = (uint32_t *)malloc(SCREEN_WIDTH * SCREEN_HEIGHT * 32);
for (int i = 0; i < SCREEN_WIDTH * SCREEN_HEIGHT; i++) { 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_UpdateTexture(texture, NULL, screen, sizeof(screen[0]) * SCREEN_WIDTH);
SDL_RenderClear(renderer); SDL_RenderClear(renderer);