diff --git a/TankGame.srcs/pic/lightning_20_20.coe b/TankGame.srcs/pic/lightning_20_20.coe new file mode 100644 index 0000000..c8bd030 --- /dev/null +++ b/TankGame.srcs/pic/lightning_20_20.coe @@ -0,0 +1,402 @@ +memory_initialization_radix=2; +memory_initialization_vector=111111111111, +111111111111, +111111111111, +111111111111, +111111111111, +111111111111, +110111101111, +101110111111, +010101101110, +000100101101, +000100101101, +010101101110, +101110111111, +110111101111, +111111111111, +111111111111, +111111111111, +111111111111, +111111111111, +111111111111, +111111111111, +111111111111, +111111111111, +111111111111, +101010101111, +001101001101, +000100101101, +000000011101, +011001111110, +110111011111, +110111011111, +011001111110, +000000011101, +000100101101, +001101001101, +101010101111, +111111111111, +111111111111, +111111111111, +111111111111, +111111111111, +111111111111, +010101101110, +000100101101, +000100111101, +011001111110, +101010101111, +111111111111, +111111111111, +111111111111, +111111111111, +111111111111, +111111111111, +101010101111, +011001111110, +000100111101, +000100101101, +010101101110, +111111111111, +111111111111, +111111111111, +111111111111, +000000101101, +101111001111, +111111111111, +111111111111, +111111111111, +111111111111, +111111111111, +111111111111, +111111111111, +111011101111, +111111111111, +111111111111, +111111111111, +111111111111, +101111001111, +000000101101, +111111111111, +111111111111, +111111111111, +111111111111, +000000101101, +110111011111, +111111111111, +111111111111, +111111111111, +111111111111, +111111111111, +111111111111, +111111111111, +101110111111, +111111111111, +111111111111, +111111111111, +111111111111, +110111011111, +000000101101, +111111111111, +111111111111, +111111111111, +111111111111, +000000101101, +110111011111, +111111111111, +111111111111, +111111111111, +111111111111, +111111111111, +111111111111, +011101111110, +101010101111, +111111111111, +111111111111, +111111111111, +111111111111, +110111011111, +000000101101, +111111111111, +111111111111, +111111111111, +111111111111, +000000101101, +110111011111, +111111111111, +111111111111, +111111111111, +111111111111, +111111111111, +101111001111, +000000101101, +101110111111, +111111111111, +111111111111, +111111111111, +111111111111, +110111011111, +000000101101, +111111111111, +111111111111, +111111111111, +111111111111, +000100101101, +110111011111, +111111111111, +111111111111, +111111111111, +111111111111, +110111011111, +000100111101, +000000011101, +110111011111, +111111111111, +111111111111, +111111111111, +111111111111, +110111011111, +000100101101, +111111111111, +111111111111, +111111111111, +111111111111, +000100101101, +110111011111, +111111111111, +111111111111, +111111111111, +111111111111, +010001011110, +000000011101, +000000011101, +111011101111, +111111111111, +111111111111, +111111111111, +111111111111, +110111011111, +000100101101, +111111111111, +111111111111, +111111111111, +111111111111, +000100101101, +110111011111, +111111111111, +111111111111, +111111111111, +011110001110, +000000011101, +000000011101, +000000011101, +001101011110, +010001011110, +110111011111, +111111111111, +111111111111, +110111011111, +000100101101, +111111111111, +111111111111, +111111111111, +111111111111, +000100101101, +110111011111, +111111111111, +111111111111, +110111011111, +010001011110, +001101011110, +000000011101, +000000011101, +000000011101, +011110001110, +111111111111, +111111111111, +111111111111, +110111011111, +000100101101, +111111111111, +111111111111, +111111111111, +111111111111, +000100111101, +110111011111, +111111111111, +111111111111, +111111111111, +111111111111, +111011101111, +000000011101, +000000011101, +010001011110, +111111111111, +111111111111, +111111111111, +111111111111, +110111011111, +000100111101, +111111111111, +111111111111, +111111111111, +111111111111, +000100111101, +110111011111, +111111111111, +111111111111, +111111111111, +111111111111, +110111011111, +000000011101, +000100111101, +110111011111, +111111111111, +111111111111, +111111111111, +111111111111, +110111011111, +000100111101, +111111111111, +111111111111, +111111111111, +111111111111, +001101001110, +100110011110, +111111111111, +111111111111, +111111111111, +111111111111, +101111001111, +000000101101, +101111001111, +111111111111, +111111111111, +111111111111, +111111111111, +111111111111, +100110011110, +001101001110, +111111111111, +111111111111, +111111111111, +111111111111, +100010011110, +000100101101, +111111111111, +111111111111, +111111111111, +111111111111, +101010101111, +011101111110, +111111111111, +111111111111, +111111111111, +111111111111, +111111111111, +111111111111, +000100101101, +100010011110, +111111111111, +111111111111, +111111111111, +111111111111, +111111111111, +010001011110, +001000111101, +110111011111, +111111111111, +111111111111, +101110111111, +111111111111, +111111111111, +111111111111, +111111111111, +111111111111, +110111011111, +001000111101, +010001011110, +111111111111, +111111111111, +111111111111, +111111111111, +111111111111, +111111111111, +111111111111, +001000111101, +000100101101, +101010111111, +111111111111, +111011111111, +111111111111, +111111111111, +111111111111, +111111111111, +101110111111, +000100101101, +001101001101, +111111111111, +111111111111, +111111111111, +111111111111, +111111111111, +111111111111, +111111111111, +111111111111, +111111111111, +100010011110, +000100101101, +010101101110, +110011001111, +111111111111, +111111111111, +110111011111, +011001111110, +001000111101, +100110011110, +111111111111, +111111111111, +111111111111, +111111111111, +111111111111, +111111111111, +111111111111, +111111111111, +111111111111, +111111111111, +111111111111, +110011001111, +001000111101, +000000101101, +011110001110, +011110001110, +000000101101, +001101001110, +111011101111, +111111111111, +111111111111, +111111111111, +111111111111, +111111111111, +111111111111, +111111111111, +111111111111, +111111111111, +111111111111, +111111111111, +111111111111, +111111111111, +111111111111, +101110111111, +001101001110, +001101001110, +101010111111, +111111111111, +111111111111, +111111111111, +111111111111, +111111111111, +111111111111, +111111111111, +111111111111, +; \ No newline at end of file diff --git a/TankGame.srcs/sources_1/new/Random.v b/TankGame.srcs/sources_1/new/Random.v index c0a0d7c..bff8fa1 100644 --- a/TankGame.srcs/sources_1/new/Random.v +++ b/TankGame.srcs/sources_1/new/Random.v @@ -1,3 +1,5 @@ + + `timescale 1ns / 1ps ////////////////////////////////////////////////////////////////////////////////// // Company: @@ -25,9 +27,10 @@ module Random( input rst_n, input [ 1: 0 ] flag, output reg [ 1: 0 ] random, - output reg [ 14: 0 ] random_14 + output [ 14: 0 ] random_14 ); reg [ 14: 0 ] rand_num; +assign random_14 = rand_num; always @( * ) begin case ( flag ) 2'b00: diff --git a/TankGame.srcs/sources_1/new/Top.v b/TankGame.srcs/sources_1/new/Top.v index 391a9fe..e6eff70 100644 --- a/TankGame.srcs/sources_1/new/Top.v +++ b/TankGame.srcs/sources_1/new/Top.v @@ -39,10 +39,12 @@ wire [ 9: 0 ] KeyBoard_Output; wire item_faster; wire item_invincible; wire item_addtime; -wire item_test; +wire item_frozen; +wire item_addHP; +wire which_player; //0 is player1 get and 1 is player2 get wire [ 10: 0 ] vgaH, vgaV; wire [ 11: 0 ] VGAData; -wire [ 11: 0 ] backgroundData, game_information_data, heart_gametips_data; +wire [ 11: 0 ] backgroundData, game_information_data, heart_gametips_data, item_data; wire [ 1 : 0 ] player1_tank_dir, player2_tank_dir; wire [ 1: 0 ] enermy1_tank_dir, enermy2_tank_dir, enermy3_tank_dir, enermy4_tank_dir; wire [ 10: 0 ] player1_tank_H, player1_tank_V, player2_tank_H, player2_tank_V; @@ -125,7 +127,7 @@ game_mode u_game_mode( .clk( clk ), .btn_confirm( BTNC ), .btn_mode_sel( SW[ 0 ] ), - .btn_return( BTNU ), //the under button is used for return to the game + .btn_return( BTNU ), //the under button is used for return to the game .gameover_classic( gameover_classic ), .gameover_infinity( gameover_infinity ), .enable_shell1( enable_enermy1_bullet ), @@ -171,6 +173,8 @@ game_logic_classic u_game_logic_classic( .scored1( scored1 ), .scored2( scored2 ), .item_invincible( item_invincible ), + .item_addHP( item_addHP ), + .which_player( which_player ), .HP1_value( player1_HP ), .HP2_value( player2_HP ), .gameover_classic( gameover_classic ), @@ -194,8 +198,8 @@ game_logic_infinity u_game_logic_infinity( .scored1( scored1 ), .scored2( scored2 ), .item_addtime( item_addtime ), - .item_test( item_test ), .item_invincible( item_invincible ), + .which_player( which_player ), .timer( timer ), .gameover_infinity( gameover_infinity ), .led_infinity( LED_infinity ), @@ -247,7 +251,7 @@ vga_data_selector u_vga_data_selector( .in13( enermy4_bullet_data ), .in14( game_information_data ), .in15( heart_gametips_data ), - .in16(), + .in16( item_data ), .in17(), .out( VGAData ) ); @@ -259,10 +263,12 @@ tank_display u_tank1_display( .mode( mode ), .tank_revive( player1_revive ), .player_enermy( 1'b0 ), + .vgaH( vgaH ), .vgaV( vgaV ), .tankH( player1_tank_H ), .tankV( player1_tank_V ), + .item_invincible( ( item_invincible ) & ( ~which_player ) ), .tankData( player1_tank_data ) ); @@ -277,6 +283,7 @@ tank_display u_tank2_display( .vgaV( vgaV ), .tankH( player2_tank_H ), .tankV( player2_tank_V ), + .item_invincible( ( item_invincible ) & ( which_player ) ), .tankData( player2_tank_data ) ); tank_display enermy1_tank_display( @@ -336,41 +343,41 @@ tank_display enermy4_tank_display( tank_move player1_tank_move( clk, reset_n, 1, 150, 150, - player1_tank_dir, player1_tank_en, player1_tank_move_en, 1'b0, player1_moving, + player1_tank_dir, player1_tank_en, player1_tank_move_en, 1'b0, player1_moving, item_frozen, player1_tank_H, player1_tank_V, player1_tank_moving_direction ); tank_move player2_tank_move( clk, reset_n, 1, 350, 350, - player2_tank_dir, player2_tank_en, player2_tank_move_en, 1'b0, player2_moving, + player2_tank_dir, player2_tank_en, player2_tank_move_en, 1'b0, player2_moving, item_frozen, player2_tank_H, player2_tank_V, player2_tank_moving_direction ); tank_move enermy1_tank_move( clk, reset_n, 1, 0, 0, - enermy1_tank_dir, enermy1_tank_en, enermy1_tank_move_en, 1'b1, enermy1_moving, + enermy1_tank_dir, enermy1_tank_en, enermy1_tank_move_en, 1'b1, enermy1_moving, item_frozen, enermy1_tank_H, enermy1_tank_V, enermy1_tank_moving_direction ); tank_move enermy2_tank_move( clk, reset_n, 1, 540, 0, - enermy2_tank_dir, enermy2_tank_en, enermy2_tank_move_en, 1'b1, enermy2_moving, + enermy2_tank_dir, enermy2_tank_en, enermy2_tank_move_en, 1'b1, enermy2_moving, item_frozen, enermy2_tank_H, enermy2_tank_V, enermy2_tank_moving_direction ); tank_move enermy3_tank_move( clk, reset_n, 1, 0, 350, - enermy3_tank_dir, enermy3_tank_en, enermy3_tank_move_en, 1'b1, enermy3_moving, + enermy3_tank_dir, enermy3_tank_en, enermy3_tank_move_en, 1'b1, enermy3_moving, item_frozen, enermy3_tank_H, enermy3_tank_V, enermy3_tank_moving_direction ); tank_move enermy4_tank_move( clk, reset_n, 1, 540, 350, - enermy4_tank_dir, enermy4_tank_en, enermy4_tank_move_en, 1'b1, enermy4_moving, + enermy4_tank_dir, enermy4_tank_en, enermy4_tank_move_en, 1'b1, enermy4_moving, item_frozen, enermy4_tank_H, enermy4_tank_V, enermy4_tank_moving_direction ); @@ -675,11 +682,31 @@ vga_data_heart_gametips u_vga_data_heart_gametips( .vgaData( heart_gametips_data ) ); assign item_faster = 0; -assign item_addtime = 0; -assign item_invincible = 0; -assign item_test = 0; - +item_logic u_item_logic( + .clk( clk ), + .clk_4Hz( clk_4Hz ), + .enable_reward( enable_reward ), + .enable_game_classic( enable_game_classic ), + .enable_game_infinity( enable_game_infinity ), + .player1_tank_H( player1_tank_H ), + .player1_tank_V( player1_tank_V ), + .player1_tank_dir( player1_tank_dir ), + .player1_tank_en( player1_tank_en ), + .player2_tank_H( player2_tank_H ), + .player2_tank_V( player2_tank_V ), + .player2_tank_dir( player2_tank_dir ), + .player2_tank_en( player2_tank_en ), + .VGA_h( vgaH ), + .VGA_V( vgaV ), + .reset_n( reset_n ), + .item_invincible( item_invincible ), + .item_addHP( item_addHP ), + .item_addtime( item_addtime ), + .item_frozen( item_frozen ), + .which_player( which_player ), + .VGA_data_reward( item_data ) + ); wire [ 31: 0 ] num ; // assign num = { 3'b000, KeyBoard_Output[ 0 ], 3'b000, KeyBoard_Output[ 1 ], 3'b000, KeyBoard_Output[ 2 ], 3'b000, KeyBoard_Output[ 3 ], @@ -707,7 +734,7 @@ SegAndLed u_SegAndLed( .score_classic( score_classic ), .score_infinity( score_infinity ), .timer( timer ), - .default_num( num ), //when mode ==00(before begin mode) then output num ,you can also use it as debug + .default_num( num ), //when mode ==00(before begin mode) then output num ,you can also use it as debug .enable_game_classic( enable_game_classic ), .enable_game_infinity( enable_game_infinity ), .player1_tank_en( player1_tank_en ), diff --git a/TankGame.srcs/sources_1/new/enermy_control.v b/TankGame.srcs/sources_1/new/enermy_control.v index 0111313..ad96459 100644 --- a/TankGame.srcs/sources_1/new/enermy_control.v +++ b/TankGame.srcs/sources_1/new/enermy_control.v @@ -24,7 +24,7 @@ module enermy_control( input clk_8Hz, input clk_2Hz, input clk_10ms, - input [ 1: 0 ] flag, //00 01 10 11 four tanks + input [ 1: 0 ] flag, //00 01 10 11 four tanks input [ 10: 0 ] player1_H, input [ 10: 0 ] player1_V, input [ 10: 0 ] player2_H, @@ -78,7 +78,7 @@ assign enermy_moving = enermy_tank_en; initial begin enermy_fire <= 1'b0; - counter_num <= 0; + counter_num <= flag; rand <= flag[ 0 ]; Continue <= 0; Continue_num <= 0; @@ -197,7 +197,7 @@ always @( posedge clk_2Hz ) begin endcase end - if ( Continue ) begin + else begin enermy_fire <= 1'b0; if ( rand ) begin if ( enermy_V + TANK_HEIGHT / 2 <= chase_tank_V ) begin @@ -236,21 +236,7 @@ always @( posedge clk_2Hz ) begin end if ( counter_num % 4 != flag ) begin - if ( enermy_dir_feedback == 2'b00 && enermy_V == 0 ) begin - enermy_dir_feedback <= rand_num[ 1: 0 ]; - end - else if ( enermy_dir_feedback == 2'b01 && tank_DBound >= HEIGHT ) begin - enermy_dir_feedback <= rand_num[ 1: 0 ]; - end - else if ( enermy_dir_feedback == 2'b10 && enermy_H == 0 ) begin - enermy_dir_feedback <= rand_num[ 1: 0 ]; - end - else if ( enermy_dir_feedback == 2'b11 && tank_RBound >= WIDTH ) begin - enermy_dir_feedback <= rand_num[ 1: 0 ]; - end - else begin - enermy_dir_feedback <= enermy_dir_feedback_tmp; - end + enermy_dir_feedback <= enermy_dir_feedback_tmp; end else begin enermy_dir_feedback <= rand_num[ 1: 0 ]; @@ -267,4 +253,6 @@ always @( posedge clk_2Hz ) begin end end + + endmodule diff --git a/TankGame.srcs/sources_1/new/game_logic_classic.v b/TankGame.srcs/sources_1/new/game_logic_classic.v index ebb2463..e818b45 100644 --- a/TankGame.srcs/sources_1/new/game_logic_classic.v +++ b/TankGame.srcs/sources_1/new/game_logic_classic.v @@ -37,20 +37,23 @@ module game_logic_classic( input [ 3: 0 ] scored1, input [ 3: 0 ] scored2, input item_invincible, + input item_addHP, + input which_player, output reg [ 3: 0 ] HP1_value, output reg [ 3: 0 ] HP2_value, output reg gameover_classic, output wire [ 15: 0 ] led_classic, - output reg [ 7: 0 ] score_classic, //[7:4] is player2 ,[3:0] is player1 + output reg [ 7: 0 ] score_classic, //[7:4] is player2 ,[3:0] is player1 output reg [ 1: 0 ] winner ); reg [ 3: 0 ] score1; reg [ 3: 0 ] score2; reg mytank1_state_last, mytank2_state_last; +reg item_addHP_last; initial begin gameover_classic <= 0; - + item_addHP_last <= 0; score_classic <= 0; winner <= 0; score1 <= 0; @@ -75,8 +78,18 @@ always @( posedge clk ) begin HP1_value <= 4; HP2_value <= 4; end + if ( item_addHP && ~item_addHP_last ) begin + if ( which_player == 0 ) begin + HP1_value <= HP1_value + 1'b1; + end + + else begin + HP2_value <= HP2_value + 1'b1; + end + end mytank1_state_last <= mytank1_state; mytank2_state_last <= mytank2_state; + item_addHP_last <= item_addHP; end // always@( negedge enable_game_classic or negedge mytank1_state ) begin // if ( item_invincible == 0 ) begin diff --git a/TankGame.srcs/sources_1/new/game_logic_infinity.v b/TankGame.srcs/sources_1/new/game_logic_infinity.v index 3fc2184..49a14ae 100644 --- a/TankGame.srcs/sources_1/new/game_logic_infinity.v +++ b/TankGame.srcs/sources_1/new/game_logic_infinity.v @@ -36,9 +36,8 @@ module game_logic_infinity( input [ 3: 0 ] scored1, input [ 3: 0 ] scored2, input item_addtime, - input item_test, - input item_invincible, + input which_player, output reg [ 3: 0 ] HP1_value, output reg [ 3: 0 ] HP2_value, output reg [ 4: 0 ] timer, @@ -46,7 +45,7 @@ module game_logic_infinity( output reg gameover_infinity, output wire [ 15: 0 ] led_infinity, - output reg [ 7: 0 ] score_infinity, //[7:4] is player2 ,[3:0] is player1 + output reg [ 7: 0 ] score_infinity, //[7:4] is player2 ,[3:0] is player1 output reg timeup ); @@ -56,9 +55,8 @@ reg [ 3: 0 ] score1; reg [ 3: 0 ] score2; reg add_flag; reg item_flag; -reg [ 1: 0 ] HP1_value, HP2_value; reg mytank1_state_last, mytank2_state_last; - +reg item_addtime_last; initial begin gameover_infinity <= 0; cnt <= 0; @@ -167,7 +165,7 @@ always @( posedge clk ) begin score1 <= scorea1 + scoreb1 + scorec1 + scored1; score2 <= scorea2 + scoreb2 + scorec2 + scored2; - if ( item_addtime == 1 || item_test ) begin + if ( item_addtime == 1 ) begin if ( item_flag == 0 && timer > 0 && timer < 16 ) begin begin if ( timer == 15 ) begin @@ -197,6 +195,11 @@ always @( posedge clk ) begin timer <= timer - 1; cnt <= 0; end + + if ( item_addtime && ~item_addtime_last ) begin + timer <= timer + 10; + end + item_addtime_last <= item_addtime; end end diff --git a/TankGame.srcs/sources_1/new/item_display.v b/TankGame.srcs/sources_1/new/item_display.v new file mode 100644 index 0000000..53621f9 --- /dev/null +++ b/TankGame.srcs/sources_1/new/item_display.v @@ -0,0 +1,112 @@ +`timescale 1ns / 1ps +////////////////////////////////////////////////////////////////////////////////// +// Company: +// Engineer: +// +// Create Date: 01/06/2021 08:41:26 AM +// Design Name: +// Module Name: item_display +// Project Name: +// Target Devices: +// Tool Versions: +// Description: +// +// Dependencies: +// +// Revision: +// Revision 0.01 - File Created +// Additional Comments: +// +////////////////////////////////////////////////////////////////////////////////// + + +module item_display( + input clk, + input set_require, + input enable_reward, + input [ 10: 0 ] random_xpos, + input [ 10: 0 ] random_ypos, + input [ 1: 0 ] item_type, + input [ 10: 0 ] VGA_h, + input [ 10: 0 ] VGA_V, + input enable_game_classic, + input enable_game_infinity, + output reg [ 11: 0 ] VGA_data + ); + + + +wire [ 5: 0 ] ITEM_WIDTH ; +wire [ 5: 0 ] ITEM_HEIGHT; + +assign ITEM_WIDTH = item_type == 2'b11 ? 32 : 20; +assign ITEM_HEIGHT = item_type == 2'b11 ? 32 : 20; +reg [ 8: 0 ] addra_add_heart, addra_add_timing, addra_frozen; +reg [ 9: 0 ] addra_invincible; + +wire[ 11: 0 ] add_heart_pic, add_timing_pic, add_frozen_pic, invincible_pic; +// reg [ 11: 0 ] add_heart_reg, add_timing_reg, add_frozen_reg, invincible_reg; + + + +always @( posedge clk ) begin + if ( set_require == 1'b1 && enable_reward == 1'b1 ) begin + if ( VGA_h >= random_xpos && VGA_h < random_xpos + ITEM_WIDTH && VGA_V >= random_ypos && VGA_V < random_ypos + ITEM_HEIGHT ) begin + addra_add_heart <= ( VGA_h - random_xpos ) + ( VGA_V - random_ypos ) * 20; + addra_add_timing <= ( VGA_h - random_xpos ) + ( VGA_V - random_ypos ) * 20; + addra_frozen <= ( VGA_h - random_xpos ) + ( VGA_V - random_ypos ) * 20; + addra_invincible <= ( VGA_h - random_xpos ) + ( VGA_V - random_ypos ) * 32; + case ( item_type ) + 2'b01: begin + if ( enable_game_classic == 1 ) begin + VGA_data <= add_heart_pic; + end + else if ( enable_game_infinity ) begin + VGA_data <= add_timing_pic; + end + end + 2'b10: begin + VGA_data <= add_frozen_pic; + end + 2'b11: begin + VGA_data <= invincible_pic; + end + default : begin + VGA_data <= 0; + end + endcase + end + else begin + VGA_data <= 0; + end + end + else begin + VGA_data <= 0; + end + +end +add_heart_20_20 u_add_heart_20_20( + .clka( clk ), + .ena( 1'b1 ), + .addra( addra_add_heart ), + .douta( add_heart_pic ) + ); +add_timing_20_20 u_add_timing_20_20( + .clka( clk ), + .ena( 1'b1 ), + .addra( addra_add_timing ), + .douta( add_timing_pic ) + ); +snowflake_20_20 u_snowflake_20_20( + .clka( clk ), + .ena( 1'b1 ), + .addra( addra_frozen ), + .douta( add_frozen_pic ) + ); +invincible_star_32_32 u_invincible_star( + .clka( clk ), + .ena( 1'b1 ), + .addra( addra_invincible ), + .douta( invincible_pic ) + ); +endmodule diff --git a/TankGame.srcs/sources_1/new/item_logic.v b/TankGame.srcs/sources_1/new/item_logic.v index 458d73b..a03abe5 100644 --- a/TankGame.srcs/sources_1/new/item_logic.v +++ b/TankGame.srcs/sources_1/new/item_logic.v @@ -43,12 +43,12 @@ module item_logic( output reg item_frozen, output reg item_addHP, output reg which_player, - output [ 11: 0 ] VGA_data + output [ 11: 0 ] VGA_data_reward ); wire [ 1: 0 ] item_type; wire [ 10: 0 ] random_xpos, random_ypos; -reg [ 31: 0 ] cnt_num; +reg [ 31: 0 ] cnt; wire set_require; reg set_finish; @@ -57,7 +57,7 @@ wire [ 11: 0 ] VGA_data_information; assign VGA_data_reward = VGA_data_information; initial begin - cnt_num <= 0; + cnt <= 0; item_invincible <= 0; item_addtime <= 0; item_frozen <= 0; @@ -92,7 +92,7 @@ object_collide_detection tank2_item( always @( posedge clk ) begin if ( enable_reward ) begin - if ( player1_tank_get || player2_tank_get ) begin + if ( set_require == 1'b1 && ( player1_tank_get || player2_tank_get ) ) begin case ( item_type ) 1: begin if ( enable_game_classic ) begin @@ -127,7 +127,7 @@ always @( posedge clk ) begin end if ( item_invincible ) begin cnt <= cnt + 1; - if ( cnt >= 500000000 ) begin + if ( cnt >= 800000000 ) begin item_invincible <= 1'b0; cnt <= 0; end @@ -148,15 +148,44 @@ always @( posedge clk ) begin end if ( item_frozen ) begin cnt <= cnt + 1; - if ( cnt >= 300000000 ) begin + if ( cnt >= 400000000 ) begin item_frozen <= 1'b0; cnt <= 0; end end end + else begin + cnt <= 0; + item_invincible <= 0; + item_addtime <= 0; + item_frozen <= 0; + item_addHP <= 0; + which_player <= 0; + end end item_random_generator u_item_random_generator( - + .clk( clk ), + .clk_4Hz( clk_4Hz ), + .set_finish( set_finish ), + .enable( enable_reward ), + .dout( random_out ), + .item_type( item_type ), + .set_require( set_require ), + .random_xpos( random_xpos ), + .random_ypos( random_ypos ) ); +item_display u_item_display( + .clk( clk ), + .set_require( set_require ), + .enable_reward( enable_reward ), + .enable_game_classic( enable_game_classic ), + .enable_game_infinity( enable_game_infinity ), + .random_xpos( random_xpos ), + .random_ypos( random_ypos ), + .item_type( item_type ), + .VGA_h( VGA_h ), + .VGA_V( VGA_V ), + .VGA_data( VGA_data_information ) + ); endmodule diff --git a/TankGame.srcs/sources_1/new/item_random_generator.v b/TankGame.srcs/sources_1/new/item_random_generator.v index 4482be2..7a2abfc 100644 --- a/TankGame.srcs/sources_1/new/item_random_generator.v +++ b/TankGame.srcs/sources_1/new/item_random_generator.v @@ -28,7 +28,67 @@ module item_random_generator( output reg dout, output reg set_require, output reg [ 1: 0 ] item_type, - output [ 10: 0 ] random_xpos, - output [ 10: 0 ] random_ypos + output reg [ 10: 0 ] random_xpos, + output reg [ 10: 0 ] random_ypos ); + + +parameter ITEM_BASE_TIME = 24; +parameter ITEM_STAY_TIME = 32; +parameter TANK_WIDTH = 32; +parameter TANK_HEIGHT = 32; +parameter WIDTH = 640; +parameter HEIGHT = 480; + +wire [ 14: 0 ] random_num; +reg [ 31: 0 ] cnt; +reg lock; +initial begin + random_xpos <= 0; + random_ypos <= 0; + item_type <= 0; + lock <= 0; +end +Random u_Random( + .clk( clk_4Hz ), + .rst_n( 1'b1 ), + .flag( 2'b00 ), + .random( ), + .random_14( random_num ) + ); +always @( posedge clk ) begin + if ( enable ) begin + cnt <= cnt + 1'b1; + if ( cnt >= ITEM_BASE_TIME * 25000000 ) begin + dout <= 1'b1; + set_require <= 1'b1; + if ( cnt >= ( ITEM_BASE_TIME + ITEM_STAY_TIME ) * 25000000 || set_finish == 1'b1 ) begin + dout <= 1'b0; + cnt <= 0; + set_require <= 1'b0; + end + end + else begin + dout <= 1'b0; + set_require <= 1'b0; + end + end +end + +always @( posedge clk ) begin + if ( dout ) begin + if ( !lock ) begin + lock <= 1'b1; + random_xpos <= random_num[ 14: 1 ] % ( WIDTH - TANK_WIDTH ); + random_ypos <= random_num[ 13: 0 ] % ( HEIGHT - TANK_HEIGHT ); + item_type <= ( random_num[ 14: 0 ] % 3 ) + 1; + end + end + else begin + random_xpos <= 0; + random_ypos <= 0; + lock <= 0; + item_type <= 0; + end +end endmodule diff --git a/TankGame.srcs/sources_1/new/tank_display.v b/TankGame.srcs/sources_1/new/tank_display.v index f965c46..d2e7fd2 100644 --- a/TankGame.srcs/sources_1/new/tank_display.v +++ b/TankGame.srcs/sources_1/new/tank_display.v @@ -26,11 +26,12 @@ module tank_display( input tank_destroyed, input [ 2: 0 ] mode, input tank_revive, - input player_enermy, //player is 0 and enermy is 1 + input player_enermy, //player is 0 and enermy is 1 input [ 10: 0 ] vgaH, - input [ 10: 0 ] vgaV, // Current VGA position + input [ 10: 0 ] vgaV, // Current VGA position input [ 10: 0 ] tankH, - input [ 10: 0 ] tankV, // Current Y of tank + input [ 10: 0 ] tankV, // Current Y of tank + input item_invincible, output [ 11: 0 ] tankData ); @@ -81,6 +82,6 @@ tank_data_selector tank_select( .clk( clk ), .UP( tankUpData ), .DOWN( tankDownD .RIGHT( tankRightData ), .Dir( tankDir ), .tankData( outData ) ); tank_data_selector e_tank_select( .clk( clk ), .UP( tankUpData_enermy ), .DOWN( tankDownData_enermy ), .LEFT( tankLeftData_enermy ), .RIGHT( tankRightData_enermy ), .Dir( tankDir ), .tankData( outData_enermy ) ); -assign tankData = ( ( tank_en & ~tank_destroyed ) ? ( player_enermy ? outData_enermy : outData ) : 0 ) | ( tank_revive ? outData_star : 0 ); +assign tankData = ( ( tank_en & ~tank_destroyed ) ? ( player_enermy ? outData_enermy : outData ) : 0 ) | ( ( ( tank_revive || item_invincible ) && tank_en ) ? outData_star : 0 ); endmodule diff --git a/TankGame.srcs/sources_1/new/tank_move.v b/TankGame.srcs/sources_1/new/tank_move.v index 4fb1812..08aae72 100644 --- a/TankGame.srcs/sources_1/new/tank_move.v +++ b/TankGame.srcs/sources_1/new/tank_move.v @@ -3,12 +3,13 @@ module tank_move( clk, reset_n, start, init_H, init_V, - tank_dir, tank_en, tank_move_en, player_enermy, moving, + tank_dir, tank_en, tank_move_en, player_enermy, moving, item_frozen, tank_H, tank_V, tank_dir_feedback ); input clk; input moving; +input item_frozen; input reset_n; input start; input [ 10: 0 ] init_H; @@ -87,7 +88,7 @@ always @( * ) begin: state_table INITIAL: next_state = STAY; STAY, UP, DOWN, LEFT, RIGHT: begin - if ( !tank_en || !tank_move_en || !moving ) begin + if ( ( item_frozen && player_enermy ) || !tank_en || !tank_move_en || !moving ) begin next_state = STAY; end else begin @@ -169,7 +170,7 @@ always @( posedge clk ) begin: tank_move_logic end reg [ 31: 0 ] counter; -wire [ 31: 0 ] counter_num = player_enermy ? 2_500_000 : 2_500_000; +wire [ 31: 0 ] counter_num = player_enermy ? 2_000_000 : 2_000_000; always @( posedge clk ) begin if ( !reset_n ) begin counter <= 0; diff --git a/TankGame.srcs/sources_1/new/vga_data_heart_gametips.v b/TankGame.srcs/sources_1/new/vga_data_heart_gametips.v index bdc426e..726cb23 100644 --- a/TankGame.srcs/sources_1/new/vga_data_heart_gametips.v +++ b/TankGame.srcs/sources_1/new/vga_data_heart_gametips.v @@ -48,11 +48,11 @@ always @( posedge clk ) begin heart_reg2 <= 0; end else if ( mode == 1 || mode == 2 ) begin - if ( vgaH >= 5 && vgaH < 25 && vgaV >= 180 && vgaV < 300 && ( vgaV - 180 ) < ( mode == 1 ? HP1_value : HP1_value_infinity ) * 20 ) begin + if ( vgaH >= 5 && vgaH < 25 && vgaV >= 180 && vgaV < 340 && ( vgaV - 180 ) < ( mode == 1 ? HP1_value : HP1_value_infinity ) * 20 ) begin addra_heart_pic1 <= ( vgaH - 5 ) + ( ( vgaV - 180 ) % 20 ) * 20; heart_reg1 <= heart_pic1; end - else if ( vgaH >= 615 && vgaH < 635 && vgaV >= 180 && vgaV < 300 && ( vgaV - 180 ) < ( mode == 1 ? HP2_value : HP2_value_infinity ) * 20 ) begin + else if ( vgaH >= 615 && vgaH < 635 && vgaV >= 180 && vgaV < 340 && ( vgaV - 180 ) < ( mode == 1 ? HP2_value : HP2_value_infinity ) * 20 ) begin addra_heart_pic2 <= ( vgaH - 615 ) + ( ( vgaV - 180 ) % 20 ) * 20; heart_reg2 <= heart_pic2; end diff --git a/TankGame.xpr b/TankGame.xpr index f41bc6f..f063bd4 100644 --- a/TankGame.xpr +++ b/TankGame.xpr @@ -195,6 +195,27 @@ + + + + + + + + + + + + + + + + + + + + + @@ -485,22 +506,6 @@ - - - - - - - - - - - - - - - -