这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 高校专区 » 毕业设计专区 » 基于FPGA的tetris游戏设计

共5条 1/1 1 跳转至

基于FPGA的tetris游戏设计

专家
2013-02-04 14:53:26     打赏

作者:湖北师范学院信工学院 谢虎城 刘蕾 周密

指导教师:梁赫西 闻辉

 

  作品简介

 

  


  开发背景:

  俄罗斯方块作为家喻户晓老少皆宜的大众游戏,具有的数学性、动态性与知名度。其上手极其简单,但是要熟练地掌握其中的操作与摆放技巧,难度却不低。本次ITAT电子系统设计团体赛,我们小组制作的是一款基于basys2开发板的俄罗斯方块(tetris)的游戏。

  结构说明:

  显示器技术规格提供的行频一般在30kHz~45kHz(保守数据),场频一般在50Hz~75Hz,针对以上数据,30kHz的行频进行扫描时所需时钟频率为:30kHz×800(行周期)=24MHz,则场频为:30kHz÷525(场周期)=57.14Hz 。

  本方块游戏采用标准的VGA(640×480,60Hz),主频为50MHz,VGA工作频率为25MHz。,本设计在原开发板的基础上增添了一片50M的有源晶振,以稳定VGA显示器的显示。

  软件平台上,本小组,利用Xlinx公司的ise14平台及 VHDL语言,分别设计了键盘检测模块、得分控制模块、游戏控制模块、存储模块(两块BRAM,分别存储图像颜色及字符编码)、文本显示模块、游戏显示模块、以及VGA显示模块,最后对各个模块进行了接口建模,组成了该tetris设计。

  功能与使用说明:

  (1) 游戏开始、复位按键F2

  开始时游戏处于停止状态须按下按键F2开始新游戏,游戏过程中也可以通 过按键F2随时重新开始游戏

  (2)游戏暂停及继续游戏按键F1

  游戏过程中可通过按键A、D控制左、右移动方块,按键S按下,以x4速度加速下降,按键Space可控制旋转方块,游戏途中可通过按键F1暂停游戏,须开始时再次按下按键F1即可。

  (3) 游戏得分统计

  在游戏模块右边的提示栏,可显示基本操作及当前得分数,每消除一行可得分1分,最高得分为9999分。

  (4) 游戏最高分统计

  游戏提示栏在每次重新开始游戏时可记录本次游戏的分数,若超过最高分则被统计显示。

  (5) 得分加速

  游戏进行过程中,默认以x1速度下降;得分超过100分,速度加倍为x2模式;超过200分,速度加倍为x3模式;超过300分,速度加倍为x4模式。

 

  平台选型说明

 

  基于basys2开发板的设计平台,外接一个50M有源晶振。

 

  设计说明

 

  一、设计原理

  KC :PS/2时钟输入

  KD :PS/2数据输入

  MCLK:系统50M有源晶振输入

  BLU:vga接口的蓝色输出信号

  GRN:vga接口的绿色输出信号

  HS :vga接口的行同步信号

  RED:vga接口的红色输出信号

  VS :vga接口的列同步信号

  


  通过检测键盘上的F1、F2、A、S、D、以及空格键控制游戏的暂停/继续、重新开始、模块左移、模块最快速度(X4)下降、模块右移、逆时钟方向旋转。游戏过程中可以随时通过F1暂停开始游戏,以及随时通过F2重新开始游戏,每次结束游戏重新开始时系统将记录下游戏最高分。得分在100下以X1速度下降,100-200以X2速度下降,200-300以X3速度下降,300分以上以X4速度下降

  在整体上,取屏幕521*800个像素点,取20*10*16*16个像素点作为游戏区域,取16*32*8*8个像素点作为文本显示区域。设计图如下:

  


  tetris游戏主要包括键盘检测模块、得分控制模块、游戏控制模块、存储模块(两块BRAM,分别存储图像颜色及字符编码)、文本显示模块、游戏显示模块、以及VGA显示模块。原理图如下:

  


  二、设计方案

  1 、键盘检测模块设计

  CLK :主时钟输入

  KC :PS/2键盘时钟

  KD :PS/2键盘数据

  RST :异步复位

  AN :按键确认

  SSEG(7:0):按键采样数据

  SSEGOUT(7:0):处理后按键数据

  SEND:输出信号

  


  该模块采用边沿检测法,通过两片Flip Flops构成移位寄存器,同时对键盘时钟及数据进行存储,并通过计数器控制接收的位数,然后截取其中有效的数据,送往下一模块进行检测,判断通码或断码,取断码的后八位数据。

  2、得分控制模块设计

  CL :计数信号

  MCLK :主时钟输入

  NG :新游戏信号

  CAR(7:0) :BRAM文本数据输出

  CRX(4:0) :BRAM地址输出

  CRY(3:0) :BRAM地址输出

  SPEED(1:0) :游戏速度输出

  WEN :BRAM写使能

  


  此模块接收来自游戏控制模块的复位和计数信号,新游戏开始时,检测得分数据是否大于最大值。比较结果用于判定是否需要更新最高得分的记录数据。不为最高值,则直接分数清零,进入游戏开始状态。在修改分数值的时候,仅修改字符对应BRAM的映射表,由文本显示模块负责寻址读取数据。同时在该模块,通过得分的记录信息,从而设置了多路选择,通过分值的不同输出不同的速度状态,传递至游戏控制模块

  3、游戏控制模块设计

  RECTIN(3:0) :BRAM数据输入

  SPEED(1:0) :游戏速度信号

  SSEG(7:0) :键盘通码

  AN :按键确认信号

  MCLK :主时钟输入

  CRX(4:0) :BRAM地址输出

  CRY(4:0) : BRAM地址输出

  RECTOUT(1:0) : BRAM数据输出

  CL :计数信号

  NG :新游戏开始信号

  WEN :BRAM写使能

  




