更新敌方坦克样式,增加简易ai判断
This commit is contained in:
@@ -71,6 +71,8 @@ wire enable_enermy1_control, enable_enermy2_control, enable_enermy3_control, ena
|
||||
wire enable_enermy1_display, enable_enermy2_display, enable_enermy3_display, enable_enermy4_display;
|
||||
wire enable_enermy1_bullet, enable_enermy2_bullet, enable_enermy3_bullet, enable_enermy4_bullet;
|
||||
|
||||
wire player1_fire, player2_fire, enermy1_fire, enermy2_fire, enermy3_fire, enermy4_fire;
|
||||
|
||||
wire enable_reward;
|
||||
|
||||
wire [ 3: 0 ] scorea1, scoreb1;
|
||||
@@ -83,6 +85,20 @@ wire [ 15: 0 ] LED_classic, LED_infinity;
|
||||
wire [ 7: 0 ] score_classic, score_infinity;
|
||||
wire [ 4: 0 ] timer;
|
||||
|
||||
|
||||
wire player1_bullet_en_feedback, player2_bullet_en_feedback;
|
||||
wire player1_bullet_en, player2_bullet_en;
|
||||
wire enermy1_bullet_en_feedback, enermy2_bullet_en_feedback, enermy3_bullet_en_feedback, enermy4_bullet_en_feedback;
|
||||
wire enermy1_bullet_en, enermy2_bullet_en, enermy3_bullet_en, enermy4_bullet_en;
|
||||
wire [ 10: 0 ] player1_bullet_H, player1_bullet_V, player2_bullet_H, player2_bullet_V;
|
||||
wire [ 10: 0 ] enermy1_bullet_H, enermy1_bullet_V, enermy2_bullet_H, enermy2_bullet_V,
|
||||
enermy3_bullet_H, enermy3_bullet_V, enermy4_bullet_H, enermy4_bullet_V;
|
||||
wire [ 2: 0 ] player1_bullet_dir, player2_bullet_dir;
|
||||
wire [ 2: 0 ] enermy1_bullet_dir, enermy2_bullet_dir, enermy3_bullet_dir, enermy4_bullet_dir;
|
||||
wire player1_revive, player2_revive;
|
||||
wire enermy1_revive, enermy2_revive, enermy3_revive, enermy4_revive;
|
||||
wire player1_scored, player2_scored;
|
||||
|
||||
assign reset_n = ~BTNC;
|
||||
|
||||
clock MyClock(
|
||||
@@ -106,7 +122,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 ),
|
||||
@@ -218,10 +234,10 @@ vga_data_selector u_vga_data_selector(
|
||||
.in7( enermy2_tank_data ),
|
||||
.in8( enermy3_tank_data ),
|
||||
.in9( enermy4_tank_data ),
|
||||
.in10(),
|
||||
.in11(),
|
||||
.in12(),
|
||||
.in13(),
|
||||
.in10( enermy1_bullet_data ),
|
||||
.in11( enermy2_bullet_data ),
|
||||
.in12( enermy3_bullet_data ),
|
||||
.in13( enermy4_bullet_data ),
|
||||
.in14(),
|
||||
.in15(),
|
||||
.in16(),
|
||||
@@ -235,6 +251,7 @@ tank_display u_tank1_display(
|
||||
.tank_destroyed( ~player1_tank_en ),
|
||||
.mode( mode ),
|
||||
.tank_revive( player1_revive ),
|
||||
.player_enermy( 1'b0 ),
|
||||
.vgaH( vgaH ),
|
||||
.vgaV( vgaV ),
|
||||
.tankH( player1_tank_H ),
|
||||
@@ -248,6 +265,7 @@ tank_display u_tank2_display(
|
||||
.tank_destroyed( ~player2_tank_en ),
|
||||
.mode( mode ),
|
||||
.tank_revive( player1_revive ),
|
||||
.player_enermy( 1'b0 ),
|
||||
.vgaH( vgaH ),
|
||||
.vgaV( vgaV ),
|
||||
.tankH( player2_tank_H ),
|
||||
@@ -260,6 +278,7 @@ tank_display enermy1_tank_display(
|
||||
.tank_destroyed( ~enermy1_tank_en ),
|
||||
.mode( mode ),
|
||||
.tank_revive( player1_revive ),
|
||||
.player_enermy( 1'b1 ),
|
||||
.vgaH( vgaH ),
|
||||
.vgaV( vgaV ),
|
||||
.tankH( enermy1_tank_H ),
|
||||
@@ -273,6 +292,7 @@ tank_display enermy2_tank_display(
|
||||
.tank_destroyed( ~enermy2_tank_en ),
|
||||
.mode( mode ),
|
||||
.tank_revive( player1_revive ),
|
||||
.player_enermy( 1'b1 ),
|
||||
.vgaH( vgaH ),
|
||||
.vgaV( vgaV ),
|
||||
.tankH( enermy2_tank_H ),
|
||||
@@ -285,6 +305,7 @@ tank_display enermy3_tank_display(
|
||||
.tank_destroyed( ~enermy3_tank_en ),
|
||||
.mode( mode ),
|
||||
.tank_revive( player1_revive ),
|
||||
.player_enermy( 1'b1 ),
|
||||
.vgaH( vgaH ),
|
||||
.vgaV( vgaV ),
|
||||
.tankH( enermy3_tank_H ),
|
||||
@@ -297,6 +318,7 @@ tank_display enermy4_tank_display(
|
||||
.tank_destroyed( ~enermy4_tank_en ),
|
||||
.mode( mode ),
|
||||
.tank_revive( player1_revive ),
|
||||
.player_enermy( 1'b1 ),
|
||||
.vgaH( vgaH ),
|
||||
.vgaV( vgaV ),
|
||||
.tankH( enermy4_tank_H ),
|
||||
@@ -307,41 +329,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, player1_moving,
|
||||
player1_tank_dir, player1_tank_en, player1_tank_move_en, 1'b0, player1_moving,
|
||||
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, player2_moving,
|
||||
player2_tank_dir, player2_tank_en, player2_tank_move_en, 1'b0, player2_moving,
|
||||
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, enermy1_moving,
|
||||
enermy1_tank_dir, enermy1_tank_en, enermy1_tank_move_en, 1'b1, enermy1_moving,
|
||||
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, enermy2_moving,
|
||||
enermy2_tank_dir, enermy2_tank_en, enermy2_tank_move_en, 1'b1, enermy2_moving,
|
||||
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, enermy3_moving,
|
||||
enermy3_tank_dir, enermy3_tank_en, enermy3_tank_move_en, 1'b1, enermy3_moving,
|
||||
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, enermy4_moving,
|
||||
enermy4_tank_dir, enermy4_tank_en, enermy4_tank_move_en, 1'b1, enermy4_moving,
|
||||
enermy4_tank_H, enermy4_tank_V, enermy4_tank_moving_direction
|
||||
);
|
||||
|
||||
@@ -355,19 +377,93 @@ control u_control(
|
||||
.player2_fire( player2_fire ),
|
||||
.player2_moving( player2_moving )
|
||||
);
|
||||
enermy_control enermy1_control(
|
||||
.clk_8Hz( clk_8Hz ),
|
||||
.clk_2Hz( clk_2Hz ),
|
||||
.player1_H( player1_tank_H ),
|
||||
.player1_V( player1_tank_V ),
|
||||
.player2_H( player2_tank_H ),
|
||||
.player2_V( player2_tank_V ),
|
||||
.player1_bullet_H( player1_bullet_H ),
|
||||
.player1_bullet_V( player1_bullet_V ),
|
||||
.player1_bullet_dir( player1_bullet_dir ),
|
||||
.player2_bullet_H( player2_bullet_H ),
|
||||
.player2_bullet_V( player2_bullet_V ),
|
||||
.player2_bullet_dir( player2_bullet_dir ),
|
||||
|
||||
.enermy_H( enermy1_tank_H ),
|
||||
.enermy_V( enermy1_tank_V ),
|
||||
.enermy_tank_en( enermy1_tank_en ),
|
||||
.enermy_dir_feedback( enermy1_tank_dir ),
|
||||
.enermy_fire( enermy1_fire ),
|
||||
.enermy_moving( enermy1_moving )
|
||||
);
|
||||
|
||||
enermy_control enermy2_control(
|
||||
.clk_8Hz( clk_8Hz ),
|
||||
.clk_2Hz( clk_2Hz ),
|
||||
.player1_H( player1_tank_H ),
|
||||
.player1_V( player1_tank_V ),
|
||||
.player2_H( player2_tank_H ),
|
||||
.player2_V( player2_tank_V ),
|
||||
.player1_bullet_H( player1_bullet_H ),
|
||||
.player1_bullet_V( player1_bullet_V ),
|
||||
.player1_bullet_dir( player1_bullet_dir ),
|
||||
.player2_bullet_H( player2_bullet_H ),
|
||||
.player2_bullet_V( player2_bullet_V ),
|
||||
.player2_bullet_dir( player2_bullet_dir ),
|
||||
|
||||
.enermy_H( enermy2_tank_H ),
|
||||
.enermy_V( enermy2_tank_V ),
|
||||
.enermy_tank_en( enermy2_tank_en ),
|
||||
.enermy_dir_feedback( enermy2_tank_dir ),
|
||||
.enermy_fire( enermy2_fire ),
|
||||
.enermy_moving( enermy2_moving )
|
||||
);
|
||||
|
||||
enermy_control enermy3_control(
|
||||
.clk_8Hz( clk_8Hz ),
|
||||
.clk_2Hz( clk_2Hz ),
|
||||
.player1_H( player1_tank_H ),
|
||||
.player1_V( player1_tank_V ),
|
||||
.player2_H( player2_tank_H ),
|
||||
.player2_V( player2_tank_V ),
|
||||
.player1_bullet_H( player1_bullet_H ),
|
||||
.player1_bullet_V( player1_bullet_V ),
|
||||
.player1_bullet_dir( player1_bullet_dir ),
|
||||
.player2_bullet_H( player2_bullet_H ),
|
||||
.player2_bullet_V( player2_bullet_V ),
|
||||
.player2_bullet_dir( player2_bullet_dir ),
|
||||
|
||||
.enermy_H( enermy3_tank_H ),
|
||||
.enermy_V( enermy3_tank_V ),
|
||||
.enermy_tank_en( enermy3_tank_en ),
|
||||
.enermy_dir_feedback( enermy3_tank_dir ),
|
||||
.enermy_fire( enermy3_fire ),
|
||||
.enermy_moving( enermy3_moving )
|
||||
);
|
||||
enermy_control enermy4_control(
|
||||
.clk_8Hz( clk_8Hz ),
|
||||
.clk_2Hz( clk_2Hz ),
|
||||
.player1_H( player1_tank_H ),
|
||||
.player1_V( player1_tank_V ),
|
||||
.player2_H( player2_tank_H ),
|
||||
.player2_V( player2_tank_V ),
|
||||
.player1_bullet_H( player1_bullet_H ),
|
||||
.player1_bullet_V( player1_bullet_V ),
|
||||
.player1_bullet_dir( player1_bullet_dir ),
|
||||
.player2_bullet_H( player2_bullet_H ),
|
||||
.player2_bullet_V( player2_bullet_V ),
|
||||
.player2_bullet_dir( player2_bullet_dir ),
|
||||
|
||||
.enermy_H( enermy4_tank_H ),
|
||||
.enermy_V( enermy4_tank_V ),
|
||||
.enermy_tank_en( enermy4_tank_en ),
|
||||
.enermy_dir_feedback( enermy4_tank_dir ),
|
||||
.enermy_fire( enermy4_fire ),
|
||||
.enermy_moving( enermy4_moving )
|
||||
);
|
||||
|
||||
wire player1_bullet_en_feedback, player2_bullet_en_feedback;
|
||||
wire player1_bullet_en, player2_bullet_en;
|
||||
wire enermy1_bullet_en_feedback, enermy2_bullet_en_feedback, enermy3_bullet_en_feedback, enermy4_bullet_en_feedback;
|
||||
wire enermy1_bullet_en, enermy2_bullet_en, enermy3_bullet_en, enermy4_bullet_en;
|
||||
wire [ 10: 0 ] player1_bullet_H, player1_bullet_V, player2_bullet_H, player2_bullet_V;
|
||||
wire [ 10: 0 ] enermy1_bullet_H, enermy1_bullet_V, enermy2_bullet_H, enermy2_bullet_V,
|
||||
enermy3_bullet_H, enermy3_bullet_V, enermy4_bullet_H, enermy4_bullet_V;
|
||||
wire [ 2: 0 ] player1_bullet_dir, player2_bullet_dir;
|
||||
wire [ 2: 0 ] enermy1_bullet_dir, enermy2_bullet_dir, enermy3_bullet_dir, enermy4_bullet_dir;
|
||||
wire player1_revive, player2_revive;
|
||||
wire enermy1_revive, enermy2_revive, enermy3_revive, enermy4_revive;
|
||||
wire player1_scored, player2_scored;
|
||||
|
||||
|
||||
control_signals u_control_signals(
|
||||
@@ -410,6 +506,8 @@ bullet_control bullet_player1(
|
||||
.tank_en( player1_tank_en ),
|
||||
.tank_dir( player1_tank_dir ),
|
||||
.tank_fire( player1_fire ),
|
||||
.player_enermy( 1'b0 ),
|
||||
|
||||
.vgaV( vgaV ),
|
||||
.vgaH( vgaH ),
|
||||
.start( 1 ),
|
||||
@@ -427,6 +525,8 @@ bullet_control bullet_player2(
|
||||
.tank_en( player2_tank_en ),
|
||||
.tank_dir( player2_tank_dir ),
|
||||
.tank_fire( player2_fire ),
|
||||
.player_enermy( 1'b0 ),
|
||||
|
||||
.vgaV( vgaV ),
|
||||
.vgaH( vgaH ),
|
||||
.start( 1 ),
|
||||
@@ -436,6 +536,82 @@ bullet_control bullet_player2(
|
||||
.bullet_V_feedback( player2_bullet_V ),
|
||||
.bullet_direction( player2_bullet_dir )
|
||||
);
|
||||
bullet_control bullet_enermy1(
|
||||
.clk( clk ),
|
||||
.reset_n( 1 ),
|
||||
.tank_H( enermy1_tank_H ),
|
||||
.tank_V( enermy1_tank_V ),
|
||||
.tank_en( enermy1_tank_en ),
|
||||
.tank_dir( enermy1_tank_dir ),
|
||||
.tank_fire( enermy1_fire ),
|
||||
.player_enermy( 1'b1 ),
|
||||
|
||||
.vgaV( vgaV ),
|
||||
.vgaH( vgaH ),
|
||||
.start( 1 ),
|
||||
.ready( enermy1_bullet_en ),
|
||||
.bulletData( enermy1_bullet_data ),
|
||||
.bullet_H_feedback( enermy1_bullet_H ),
|
||||
.bullet_V_feedback( enermy1_bullet_V ),
|
||||
.bullet_direction( enermy1_bullet_dir )
|
||||
);
|
||||
bullet_control bullet_enermy2(
|
||||
.clk( clk ),
|
||||
.reset_n( 1 ),
|
||||
.tank_H( enermy2_tank_H ),
|
||||
.tank_V( enermy2_tank_V ),
|
||||
.tank_en( enermy2_tank_en ),
|
||||
.tank_dir( enermy2_tank_dir ),
|
||||
.tank_fire( enermy2_fire ),
|
||||
.player_enermy( 1'b1 ),
|
||||
|
||||
.vgaV( vgaV ),
|
||||
.vgaH( vgaH ),
|
||||
.start( 1 ),
|
||||
.ready( enermy2_bullet_en ),
|
||||
.bulletData( enermy2_bullet_data ),
|
||||
.bullet_H_feedback( enermy2_bullet_H ),
|
||||
.bullet_V_feedback( enermy2_bullet_V ),
|
||||
.bullet_direction( enermy2_bullet_dir )
|
||||
);
|
||||
bullet_control bullet_enermy3(
|
||||
.clk( clk ),
|
||||
.reset_n( 1 ),
|
||||
.tank_H( enermy3_tank_H ),
|
||||
.tank_V( enermy3_tank_V ),
|
||||
.tank_en( enermy3_tank_en ),
|
||||
.tank_dir( enermy3_tank_dir ),
|
||||
.tank_fire( enermy3_fire ),
|
||||
.player_enermy( 1'b1 ),
|
||||
|
||||
.vgaV( vgaV ),
|
||||
.vgaH( vgaH ),
|
||||
.start( 1 ),
|
||||
.ready( enermy3_bullet_en ),
|
||||
.bulletData( enermy3_bullet_data ),
|
||||
.bullet_H_feedback( enermy3_bullet_H ),
|
||||
.bullet_V_feedback( enermy3_bullet_V ),
|
||||
.bullet_direction( enermy3_bullet_dir )
|
||||
);
|
||||
bullet_control bullet_enermy4(
|
||||
.clk( clk ),
|
||||
.reset_n( 1 ),
|
||||
.tank_H( enermy4_tank_H ),
|
||||
.tank_V( enermy4_tank_V ),
|
||||
.tank_en( enermy4_tank_en ),
|
||||
.tank_dir( enermy4_tank_dir ),
|
||||
.tank_fire( enermy4_fire ),
|
||||
.player_enermy( 1'b1 ),
|
||||
|
||||
.vgaV( vgaV ),
|
||||
.vgaH( vgaH ),
|
||||
.start( 1 ),
|
||||
.ready( enermy4_bullet_en ),
|
||||
.bulletData( enermy4_bullet_data ),
|
||||
.bullet_H_feedback( enermy4_bullet_H ),
|
||||
.bullet_V_feedback( enermy4_bullet_V ),
|
||||
.bullet_direction( enermy4_bullet_dir )
|
||||
);
|
||||
cal_score u_cal_score(
|
||||
clk, reset_n, enermy1_tank_en, enermy2_tank_en, enermy3_tank_en, enermy4_tank_en,
|
||||
player1_scored, player2_scored, scorea1, scorea2, scoreb1, scoreb2, scorec1, scorec2, scored1, scored2
|
||||
@@ -480,7 +656,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 ),
|
||||
|
||||
@@ -11,6 +11,8 @@ module bullet_control(
|
||||
input tank_en,
|
||||
input [ 1: 0 ] tank_dir,
|
||||
input tank_fire,
|
||||
input player_enermy, //player is 0 and enermy is 1
|
||||
|
||||
input [ 10: 0 ] vgaH,
|
||||
input [ 10: 0 ] vgaV,
|
||||
input ready,
|
||||
@@ -117,12 +119,14 @@ always @( * ) begin: bullet_logic
|
||||
end
|
||||
|
||||
reg bullet_move_en;
|
||||
wire [ 31: 0 ] bullet_speed;
|
||||
assign bullet_speed = player_enermy ? 500_000 : 1_000_000;
|
||||
always @( posedge clk ) begin: counter_logic
|
||||
if ( !reset_n ) begin
|
||||
counter <= 0;
|
||||
bullet_move_en <= 0;
|
||||
end
|
||||
else if ( counter == 1_000_000 ) begin
|
||||
else if ( counter == bullet_speed ) begin
|
||||
counter <= 0;
|
||||
bullet_move_en <= 1;
|
||||
end
|
||||
|
||||
@@ -0,0 +1,233 @@
|
||||
`timescale 1ns / 1ps
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
// Company:
|
||||
// Engineer:
|
||||
//
|
||||
// Create Date: 01/01/2021 10:06:10 PM
|
||||
// Design Name:
|
||||
// Module Name: enermy_control
|
||||
// Project Name:
|
||||
// Target Devices:
|
||||
// Tool Versions:
|
||||
// Description:
|
||||
//
|
||||
// Dependencies:
|
||||
//
|
||||
// Revision:
|
||||
// Revision 0.01 - File Created
|
||||
// Additional Comments:
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
module enermy_control(
|
||||
input clk_8Hz,
|
||||
input clk_2Hz,
|
||||
input [ 10: 0 ] player1_H,
|
||||
input [ 10: 0 ] player1_V,
|
||||
input [ 10: 0 ] player2_H,
|
||||
input [ 10: 0 ] player2_V,
|
||||
input [ 10: 0 ] player1_bullet_H,
|
||||
input [ 10: 0 ] player1_bullet_V,
|
||||
input [ 2: 0 ] player1_bullet_dir,
|
||||
input [ 10: 0 ] player2_bullet_H,
|
||||
input [ 10: 0 ] player2_bullet_V,
|
||||
input [ 2: 0 ] player2_bullet_dir,
|
||||
|
||||
|
||||
input [ 10: 0 ] enermy_H,
|
||||
input [ 10: 0 ] enermy_V,
|
||||
input enermy_tank_en,
|
||||
|
||||
output reg [ 1: 0 ] enermy_dir_feedback,
|
||||
output reg enermy_fire,
|
||||
output wire enermy_moving
|
||||
|
||||
);
|
||||
parameter HEIGHT = 480;
|
||||
parameter WIDTH = 640;
|
||||
parameter TANK_HEIGHT = 32;
|
||||
parameter TANK_WIDTH = 32;
|
||||
parameter BULLET_LONGER = 10;
|
||||
parameter BULLET_SHORTER = 5;
|
||||
wire [ 10: 0 ] tank_DBound = enermy_V + TANK_HEIGHT;
|
||||
wire [ 10: 0 ] tank_RBound = enermy_H + TANK_WIDTH;
|
||||
|
||||
wire[ 10: 0 ] player1_DBound = player1_V + TANK_HEIGHT;
|
||||
wire [ 10: 0 ] player1_RBound = player1_H + TANK_WIDTH;
|
||||
|
||||
|
||||
wire[ 10: 0 ] player2_DBound = player1_V + TANK_HEIGHT;
|
||||
wire [ 10: 0 ] player2_RBound = player1_H + TANK_WIDTH;
|
||||
|
||||
reg [ 1: 0 ] enermy_dir_feedback_tmp;
|
||||
reg [ 5: 0 ] counter_num;
|
||||
|
||||
|
||||
reg rand;
|
||||
wire [ 10: 0 ] chase_tank_H = rand ? player1_H : player2_H;
|
||||
wire [ 10: 0 ] chase_tank_V = rand ? player1_V : player2_V;
|
||||
|
||||
assign enermy_moving = enermy_tank_en;
|
||||
|
||||
initial begin
|
||||
enermy_fire = 1'b0;
|
||||
counter_num <= 0;
|
||||
rand <= $random % 2;
|
||||
end
|
||||
always @( posedge clk_8Hz ) begin
|
||||
if ( !player1_bullet_dir[ 2 ] ) begin
|
||||
case ( player1_bullet_dir[ 1 ] )
|
||||
|
||||
1'b0: begin
|
||||
if ( player1_bullet_H <= tank_RBound && player1_bullet_H + BULLET_SHORTER >= enermy_H ) begin
|
||||
if ( ( enermy_V < player1_bullet_V && ~player1_bullet_dir[ 0 ] ) || ( enermy_V > player1_bullet_V && player1_bullet_dir[ 0 ] ) ) begin
|
||||
if ( enermy_H < WIDTH / 6 ) begin
|
||||
|
||||
enermy_dir_feedback_tmp <= 2'b11;
|
||||
end
|
||||
else if ( enermy_H > 3 * WIDTH / 4 ) begin
|
||||
enermy_dir_feedback_tmp <= 2'b10;
|
||||
end
|
||||
else begin
|
||||
if ( enermy_H + TANK_WIDTH / 2 < player1_bullet_H + BULLET_SHORTER / 2 ) begin
|
||||
enermy_dir_feedback_tmp <= 2'b10;
|
||||
end
|
||||
else begin
|
||||
enermy_dir_feedback_tmp <= 2'b11;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
1'b1: begin
|
||||
if ( player1_bullet_V <= tank_DBound && player1_bullet_V + BULLET_SHORTER >= enermy_V ) begin
|
||||
if ( ( enermy_H < player1_bullet_H && ~player1_bullet_dir[ 0 ] ) || ( enermy_H > player1_bullet_H && player1_bullet_dir[ 0 ] ) ) begin
|
||||
if ( enermy_V < HEIGHT / 6 ) begin
|
||||
enermy_dir_feedback_tmp <= 2'b01;
|
||||
end
|
||||
else if ( enermy_V > 3 * HEIGHT / 4 ) begin
|
||||
enermy_dir_feedback_tmp <= 2'b00;
|
||||
end
|
||||
else begin
|
||||
if ( enermy_V + TANK_HEIGHT / 2 < player1_bullet_V + BULLET_SHORTER / 2 ) begin
|
||||
enermy_dir_feedback_tmp <= 2'b00;
|
||||
end
|
||||
else begin
|
||||
enermy_dir_feedback_tmp <= 2'b01;
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
endcase
|
||||
|
||||
end
|
||||
|
||||
|
||||
else if ( !player2_bullet_dir[ 2 ] ) begin
|
||||
case ( player2_bullet_dir[ 1 ] )
|
||||
|
||||
1'b0: begin
|
||||
if ( player2_bullet_H <= tank_RBound && player2_bullet_H + BULLET_SHORTER >= enermy_H ) begin
|
||||
if ( ( enermy_V < player2_bullet_V && ~player2_bullet_dir[ 0 ] ) || ( enermy_V > player2_bullet_V && player2_bullet_dir[ 0 ] ) ) begin
|
||||
if ( enermy_H < WIDTH / 6 ) begin
|
||||
|
||||
enermy_dir_feedback_tmp <= 2'b11;
|
||||
end
|
||||
else if ( enermy_H > 3 * WIDTH / 4 ) begin
|
||||
enermy_dir_feedback_tmp <= 2'b10;
|
||||
end
|
||||
else begin
|
||||
if ( enermy_H + TANK_WIDTH / 2 < player2_bullet_H + BULLET_SHORTER / 2 ) begin
|
||||
enermy_dir_feedback_tmp <= 2'b10;
|
||||
end
|
||||
else begin
|
||||
enermy_dir_feedback_tmp <= 2'b11;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
1'b1: begin
|
||||
if ( player2_bullet_V <= tank_DBound && player2_bullet_V + BULLET_SHORTER >= enermy_V ) begin
|
||||
if ( ( enermy_H < player2_bullet_H && ~player2_bullet_dir[ 0 ] ) || ( enermy_H > player2_bullet_H && player2_bullet_dir[ 0 ] ) ) begin
|
||||
if ( enermy_V < HEIGHT / 6 ) begin
|
||||
enermy_dir_feedback_tmp <= 2'b01;
|
||||
end
|
||||
else if ( enermy_V > 3 * HEIGHT / 4 ) begin
|
||||
enermy_dir_feedback_tmp <= 2'b00;
|
||||
end
|
||||
else begin
|
||||
if ( enermy_V + TANK_HEIGHT / 2 < player2_bullet_V + BULLET_SHORTER / 2 ) begin
|
||||
enermy_dir_feedback_tmp <= 2'b00;
|
||||
end
|
||||
else begin
|
||||
enermy_dir_feedback_tmp <= 2'b01;
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
endcase
|
||||
|
||||
end
|
||||
else begin
|
||||
enermy_fire <= 1'b0;
|
||||
if ( rand ) begin
|
||||
if ( enermy_V + TANK_HEIGHT / 2 <= chase_tank_V ) begin
|
||||
enermy_dir_feedback_tmp <= 2'b01;
|
||||
end
|
||||
else if ( enermy_V >= chase_tank_V + TANK_HEIGHT / 2 ) begin
|
||||
enermy_dir_feedback_tmp <= 2'b00;
|
||||
end
|
||||
else begin
|
||||
enermy_fire <= 1'b1;
|
||||
if ( enermy_H < chase_tank_H ) begin
|
||||
enermy_dir_feedback_tmp <= 2'b11;
|
||||
end
|
||||
else begin
|
||||
enermy_dir_feedback_tmp <= 2'b10;
|
||||
end
|
||||
end
|
||||
end
|
||||
else begin
|
||||
if ( enermy_H + TANK_WIDTH / 2 <= chase_tank_H ) begin
|
||||
enermy_dir_feedback_tmp <= 2'b11;
|
||||
end
|
||||
else if ( enermy_H >= chase_tank_H + TANK_HEIGHT / 2 ) begin
|
||||
enermy_dir_feedback_tmp <= 2'b10;
|
||||
end
|
||||
else begin
|
||||
enermy_fire <= 1'b1;
|
||||
if ( enermy_V < chase_tank_V ) begin
|
||||
enermy_dir_feedback_tmp <= 2'b01;
|
||||
end
|
||||
else begin
|
||||
enermy_dir_feedback_tmp <= 2'b00;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
always @( posedge clk_8Hz ) begin
|
||||
if ( $random % 2 ) begin
|
||||
enermy_dir_feedback <= enermy_dir_feedback_tmp;
|
||||
end
|
||||
else begin
|
||||
enermy_dir_feedback <= $random % 4;
|
||||
end
|
||||
counter_num <= counter_num + 1;
|
||||
if ( counter_num == 8 ) begin
|
||||
counter_num <= 0;
|
||||
rand = $random % 2;
|
||||
end
|
||||
end
|
||||
|
||||
endmodule
|
||||
@@ -26,10 +26,11 @@ module tank_display(
|
||||
input tank_destroyed,
|
||||
input [ 2: 0 ] mode,
|
||||
input tank_revive,
|
||||
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
|
||||
output [ 11: 0 ] tankData
|
||||
);
|
||||
|
||||
@@ -49,7 +50,14 @@ wire [ 11: 0 ] tankLeftData;
|
||||
wire [ 11: 0 ] tankRightData;
|
||||
wire [ 11: 0 ] tankUpData;
|
||||
wire [ 11: 0 ] tankDownData;
|
||||
|
||||
wire [ 11: 0 ] tankLeftData_enermy;
|
||||
wire [ 11: 0 ] tankRightData_enermy;
|
||||
wire [ 11: 0 ] tankUpData_enermy;
|
||||
wire [ 11: 0 ] tankDownData_enermy;
|
||||
|
||||
wire [ 11: 0 ] outData;
|
||||
wire [ 11: 0 ] outData_enermy;
|
||||
|
||||
assign tankAddr = tank_en ? ( ( vgaV - tankV ) * TANK_WIDTH + ( vgaH - tankH ) ) : 1'b0;
|
||||
|
||||
@@ -58,9 +66,17 @@ tank_right_img tank_right( .addra( tankAddr ), .clka( clk ), .douta( tankRightDa
|
||||
tank_up_img tank_up( .addra( tankAddr ), .clka( clk ), .douta( tankUpData ), .ena( 1'b1 ) );
|
||||
tank_down_img tank_down( .addra( tankAddr ), .clka( clk ), .douta( tankDownData ), .ena( 1'b1 ) );
|
||||
|
||||
|
||||
enermy_tank_left e_tank_left( .addra( tankAddr ), .clka( clk ), .douta( tankLeftData_enermy ), .ena( 1'b1 ) );
|
||||
enermy_tank_right e_tank_right( .addra( tankAddr ), .clka( clk ), .douta( tankRightData_enermy ), .ena( 1'b1 ) );
|
||||
enermy_tank_up e_tank_up( .addra( tankAddr ), .clka( clk ), .douta( tankUpData_enermy ), .ena( 1'b1 ) );
|
||||
enermy_tank_down e_tank_down( .addra( tankAddr ), .clka( clk ), .douta( tankDownData_enermy ), .ena( 1'b1 ) );
|
||||
|
||||
|
||||
tank_data_selector tank_select( .clk( clk ), .UP( tankUpData ), .DOWN( tankDownData ), .LEFT( tankLeftData ),
|
||||
.RIGHT( tankRightData ), .Dir( tankDir ), .tankData( outData ) );
|
||||
|
||||
assign tankData = ( tank_en & ~tank_destroyed ) ? outData : 0;
|
||||
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;
|
||||
|
||||
endmodule
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
module tank_move(
|
||||
clk, reset_n, start,
|
||||
init_H, init_V,
|
||||
tank_dir, tank_en, tank_move_en, moving,
|
||||
tank_dir, tank_en, tank_move_en, player_enermy, moving,
|
||||
tank_H, tank_V, tank_dir_feedback
|
||||
);
|
||||
|
||||
@@ -16,6 +16,7 @@ input [ 10: 0 ] init_V;
|
||||
input [ 1: 0 ] tank_dir;
|
||||
input tank_en;
|
||||
input tank_move_en;
|
||||
input player_enermy;
|
||||
output reg [ 10: 0 ] tank_H;
|
||||
output reg [ 10: 0 ] tank_V;
|
||||
output reg [ 2: 0 ] tank_dir_feedback;
|
||||
@@ -168,12 +169,13 @@ always @( posedge clk ) begin: tank_move_logic
|
||||
end
|
||||
|
||||
reg [ 31: 0 ] counter;
|
||||
wire [ 31: 0 ] counter_num = player_enermy ? 2_500_000 : 3_000_000;
|
||||
always @( posedge clk ) begin
|
||||
if ( !reset_n ) begin
|
||||
counter <= 0;
|
||||
counter_move_en <= 0;
|
||||
end
|
||||
else if ( counter == 5_000_000 ) begin
|
||||
else if ( counter == counter_num ) begin
|
||||
counter <= 0;
|
||||
counter_move_en <= 1;
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user