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 输出及数码管译码进行逐项验证。

VGA 贪吃蛇游戏 Verilog Quartus 设计文档图片 image1.png

VGA 贪吃蛇游戏 Verilog Quartus 设计文档图片 image10.png

VGA 贪吃蛇游戏 Verilog Quartus 设计文档图片 image11.png

VGA 贪吃蛇游戏 Verilog Quartus 设计文档图片 image12.png

VGA 贪吃蛇游戏 Verilog Quartus 设计文档图片 image13.png

VGA 贪吃蛇游戏 Verilog Quartus 设计文档图片 image14.png

VGA 贪吃蛇游戏 Verilog Quartus 设计文档图片 image15.png

VGA 贪吃蛇游戏 Verilog Quartus 设计文档图片 image16.png

VGA 贪吃蛇游戏 Verilog Quartus 设计文档图片 image17.png

VGA 贪吃蛇游戏 Verilog Quartus 设计文档图片 image18.png

VGA 贪吃蛇游戏 Verilog Quartus 设计文档图片 image19.png

VGA 贪吃蛇游戏 Verilog Quartus 设计文档图片 image2.png

VGA 贪吃蛇游戏 Verilog Quartus 设计文档图片 image20.png

VGA 贪吃蛇游戏 Verilog Quartus 设计文档图片 image21.png

VGA 贪吃蛇游戏 Verilog Quartus 设计文档图片 image22.png

VGA 贪吃蛇游戏 Verilog Quartus 设计文档图片 image23.png

VGA 贪吃蛇游戏 Verilog Quartus 设计文档图片 image24.png

VGA 贪吃蛇游戏 Verilog Quartus 设计文档图片 image25.png

VGA 贪吃蛇游戏 Verilog Quartus 设计文档图片 image26.png

VGA 贪吃蛇游戏 Verilog Quartus 设计文档图片 image27.png

VGA 贪吃蛇游戏 Verilog Quartus 设计文档图片 image28.png

VGA 贪吃蛇游戏 Verilog Quartus 设计文档图片 image29.png

VGA 贪吃蛇游戏 Verilog Quartus 设计文档图片 image3.png

VGA 贪吃蛇游戏 Verilog Quartus 设计文档图片 image4.png

VGA 贪吃蛇游戏 Verilog Quartus 设计文档图片 image5.png

VGA 贪吃蛇游戏 Verilog Quartus 设计文档图片 image6.png

VGA 贪吃蛇游戏 Verilog Quartus 设计文档图片 image7.png

VGA 贪吃蛇游戏 Verilog Quartus 设计文档图片 image8.png

VGA 贪吃蛇游戏 Verilog Quartus 设计文档图片 image9.png

部分代码

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

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

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