Title: VGA Display Part 3 Animation
1VGA DisplayPart 3Animation
ECE 448 Lecture 11
2Required Reading
- P. Chu, FPGA Prototyping by VHDL Examples
- Chapter 12, VGA Controller I Graphic
-
- Source Codes of Examples
- http//academic.csuohio.edu/chu_p/rtl/fpga_vhd
l.html - Nexys 3 Board Reference Manual
- VGA Port, pages 15-17
3PONG
4PONG
- Commonly regarded as the first
- "commercially successful" video game
- Released by Atari in 1972
- Created by Allan Alcorn as a training exercise
- assigned to him by Atari co-founder Nolan
Bushnell - The first prototype developed completely in
- hardware using TTL devices
- Originally used as an arcade video game
- Home version released during the 1975 Christmas
season
5PONG
6PONG Interesting Videos
Pong Game http//www.ponggame.org First
documented Video Ping-Pong game
1969 https//www.youtube.com/watch?vXNRx5hc4gYc
Classic Game Room HD - PONG for Nintendo DS /
GBA https//www.youtube.com/watch?vTrezFjGF-Kg
7Animation
8Animation Basics
- Animation is achieved by an object changing
- its location gradually in each frame
- We use signals, instead of constants,
- to determine boundaries of an object
- VGA monitor is refreshed 60 times per second
- The boundary signals need to be updated
- at this rate
- We create a 60 Hz enable tick, refr_tick, which
- is asserted for 1 pixel period every 1/60th
of a second
9Moving the Bar (Paddle)
600 x 603 bar_y_t y bar_y_b bar_y_t
bar_y_reg bar_y_bbar_y_tBAR_Y_SIZE-1 BAR_V is
a velocity of the bar (pixels/frame)
10Moving the Bar in VHDL (1)
-- bar left, right boundary constant BAR_X_L
integer600 constant BAR_X_R
integer603 -- bar top, bottom boundary
signal bar_y_t, bar_y_b unsigned(9 downto 0)
constant BAR_Y_SIZE integer72 -- reg to
track top boundary (x position is fixed)
signal bar_y_reg, bar_y_next unsigned(9 downto
0) -- bar moving velocity when the button is
pressed constant BAR_V integer4
11Moving the Bar in VHDL (2)
-- boundary bar_y_t lt bar_y_reg bar_y_b
lt bar_y_t BAR_Y_SIZE - 1 -- pixel within
bar bar_on lt '1' when (BAR_X_Lltpix_x)
and (pix_xltBAR_X_R) and
(bar_y_tltpix_y) and (pix_yltbar_y_b) else
'0' -- bar rgb output bar_rgb lt "010"
--green
12Moving the Bar in VHDL (3)
-- new bar y-position process(bar_y_reg, bar_y_b,
bar_y_t, refr_tick, btn) begin bar_y_next
lt bar_y_reg -- no move if refr_tick'1'
then if btn(1)'1' and bar_y_b lt
(MAX_Y-1-BAR_V) then bar_y_next lt
bar_y_reg BAR_V -- move down elsif
btn(0)'1' and bar_y_t gt BAR_V then
bar_y_next lt bar_y_reg - BAR_V -- move up
end if end if end process
13Circuit calculating bar_y_next
14Moving the Bar in VHDL (4)
process (clk, reset) begin if reset'1'
then bar_y_reg lt (othersgt'0')
elsif (clk'event and clk'1') then
bar_y_reg lt bar_y_next end if end process
15bar_y_reg, bar_y_t, and bar_y_b
16Moving the Ball
ball_x_l x ball_x_r ball_y_t y
ball_y_b ball_x_l ball_x_reg ball_x_rball_x_l
BALL_SIZE-1 ball_y_t ball_y_reg ball_y_bball_y
_tBALL_SIZE-1
17Ball Velocity
- The ball may change direction by hitting the
wall, - the paddle, or the bottom or top of the
screen - We decompose velocity into an x-component
- and a y-component
- Each component can have either a positive value
- BALL_V_P or a negative value BALL_V_N
- The current value of each component is kept
- in x_delta_reg and y_delta_reg
18Velocity Components of the Ball
x
x_delta_reg BALL_V_P y_delta_reg BALL_V_N
x_delta_reg BALL_V_N y_delta_reg BALL_V_N
x_delta_reg BALL_V_P y_delta_reg BALL_V_P
x_delta_reg BALL_V_N y_delta_reg BALL_V_P
y
19Moving the Ball in VHDL (1)
constant BALL_SIZE integer8 -- 8 -- ball
boundaries signal ball_x_l, ball_x_r unsigned(9
downto 0) signal ball_y_t, ball_y_b unsigned(9
downto 0) -- reg to track left, top boundary
signal ball_x_reg, ball_x_next unsigned(9 downto
0) signal ball_y_reg, ball_y_next unsigned(9
downto 0) -- reg to track ball speed signal
x_delta_reg, x_delta_next unsigned(9 downto 0)
signal y_delta_reg, y_delta_next unsigned(9
downto 0) -- ball velocity can be pos or neg
constant BALL_V_P unsigned(9 downto 0)
to_unsigned(2,10) constant BALL_V_N unsigned(9
downto 0) unsigned(to_signed(-2,10))
20Moving the Ball in VHDL (2)
type rom_type is array (0 to 7) of
std_logic_vector(0 to 7) constant BALL_ROM
rom_type ( "00111100", --
"01111110", -- "11111111", --
"11111111", --
"11111111", -- "11111111", --
"01111110", --
"00111100" -- ) signal rom_addr,
rom_col unsigned(2 downto 0) signal rom_data
std_logic_vector(0 to 7) signal rom_bit
std_logic
21Moving the Ball in VHDL (3)
ball_x_l lt ball_x_reg ball_y_t lt
ball_y_reg ball_x_r lt ball_x_l BALL_SIZE -
1 ball_y_b lt ball_y_t BALL_SIZE - 1 --
pixel within ball sq_ball_on lt '1' when
(ball_x_lltpix_x) and (pix_xltball_x_r) and
(ball_y_tltpix_y) and
(pix_yltball_y_b) else '0'
22Moving the Ball in VHDL (4)
-- map current pixel location to ROM addr/col
rom_addr lt pix_y(2 downto 0) - ball_y_t(2 downto
0) rom_col lt pix_x(2 downto 0) -
ball_x_l(2 downto 0) rom_data lt
BALL_ROM(to_integer(rom_addr)) rom_bit lt
rom_data(to_integer(rom_col)) -- pixel within
ball rd_ball_on lt '1' when
(sq_ball_on'1') and (rom_bit'1') else
'0' -- ball rgb output ball_rgb lt "100"
-- red
23Moving the Ball in VHDL (5)
-- new ball position ball_x_next lt
ball_x_reg x_delta_reg when refr_tick'1' else
ball_x_reg
ball_y_next lt ball_y_reg y_delta_reg when
refr_tick'1' else
ball_y_reg
24Moving the Ball in VHDL (6)
process(x_delta_reg, y_delta_reg, ball_x_l,
ball_x_r, ball_y_t, ball_y_b,
bar_y_t, bar_y_b) begin x_delta_next lt
x_delta_reg y_delta_next lt y_delta_reg
if ball_y_t lt 1 then -- reach top
y_delta_next lt BALL_V_P elsif ball_y_b gt
(MAX_Y-1) then -- reach bottom
y_delta_next lt BALL_V_N elsif ball_x_l lt
WALL_X_R then -- reach wall
x_delta_next lt BALL_V_P -- bounce back
elsif (BAR_X_Lltball_x_r) and (ball_x_rltBAR_X_R)
then -- reach x of right bar if
(bar_y_tltball_y_b) and (ball_y_tltbar_y_b) then
x_delta_next lt BALL_V_N --hit,
bounce back end if end if end
process
25Bouncing
y_delta_next lt BALL_V_P
x_delta_next lt BALL_V_P
x_delta_next lt BALL_V_N
y_delta_next lt BALL_V_N
26Circuit calculating y_delta_next
27Circuit calculating x_delta_next
28Moving the Ball in VHDL (7)
process (clk, reset) begin if reset'1'
then ball_x_reg lt (othersgt'0')
ball_y_reg lt (othersgt'0')
x_delta_reg lt BALL_V_P y_delta_reg lt
BALL_V_P elsif (clk'event and clk'1')
then ball_x_reg lt ball_x_next
ball_y_reg lt ball_y_next x_delta_reg
lt x_delta_next y_delta_reg lt
y_delta_next end if end process
29Generating ref_tick in VHDL
pix_x lt unsigned(pixel_x) pix_y lt
unsigned(pixel_y) -- refr_tick 1-clock tick
asserted at start of v-sync -- i.e., when
the screen is refreshed (60 Hz) refr_tick lt '1'
when (pix_y481) and (pix_x0) else
'0'
30Vertical Synchronization