当前位置:   article > 正文

FPGA_Verilog学习之旅(3)---VGA贪吃蛇游戏_verilog贪吃蛇暂停

verilog贪吃蛇暂停


前言

上一篇文章主要介绍了VGA一些基本的东西,然后想用VGA做一个贪吃蛇游戏,本来以为会开发一段时间,没想到两天就写完了,这篇文章就简单谈一谈VGA贪吃蛇的设计思路,由于代码过多,这篇就仅在结尾处贴出顶层模块代码
---------此篇文章主要内容:FPGA-VGA贪吃蛇游戏设计思路

一、整体设计流程

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

二、RTL Viewer

在这里插入图片描述

三、主要模块功能

1、按键控制模块

负责在四种游戏状态(游戏开始、难度选择、游戏进行、游戏结束)的切换,根据不同游戏状态下-按键的输入,输出不同的游戏状态信号(状态机控制)

在这里插入图片描述
其中,在游戏进行中时:

  1. 贪吃蛇处于左、右行进时—上、下按键有效
  2. 贪吃蛇处于上、下行进时—左、右按键有效
    在这里插入图片描述

2、VGA驱动模块

根据按键控制模块输出的四种游戏状态,切换不同显示画面
在这里插入图片描述

3、游戏开始模块

负责显示一个170*170像素贪吃蛇图片,事先存放到片内ROM中,使用时进行输出
在这里插入图片描述

4、难度选择模块

负责选择游戏难易程度,根据上、下按键的输入,输出不同的速度值信号
在这里插入图片描述

5、游戏进行模块

  1. 接收难度选择模块输出的速度值,从而设置贪吃蛇的移动速度
  2. 控制贪吃蛇行进方向
  3. 控制蛇身长度增长,每吃一个苹果加一节蛇身,蛇头加蛇身最长可达25节
  4. 随机苹果生成,一旦苹果被吃,随机生成一个新苹果(使用一个加法器产生随机数)
  5. 一旦发生撞墙、撞到自身,立即结束游戏,并把游戏分数传送到游戏结束模块

在这里插入图片描述

6、游戏结束模块

接收游戏进行模块输出的游戏分数,显示游戏结束和游戏分数
在这里插入图片描述

四、实况展示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结

从开始构思框架、写流程、敲代码、实板测试、调试BUG等等,来来回回折腾了整整两天,眼睛都盯电脑盯花了,不过结果还不错
由于代码太多了,这里就仅贴一个顶层模块的代码
附:顶层模块源码

/* -----VGA贪吃蛇游戏----- */

module Top_VGA_Game_Snake(
    input         sys_clk_50,       // 全局时钟信号
    input         sys_rst_n,        // 复位信号(低有效)
    input  [ 3:0] key,              // 按键输入:上-下-左-右<--->key[0]-key[1]-key[2]-key[3]    
    
    output [23:0] vga_rgb,          // RGB888红绿蓝三原色输出
    output        vga_hs,           // 行同步信号
    output        vga_vs,           // 场同步信号
    output        vga_clk_25,       // VGA时钟
    output        vga_blank,        // 场消隐信号
    output        vga_sync          // 同步控制信号输入
);

// 连线型变量
wire        locked_w;
wire        rst_n_w; 
wire        vga_clk_25_w;
wire [ 9:0] pixel_xpos_w;
wire [ 9:0] pixel_ypos_w;
wire [23:0] data_start_w;
wire [23:0] data_speed_w;
wire [23:0] data_play_w;
wire [23:0] data_end_w;
wire [ 3:0] state_m_w;     
wire        speed_m_w;     
wire [ 3:0] move_d_w;     
wire        game_over_w;   
wire [ 5:0] game_score_w;  

/* -----main code----- */

assign vga_clk_25 = vga_clk_25_w;
// 待PLL输出稳定之后,停止复位 
assign rst_n_w = locked_w & sys_rst_n; 
// 同步控制信号输入(这里不需要,可直接接低电平)
assign vga_sync = 1'b0;

// PLL_IP核例化模块,进行时钟分频,输出25MHz 
pll_clk	u_pll_clk(
	.areset     (~sys_rst_n  ),  // 由于锁相环为高电平复位,故取反
	.inclk0     (sys_clk_50  ),
    
	.c0         (vga_clk_25_w),
	.locked     (locked_w    )  
);

// VGA驱动模块
VGA_Driver u_VGA_Driver(
    .vga_clk_25   (vga_clk_25_w),
    .rst_n        (rst_n_w     ),
    .state_m      (state_m_w   ),
    .data_start   (data_start_w),  // 接收当前游戏状态
    .data_speed   (data_speed_w),  // 接收设定游戏速度
    .data_play    (data_play_w ), 
    .data_end     (data_end_w  ),
                
    .vga_rgb      (vga_rgb     ),
    .vga_hs       (vga_hs      ),
    .vga_vs       (vga_vs      ),
    .vga_blank    (vga_blank   ),
    .pixel_xpos   (pixel_xpos_w),  
    .pixel_ypos   (pixel_ypos_w)
);

// 按键控制模块
Key_Ctrl u_Key_Ctrl(   
    .clk          (sys_clk_50 ),           
    .rst_n        (rst_n_w    ),
    .key          (key        ),         
    .game_over    (game_over_w),   // 接收游戏结束信号

    .state_m      (state_m_w  ),   // 输出当前游戏状态
    .move_d       (move_d_w   ),   // 输出贪吃蛇移动方向
    .speed_m      (speed_m_w  )    // 输出设置的游戏速度
);

// 游戏开始界面
Game_Start u_Game_Start( 
    .vga_clk_25  (vga_clk_25_w),      
    .rst_n       (rst_n_w     ),            
    .pixel_xpos  (pixel_xpos_w),     
    .pixel_ypos  (pixel_ypos_w),    
    
    .pixel_data  (data_start_w)       
);

// 速度选择界面
Game_Speed u_Game_Speed( 
    .vga_clk_25  (vga_clk_25_w),      
    .rst_n       (rst_n_w     ),            
    .pixel_xpos  (pixel_xpos_w),     
    .pixel_ypos  (pixel_ypos_w),    
    
    .pixel_data  (data_speed_w)   // 输出游戏速度设置      
);

// 游戏进行界面
Game_Play u_Game_Play( 
    .vga_clk_25  (vga_clk_25_w),      
    .rst_n       (rst_n_w     ),            
    .pixel_xpos  (pixel_xpos_w),     
    .pixel_ypos  (pixel_ypos_w),
    .state_m     (state_m_w   ),  // 接收当前游戏状态
    .speed_m     (speed_m_w   ),  // 接收设置的游戏速度
    .move_dirt   (move_d_w    ),  // 接收贪吃蛇移动方向
    
    .game_over   (game_over_w ),  // 输出游戏结束信号
    .game_score  (game_score_w),  // 输出游戏得分
    .pixel_data  (data_play_w )       
);

// 游戏结束界面
Game_End u_Game_End( 
    .vga_clk_25  (vga_clk_25_w),      
    .rst_n       (rst_n_w     ),            
    .pixel_xpos  (pixel_xpos_w),     
    .pixel_ypos  (pixel_ypos_w), 
    .game_score  (game_score_w),  // 接收游戏得分
    
    .pixel_data  (data_end_w )       
);

endmodule 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125

源码下载链接

https://download.csdn.net/download/hxt691083776/13102976?spm=1001.2014.3001.5503

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号