基于FPGA的俄罗斯方块游戏设计与实现
2022-01-24吕兆承
李 营,吕兆承,施 勇
俄罗斯方块游戏是一款难易程度适中、操作方便的游戏,深受人们喜欢.常见的俄罗斯方块硬件游戏多由专用集成芯片或者单片机设计实现,而FPGA芯片具有高速并行计算、可编程,实现的游戏系统功能易拓展等特点,鉴于此本文根据VGA时序显示原理和俄罗斯方块游戏工作原理,在QuartusⅡ13.1环境下利用Verilog硬件描述语言和层次化建模思想设计实现硬件俄罗斯方块游戏系统[1].
1 俄罗斯方块游戏系统工作原理
本文俄罗斯方块游戏系统选用Altera公司Cyclone V系列的5CSXFC6D6F31C6芯片设计实现相应功能,由VGA显示器、FPGA芯片等构成.俄罗斯方块游戏的规则是当游戏开始初始化后,随机产生一个方块,当其下落过程中根据不同按键进行操作,比如当点击旋转按钮时将方块旋转,点击LEFT_KEY时向左移动,一旦下落到底并且满行时消除该行,当最新方块掉落行置顶时游戏结束.具体的游戏算法流程图如图1所示[2].
图1 俄罗斯方块游戏算法流程图
2 系统总体实现
采用自顶向下层次化建模思想设计实现俄罗斯方块系统各功能模块.系统的功能框图如图2所示.由图2可知,系统底层包含:按键输入处理模块(key.v)、方块移动控制模块(game_control.v)、数据路径模块(datapath.v)、游戏界面输出模块(merge.v)、VGA时序控制模块(vga_top)[3].
图2 系统设计思路和实现功能框图
2.1 按键输入处理模块
该模块的功能是对输入系统的各种控制信号进行上升沿检测及消抖,其接口框图如图3所示,图中输入按键UP_KEY、LEFT_KEY、RIGHT_KEY、DOWN_KEY分别用来控制方块旋转、方块向左、向右、向下移动[4],其对应消抖后输出信号为rotate、left、right、down.若UP_KEY按下1次,方块旋转1次,其他按键功能类似,此处不再列出.
图3 按键输入处理模块接口框图
2.2 方块移动控制模块
该模块的功能是:①根据游戏规则定义了10个状态,并采用有限状态机设计实现[5].②接收按键输入处理模块信号,将其控制输出后送至数据路径模块.
该模块的状态迁移图如图4所示.各状态的含义如下:
图4 系统状态迁移图
①空闲状态S_idle:点击系统复位按键rst_n后进入该状态.
②新的俄罗斯方块产生状态S_new.
③保持状态S_hold:在该状态中计时到固定时间后,转到下移状态S_down状态;或者根据不同输入信号指令转到下移或者移动状态.
④下移状态S_down:判断当前俄罗斯方块能否下移一格.若是则转到S_remove_1状态,否则转到S_shift状态.
⑤移动状态判断S_move:判断当前俄罗斯方块是否能够按照按键信号进行移动,若是转到S_shift状态,若不是转到S_remove_1状态.
⑥更新方块坐标状态S_shift:更新俄罗斯方块的坐标信息,返回S_hold状态.
⑦更新屏幕状态S_remove_1.
⑧消除行判断状态S_remove_2:重复判断,若无可消除的行跳转S_isdie状态.
⑨游戏结束判断状态S_isdie:若结束跳转到S_stop,否则跳转到S_new.
⑩清除屏幕状态S_stop.
2.3 数据路径模块
该模块主要功能是:根据方块移动控制模块给出的信号,对方块当前的状态进行判断,更新游戏背景[6].具体功能如下:
(1)游戏背景定义.背景R是24行10列的寄存器组,负责保存非活动方块坐标(①所有之前下落的方块;②下落后方块消除之后的结果).背景R中任一位置,如方块存在,则该位置为1,否则为0.
(2)数据交换.完成本模块与方块移动控制模块game_control间的控制.
(3)方块模型定义.定义了七种形状方块模型,如图5所示,图中阴影部分为固定点,即方块旋转时不变的格点.
图5 方块模型示意图
(4)方块运动.指活动方块的运动,所谓活动方块为当前下落中的方块,通过活动方块坐标表示.俄罗斯方块的运动包括4种:①方块随机产生;②方块旋转、下落、向左、向右四种移动方式;③方块停止与消除由S_remove1和S_remove2两个状态完成.④死亡判定.该模块的接口框图如图6所示,图中各端口含义如下:
图6 数据路径模块接口框图
输入端口.信号MOVE、DOWN、DIE、SHIFT、REMOVE_1、REMOVE_2、NEW、STOP、AUTODOWN、KEYBOARD等信号均连接方块移动控制模块相应输出.
输出端口.信号n、m指向当前活动方块固定点位置.信号BLOCK[6:0]指方块类型,由7位编码构成.信号MOVE_ABLE、SHIFT_FINISH、DOWN_ABLE、REMOVE_2_FINISH分别连接方块移动控制模块相应信号.M_OUT[239:0]指活动和非活动方块数据在背景数据输出.
2.4 游戏界面输出模块
该模块主要完成游戏界面最终输出功能,其接口框图如图7所示.图中各端口的含义如下:游戏界面背景ROW为20行,COL为10列,即非活动矩阵数据data_in[239:0],活动方块形状数据shape[6:0],活动方块的固定点位置坐标是x_pos[3:0]和y_pos[3:0],最终游戏界面数据data_out[ROW*COL-1:0],即data_out[199:0].
图7 游戏输出界面模块接口框图
2.5 VGA驱动控制模块
该模块的功能是接收游戏界面输出模块数据,将结果通过VGA接口在显示屏端显示[7].其接口框图如图8所示.
图8 VGA驱动控制模块接口框图
图中各端口的含义如下:
输入端口.num[199:0]连接游戏输出界面模块的data_out[199:0]信号.
输出端口.红色、绿色、蓝色三基色信号分别指OUTRed[3:0]、OUTGreen[3:0]、OUTBlue[3:0].hsync_r和vsync_r分别是行、场同步 信 号.图 中VGA_BLANKn、VGA_SYNCn、DAC_CLK均是 其DE2-115的VGA驱动 所需的3根 线,其中VGA_BLANKn和VGA_SYNCn分别设置为1和0,DAC_CLK连接25MHz驱动时钟.
2.6 系统顶层模块
将上述各模块连接完成后构成顶层模块,其核心代码如下:
3 系统仿真结果
3.1 系统软件仿真
系统设计完成后生成的RTL图如图9所示,由图可知各个功能模块与图2系统设计思路和功能框图一致[1],说明系统设计思路正确.
图9 系统RTL图
3.2 系统硬件显示效果
FPGA作为处理器读取DE10开发板键盘发送的按键信息后,通过VGA接口显示俄罗斯方块游戏运行界面.系统通过start按键控制游戏开始,通过其他四个按键分别控制方块旋转、向下、向左、向右移动.结果达到了系统设计要求,其硬件显示效果如图10所示[8].
图10 硬件显示效果图
4 结语
在640*480@60Hz的VGA分辨率下,基于Cyclone V系列 的5CSXFC6D6F31C6 FPGA芯片进行了俄罗斯方块系统硬件验证.文章提出的俄罗斯方块游戏系统设计思路是利用FPGA芯片开发游戏的有效尝试,相对于传统的硬件游戏系统,本系统功能更易拓展,如添加PS2键盘、LCD液晶显示等设备,系统有一定的工业应用前景[9].