关键词: 基于     tetris     游戏     设计     数据     显示     模块         

专家
2013-02-04 14:55:01     打赏
2楼

  本模块为本设计的核心模块,由一个有限状态机实现,游戏中随机产生的五种模块以及随机的八种颜色。可通过检测按键键值判断相应状态转移,按键F2,F1拥有最高优先级,可暂停,重启游戏。复位状态时,通过寄存器makex,makey将屏幕中所有颜色信息清零为000黑色。初始化状态时,随机产生模块及对应随机颜色。空闲状态时,通过控制时延,实现速度的控制。测试状态中

  测试每个模块组成部分(四个基本块组成的图形)与位于下左右格点状态,色彩数据存储时,采用四位存储,最高位为是否已经着色标注位。通过所在坐标位置寻址读取所需检测格点的颜色信息。判断后,如若被占用,转移到停止状态,测试得分,进行得分,停止游戏判断。四个格点分别检测一次,除去自身格点外。

  检测完所有格点,可执行翻转操作,打开写使能,以控制颜色数据的写入。

  写入黑色,便于格点的移动。移动完毕后,开始写入颜色信息到RAM块,写入完毕,写使能关闭。停止状态时,检测所有块是否到达第一行,到达则,进入暂停状态挂起。反之,进入删除状态。开始测试整个游戏模块,检测是否有完整一行全被被占据,检测到则加分送往得分控制模块并开始删除此行。删除状态采用移位的思想将此行上面的颜色信息的地址行坐标依次加1即可。无完整行,则转移至初始化状态选择新的模块。执行完一行的操作后,继续检测直到检测完毕。空格键按下后跳转到旋转状态,判断模块编号(已考虑旋转中的状态),检测旋转的条件及实现,依旧采用读取相应地址颜色信息,并对寻址地址进行修改,最终转移到空闲态。

  整个控制系统状态机:

  


  4、存储模块设计(两块BRAM,分别存储图像颜色及字符编码)

  游戏过程中需要两块BRAM来存储,来分别存储游戏过程中的游戏颜色信息和文本显示的信息。在颜色的存储方面,采用512*8的BRAM,采用一个格点4位数据的形式,共20*10个格点,每个格点采用16*16的像素。

  如图即四个格点组成的模块,翻转过程中的各种形态:

  


  游戏模块格点图:

  


  在文本显示的字符存储方面,共16*32个格点,每个格点由8*8个像素组成,每个格点存储一个字符的信息,这个基本字符预先写入RAM中,采用此种方法的弊端即占用RAM空间较多,优势在于便于实现和控制。在字符的存储上面讲8*8的像素中需要显示的用1表示,不需显示的用0表示,然后每行转化为两位十六进制共16进行存储,采用64*16的BRAM,共存储64个字符。文本的显示通过映射表进行字符的排列。

  


  字符映射表:

  


  5、文本显示模块设计

  CAR(7:0) :BRAM数据输出

  CLKD :分频时钟输入

  TEXT :使能信号

  CRX(4:0) :BRAM地址输出

  CRY(3:0) : BRAM地址输出

  PIX(2:0) : BRAM颜色数据输出

  


  文本显示模块主要接收文本控制模块的字符映射表的信息,并依次显示出文本信息,在显示控制方面,此模块采用格点的行列计数,与像素的行列计数同步进行,在每行,首先是像素列计数开始,然后是修改格点的列,然后是修改像素的行,最后是修改格点的列,每次读取相应映射表位置的,一个像素,共8位数据,并根据相应的列判断对应位的值,从而输出黑(000)白(111)颜色信息。依次遍历整个20*10*16*16的像素点。

  6、游戏显示模块设计

  RECT(3:0) :BRAM数据输出

  CLKDIV :分频时钟输入

  MCLK :主时钟输入

  VID :使能信号

  CRX(4:0) :BRAM地址输出

  CRY(4:0) :BRAM地址输出

  PIXEL(2:0) :颜色像素数据

  


  该模块采用和文本显示模块类似的解决方案,即采用格点计数与像素计数,共同进行的方式,不同的是该模块不需要通过映射表,而是直接将BRAM中的数据读出并输出显示

  7、VGA显示模块设计

  PIX(2:0) :输入颜色像素

  MCLK :主时钟输入

  BLU :VGA蓝色信号

  CLKD :25M分频时钟

  GRN : VGA绿色信号

  HS :VGA行同步信号

  RED : VGA红色信号

  TEXT :文本显示模块使能

  VID :游戏显示模块使能

  VS : VGA场同步信号

  


  VGA模块主要用与控制VGA的驱动,满足基本的时序要求,同时一个重要的功能是控制文本显示和游戏显示模块的相互切换,使得图像信息能够合理的输出。

 

  作品特色

 

  本tetris游戏设计主频为50MHz,工作频率相对较高,同时在设计上,充分利用了spartan3E xc3s100e的逻辑资源,Slices利用率达到90%,同时设计对电路器件要求相对较低,精简后电路占用面积小。同时本设计在功耗上相对较小,经分析仅为34mW。因此能够以较低成本实现,并且能够稳定实现该游戏的全部功能。

 

系统演示视频:http://v.eepw.com.cn/video/play/id/2812


菜鸟
2013-12-17 21:09:29     打赏
3楼
好激动啊,终于找到志同道合的啦!我们和你做的要求是完全一样的,可是现在似乎在键盘控制上出现了一些问题,一直没有达到预想的结果,可否指导一二,或者贴下代码参考一下?真的万分感谢啊!

菜鸟
2013-12-17 22:50:05     打赏
4楼
我的邮箱1798115190@qq.com,可否指点一二啊?

菜鸟
2013-12-22 11:17:07     打赏
5楼
网上找的吧,亲。。。

共5条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]