贪吃蛇 VGA 游戏 Verilog Quartus

名称:贪吃蛇 VGA 游戏 Verilog Quartus

软件:Quartus

语言:Verilog

开发板/平台:DE2-115

功能介绍

这是一个运行在 DE2-115 开发板上的 Verilog 贪吃蛇 VGA 游戏工程。设计以 Snake 为顶层模块,支持 50 MHz 时钟、复位、按键方向控制、速度模式选择以及开始/暂停操作,游戏画面通过 VGA 接口输出,得分通过开发板数码管显示。 工程包含主状态机、导航状态机、蛇体控制、随机目标生成、速度计数、VGA 时序封装、计分器和七段数码管译码等模块。两组按键输入分别连接 PUSH_BUTTONS 与 c_PUSH_BUTTONS,顶层同时保留两套导航与得分信号,适合学习多模块协同、游戏状态管理、随机位置生成和 FPGA 视频输出的实现方法。 源码配套 Quartus 工程文件、引脚约束和编译输出文件,模块划分清晰,能够直接作为 DE2-115 VGA 游戏开发、Verilog 状态机设计和 FPGA 外设接口实验的参考。

运行环境

开发工具:Intel Quartus 工程环境 硬件平台:Altera DE2-115 开发板 设计语言:Verilog 顶层模块:Snake 时钟输入:CLOCK(50 MHz) 外设接口:按键输入、VGA 输出、HEX0-HEX3 数码管输出 工程文件:Snake.qpf、Snake.qsf 及 scr 目录下的 Verilog 源文件

设计思路

顶层 Snake 模块以 CLOCK 和 RESET 为基础时序与复位输入,通过 MasterStateMachine 管理游戏总体状态,并将两组按键分别送入 NavigationStateMachine,形成主蛇与对照蛇的方向状态。SnakeControl 集中处理蛇体位置、目标碰撞、得分、自撞以及墙边相关状态,并使用随机地址模块提供目标位置更新信号。 GenericCounter_speed 根据 speed_mode、当前 Score 以及 stop_start 产生 Gameclock,游戏逻辑在该节拍下更新,从而实现简单、中等和困难等速度模式,并支持开始/暂停控制。VGAWrapper 接收水平和垂直地址及颜色数据,输出 VGA 时钟、行场同步、消隐和颜色信号;ScoreCounter 与 Seg7Decoder 负责计分结果到 HEX0-HEX3 数码管显示的连接。各模块通过明确的状态线、坐标线和得分线连接,便于在 Quartus 工程中逐级查看和修改。

模块结构

顶层模块为 Snake,主要连接关系如下: MasterStateMachine 负责游戏主状态与自撞输入处理;NavigationStateMachine 实例化两份,分别产生 NavState 和 c_NavState;RandomWrapper 组合 PRandomHorz 与 PRandomVert,为目标生成提供水平和垂直随机地址;GenericCounter_speed 根据速度模式与得分产生 Gameclock。 SnakeControl 是游戏核心控制模块,连接地址、颜色、目标到达、导航状态、随机地址、得分和 Suicide 信号。VGAWrapper 负责将 AddrH、AddrV 与 Colour 转换为 VGA 输出时序。ScoreCounter 输出 Score 与 c_Score,Seg7Decoder 用于数码管显示,GenericCounter 则提供通用计数功能。

开发板验证

工程提供 DE2-115 开发板的管脚约束与分配文件,可在 Quartus 中完成引脚配置并下载生成的 SOF 文件进行硬件验证。顶层接口包含 50 MHz 时钟、复位、两组按键输入、速度模式、开始/暂停控制、VGA 颜色与同步信号以及 HEX 数码管输出,便于连接开发板按键、VGA 接口和数码管进行整机测试。

部分代码

以下展示顶层模块 Snake 的部分代码,完整源码请下载压缩包查看。

module Snake(
    input CLOCK,//50M
    input RESET,//高电平复位
	 input [3:0] PUSH_BUTTONS,//按键
	 input [3:0] c_PUSH_BUTTONS,//按键
	 input [1:0] speed_mode,//简单中等困难三个模式
	 input stop_start,//开始暂停
    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,
    output [7:0] HEX2,
    output [7:0] HEX3
	 );

	// the wires for connecting the modules
	wire [1:0] MasterState;
	wire [1:0] NavState;
	wire [1:0] c_NavState;
	wire [7:0] RandomAddrH;
	wire [6:0] RandomAddrV;	
	wire [9:0] AddrH;
	wire [8:0] AddrV;
	wire [7:0] Colour;
	wire ReachedTarget;		
	wire c_ReachedTarget;
	wire [3:0] Score; // the score we get from the score counter
	wire [3:0] c_Score; // the score we get from the score counter
	wire Gameclock;
	wire Suicide;
	wire [3:0] NOT_PUSH_BUTTONS;
	wire REACHED_WALL;
	wire game_enable;
	
	//assign game_enable=(~REACHED_WALL & stop_start);
	assign game_enable=(stop_start);
	
	assign NOT_PUSH_BUTTONS= ~PUSH_BUTTONS;
		
	// initialize the modules
	MasterStateMachine MasterSTM (
					.RESET(RESET),
					.CLOCK(CLOCK),
					.PUSH_BUTTONS(NOT_PUSH_BUTTONS),
					.SCORE_IN(Score),
					.c_SCORE_IN(c_Score),
					.STATE_OUT(MasterState),
					.SUICIDE_IN(Suicide)
					);
					
	NavigationStateMachine NavSTM (
					.RESET(RESET),
					.CLOCK(Gameclock),
					.PUSH_BUTTONS(NOT_PUSH_BUTTONS),
					.STATE_OUT(NavState)
					);
					
	NavigationStateMachine c_NavSTM (
					.RESET(RESET),
					.CLOCK(Gameclock),
					.PUSH_BUTTONS(c_PUSH_BUTTONS),
					.STATE_OUT(c_NavState)
					);
					
  RandomWrapper RNDMWrp (
					.CLK(CLOCK),
					.RESET(RESET),
					.NEXT(ReachedTarget || c_ReachedTarget),
					.MASTER_STATE(MasterState),
					.HORIZONTAL(RandomAddrH),
					.VERTICAL(RandomAddrV)
					);
					
// Change this to adjust the snake's speed	
GenericCounter_speed  #(
		.COUNTER_WIDTH(32)
		)
	GameSpeed(
		.CLK(CLOCK),
		.RESET(RESET),
		.speed_mode(speed_mode),
		.SCORE(Score),
 		.ENABLE_IN(game_enable),	
		.TRIGG_OUT(Gameclock)
);						
	
  SnakeControl SnakeCtl (
    				.CLK(CLOCK),
					.RESET(RESET),
					.GAMECLOCK(Gameclock),
					.ADDRH(AddrH),
					.ADDRV(AddrV),
					.COLOUR(Colour),
					.REACHED_TARGET(ReachedTarget),
					.c_REACHED_TARGET(c_ReachedTarget),
					.MASTER_STATE(MasterState),
					.NAVIGATION_STATE(NavState),
					.c_NAVIGATION_STATE(c_NavState),
					.RAND_ADDRH(RandomAddrH),
					.RAND_ADDRV(RandomAddrV),
					.SCORE(Score),
					.c_SCORE(c_Score),
					.SUICIDE(Suicide)
					);

  VGAWrapper VGAWrp (
					.CLK(CLOCK),
					.RESET(RESET),
					.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)
// ... 以下代码略,完整源码请下载压缩包查看

代码文件(付费下载)

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

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

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