102 lines
3.6 KiB
Verilog
102 lines
3.6 KiB
Verilog
`timescale 1ns / 1ps
|
|
|
|
|
|
module object_collide_detection(
|
|
input [ 10: 0 ] object1_H,
|
|
input [ 10: 0 ] object1_V,
|
|
input object1_en,
|
|
input [ 1: 0 ] object1_dir,
|
|
input [ 10: 0 ] object1_LONGER,
|
|
input [ 10: 0 ] object1_SHORTER,
|
|
input [ 10: 0 ] object2_H,
|
|
input [ 10: 0 ] object2_V,
|
|
input object2_en,
|
|
input [ 1: 0 ] object2_dir,
|
|
input [ 10: 0 ] object2_LONGER,
|
|
input [ 10: 0 ] object2_SHORTER,
|
|
output reg object1_collide,
|
|
output reg object2_collide
|
|
);
|
|
|
|
reg [ 3: 0 ] object1_collide_dir, object2_collide_dir;
|
|
wire [ 10: 0 ] object1_RBound, object1_DBound;
|
|
wire [ 10: 0 ] object2_RBound, object2_DBound;
|
|
|
|
assign object1_RBound = object1_H + ( ( object1_dir >= 2'b10 ) ? object1_LONGER : object1_SHORTER ) ;
|
|
assign object1_DBound = object1_V + ( ( object1_dir >= 2'b10 ) ? object1_SHORTER : object1_LONGER ) ;
|
|
assign object2_RBound = object2_H + ( ( object2_dir >= 2'b10 ) ? object2_LONGER : object2_SHORTER ) ;
|
|
assign object2_DBound = object2_V + ( ( object2_dir >= 2'b10 ) ? object2_SHORTER : object2_LONGER ) ;
|
|
|
|
always @( * ) begin
|
|
if ( object1_en && object2_en && object1_RBound <= object2_RBound && object1_RBound >= object2_H &&
|
|
~( object1_DBound < object2_V || object1_V > object2_DBound ) ) begin
|
|
object1_collide_dir[ 3 ] <= 1;
|
|
end
|
|
else begin
|
|
object1_collide_dir[ 3 ] <= 0;
|
|
end
|
|
|
|
if ( object1_en && object2_en && object1_H <= object2_RBound && object1_H >= object2_H &&
|
|
~( object1_DBound < object2_V || object1_V > object2_DBound ) ) begin
|
|
object1_collide_dir[ 2 ] <= 1;
|
|
end
|
|
else begin
|
|
object1_collide_dir[ 2 ] <= 0;
|
|
end
|
|
|
|
if ( object1_en && object2_en && object1_V <= object2_DBound && object1_V >= object2_V
|
|
&& ~( object1_RBound < object2_H || object1_H > object2_RBound ) ) begin
|
|
object1_collide_dir[ 0 ] <= 1;
|
|
end
|
|
else begin
|
|
object1_collide_dir[ 0 ] <= 0;
|
|
end
|
|
|
|
if ( object1_en && object2_en && object1_DBound <= object2_DBound && object1_DBound >= object2_V
|
|
&& ~( object1_RBound < object2_H || object1_H > object2_RBound ) ) begin
|
|
object1_collide_dir[ 1 ] <= 1;
|
|
end
|
|
else begin
|
|
object1_collide_dir[ 1 ] <= 0;
|
|
end
|
|
object1_collide <= object1_collide_dir[ object1_dir ];
|
|
end
|
|
|
|
always @( * ) begin
|
|
if ( object1_en && object2_en && object2_RBound <= object1_RBound && object2_RBound >= object1_H &&
|
|
~( object2_DBound < object1_V || object2_V > object1_DBound ) ) begin
|
|
object2_collide_dir[ 3 ] <= 1;
|
|
end
|
|
else begin
|
|
object2_collide_dir[ 3 ] <= 0;
|
|
end
|
|
|
|
if ( object1_en && object2_en && object2_H <= object1_RBound && object2_H >= object1_H &&
|
|
~( object2_DBound < object1_V || object2_V > object1_DBound ) ) begin
|
|
object2_collide_dir[ 2 ] <= 1;
|
|
end
|
|
else begin
|
|
object2_collide_dir[ 2 ] <= 0;
|
|
end
|
|
|
|
if ( object1_en && object2_en && object2_V <= object1_DBound && object2_V >= object1_V
|
|
&& ~( object2_RBound < object1_H || object2_H > object1_RBound ) ) begin
|
|
object2_collide_dir[ 0 ] <= 1;
|
|
end
|
|
else begin
|
|
object2_collide_dir[ 0 ] <= 0;
|
|
end
|
|
|
|
if ( object1_en && object2_en && object2_DBound <= object1_DBound && object2_DBound >= object1_V
|
|
&& ~( object2_RBound < object1_H || object2_H > object1_RBound ) ) begin
|
|
object2_collide_dir[ 1 ] <= 1;
|
|
end
|
|
else begin
|
|
object2_collide_dir[ 1 ] <= 0;
|
|
end
|
|
object2_collide <= object2_collide_dir[ object2_dir ];
|
|
end
|
|
|
|
|
|
endmodule
|