VGA 弹球游戏设计 Verilog Vivado Nexys A7 Quartus/Vivado
名称:VGA 弹球游戏设计 Verilog Vivado Nexys A7 Quartus/Vivado
软件:Quartus/Vivado
语言:Verilog
开发板/平台:Nexys A7
功能介绍
这是一个运行在 Nexys A7-100T FPGA 开发板上的 VGA 弹球游戏设计,使用 Verilog HDL 和 Quartus/Vivado 工程文件实现。系统输出标准 640×480@60Hz VGA 图像,画面包含白色背景、左侧墙体、可由按键控制的右侧球拍以及持续运动的小球。小球碰到上下边界和左侧墙体会反弹,击中球拍后反弹并累计得分。 游戏顶部设有固定信息栏,显示 BALL GAME、SCORE、团队 ID 5547785 和团队徽标;数码管同步显示当前分数。板载按键用于控制球拍上下移动,拨码开关可调整小球速度和球拍尺寸。工程采用复位同步、按键消抖、VGA 时序、图形生成、字符点阵 ROM、徽标 ROM 和数码管显示等模块化结构,适合作为 VGA 时序、FPGA 图形绘制和交互逻辑综合实践项目。运行环境
硬件平台:Digilent Nexys A7-100T 开发板,FPGA 器件 XC7A100T-1CSG324C,VGA 显示器,USB 下载线。设计采用板载时钟,经 VGA 时序模块分频产生约 25MHz 像素更新节拍,输出 RGB444 颜色信号。 开发环境:Verilog HDL,Vivado 工程环境,并提供 Quartus 工程文件、约束文件和 ModelSim 仿真相关文件。工程顶层可使用 vga_controller_top,板级版本包含 Nexys A7 官方约束裁剪文件。设计思路
本项目采用逐像素扫描与实时图形判定相结合的实现方式,构建基于 FPGA 和 VGA 的交互式弹球游戏。系统以 640×480@60Hz 为显示目标,通过 VGA 时序模块产生像素坐标、行场同步和可见区信号;图形生成模块依据当前坐标判断背景、顶部信息栏、左侧墙体、球拍和小球的显示优先级,并输出 RGB444 像素颜色。顶部固定 100 像素信息栏显示 BALL GAME、当前分数、团队 ID 与徽标,颜色和团队信息通过参数配置,便于修改主题。 游戏状态在时序逻辑中更新。小球持续运动,碰到顶部或底部边界时改变垂直方向,碰到左侧墙体时改变水平方向,击中右侧球拍后反弹并增加分数。玩家通过上下按键控制球拍位置,按键输入先经过消抖处理;速度拨码和球拍尺寸拨码直接参与运动参数选择,使游戏具有可调节的交互效果。分数同时送入 VGA 信息栏和八位数码管扫描模块,实现屏幕与板载显示的同步反馈。模块结构
系统顶层为 vga_controller_top,负责连接 50MHz 时钟、复位、按键、拨码开关、VGA 和数码管接口。aiso_rst 完成复位同步,debounce 对上下按键进行消抖,vga_sync 产生 VGA 像素节拍、hsync、vsync、像素坐标和 video_on 信号。 graphic_generator 负责球拍与小球状态更新、边界及球拍碰撞检测、分数累加和像素颜色生成;vga_text_overlay 用于绘制顶部信息栏,font_rom_7x8 提供数字与大写字母点阵,team_badge_rom 生成团队徽标图案,display 完成八位数码管动态扫描。工程同时提供 Nexys A7 的 XDC/QSF 约束和对应仿真测试文件。开发板验证
本设计已在 Nexys A7-100T 开发板上完成板级验证。工程提供对应的引脚约束文件,覆盖板载时钟、复位与上下按键、速度和球拍尺寸拨码开关、VGA 输出以及八位数码管接口。验证功能包括 640×480 VGA 游戏画面、球拍按键控制、边界与墙体反弹、球拍碰撞计分、顶部信息栏显示和数码管分数显示。
仿真图/仿真说明/设计文档图片
工程包含 VGA 顶层与图形生成相关的仿真测试文件,可用于检查 VGA 时序、像素坐标、球拍控制、小球运动、碰撞反弹、状态栏显示和分数更新等逻辑。配套设计文档说明了 640×480@60Hz 时序参数、系统模块划分、游戏流程、工程目录和测试项目,并提供 VGA 结构图、时序图、模块结构图及测试截图等设计资料。












