VGA 贪吃蛇游戏 Verilog Quartus
名称:VGA 贪吃蛇游戏 Verilog Quartus
软件:Quartus
语言:Verilog
开发板/平台:Cyclone IV FPGA开发板
功能介绍
这是一个基于 Verilog 和 Quartus 的 FPGA VGA 贪吃蛇游戏工程。系统以 50MHz 时钟为基础,通过按键控制蛇头移动方向,在 VGA 屏幕上绘制游戏区域、蛇身和随机生成的食物;蛇吃到食物后触发目标事件并更新分数,数码管同步显示计分结果。 工程包含完整的顶层设计和多个可独立仿真的功能模块,覆盖通用计数器、主状态机、导航状态机、随机数封装、蛇控制、VGA 封装、分数计数器及数码管译码。设计同时处理游戏开始、进行、胜利、失败、碰撞和复位等状态,适合学习 FPGA 游戏逻辑、VGA 时序和多模块 Verilog 工程组织方法。运行环境
开发环境为 Intel Quartus 工程,设计语言为 Verilog,顶层模块为 Snake,目标硬件为 Cyclone IV FPGA 开发板。工程使用 50MHz 时钟输入、4 位低电平有效按键、VGA 颜色与同步输出,以及 HEX0、HEX1 数码管接口。配套文件包含 Quartus 工程配置、管脚分配、Verilog 源码、各模块 testbench 和 ModelSim 仿真配置,可在 Quartus 中编译并进行模块级或顶层仿真。设计思路
设计采用分层模块化结构,将游戏状态管理、方向控制、蛇身运动、随机食物坐标、VGA 时序输出和数码管显示分别实现,再由顶层 Snake 统一连接。50MHz 输入时钟经过 GenericCounter 分频得到 Gameclock,作为蛇移动和方向状态更新的节拍;调整 COUNTER_MAX 即可改变移动速度。 MasterStateMachine 管理 idle、play、win、lose 等全局状态,NavigationStateMachine 根据低电平有效按键记录移动方向。SnakeControl 负责蛇身位置维护、像素坐标判断、目标碰撞和自碰撞检测,并输出当前颜色、吃到目标事件及 Suicide 状态。RandomWrapper 在目标被吃到时更新食物水平和垂直坐标,ScoreCounter 对有效事件计分,Seg7Decoder 将得分相关信息转换为 HEX0、HEX1 段码。VGAWrapper 根据像素地址和游戏状态产生颜色、行同步、场同步、VGA 时钟及消隐控制信号。模块结构
顶层模块为 Snake,主要连接关系如下: 1. MasterStateMachine:管理游戏全局状态,并接收得分与自杀碰撞状态。 2. NavigationStateMachine:在 Gameclock 节拍下解析按键,输出蛇头移动方向。 3. GenericCounter:对 50MHz 时钟分频,产生游戏移动节拍 Gameclock。 4. RandomWrapper:封装水平、垂直伪随机位置生成,在吃到目标后更新食物坐标。 5. SnakeControl:完成蛇身运动、碰撞检测、像素颜色生成、得分触发和游戏结束判断。 6. VGAWrapper:完成 VGA 像素地址、颜色、同步信号、VGA_CLK 和 VGA_BLANK_N 输出。 7. ScoreCounter:根据 ReachedTarget 事件更新当前得分。 8. Seg7Decoder:将计分相关信号译码为 HEX0、HEX1 数码管段码。开发板验证
工程已在 Cyclone IV FPGA 开发板上完成管脚约束配置,可将 50MHz 时钟、低电平按键、VGA 信号及 HEX0/HEX1 数码管连接到对应硬件接口进行验证。下载后通过方向按键控制蛇移动,VGA 输出游戏画面,数码管显示得分,复位信号用于重新开始游戏。演示视频
配套演示视频展示了贪吃蛇 VGA 游戏的运行过程,包括按键控制蛇头方向、随机食物生成、吃到食物后的得分变化以及游戏状态切换。结合视频可以直观看到 VGA 画面输出和数码管计分效果。仿真图/仿真说明/设计文档图片
设计文档配套整理了工程文件、程序编译、RTL 图、顶层 testbench 与顶层仿真图,并分别提供 GenericCounter、MasterStateMachine、NavigationStateMachine、RandomWrapper、ScoreCounter、SnakeControl、VGAWrapper、Seg7Decoder 等模块的 testbench 和仿真图,便于对时钟分频、状态转移、方向控制、随机坐标、计分、蛇运动、VGA 输出及数码管译码进行逐项验证。




























