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

代码文件(付费下载)

📥 付费后此处显示完整工程压缩包下载链接。
1、代码文件需要付费后才可见。
2、支付问题请联系微信公众号客服。
3、优质Verilog/VHDL代码资源,所见即所得。
Verilog/VHDL资源下载 » VGA 音乐游戏 FPGA 设计 Verilog Vivado

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

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