mirror of
https://github.com/sehugg/8bitworkshop.git
synced 2025-01-02 23:30:21 +00:00
update presets; redir.html expire
This commit is contained in:
parent
c6f66dd11d
commit
0ee201b9e8
@ -18,7 +18,7 @@ module ball_absolute_top(clk, reset, hsync, vsync, rgb);
|
|||||||
reg [8:0] ball_vert_initial = 128;
|
reg [8:0] ball_vert_initial = 128;
|
||||||
reg [8:0] ball_vert_move = 2;
|
reg [8:0] ball_vert_move = 2;
|
||||||
|
|
||||||
localparam BALL_SIZE = 8;
|
localparam BALL_SIZE = 4;
|
||||||
|
|
||||||
hvsync_generator hvsync_gen(
|
hvsync_generator hvsync_gen(
|
||||||
.clk(clk),
|
.clk(clk),
|
||||||
@ -54,16 +54,16 @@ module ball_absolute_top(clk, reset, hsync, vsync, rgb);
|
|||||||
ball_horiz_move <= -ball_horiz_move;
|
ball_horiz_move <= -ball_horiz_move;
|
||||||
end
|
end
|
||||||
|
|
||||||
wire [8:0] ball_hdiff = ball_hpos - hpos;
|
wire [8:0] ball_hdiff = hpos - ball_hpos;
|
||||||
wire [8:0] ball_vdiff = ball_vpos - vpos;
|
wire [8:0] ball_vdiff = vpos - ball_vpos;
|
||||||
|
|
||||||
wire ball_hgfx = ball_hdiff < BALL_SIZE;
|
wire ball_hgfx = ball_hdiff < BALL_SIZE;
|
||||||
wire ball_vgfx = ball_vdiff < BALL_SIZE;
|
wire ball_vgfx = ball_vdiff < BALL_SIZE;
|
||||||
wire ball_gfx = ball_hgfx && ball_vgfx;
|
wire ball_gfx = ball_hgfx && ball_vgfx;
|
||||||
|
|
||||||
// collide with vertical and horizontal boundaries
|
// collide with vertical and horizontal boundaries
|
||||||
wire ball_vert_collide = ball_vgfx && (vpos==V_DISPLAY || vpos==0);
|
wire ball_vert_collide = ball_vpos >= 240 - BALL_SIZE;
|
||||||
wire ball_horiz_collide = ball_hgfx && vpos==0 && (hpos==H_DISPLAY || hpos==0);
|
wire ball_horiz_collide = ball_hpos >= 256 - BALL_SIZE;
|
||||||
|
|
||||||
wire grid_gfx = (((hpos&7)==0) && ((vpos&7)==0));
|
wire grid_gfx = (((hpos&7)==0) && ((vpos&7)==0));
|
||||||
|
|
||||||
|
@ -9,12 +9,12 @@ module RAM_sync(clk, addr, din, dout, we);
|
|||||||
parameter D = 8; // # of data bits
|
parameter D = 8; // # of data bits
|
||||||
|
|
||||||
input clk; // clock
|
input clk; // clock
|
||||||
input [A-1:0] addr; // 10-bit address
|
input [A-1:0] addr; // address
|
||||||
input [D-1:0] din; // 8-bit data input
|
input [D-1:0] din; // data input
|
||||||
output [D-1:0] dout; // 8-bit data output
|
output [D-1:0] dout; // data output
|
||||||
input we; // write enable
|
input we; // write enable
|
||||||
|
|
||||||
reg [D-1:0] mem [0:(1<<A)-1]; // 1024x8 bit memory
|
reg [D-1:0] mem [0:(1<<A)-1]; // (1<<A)xD bit memory
|
||||||
|
|
||||||
always @(posedge clk) begin
|
always @(posedge clk) begin
|
||||||
if (we) // if write enabled
|
if (we) // if write enabled
|
||||||
@ -30,12 +30,12 @@ module RAM_async(clk, addr, din, dout, we);
|
|||||||
parameter D = 8; // # of data bits
|
parameter D = 8; // # of data bits
|
||||||
|
|
||||||
input clk; // clock
|
input clk; // clock
|
||||||
input [A-1:0] addr; // 10-bit address
|
input [A-1:0] addr; // address
|
||||||
input [D-1:0] din; // 8-bit data input
|
input [D-1:0] din; // data input
|
||||||
output [D-1:0] dout; // 8-bit data output
|
output [D-1:0] dout; // data output
|
||||||
input we; // write enable
|
input we; // write enable
|
||||||
|
|
||||||
reg [D-1:0] mem [0:(1<<A)-1]; // 1024x8 bit memory
|
reg [D-1:0] mem [0:(1<<A)-1]; // (1<<A)xD bit memory
|
||||||
|
|
||||||
always @(posedge clk) begin
|
always @(posedge clk) begin
|
||||||
if (we) // if write enabled
|
if (we) // if write enabled
|
||||||
|
@ -1,26 +1,6 @@
|
|||||||
`include "hvsync_generator.v"
|
`include "hvsync_generator.v"
|
||||||
`include "digits10.v"
|
`include "digits10.v"
|
||||||
|
`include "ram.v"
|
||||||
module RAM(clk, addr, din, dout, we);
|
|
||||||
|
|
||||||
parameter A = 10; // # of address bits
|
|
||||||
parameter D = 8; // # of data bits
|
|
||||||
|
|
||||||
input clk; // clock
|
|
||||||
input [A-1:0] addr; // 10-bit address
|
|
||||||
input [D-1:0] din; // 8-bit data input
|
|
||||||
output [D-1:0] dout; // 8-bit data output
|
|
||||||
input we; // write enable
|
|
||||||
|
|
||||||
reg [D-1:0] mem [0:(1<<A)-1]; // 1024x8 bit memory
|
|
||||||
|
|
||||||
always @(posedge clk) begin
|
|
||||||
if (we) // if write enabled
|
|
||||||
mem[addr] <= din; // write memory from din
|
|
||||||
dout <= mem[addr]; // read memory to dout
|
|
||||||
end
|
|
||||||
|
|
||||||
endmodule
|
|
||||||
|
|
||||||
module test_ram1_top(clk, reset, hsync, vsync, rgb);
|
module test_ram1_top(clk, reset, hsync, vsync, rgb);
|
||||||
|
|
||||||
@ -38,7 +18,7 @@ module test_ram1_top(clk, reset, hsync, vsync, rgb);
|
|||||||
reg ram_writeenable = 0;
|
reg ram_writeenable = 0;
|
||||||
|
|
||||||
// RAM to hold 32x32 array of bytes
|
// RAM to hold 32x32 array of bytes
|
||||||
RAM ram(
|
RAM_sync ram(
|
||||||
.clk(clk),
|
.clk(clk),
|
||||||
.dout(ram_read),
|
.dout(ram_read),
|
||||||
.din(ram_write),
|
.din(ram_write),
|
||||||
|
@ -35,44 +35,54 @@ module sprite_scanline_renderer(clk, reset, hpos, vpos, rgb,
|
|||||||
ram_addr, ram_data, ram_busy,
|
ram_addr, ram_data, ram_busy,
|
||||||
rom_addr, rom_data);
|
rom_addr, rom_data);
|
||||||
|
|
||||||
parameter NB = 5;
|
parameter NB = 5; // 2^NB == number of sprites
|
||||||
parameter MB = 3;
|
parameter MB = 3; // 2^MB == slots per scanline
|
||||||
|
|
||||||
localparam N = 1<<NB;
|
localparam N = 1<<NB; // number of sprites
|
||||||
localparam M = 1<<MB;
|
localparam M = 1<<MB; // slots per scanline
|
||||||
|
|
||||||
input clk, reset;
|
input clk, reset;
|
||||||
input [8:0] hpos;
|
input [8:0] hpos;
|
||||||
input [8:0] vpos;
|
input [8:0] vpos;
|
||||||
output [3:0] rgb;
|
output [3:0] rgb;
|
||||||
|
|
||||||
output [NB:0] ram_addr;
|
output [NB:0] ram_addr; // RAM for sprite data
|
||||||
input [15:0] ram_data;
|
input [15:0] ram_data; // (2 words per sprite)
|
||||||
output ram_busy;
|
output ram_busy; // set when accessing RAM
|
||||||
|
|
||||||
output [15:0] rom_addr;
|
output [15:0] rom_addr; // sprite ROM address
|
||||||
input [15:0] rom_data;
|
input [15:0] rom_data; // sprite ROM data
|
||||||
|
|
||||||
|
// copy of sprite data from RAM
|
||||||
reg [7:0] sprite_xpos[0:N-1];
|
reg [7:0] sprite_xpos[0:N-1];
|
||||||
reg [7:0] sprite_ypos[0:N-1];
|
reg [7:0] sprite_ypos[0:N-1];
|
||||||
reg [7:0] sprite_attr[0:N-1];
|
reg [7:0] sprite_attr[0:N-1];
|
||||||
|
|
||||||
|
// mapping of N sprites to M line slots
|
||||||
reg [NB-1:0] sprite_to_line[0:M-1];
|
reg [NB-1:0] sprite_to_line[0:M-1];
|
||||||
reg [7:0] line_xpos[0:M-1];
|
|
||||||
reg [7:0] line_yofs[0:M-1];
|
reg [7:0] line_xpos[0:M-1]; // X pos for M slots
|
||||||
reg [7:0] line_attr[0:M-1];
|
reg [7:0] line_yofs[0:M-1]; // Y pos for M slots
|
||||||
reg line_active[0:M-1];
|
reg [7:0] line_attr[0:M-1]; // attr for M slots
|
||||||
reg [3:0] scanline[0:511];
|
reg line_active[0:M-1]; // slot active?
|
||||||
|
|
||||||
|
// temporary counters
|
||||||
reg [NB-1:0] i; // 0..N-1
|
reg [NB-1:0] i; // 0..N-1
|
||||||
reg [MB-1:0] j; // 0..M-1
|
reg [MB-1:0] j; // 0..M-1
|
||||||
reg [MB-1:0] k; // 0..M-1
|
reg [MB-1:0] k; // 0..M-1
|
||||||
reg [7:0] z;
|
reg [7:0] z;
|
||||||
reg [8:0] write_ofs;
|
reg [8:0] write_ofs;
|
||||||
|
|
||||||
wire [8:0] read_bufidx = {vpos[0], hpos[7:0]};
|
|
||||||
reg [15:0] out_bitmap;
|
reg [15:0] out_bitmap;
|
||||||
reg [7:0] out_attr;
|
reg [7:0] out_attr;
|
||||||
wire [NB-1:0] load_index = hpos[NB+2:3];
|
|
||||||
|
// which sprite are we currently reading?
|
||||||
|
wire [NB-1:0] load_index = hpos[NB+1:2];
|
||||||
|
|
||||||
|
// RGB dual scanline buffer
|
||||||
|
reg [3:0] scanline[0:511];
|
||||||
|
|
||||||
|
// which offset in scanline buffer to read?
|
||||||
|
wire [8:0] read_bufidx = {vpos[0], hpos[7:0]};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
0: read sprite_ypos[i]
|
0: read sprite_ypos[i]
|
||||||
@ -95,18 +105,20 @@ module sprite_scanline_renderer(clk, reset, hpos, vpos, rgb,
|
|||||||
// load sprites from RAM on line 260
|
// load sprites from RAM on line 260
|
||||||
// 8 cycles per sprite
|
// 8 cycles per sprite
|
||||||
// do first sprite twice b/c CPU might still be busy
|
// do first sprite twice b/c CPU might still be busy
|
||||||
if (vpos == 260 && hpos < N*8+8) begin
|
if (vpos == 260 && hpos < N*4+8) begin
|
||||||
ram_busy <= 1;
|
ram_busy <= 1;
|
||||||
case (hpos[2:0])
|
case (hpos[1:0])
|
||||||
3: begin
|
0: begin
|
||||||
ram_addr <= {load_index, 1'b0};
|
ram_addr <= {load_index, 1'b0};
|
||||||
end
|
end
|
||||||
5: begin
|
1: begin
|
||||||
sprite_xpos[load_index] <= ram_data[7:0];
|
|
||||||
sprite_ypos[load_index] <= ram_data[15:8];
|
|
||||||
ram_addr <= {load_index, 1'b1};
|
ram_addr <= {load_index, 1'b1};
|
||||||
end
|
end
|
||||||
7: begin
|
2: begin
|
||||||
|
sprite_xpos[load_index] <= ram_data[7:0];
|
||||||
|
sprite_ypos[load_index] <= ram_data[15:8];
|
||||||
|
end
|
||||||
|
3: begin
|
||||||
sprite_attr[load_index] <= ram_data[7:0];
|
sprite_attr[load_index] <= ram_data[7:0];
|
||||||
end
|
end
|
||||||
endcase
|
endcase
|
||||||
|
13
redir.html
13
redir.html
@ -1,4 +1,17 @@
|
|||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
|
||||||
|
<meta http-equiv="Pragma" content="no-cache" />
|
||||||
|
<meta http-equiv="Expires" content="0" />
|
||||||
|
</head>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
var VERSION = '2.1.1';
|
var VERSION = '2.1.1';
|
||||||
document.location.href = 'v' + VERSION + '/' + document.location.search;
|
document.location.href = 'v' + VERSION + '/' + document.location.search;
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
|
@ -7,6 +7,7 @@ var VERILOG_PRESETS = [
|
|||||||
{id:'7segment.v', name:'7-Segment Decoder'},
|
{id:'7segment.v', name:'7-Segment Decoder'},
|
||||||
{id:'digits10.v', name:'Bitmapped Digits'},
|
{id:'digits10.v', name:'Bitmapped Digits'},
|
||||||
{id:'scoreboard.v', name:'Scoreboard'},
|
{id:'scoreboard.v', name:'Scoreboard'},
|
||||||
|
{id:'ball_absolute.v', name:'Ball Motion (absolute position)'},
|
||||||
{id:'ball_slip_counter.v', name:'Ball Motion (slipping counter)'},
|
{id:'ball_slip_counter.v', name:'Ball Motion (slipping counter)'},
|
||||||
{id:'ball_paddle.v', name:'Brick Smash Game'},
|
{id:'ball_paddle.v', name:'Brick Smash Game'},
|
||||||
{id:'ram1.v', name:'RAM Text Display'},
|
{id:'ram1.v', name:'RAM Text Display'},
|
||||||
|
Loading…
Reference in New Issue
Block a user