部分代码
以下展示顶层模块 Snake 的部分代码,完整源码请下载压缩包查看。
module Snake(
input [3:0] PUSH_BUTTONS,//按键
input CLOCK,//50M
input RESET,//高电平复位
output [7:0] COLOUR_OUT,
output HS,
output VS,
output VGA_CLK ,//VGA时钟
output VGA_BLANK_N ,//VGA颜色信号有效控制信号,高电平有效
output [7:0] HEX0,
output [7:0] HEX1
);
// 模块之间的连接信号(内部连线)
wire [1:0] MasterState;
wire [1:0] NavState;
wire [7:0] RandomAddrH;
wire [6:0] RandomAddrV;
wire [9:0] AddrH;
wire [8:0] AddrV;
wire [7:0] Colour;
wire ReachedTarget;
wire [3:0] Score; // 当前得分(来自 ScoreCounter)
wire Gameclock;
wire Suicide;
wire [3:0] NOT_PUSH_BUTTONS;
// 按键取反:适配“低电平按下”的按键硬件
assign NOT_PUSH_BUTTONS= ~PUSH_BUTTONS;
// 1) 主状态机:控制 idle/play/win/lose
MasterStateMachine MasterSTM (
.RESET(RESET),
.CLOCK(CLOCK),
.PUSH_BUTTONS(NOT_PUSH_BUTTONS),
.SCORE_IN(Score),
.STATE_OUT(MasterState),
.SUICIDE_IN(Suicide)
);
// 2) 方向状态机:根据按键决定移动方向(使用较慢的 Gameclock 作为节拍)
NavigationStateMachine NavSTM (
.RESET(RESET),
.CLOCK(Gameclock),
.PUSH_BUTTONS(NOT_PUSH_BUTTONS),
.STATE_OUT(NavState)
);
// 3) 随机位置:用于产生苹果坐标(吃到苹果时更新)
RandomWrapper RNDMWrp (
.CLK(CLOCK),
.RESET(RESET),
.NEXT(ReachedTarget),
.MASTER_STATE(MasterState),
.HORIZONTAL(RandomAddrH),
.VERTICAL(RandomAddrV)
);
// 4) 游戏节拍:用通用计数器把 50MHz 分频成更慢的 Gameclock
// 修改 COUNTER_MAX 可以调整蛇的移动速度
GenericCounter #(
.COUNTER_WIDTH(32),
.COUNTER_MAX(8166667))
GameSpeed(
.CLK(CLOCK),
.RESET(1'b0),
.ENABLE_IN(1),
.TRIGG_OUT(Gameclock)
);
// 5) 游戏核心逻辑:蛇身位置、碰撞检测、画面像素颜色、加分触发
SnakeControl SnakeCtl (
.CLK(CLOCK),
.GAMECLOCK(Gameclock),
.ADDRH(AddrH),
.ADDRV(AddrV),
.COLOUR(Colour),
.REACHED_TARGET(ReachedTarget),
.MASTER_STATE(MasterState),
.NAVIGATION_STATE(NavState),
.RAND_ADDRH(RandomAddrH),
.RAND_ADDRV(RandomAddrV),
.DEBUG_OUT(),
.SCORE(Score),
.SUICIDE(Suicide)
);
// 6) VGA 输出封装:产生 VGA 时序与输出颜色
VGAWrapper VGAWrp (
.CLK(CLOCK),
.MASTER_STATE(MasterState),
.ADDRH(AddrH),
.ADDRV(AddrV),
.CIN(Colour),
.COUT(COLOUR_OUT),
.VGA_BLANK_N(VGA_BLANK_N),
.VGA_CLK(VGA_CLK),
.HS(HS),
.VS(VS)
);
// 7) 得分计数器:每次吃到苹果加 1(每个 Gameclock 周期最多加一次)
ScoreCounter ScoreCnt(
.RESET(RESET),
.GAMECLOCK(Gameclock),
.REACHED_TARGET(ReachedTarget),
.CURRENT_SCORE(Score)
);
// 8) 数码管译码显示:把吃到苹果事件转换为段码输出
Seg7Decoder i_Seg7Decoder(
. clk(CLOCK),
.RESET(RESET),
. ReachedTarget(ReachedTarget),
. HEX0(HEX0),
. HEX1(HEX1)
);
endmodule
代码文件(付费下载)
📥
付费后此处显示完整工程压缩包下载链接。
1、代码文件需要付费后才可见。
2、支付问题请联系微信公众号客服。
3、优质Verilog/VHDL代码资源,所见即所得。
Verilog/VHDL资源下载 » VGA 贪吃蛇游戏 Verilog Quartus
2、支付问题请联系微信公众号客服。
3、优质Verilog/VHDL代码资源,所见即所得。
Verilog/VHDL资源下载 » VGA 贪吃蛇游戏 Verilog Quartus