VGA 音乐游戏 FPGA 设计 Verilog Vivado
名称:VGA 音乐游戏 FPGA 设计 Verilog Vivado
软件:Vivado
语言:Verilog
功能介绍
本设计是一个基于 FPGA 的 VGA 音乐游戏工程,使用 Verilog 编写并在 Vivado 环境下开发。系统通过 VGA 输出游戏画面,结合键盘输入完成玩家操作,同时使用七段数码管显示分数,并预留 MP3 播放控制接口,用于实现音乐、轨道和按键响应相结合的游戏效果。 顶层模块 GAME_TOP 集成了 VGA 显示控制、PS/2 键盘输入、分数显示、MP3 控制、时钟管理和复位控制等功能。游戏逻辑通过 music_id 选择歌曲或关卡相关内容,通过 rst_track 控制轨道复位,VGA 输出包含 4 位 R/G/B 颜色信号以及 hs、vs 同步信号,适合连接常见 VGA 显示设备进行画面显示。 工程中使用 Vivado IP 生成的时钟模块和 Block Memory 相关模块,适合用于图像、轨道或音乐相关数据的存储和读取。整体功能覆盖 FPGA 游戏类课程设计常见要求:实时显示、按键交互、得分统计、数码管显示和外设控制,适合作为 VGA 游戏、音乐节奏游戏、PS/2 键盘控制和多模块系统集成的参考工程。
运行环境
开发语言:Verilog 开发软件:Vivado 顶层模块:GAME_TOP 工程类型:FPGA VGA 音乐游戏设计,包含 Vivado 工程文件 VGA_hw.xpr、Verilog 源码、IP 配置、综合运行结果和管脚约束文件。
设计思路
设计以 GAME_TOP 作为系统顶层,将显示、输入、计分和音频播放几个功能域组合在一起。外部 100MHz 时钟首先进入 clk_wiz_0,产生 VGA 显示使用的 65MHz 时钟和后级分频使用的 12MHz 时钟;Divider 再生成 1000Hz 扫描刷新时钟和 2MHz MP3 控制时钟,使不同外设运行在各自合适的时钟频率下。 游戏显示部分由 VGA 相关模块完成,顶层向其传入音乐编号、键盘状态和轨道复位信号,并输出 RGB、行同步 hs、场同步 vs 以及当前得分。这样的结构把画面生成、轨道状态和得分计算集中在显示游戏逻辑中,顶层只负责信号连接和系统集成,便于后续替换图像素材或调整轨道控制逻辑。 键盘模块负责采集 PS/2 键盘时钟和数据,将按键解析为内部 keys/key_state 信号供游戏逻辑使用;display_score 模块使用 1000Hz 时钟对七段数码管进行动态刷新,将 score 显示到数码管上。MP3 部分通过 mp3board 模块连接 SO、DREQ、XCS、XDCS、SCK、SI、XRESET 等信号,并根据 music_id 选择播放内容,实现画面游戏和音乐播放的联动。
模块结构
顶层模块:GAME_TOP,负责连接时钟、键盘、VGA、MP3、数码管和调试 LED 等接口。 主要功能模块包括:clk_wiz_0 时钟生成模块,Divider 分频模块,vga 显示与游戏逻辑模块,keyboard 键盘解析模块,display_score 分数显示模块,mp3board 音频播放控制模块,以及 track_control 等轨道控制相关模块。 工程还包含多个 blk_mem_gen IP,用于配合游戏画面、轨道或相关数据存储;track_testbench 可用于轨道控制相关逻辑的仿真参考。
开发板验证
工程已配置顶层管脚约束文件 top.xdc,可用于将 GAME_TOP 的 VGA、PS/2 键盘、数码管、MP3 模块控制信号、复位和调试 LED 等接口映射到实际 FPGA 引脚。顶层端口划分清晰,包含 clk_100、key_clk/key_data、music_id、VGA RGB/hs/vs、七段数码管 shift/oData 以及 MP3 模块 SPI/控制相关信号,便于结合开发板原理图进行硬件连接和验证。 该设计属于带外设联动的 FPGA 音乐游戏工程,板级验证重点包括 VGA 显示同步与颜色输出、键盘按键识别、分数显示刷新、音乐编号选择以及 MP3 播放控制信号时序。Vivado 综合结果已生成,适合作为课程设计、综合实验或 FPGA 游戏类项目的硬件实现参考。
仿真图/仿真说明/设计文档图片
工程中包含 track_testbench,可用于在 Vivado 仿真环境中对轨道控制相关逻辑进行调试参考。设计文档以 PDF 形式随工程保留,可配合源码理解系统结构和实验设计思路。
部分代码
以下展示顶层模块GAME_TOP的部分代码,完整代码可关注下方公众号卡片获取。
module GAME_TOP( input clk_100, //100Mhz //键盘 input key_clk, //键盘时钟 input key_data, //键盘输入数据 //复位控制 input rst, //复位 input rst_track, //轨道复位 //VGA input [3:0] music_id, //第几首歌 output [3:0] color_r, //R output [3:0] color_g, //G output [3:0] color_b, //B output hs, //行同?? output vs, //场同?? //七段数码管 output [7:0] shift, output [6:0] oData, //MP3 input SO, //传出 input DREQ, //数据请求,高电平时可传输数据 output XCS, //片???SCI 传输读???写指令 output XDCS, //片???SDI 传输数据 output SCK, //时钟 output SI, //传入mp3 output XRESET, //硬件复位,低电平有效 output [15:0] debugled ); //时钟 wire clk_65,clk_12,clk_1000,clk_2,locked; //键盘输入 wire [8:0] keys; wire key_state; //得分 wire [31:0] score; //分频1 clk_wiz_0 uut( .reset(~rst), .locked(locked), .clk_in1(clk_100), .clk_out1(clk_65), .clk_out2(clk_12) ); //分频器2 Divider uut_divider( .clk12Mhz(clk_12), .clk1000hz(clk_1000), .clk2Mhz(clk_2) ); //VGA vga uut_vga( .clk(clk_65), .rst(locked), .rst_track(rst_track), .music_id(music_id), .keys(keys), .key_state(key_state), .color_r(color_r), .color_g(color_g), .color_b(color_b), .hs(hs), .vs(vs), .score(score), .debugled(debugled) ); //MP3 mp3board uut_mp3( .clk(clk_2), .rst(rst), .play(rst_track), .SO(SO), .DREQ(DREQ), .XCS(XCS), .XDCS(XDCS), .SCK(SCK), .SI(SI), .XRESET(XRESET), .music_id(music_id) ); //键盘 keyboard uut_keyboard( .clk_in(clk_100), .rst(rst), .key_clk(key_clk), .key_data(key_data), .key_state(key_state), .key_ascii(keys) ); //数码管显示分数 display_score uut_score( .clk_1000hz(clk_1000), .score(score), .shift(shift),//第几个数码管(片选) .oData(oData) ); endmodule
代码获取:点击下方公众号卡片
