1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108module vga_controller #(
parameter PLAYER_RADIUS, // 25 px
parameter GOAL_RADIUS, // 40 px
parameter BALL_RADIUS // 5 px
)
( input clk,
input wire [9:0] y,
input wire [9:0] x,
input wire [9:0] team1_ver_pos,
input wire [9:0] team2_ver_pos,
input wire [9:0] ball_x,
input wire [9:0] ball_y,
output wire hor_sync,
output wire ver_sync,
output reg [7:0] red,
output reg [7:0] green,
output reg [7:0] blue
);
assign hor_sync = (x > 95) ? 1'b1 : 1'b0;
assign ver_sync = (y > 1) ? 1'b1 : 1'b0;
always @(posedge clk) begin
// if (x < 784 && x > 143 && y < 515 && y > 34) begin // the active region
if (x < 784 && x > 143 && y < 515 && y > 84) begin // field
if (
((y - ball_y)**2) + ((x - ball_x)**2) < BALL_RADIUS ** 2 // BALL
) red = 8'b00000000;
else if (
((y - team1_ver_pos)**2) + ((x - 300)**2) > PLAYER_RADIUS ** 2 // BLUE VER PLAYER
&& ( (((y-450)**2)+((x-200)**2) > (GOAL_RADIUS + 2)**2)
|| (((y-450)**2)+((x-200)**2) < (GOAL_RADIUS - 2)**2) ) // BLUE GOAL 1
&& ( (((y-330)**2)+((x-200)**2) > (GOAL_RADIUS + 2)**2)
|| (((y-330)**2)+((x-200)**2) < (GOAL_RADIUS - 2)**2) ) // BLUE GOAL 2
&& ( (((y-210)**2)+((x-200)**2) > (GOAL_RADIUS + 2)**2)
|| (((y-210)**2)+((x-200)**2) < (GOAL_RADIUS - 2)**2) ) // BLUE GOAL 3
) red = 8'b11111111;
else red = 8'b00000000;
if (
((y - team1_ver_pos)**2) + ((x - 300)**2) > PLAYER_RADIUS ** 2 // BLUE VER PLAYER
&& ((y - team2_ver_pos)**2) + ((x - 600)**2) > PLAYER_RADIUS ** 2 // RED VER PLAYER
&& ( (((y-450)**2)+((x-200)**2) > (GOAL_RADIUS + 2)**2)
|| (((y-450)**2)+((x-200)**2) < (GOAL_RADIUS - 2)**2) ) // BLUE GOAL 1
&& ( (((y-330)**2)+((x-200)**2) > (GOAL_RADIUS + 2)**2)
|| (((y-330)**2)+((x-200)**2) < (GOAL_RADIUS - 2)**2) ) // BLUE GOAL 2
&& ( (((y-210)**2)+((x-200)**2) > (GOAL_RADIUS + 2)**2)
|| (((y-210)**2)+((x-200)**2) < (GOAL_RADIUS - 2)**2) ) // BLUE GOAL 3
&& ( (((y-450)**2)+((x-700)**2) > (GOAL_RADIUS + 2)**2)
|| (((y-450)**2)+((x-700)**2) < (GOAL_RADIUS - 2)**2) ) // RED GOAL 1
&& ( (((y-210)**2)+((x-700)**2) > (GOAL_RADIUS + 2)**2)
|| (((y-210)**2)+((x-700)**2) < (GOAL_RADIUS - 2)**2) ) // RED GOAL 2
&& ( (((y-330)**2)+((x-700)**2) > (GOAL_RADIUS + 2)**2)
|| (((y-330)**2)+((x-700)**2) < (GOAL_RADIUS - 2)**2) ) // RED GOAL 3
) green = 8'b11111111;
else green = 8'b00000000;
if (((y - team2_ver_pos)**2) + ((x - 600)**2) > PLAYER_RADIUS ** 2 // RED VER PLAYER
&& ( (((y-450)**2)+((x-700)**2) > (GOAL_RADIUS + 2)**2)
|| (((y-450)**2)+((x-700)**2) < (GOAL_RADIUS - 2)**2) ) // RED GOAL 1
&& ( (((y-210)**2)+((x-700)**2) > (GOAL_RADIUS + 2)**2)
|| (((y-210)**2)+((x-700)**2) < (GOAL_RADIUS - 2)**2) ) // RED GOAL 2
&& ( (((y-330)**2)+((x-700)**2) > (GOAL_RADIUS + 2)**2)
|| (((y-330)**2)+((x-700)**2) < (GOAL_RADIUS - 2)**2) ) // RED GOAL 3
) blue = 8'b11111111;
else blue = 8'b00000000;
end else if (x < 784 && x > 143 && y < 85 && y > 81) begin // separator between field and board
red = 8'b00000000;
green = 8'b00000000;
blue = 8'b00000000;
end else if (x < 784 && x > 143 && y < 82 && y > 34) begin // board
red = 8'b10000000;
green = 8'b11111111;
blue = 8'b10101010;
end else begin // outside the active region
red = 8'b00000000;
green = 8'b00000000;
blue = 8'b00000000;
end
end
/* always @(posedge clk) begin
if (x < 'd784 && x > 'd143 && y < 'd515 && y > 'd34) begin
red <= 8'b11111111;
green <= 8'b11111111;
blue <= 8'b11111111;
end else begin
red <= 8'b00000000;
green <= 8'b00000000;
blue <= 8'b00000000;
end
end
*/
endmodule