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 弹球游戏设计 Verilog Vivado Nexys A7 Quartus/Vivado 开发板验证图片 开发板.jpg

仿真图/仿真说明/设计文档图片

工程包含 VGA 顶层与图形生成相关的仿真测试文件,可用于检查 VGA 时序、像素坐标、球拍控制、小球运动、碰撞反弹、状态栏显示和分数更新等逻辑。配套设计文档说明了 640×480@60Hz 时序参数、系统模块划分、游戏流程、工程目录和测试项目,并提供 VGA 结构图、时序图、模块结构图及测试截图等设计资料。

VGA 弹球游戏设计 Verilog Vivado Nexys A7 Quartus/Vivado 设计文档图片 image1.png

VGA 弹球游戏设计 Verilog Vivado Nexys A7 Quartus/Vivado 设计文档图片 image10.png

VGA 弹球游戏设计 Verilog Vivado Nexys A7 Quartus/Vivado 设计文档图片 image11.png

VGA 弹球游戏设计 Verilog Vivado Nexys A7 Quartus/Vivado 设计文档图片 image12.png

VGA 弹球游戏设计 Verilog Vivado Nexys A7 Quartus/Vivado 设计文档图片 image13.png

VGA 弹球游戏设计 Verilog Vivado Nexys A7 Quartus/Vivado 设计文档图片 image2.png

VGA 弹球游戏设计 Verilog Vivado Nexys A7 Quartus/Vivado 设计文档图片 image3.png

VGA 弹球游戏设计 Verilog Vivado Nexys A7 Quartus/Vivado 设计文档图片 image4.jpeg

VGA 弹球游戏设计 Verilog Vivado Nexys A7 Quartus/Vivado 设计文档图片 image5.png

VGA 弹球游戏设计 Verilog Vivado Nexys A7 Quartus/Vivado 设计文档图片 image6.png

VGA 弹球游戏设计 Verilog Vivado Nexys A7 Quartus/Vivado 设计文档图片 image7.png

VGA 弹球游戏设计 Verilog Vivado Nexys A7 Quartus/Vivado 设计文档图片 image8.png

VGA 弹球游戏设计 Verilog Vivado Nexys A7 Quartus/Vivado 设计文档图片 image9.png

部分代码

以下展示顶层模块 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

注册为本站会员,充值100得150,详情咨询客服

目前为止共有 *** 位优秀的会员加入! 立刻加入会员