部分代码
以下展示顶层模块 vga_controller_top 的部分代码,完整源码请下载压缩包查看。
module vga_controller_top(
clk_50M,
rst,
speed_sw,
size_sw,
btn_up,
btn_down,
hsync,
vsync,
VGA_CLK,
VGA_BLANK_N,
bit_sel,
seg_sel,
rgb
);
// ========================= 顶部信息栏样式参�?=========================
parameter [27:0] TEAM_ID_BCD = {4'd5, 4'd5, 4'd4, 4'd7, 4'd7, 4'd8, 4'd5};
parameter [9:0] INFO_BAR_HEIGHT = 10'd100;
parameter [11:0] TEAM_COLOR_PRIMARY = 12'h2A8;
parameter [11:0] TEAM_COLOR_TEXT = 12'hFFF;
parameter [11:0] WALL_COLOR = 12'h00F;
parameter [11:0] BG_COLOR = 12'hFFF;
parameter [11:0] BALL_COLOR = 12'hF00;
// ========================= 外部接口 =========================
input clk_50M; // 板载 50MHz 时钟
input rst; // 外部低有效复位按键输�?
input [1:0] speed_sw; // 球速选择输入
input [1:0] size_sw; // 球拍尺寸选择输入
input btn_up; // 球拍上移按键
input btn_down; // 球拍下移按键
output hsync; // VGA 行同�?
output vsync; // VGA 场同�?
output VGA_CLK; // VGA 像素时钟
output VGA_BLANK_N; // VGA 有效区指�?
output [3:0] bit_sel; // 数码管位�?
output [6:0] seg_sel; // 数码管段�?
output [11:0] rgb; // VGA RGB444 颜色输出
// ========================= 内部连线 =========================
wire clk; // 内部逻辑使用的时�?
wire video_on; // 当前像素是否在可见显示区
wire rst_s; // 同步后的高有效复�?
wire [9:0] pixel_x; // 当前像素 x 坐标
wire [9:0] pixel_y; // 当前像素 y 坐标
wire db_btn_up; // 消抖后的上移按键信号
wire db_btn_down; // 消抖后的下移按键信号
wire [1:0] btn_up_dowm; // 组合成图形模块需要的 2 位按键信�?
wire [7:0] score; // 当前分数
wire hsync_buf; // 行同步内部信�?
wire vsync_buf; // 场同步内部信�?
wire [11:0] rgb_buf; // RGB 内部信号
// 顶层输出连接
assign hsync = hsync_buf;
assign vsync = vsync_buf;
assign rgb = rgb_buf;
assign clk = clk_50M;
// 复位同步模块�? // 外部按键为低有效,本模块输出内部使用的高有效同步复位信号 rst_s�?
aiso_rst u0(
.clk(clk),
.reset(rst),
.reset_s(rst_s)
);
// VGA 时序发生器:
// 负责生成 hsync / vsync / VGA_CLK / VGA_BLANK_N�? // 同时给出当前像素坐标�?video_on 信号�?
vga_sync u1(
.clk(clk),
.rst(rst_s),
.VGA_CLK(VGA_CLK),
.VGA_BLANK_N(VGA_BLANK_N),
.hsync(hsync_buf),
.vsync(vsync_buf),
.pixel_x(pixel_x),
.pixel_y(pixel_y),
.video_on(video_on)
);
// 上移按键消抖
debounce u2(
.clk(clk),
.reset(rst_s),
.sw(btn_up),
.db(db_btn_up)
);
// 下移按键消抖
debounce u3(
.clk(clk),
.reset(rst_s),
.sw(btn_down),
.db(db_btn_down)
);
// 将两个方向按键信号打包成 2 位总线,便于传给图形模�?
assign btn_up_dowm = {db_btn_down, db_btn_up};
// 图形生成模块�? // 根据当前像素坐标、游戏状态和按键信息,生成最终画面和分数�?
graphic_generator #(
.TEAM_ID_BCD(TEAM_ID_BCD),
.INFO_BAR_HEIGHT(INFO_BAR_HEIGHT),
.TEAM_COLOR_PRIMARY(TEAM_COLOR_PRIMARY),
.TEAM_COLOR_TEXT(TEAM_COLOR_TEXT),
.WALL_COLOR(WALL_COLOR),
.BG_COLOR(BG_COLOR),
.BALL_COLOR(BALL_COLOR)
) u4 (
.clk(clk),
.rst(rst_s),
.btn(btn_up_dowm),
.pixel_x(pixel_x),
.pixel_y(pixel_y),
.speed_sw(speed_sw),
.size_sw(size_sw),
.video_on(video_on),
.score(score),
.rgb(rgb_buf)
);
// ... 以下代码略,完整源码请下载压缩包查看
代码文件(付费下载)
📥
付费后此处显示完整工程压缩包下载链接。
1、代码文件需要付费后才可见。
2、支付问题请联系微信公众号客服。
3、优质Verilog/VHDL代码资源,所见即所得。
Verilog/VHDL资源下载 » VGA 弹球游戏设计 Verilog Vivado Nexys A7 Quartus/Vivado
2、支付问题请联系微信公众号客服。
3、优质Verilog/VHDL代码资源,所见即所得。
Verilog/VHDL资源下载 » VGA 弹球游戏设计 Verilog Vivado Nexys A7 Quartus/Vivado