更新敌方坦克样式,增加简易ai判断

This commit is contained in:
2021-01-02 13:04:34 +08:00
parent 38350c37bb
commit 720f1c75e2
60 changed files with 833828 additions and 51 deletions
+200 -24
View File
@@ -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 ),
+5 -1
View File
@@ -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
+20 -4
View File
@@ -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
+4 -2
View File
@@ -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