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 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -550,7 +555,7 @@
-
+
@@ -899,7 +904,6 @@
-
@@ -913,7 +917,6 @@
-
@@ -927,7 +930,6 @@
-