FPGA Breakout Atari 2600 Video Game FPGA Reproduction Doug Cumbie, CpE MS UCF Fall 2008 EEL 5772 – FPGA Design Professor: Jooheung Lee December 2, 2008
Atari Breakout Developed and released by Atari in 1976 as a coin-operated arcade game Originally designed by Steve Wozniak (Inventor of the Apple computer) using only discrete logic chips Eventually released for the Atari 2600 video game system in 1978
Gameplay Break bricks for points by altering the path of a moving ball with a controllable paddle Avoid missing the ball and losing 1 of the 5 available lives Destroy all the bricks across 2 levels for a total possible score of 864 points
FPGA Breakout Design Modules Video Generation User Input Controller Internal Logic Graphics Display Collision Logic Score/Lives Logic Paddle and Ball Frame Counters Ball Movement
FPGA Breakout Design Overview
Video Generation Model graphics resolution after Atari 2600 native resolution of 160x192 pixels Extends the 640x480 Pixel VGA Display Driver from Lab 2 Horizontal and Vertical Counters are scaled to create the appropriate pixel size and resolution [7:0] Pixel_X = Hcount / 4; [7:0] Pixel_Y = (Vcount >= 48) ? (Vcount-48)/2;
Graphics Display and Animation Graphics are displayed by setting the appropriate pixel color for each object when the Pixel_X and Pixel_Y values are at a specific location Objects include: Ball, Paddle, Walls, Bricks, Scoreboard Animations are done by using an adjustable counter module, FrameCounter, for timing the positional updates of the ball and paddle Paddle FrameCounter is fixed at 200Hz rate (5ms refresh) Ball FrameCounter is adjusted based on the number of bricks remaining 108 to 95 bricks: 33 Hz (30ms) 94 to 80 bricks: 50 Hz (20ms) 79 to 20 bricks: 100 Hz (10ms) 19 to 0 bricks: 125 Hz (8ms) Ball movement is varied by slope ΔY/ Δ X, and altered by colliding with different X-positions on the paddle
Collisions Ball collisions with objects reverses X or Y direction Ball collisions occur at object edges (Top, Bottom, Left, Right) Bricks (6 rows of 18 bricks – 108 total) Brick collisions are realized by checking ball’s current position and a 108-bit brick state register Bricks are only destroyed on a top or bottom collision If a brick top or bottom collision is detected, the following actions are performed: if (BRICKS[18*yBallBrick + xBallBrick]) begin // 1. Clear brick state BRICKS [18*(yBallBrick) + xBallBrick] = 0; // 2. Decrement total brick count brickCount = brickCount - 1; // 3. Alter ball’s motion yBallDelta = -yBallDelta; // 4. Update score Score = CalcScore(Score, yBallBrick); end
Score and Lives Logic Number fonts are stored in a 16 bit wide x 140 deep Single Port ROM (predefined in a COE file) Each digit has a unique ROM and values are displayed by painting gray pixels at the top of the screen for every logic ‘1’ in ROM The 3-digit Score is contained in a 10-bit register Score is converted to 3 BCD values for each digit (hundreds, tens, and ones place) by using a module Score3BCD
User Input Controller Provides input to the gameplay – moves paddle Uses original Atari 2600 joystick Hardware interface to Joystick: 9-pin male D-sub connector to Xilinx board’s I/O expansion headers Joystick commands send logic lows Verilog software module inverts commands
Demonstration…
Questions?