summaryrefslogtreecommitdiffstats
path: root/GPU
diff options
context:
space:
mode:
authorJames <james.mckenzie@citrix.com>2013-10-10 11:40:39 +0100
committerJames <james.mckenzie@citrix.com>2013-10-10 11:40:39 +0100
commit4b7ba2f7366194608aac59b47d0f3c7cd9f21fb1 (patch)
tree0a7bb29847dd16cae644be4893039e577c106964 /GPU
parentd32c5f6d4713b445ee9f17df51abb25211ee52d6 (diff)
downloadpong-4b7ba2f7366194608aac59b47d0f3c7cd9f21fb1.tar.gz
pong-4b7ba2f7366194608aac59b47d0f3c7cd9f21fb1.tar.bz2
pong-4b7ba2f7366194608aac59b47d0f3c7cd9f21fb1.zip
remove-path
Diffstat (limited to 'GPU')
-rw-r--r--GPU/gpu_hw.tcl138
-rw-r--r--GPU/hdl/GPU_IF.v219
2 files changed, 357 insertions, 0 deletions
diff --git a/GPU/gpu_hw.tcl b/GPU/gpu_hw.tcl
new file mode 100644
index 0000000..5eae01e
--- /dev/null
+++ b/GPU/gpu_hw.tcl
@@ -0,0 +1,138 @@
+# TCL File Generated by Component Editor 13.0sp1
+# Wed Oct 09 17:56:27 BST 2013
+# DO NOT MODIFY
+
+
+#
+# gpu "gpu" v1.0
+# 2013.10.09.17:56:27
+#
+#
+
+#
+# request TCL package from ACDS 13.1
+#
+package require -exact qsys 13.1
+
+
+#
+# module gpu
+#
+set_module_property DESCRIPTION ""
+set_module_property NAME gpu
+set_module_property VERSION 1.0
+set_module_property INTERNAL false
+set_module_property OPAQUE_ADDRESS_MAP true
+set_module_property GROUP my_lib
+set_module_property AUTHOR ""
+set_module_property DISPLAY_NAME gpu
+set_module_property INSTANTIATE_IN_SYSTEM_MODULE true
+set_module_property EDITABLE true
+set_module_property ANALYZE_HDL AUTO
+set_module_property REPORT_TO_TALKBACK false
+set_module_property ALLOW_GREYBOX_GENERATION false
+
+
+#
+# file sets
+#
+add_fileset QUARTUS_SYNTH QUARTUS_SYNTH "" ""
+set_fileset_property QUARTUS_SYNTH TOP_LEVEL gpuv2
+set_fileset_property QUARTUS_SYNTH ENABLE_RELATIVE_INCLUDE_PATHS false
+add_fileset_file GPU_IF.v VERILOG PATH hdl/GPU_IF.v
+
+add_fileset SIM_VHDL SIM_VHDL "" ""
+set_fileset_property SIM_VHDL TOP_LEVEL gpuv2
+set_fileset_property SIM_VHDL ENABLE_RELATIVE_INCLUDE_PATHS false
+add_fileset_file gpu_hw.tcl OTHER PATH gpu_hw.tcl
+
+
+#
+# parameters
+#
+
+
+#
+# display items
+#
+
+
+#
+# connection point clock
+#
+add_interface clock clock end
+set_interface_property clock clockRate 0
+set_interface_property clock ENABLED true
+set_interface_property clock EXPORT_OF ""
+set_interface_property clock PORT_NAME_MAP ""
+set_interface_property clock SVD_ADDRESS_GROUP ""
+
+add_interface_port clock clk clk Input 1
+
+
+#
+# connection point reset
+#
+add_interface reset reset end
+set_interface_property reset associatedClock clock
+set_interface_property reset synchronousEdges DEASSERT
+set_interface_property reset ENABLED true
+set_interface_property reset EXPORT_OF ""
+set_interface_property reset PORT_NAME_MAP ""
+set_interface_property reset SVD_ADDRESS_GROUP ""
+
+add_interface_port reset rst_n reset_n Input 1
+
+
+#
+# connection point vga
+#
+add_interface vga conduit end
+set_interface_property vga associatedClock ""
+set_interface_property vga associatedReset ""
+set_interface_property vga ENABLED true
+set_interface_property vga EXPORT_OF ""
+set_interface_property vga PORT_NAME_MAP ""
+set_interface_property vga SVD_ADDRESS_GROUP ""
+
+add_interface_port vga vga_red export Output 3
+add_interface_port vga vga_green export Output 3
+add_interface_port vga vga_blue export Output 3
+add_interface_port vga vga_hs export Output 1
+add_interface_port vga vga_vs export Output 1
+add_interface_port vga vga_clk export Input 1
+
+
+#
+# connection point avalon_slave
+#
+add_interface avalon_slave avalon end
+set_interface_property avalon_slave addressUnits WORDS
+set_interface_property avalon_slave associatedClock clock
+set_interface_property avalon_slave associatedReset reset
+set_interface_property avalon_slave bitsPerSymbol 8
+set_interface_property avalon_slave burstOnBurstBoundariesOnly false
+set_interface_property avalon_slave burstcountUnits WORDS
+set_interface_property avalon_slave explicitAddressSpan 0
+set_interface_property avalon_slave holdTime 0
+set_interface_property avalon_slave linewrapBursts false
+set_interface_property avalon_slave maximumPendingReadTransactions 0
+set_interface_property avalon_slave readLatency 0
+set_interface_property avalon_slave readWaitTime 1
+set_interface_property avalon_slave setupTime 0
+set_interface_property avalon_slave timingUnits Cycles
+set_interface_property avalon_slave writeWaitTime 0
+set_interface_property avalon_slave ENABLED true
+set_interface_property avalon_slave EXPORT_OF ""
+set_interface_property avalon_slave PORT_NAME_MAP ""
+set_interface_property avalon_slave SVD_ADDRESS_GROUP ""
+
+add_interface_port avalon_slave cs_n chipselect_n Input 1
+add_interface_port avalon_slave address address Input 7
+add_interface_port avalon_slave data writedata Input 32
+add_interface_port avalon_slave wr_n write_n Input 1
+set_interface_assignment avalon_slave embeddedsw.configuration.isFlash 0
+set_interface_assignment avalon_slave embeddedsw.configuration.isMemoryDevice 0
+set_interface_assignment avalon_slave embeddedsw.configuration.isNonVolatileStorage 0
+set_interface_assignment avalon_slave embeddedsw.configuration.isPrintableDevice 0
+
diff --git a/GPU/hdl/GPU_IF.v b/GPU/hdl/GPU_IF.v
new file mode 100644
index 0000000..f32de1e
--- /dev/null
+++ b/GPU/hdl/GPU_IF.v
@@ -0,0 +1,219 @@
+// gpuv2.v
+
+// This file was auto-generated as a prototype implementation of a module
+// 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] ball_x;
+ reg [8:0] ball_y;
+ reg [8:0] bat0_y;
+ reg [8:0] bat1_y;
+
+ reg [15:0] sprite[0:15];
+
+ wire [4:0] reg_addr;
+
+ assign reg_addr = address[6:2];
+
+
+ reg [2:0] sprite_red;
+ reg [2:0] sprite_green;
+ reg [2:0] sprite_blue;
+
+ always @(posedge clk or negedge rst_n)
+ begin
+ if (rst_n == 0) begin
+ ball_x <= 10'd127;
+ ball_y <= 10'd127;
+ bat0_y <= 10'd100;
+ bat1_y <= 10'd200;
+
+ 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'b000:
+ ball_x <= data[9:0];
+ 3'b001:
+ ball_y <= data[8:0];
+ 3'b010:
+ bat0_y <= data[8:0];
+ 3'b011:
+ bat1_y <= data[8:0];
+ 3'b100:
+ 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;
+ 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 <= 10'd0;
+ else if(trig_25M)
+ begin
+ if(vector_x != 10'd799)
+ vector_x <= vector_x + 1'b1;
+ else
+ vector_x <= 10'd0;
+ end
+ end
+
+ reg [9:0] vector_y;
+ always @ (posedge vga_clk or negedge rst_n)
+ begin
+ if(!rst_n)
+ vector_y <= 10'd0;
+ else if(trig_25M)
+ begin
+ if(vector_x == 10'd799)
+ begin
+ if(vector_y != 10'd524)
+ vector_y <= vector_y + 1'b1;
+ else
+ vector_y <= 10'd0;
+ 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 && vector_x < 10'd752)
+ 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 && vector_y < 10'd492)
+ vga_vs <= 1'b0;
+ else
+ vga_vs <= 1'b1;
+ end
+ end
+
+
+
+ reg [2:0] index;
+ always @ (posedge vga_clk or negedge rst_n)
+ begin
+ if(!rst_n)
+ index <= 3'b000;
+ else if(trig_25M)
+ begin
+ if(vector_x < 10'd640 && vector_y < 10'd480)
+ if(vector_x >= (ball_x - 8 )&& vector_x <=( ball_x + 7 )
+ && vector_y >= (ball_y - 8) && vector_y <= (ball_y + 7)) begin
+ if (sprite[(vector_y - (ball_y - 8)) & 15 ][(vector_x - (ball_x -8))& 15 ])
+ index <= 3'b001;
+ else
+ index <= 3'b000;
+ end else if (vector_x < 10'd4)
+ if (vector_y >=( bat0_y - 20 ) && vector_y <= (bat0_y + 20) )
+ index <= 3'b111;
+ else
+ index <= 3'b000;
+ else if (vector_x >= 10'd318 && vector_x < 10'd322)
+ index <= {3{vector_y[3]}};
+ else if (vector_x >= 10'd636 && vector_x < 10'd640)
+ if (vector_y >=( bat1_y - 20 ) && vector_y <= (bat1_y + 20) )
+ index <= 3'b111;
+ else
+ index <= 3'b000;
+ else
+ index <= 3'b000;
+ else
+ index <= 3'b000;
+ end
+ end
+
+ always begin
+ if (index == 3'b000) begin
+ vga_red = 3'b000;
+ vga_green = 3'b000;
+ vga_blue = 3'b000;
+ end else if (index == 3'b001) begin
+ vga_red = sprite_red;
+ vga_green= sprite_green;
+ vga_blue = sprite_blue;
+ end else begin
+ vga_red= 3'b111;
+ vga_green=3'b111;
+ vga_blue=3'b111;
+ end
+
+
+ end
+
+endmodule