summaryrefslogtreecommitdiffstats
path: root/GPU/hdl/GPU_IF.v
diff options
context:
space:
mode:
Diffstat (limited to 'GPU/hdl/GPU_IF.v')
-rw-r--r--GPU/hdl/GPU_IF.v494
1 files changed, 269 insertions, 225 deletions
diff --git a/GPU/hdl/GPU_IF.v b/GPU/hdl/GPU_IF.v
index 16c234d..94bc137 100644
--- a/GPU/hdl/GPU_IF.v
+++ b/GPU/hdl/GPU_IF.v
@@ -4,239 +4,283 @@
// created in component editor. It ties off all outputs to ground and
// ignores all inputs. It needs to be edited to make it do something
// useful.
-//
+//
// This file will not be automatically regenerated. You should check it in
// to your version control system if you want to keep it.
`timescale 1 ps / 1 ps
module gpuv2 #(
- parameter AUTO_CLOCK_CLOCK_RATE = "-1"
- ) (
- input wire clk, // clock.clk
- input wire rst_n, // reset.reset_n
- input wire vga_clk, // vga_out.export
- output reg [2:0] vga_red, // .export
- output reg [2:0] vga_green, // .export
- output reg [2:0] vga_blue, // .export
- output reg vga_hs, // .export
- output reg vga_vs, // .export
- input wire [31:0] data, // avalon_slave.writedata
- input wire wr_n, // .write_n
- input wire cs_n, // .chipselect_n
- input wire [6:0] address // .address
- );
-
-
- reg [9:0] sprite_x;
- reg [9:0] sprite_y;
- reg [9:0] bat0_y;
- reg [9:0] bat1_y;
-
- reg [15:0] sprite[0:15];
-
- wire [4:0] reg_addr;
-
- assign reg_addr = address[6:2];
-
- wire [9:0] offset;
-
- assign offset = 10'h80;
-
- reg [2:0] sprite_red;
- reg [2:0] sprite_green;
- reg [2:0] sprite_blue;
-
- reg blanking;
-
- always @(posedge clk or negedge rst_n)
- begin
- if (rst_n == 0) begin
- blanking <= 0;
- sprite_x <= 10'd127+offset;
- sprite_y <= 10'd127+offset;
- bat0_y <= 10'd100+offset;
- bat1_y <= 10'd200+offset;
-
- sprite[0]=16'b1111111111111111;
- sprite[1]=16'b1000000000000001;
- sprite[2]=16'b1000000000000001;
- sprite[3]=16'b1000000000000001;
- sprite[4]=16'b1000000000000001;
- sprite[5]=16'b1000000000000001;
- sprite[6]=16'b1000000000000001;
- sprite[7]=16'b1000000000000001;
- sprite[8]=16'b1000000000000001;
- sprite[9]=16'b1000000000000001;
- sprite[10]=16'b1000000000000001;
- sprite[11]=16'b1000000000000001;
- sprite[12]=16'b1000000000000001;
- sprite[13]=16'b1000000000000001;
- sprite[14]=16'b1000000000000001;
- sprite[15]=16'b1111111111111111;
-
- sprite_red[2:0]=3'b111;
- sprite_green[2:0]=3'b000;
- sprite_blue[2:0]=3'b111;
-
- end else if (~cs_n && ~wr_n) begin
- if (reg_addr[4]) begin
- sprite[reg_addr[3:0]]<=data[15:0];
- end else begin
- case (reg_addr[2:0])
- 3'd0:
- blanking <= data[0];
- 3'd1:
- sprite_x <= data[9:0];
- 3'd2:
- sprite_y <= data[9:0];
- 3'd3:
- bat0_y <= data[9:0];
- 3'd4:
- bat1_y <= data[9:0];
- 3'd5:
- begin
- sprite_red <= data[8:6];
- sprite_green <= data[5:3];
- sprite_blue <= data[2:0];
- end
- endcase
- end
- end
- end
-
-
- reg trig_25M;
- always @ (posedge vga_clk)
- begin
- if(!rst_n)
- trig_25M <= 1'b0;
+ parameter AUTO_CLOCK_CLOCK_RATE = "-1"
+ ) (
+ input wire clk, // clock.clk
+ input wire rst_n, // reset.reset_n
+ input wire vga_clk, // vga_out.export
+ output reg [2: 0] vga_red, // .export
+ output reg [2: 0] vga_green, // .export
+ output reg [2: 0] vga_blue, // .export
+ output reg vga_hs, // .export
+ output reg vga_vs, // .export
+ input wire [31: 0] data, // avalon_slave.writedata
+ input wire wr_n, // .write_n
+ input wire cs_n, // .chipselect_n
+ input wire [6: 0] address // .address
+ );
+
+
+
+
+localparam [4: 0]
+ GPU_REG_BLANK = 4'h0,
+ GPU_REG_SPRITE_X = 4'h1,
+ GPU_REG_SPRITE_Y = 4'h2,
+ GPU_REG_BAT0_Y = 4'h3,
+ GPU_REG_BAT1_Y = 4'h4,
+ GPU_REG_SPRITE_COLOUR = 4'h5,
+ GPU_REG_SPRITE_BASE = 4'h10;
+
+
+/*
+// 640x480 60Hz 25MHz
+localparam [13: 0] GPU_ZERO = 14'd0,
+ GPU_H_ACTIVE = 14'd640,
+ GPU_H_SYNC_START = 14'd656,
+ GPU_H_SYNC_END = 14'd752,
+ GPU_H_TOTAL = 14'd799,
+ GPU_V_ACTIVE = 14'd480,
+ GPU_V_SYNC_START = 14'd490,
+ GPU_V_SYNC_END = 14'd492,
+ GPU_V_TOTAL = 14'd524;
+
+
+reg pixel_clk;
+always @ (posedge vga_clk) begin
+ if (!rst_n)
+ pixel_clk <= 1'b0;
else
- trig_25M <= ~trig_25M;
- end
-
- reg [9:0] vector_x;
- always @ (posedge vga_clk or negedge rst_n)
- begin
- if(!rst_n)
- vector_x <= offset;
- else if(trig_25M)
- begin
- if(vector_x != (10'd799 + offset))
- vector_x <= vector_x + 1'b1;
+ pixel_clk <= ~pixel_clk;
+end
+
+*/
+
+// 800x600 75Hz 49.5MHz
+localparam [13: 0] GPU_ZERO = 14'd0,
+ GPU_H_ACTIVE = 14'd800,
+ GPU_H_SYNC_START = 14'd816,
+ GPU_H_SYNC_END = 14'd896,
+ GPU_H_TOTAL = 14'd1055,
+ GPU_V_ACTIVE = 14'd600,
+ GPU_V_SYNC_START = 14'd601,
+ GPU_V_SYNC_END = 14'd604,
+ GPU_V_TOTAL = 14'd625;
+
+wire pixel_clk=vga_clk;
+
+localparam [13: 0] GPU_OFFSET=14'h80,
+ BAT_WIDTH=14'd4,
+ NET_WIDTH=14'd4;
+
+reg blanking;
+reg [13: 0] sprite_x, sprite_y, bat0_y, bat1_y;
+reg [2: 0] sprite_red, sprite_green, sprite_blue;
+reg [15: 0] sprite[0: 15];
+
+assign reg_addr = address[6: 2];
+wire [4: 0] reg_addr;
+
+always @(posedge clk or negedge rst_n) begin
+ if (rst_n == 0) begin
+ blanking <= 1;
+ sprite_x <= GPU_ZERO;
+ sprite_y <= GPU_ZERO;
+ bat0_y <= GPU_ZERO;
+ bat1_y <= GPU_ZERO;
+
+ sprite[0] = 16'b1111111111111111;
+ sprite[1] = 16'b1000000000000001;
+ sprite[2] = 16'b1000000000000001;
+ sprite[3] = 16'b1000000000000001;
+ sprite[4] = 16'b1000000000000001;
+ sprite[5] = 16'b1000000000000001;
+ sprite[6] = 16'b1000000000000001;
+ sprite[7] = 16'b1000000000000001;
+ sprite[8] = 16'b1000000000000001;
+ sprite[9] = 16'b1000000000000001;
+ sprite[10] = 16'b1000000000000001;
+ sprite[11] = 16'b1000000000000001;
+ sprite[12] = 16'b1000000000000001;
+ sprite[13] = 16'b1000000000000001;
+ sprite[14] = 16'b1000000000000001;
+ sprite[15] = 16'b1111111111111111;
+
+ sprite_red[2: 0] = 3'b111;
+ sprite_green[2: 0] = 3'b000;
+ sprite_blue[2: 0] = 3'b111;
+
+ end
+ else if (~cs_n && ~wr_n) begin
+ if (reg_addr[4]) begin
+ sprite[reg_addr[3: 0]] <= data[15: 0];
+ end
+ else begin
+ case (reg_addr[4: 0])
+ GPU_REG_BLANK:
+ blanking <= data[0];
+ GPU_REG_SPRITE_X:
+ sprite_x <= data[13: 0];
+ GPU_REG_SPRITE_Y:
+ sprite_y <= data[13: 0];
+ GPU_REG_BAT0_Y:
+ bat0_y <= data[13: 0];
+ GPU_REG_BAT1_Y:
+ bat1_y <= data[13: 0];
+ GPU_REG_SPRITE_COLOUR: begin
+ sprite_red <= data[8: 6];
+ sprite_green <= data[5: 3];
+ sprite_blue <= data[2: 0];
+ end
+ endcase
+ end
+ end
+end
+
+
+reg [13: 0] vector_x;
+always @ (posedge pixel_clk or negedge rst_n) begin
+ if (!rst_n)
+ vector_x <= GPU_OFFSET;
+ else begin
+ if (vector_x != (GPU_H_TOTAL + GPU_OFFSET))
+ vector_x <= vector_x + 1'b1;
else
- vector_x <= offset;
- end
- end
-
- reg [9:0] vector_y;
- always @ (posedge vga_clk or negedge rst_n)
- begin
- if(!rst_n)
- vector_y <= offset;
- else if(trig_25M)
- begin
- if(vector_x == (10'd799 + offset))
- begin
- if(vector_y != (10'd524 + offset))
- vector_y <= vector_y + 1'b1;
+ vector_x <= GPU_OFFSET;
+ end
+end
+
+
+reg [13: 0] vector_y;
+always @ (posedge pixel_clk or negedge rst_n) begin
+ if (!rst_n)
+ vector_y <= GPU_OFFSET;
+ else begin
+ if (vector_x == (GPU_H_TOTAL + GPU_OFFSET )) begin
+ if (vector_y != (GPU_V_TOTAL + GPU_OFFSET))
+ vector_y <= vector_y + 1'b1;
else
- vector_y <= offset;
- end
- end
- end
-
- always @ (posedge vga_clk or negedge rst_n)
- begin
- if(!rst_n)
- vga_hs <= 1'b0;
- else if(trig_25M)
- begin
- if(vector_x >= (10'd656 + offset) && vector_x < (10'd752+offset))
- vga_hs <= 1'b0;
+ vector_y <= GPU_OFFSET;
+ end
+ end
+end
+
+
+always @ (posedge pixel_clk or negedge rst_n) begin
+ if (!rst_n)
+ vga_hs <= 1'b0;
+ else begin
+ if (vector_x >= (GPU_H_SYNC_START + GPU_OFFSET) && vector_x < (GPU_H_SYNC_END + GPU_OFFSET))
+ vga_hs <= 1'b0;
else
- vga_hs <= 1'b1;
- end
- end
-
- always @ (posedge vga_clk or negedge rst_n)
- begin
- if(!rst_n)
- vga_vs <= 1'b0;
- else if(trig_25M)
- begin
- if(vector_y >= (10'd490+offset) && vector_y < (10'd492+offset))
- vga_vs <= 1'b0;
+ vga_hs <= 1'b1;
+ end
+end
+
+always @ (posedge pixel_clk or negedge rst_n) begin
+ if (!rst_n)
+ vga_vs <= 1'b0;
+ else begin
+ if (vector_y >= (GPU_V_SYNC_START + GPU_OFFSET) && vector_y < (GPU_V_SYNC_END + GPU_OFFSET))
+ vga_vs <= 1'b0;
+ else
+ vga_vs <= 1'b1;
+ end
+end
+
+
+
+
+reg px_blank;
+
+always @ (posedge pixel_clk or negedge rst_n) begin
+ if (!rst_n)
+ px_blank <= 1;
+ else begin
+ if (vector_x >= GPU_OFFSET && vector_x < (GPU_H_ACTIVE + GPU_OFFSET) && vector_y >= GPU_OFFSET && vector_y < (GPU_V_ACTIVE + GPU_OFFSET))
+ px_blank <= blanking;
+ else
+ px_blank <= 1;
+ end
+end
+
+
+
+reg px_bat;
+
+always @ (posedge pixel_clk or negedge rst_n) begin
+ if (!rst_n) begin
+ px_bat <= 0;
+ end
+ else begin
+ if (vector_x < (BAT_WIDTH + GPU_OFFSET) && vector_y >= ( bat0_y - 20 ) && vector_y <= (bat0_y + 20) )
+ px_bat <= 1;
+ else if (vector_x >= (GPU_OFFSET + GPU_H_ACTIVE - BAT_WIDTH) && vector_y >= ( bat1_y - 20 ) && vector_y <= (bat1_y + 20) )
+ px_bat <= 1 ;
else
- vga_vs <= 1'b1;
- end
- end
-
-
-
- reg px_bat;
- reg px_net;
- reg px_sprite;
- reg px_blank;
-
- always @ (posedge vga_clk or negedge rst_n)
- begin
- if(!rst_n) begin
- px_bat <= 0;
- px_net <= 0;
- px_sprite <= 0;
- px_blank <= 1;
- end else if(trig_25M) begin
- if(vector_x>= offset && vector_x < (10'd640+offset) && vector_y >= offset && vector_y < (10'd480+offset))
- px_blank<= blanking;
- else
- px_blank<=1;
-
- if(vector_x >= (sprite_x - 8 )&& vector_x <=( sprite_x + 7 )
- && vector_y >= (sprite_y - 8) && vector_y <= (sprite_y + 7))
- px_sprite <= sprite[(vector_y - (sprite_y - 8)) & 15 ][(vector_x - (sprite_x -8))& 15 ];
- else
- px_sprite <= 0;
-
- if (vector_x < (10'd4+offset) && vector_y >=( bat0_y - 20 ) && vector_y <= (bat0_y + 20) )
- px_bat <= 1;
- else if (vector_x >= (10'd636 + offset) && vector_y >=( bat1_y - 20 ) && vector_y <= (bat1_y + 20) )
- px_bat <=1 ;
- else
- px_bat <=0;
-
-
- if (vector_x >= (10'd318 +offset) && vector_x < (10'd322+offset))
- px_net <= {3{vector_y[3]}};
- else
- px_net <= 0;
-
- end
- end
-
- always begin
- if (px_blank) begin
- vga_red = 3'b000;
- vga_green = 3'b000;
- vga_blue = 3'b000;
- end else if (px_bat) begin
- vga_red= 3'b111;
- vga_green=3'b111;
- vga_blue=3'b111;
- end else if (px_sprite) begin
- vga_red = sprite_red;
- vga_green= sprite_green;
- vga_blue = sprite_blue;
- end else if (px_net) begin
- vga_red= 3'b111;
- vga_green=3'b111;
- vga_blue=3'b111;
- end else begin
- vga_red = 3'b000;
- vga_green = 3'b000;
- vga_blue = 3'b000;
- end
-
-
- end
-
+ px_bat <= 0;
+ end
+end
+
+
+
+reg px_net;
+
+always @ (posedge pixel_clk or negedge rst_n) begin
+ if (!rst_n)
+ px_net <= 0;
+ else begin
+ if (vector_x >= (GPU_OFFSET + ( (GPU_H_ACTIVE - NET_WIDTH) / 2) ) && vector_x < ( GPU_OFFSET + ((GPU_H_ACTIVE + NET_WIDTH) / 2)))
+ px_net <= {3{vector_y[3]}};
+ else
+ px_net <= 0;
+ end
+end
+
+
+
+reg px_sprite;
+
+always @ (posedge pixel_clk or negedge rst_n) begin
+ if (!rst_n)
+ px_sprite <= 0;
+ else begin
+ if (vector_x >= (sprite_x - 8 ) && vector_x <= ( sprite_x + 7 )
+ && vector_y >= (sprite_y - 8) && vector_y <= (sprite_y + 7))
+ px_sprite <= sprite[(vector_y - (sprite_y - 8)) & 15 ][(vector_x - (sprite_x - 8)) & 15 ];
+ else
+ px_sprite <= 0;
+ end
+end
+
+always begin
+ if (px_blank) begin
+ vga_red = 3'b000;
+ vga_green = 3'b000;
+ vga_blue = 3'b000;
+ end else if (px_bat) begin
+ vga_red = 3'b111;
+ vga_green = 3'b111;
+ vga_blue = 3'b111;
+ end else if (px_sprite) begin
+ vga_red = sprite_red;
+ vga_green = sprite_green;
+ vga_blue = sprite_blue;
+ end else if (px_net) begin
+ vga_red = 3'b111;
+ vga_green = 3'b111;
+ vga_blue = 3'b111;
+ end else begin
+ vga_red = 3'b000;
+ vga_green = 3'b000;
+ vga_blue = 3'b000;
+ end
+end
+
endmodule