基于FPGA的俄罗斯方块游戏设计毕业论文(打印版)_第1页
基于FPGA的俄罗斯方块游戏设计毕业论文(打印版)_第2页
基于FPGA的俄罗斯方块游戏设计毕业论文(打印版)_第3页
基于FPGA的俄罗斯方块游戏设计毕业论文(打印版)_第4页
基于FPGA的俄罗斯方块游戏设计毕业论文(打印版)_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

..学位论文原创性声明本人郑重声明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。本人完全意识到本声明的法律后果由本人承担。作者签名:年月日学位论文版权使用授权书本学位论文作者完全了解学校有关保障、使用学位论文的规定,同意学校保留并向有关学位论文管理部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。本人授权省级优秀学士学位论文评选机构将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。本学位论文属于1、保密□,在年解密后适用本授权书。2、不保密□。〔请在以上相应方框内打"√"作者签名:年月日导师签名:年月日目录15814摘要4TOC\o"1-3"\h\u18058前言5132341绪论683361.1游戏的历史 673921.1.1追根溯源 6326101.1.2图形硬件的革命 6125361.2游戏的意义与内涵 7129461.3游戏的组成因素 7178312游戏的可行性分析8296812.1设计目的 8258292.2可行性研究前提 8182412.3可行性分析 8180342.4结论意见 9174713需求分析9200133.1引言 915573.2游戏需求 9323074设计分析950014.1系统方案设计支持 97434.1.1开发环境 9279924.1.2编程语言 10287594.1.3硬件平台 1073194.2系统实现框图 10172974.3模块实现 12105284.3.1实验电路图 1240774.3.2随机产生模块 12246504.3.3PS/2键控模块 16162134.3.4VGA显示模块 19221444.3.5分频模块 24179314.3.6键控模块 2488215仿真分析24280425.1随机数产生序列仿真 2417915.2VGA显示模块仿真波形 25141895.3实现运行结果仿真 25104776总结与展望2983186.1本文完成的主要工作 2962176.2未来研究展望 293424致谢3128900参考文献3213683附录33基于FPGA的俄罗斯方块游戏设计摘要:俄罗斯方块游戏是一款风靡全球的游戏,它的基本规则是旋转、移动、下落和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并消除得分。本设计是用FPGA开发板实现俄罗斯方块,具体是在显示器上显示10×20的点阵以及外围方框。点阵表示方块,方框表示方块的活动范围。关键词:俄罗斯方块VGAFPGA串口通信Abstract:Tetrisisapopulargamearoundtheworld,it’sbasicruleistorotate,moveandplaceallsortsofboxeswhichthegameautomaticallyoutput,makingthemarrangedincompleteoneormorelinestogettherelevantscore.ThedesignintroducesaTetrisgamethroughFPGAprogramming,the10×20dotmatrixandexternalboxesareshownonthedisplay.Thedotmatrixrepresentbox,andtheboxesrepresentthescopeofactivitiesofthebox.Keywords:TetrisVGAFPGASerialport前言:在现今电子信息高速发展的时代,电子游戏已经深入人们的日常生活,成为老少皆宜的娱乐方式。但是游戏设计结合了日新月异的技术,在一个产品中整合了复杂的设计、艺术、声音和软件,所以并不是人人皆知。知道今天,在中国从事游戏设计的人任然很少,但是游戏行业的发展之快,远超家电、汽车等传统行业,也正因为如此,游戏人才的教育、培养远落后于产业的发展。俄罗斯方块是个老幼皆宜的小游戏,它实现由四块正方形的色块组成,然后存储在一个数组的四个元素中,随机产生不同的七种类型方块,根据时钟控制它在一定的时间不停的产生,用户根据键盘的四个方向键控制翻转、向左、向右和向下操作。然后程序根据这七种方块对叠成各种不同的模型。俄罗斯方块游戏可以说是随计算机的发展而发展,并不断推陈出新演变出各种类似游戏,深受广大玩家喜爱。这个游戏有的简单,有的复杂,但其根本原理是一样的,都是对运动的方块组合,来训练玩家的反应能力。谈到游戏软件,大多数人都认为其神妙莫测,高不莫及。而一般游戏软件也确实具有很高的技术难度,随着开发工具及软件开发方法学的不断发展,动手开发游戏也不是十分困难的。俄罗斯方块游戏是一种古老而有趣的游戏,游戏软件不计其数,网上就有关于实现的复杂算法和设计,其难度让一般初学者望而却步。本文利用FPGA硬件描述语言VHDL进行游戏的开发和实现。1绪论1.1游戏的历史游戏开发至今已经有30多年,在这个短暂的时期里,随着硬件水平的提高,游戏开发新技术层出不穷,经典游戏比比皆是。1.1.1追根溯源真正的电子游戏机产生于20世纪70年代。1971年,麻省理工学院的学生NolanBushnell设计了世界上的第一个业务用游戏机〔俗名街机,叫做《电脑空间》。这台游戏机用一台黑白电视机作为显示屏,用一个控制柄作为操纵器,不过由于市场因素这款游戏以失败告终。但是最后他在电子游戏的发展上取得了非凡的成就。上面介绍的是专用机游戏的历史,而最早的电脑游戏可以追溯到1972年,一个叫Crowther的工程师用当时最流行的主机――DEC公司的PDP-10编写一段简单的FORTRAN程序。在这个程序里,Crowther设计了一张地图,地图上不规则的分布着陷阱,游戏者必须寻找路径避开陷阱。这个程序被公认为是最早的电脑游戏程序。1989年,BroderBund公司的设计师乔丹.麦克纳根据阿拉伯民族的古老传说《一千零一夜》在Apple平台上制作了一部动作冒险相结合的电脑游戏――波斯王子。这个游戏获得了第一作,它代表了当时电脑技术的最高水平。1986年,任天堂公司发售了一款真正的游戏巨作――超级马里奥。20世纪80年代IBMPC兼容机的出现打破了Apple公司的垄断地位。到了20世纪90年代,游戏业才真正成熟起来,成为了一种产业。由于PC机价格非常低而且硬件速度越来越快,游戏逐渐成为人们生活中不可缺少的一部分。游戏产业也逐渐发展成熟。1.1.2图形硬件的革命图形硬件的飞速发展是近些年来的事情,部分原因是来自工业方面的压力,例如在军事和医疗方面对于实时图形的需求很强烈,而交互娱乐产业也极大的推动了图形硬件的发展。技术上的因素同样也推动着图形硬件的发展,许多图形算法可以很容易地表达为并行方式,这样硬件执行的效率变得很高。摩乐定律也起了作用,越来越多的晶体管可以集成到一块单独的芯片上。在所谓的GPU〔图形处理器概念出现以前,特殊的图形硬件只出现在诸如SGI和E&S系统里面,这些硬件价格太昂贵,不过这些公司提供了第一代基于硬件的顶点变换和纹理映射的解决方案。1.2游戏的意义与内涵游戏这个名称一直就存在于每个人的日常生活中,如猜拳游戏、猜谜游戏、大地游戏、球类游戏等,林林总总,不胜枚举,甚至于有些流行歌曲把人生也比喻为游戏,好比"一场游戏一场梦"。因此,游戏对于现代人的成长历程,绝对是一个不可或缺的重要角色。1.3游戏的组成因素"游戏",最简单的定义,就是一种供人们娱乐休闲的快乐元素。从更专业的角度形容,"游戏"是具有特定行为模式、规则条件、身心娱乐及输赢的一种行为表现。这种行为表现具备以下4个要素。行为模式:"游戏"最简单的要素就是游戏有特定的流程模式,这种流程模式贯穿于整个游戏的行为,用户必须依照它的模式流程来执行。倘若一种游戏没有了特定的行为模式,那么就没有执行的行为;在没有执行的行为之后,这个游戏也玩不下去了。举个例子来说,如果猜拳游戏没有了剪刀、石头、布等行为模式,那么这还能叫做"猜拳游戏"吗?所以不管游戏的流程有多么复杂还是多么简单,一定要有特定的行为模式。条件规则:当游戏有了一定的行为模式后,接着就必须制定出一系列的条件规则。简单来说,这些游戏的条件规则就是大家必须去遵守的游戏行为守则,只要是大家一致以为的游戏行为,在游戏中,玩家就必须遵守它,如果不遵守这种游戏行为,那么就失去了公平性。如同一种简单的球赛,打球的英文解释可以用PLAYGAME来加以说明,按照英文字面上的解释,它就是执行游戏的行为,而球赛必须有一定的条件规则,并且参与者都要必须去遵守它,不能遵守它就叫作"犯规"。所以不管是什么游戏,它都会具备一组规则条件,在游戏进行的时候才会有足够的公平性。一般而言,游戏又可以分为动态和静态两种形态。动态的游戏必须配合肢体动作,如猜拳游戏;而静态游戏则是较偏向思考的行为,如同纸上游戏。然而不管是动态或是静态游戏,只要具备上述4项组成要素,都可以将它称为"游戏"。2游戏的可行性分析2.1设计目的综合运用在校期间所学理论知识和技能,设计开发俄罗斯方块,使自己熟悉应用系统的开发过程,培养独立思考能力,检验学习效果和动手能力,提高工程实践能力,为将来实际工作打下坚实的基础。2.2可行性研究前提基本需求:系统开发的总体任务是实现游戏的可操作性、美观性、及时性。开发过程遵循软件工程规范,可采用结构化或面向对象分析设计方法。主要实现FPGA的VHDL程序开发,对游戏中的图形图像进行键盘控制。游戏者可以通过上下左右键来对游戏进行操作。主要开发目标:采用结构化设计方法,开发出一个可操作性、美观性、及时性的游戏,实现FPGA的VHDL程序开发,并通过此次软件开发过程全面提高自身的综合素质。评价尺度:由于本软件是一个初级产品,对其要求不是太苛刻,所以能够达到俄罗斯游戏的一般功能即可。2.3可行性分析管理可行性:该游戏软件为首次开发,目的只为提高工作自身素质和检查自学VHDL的效果,用QuartusⅡ11.0软件编写,所有功能均根据基本需求所做。便于管理,所以在这方面是可以实现的。技术可行性:可用与本游戏的编程语言有VB,Java,Delphi,VHDL等,考虑到用于编写程序的困难度,和对语言的了解程度,选择硬件描述语言VHDL作为编程语言。需要对变量定义、变量初始化、界面初始化、游戏初始化、然后进入游戏、处理游戏过程中的各种操作。2.4结论意见综上所述,本游戏软件的技术成熟、完备。各方面均无重大问题,因此本游戏软件可开始着手编写。3需求分析3.1引言对软件需求完全理解对于软件开发工作的成功是至关重要的,需求说明的任务是发现、规范的过程,有益于提高软件开发过程中的能见度,便于对软件开发过程中的控制与管理,便于采用工程方法开发软件,提高软件的质量,便于开发人员、维护人员、管理人员之间的交流、协作,并作为工作成果的原始依据,并且在向潜在用户传递软件功能、性能需求,使其能够判断该软件是否与自己的需求相关。3.2游戏需求随机给出不同的形状〔田字形、长条形、Z字形、反Z形、7字形、反7形、T字型下落填充给定的区域,若填满一条便消掉。游戏功能要求如下:游戏界面需求:简单良好的用户界面,在显示频上显示游戏方框区间,游戏界面,考虑到自己的能力有限,目前只打算完成简单的游戏试玩。游戏形状<方块>需求:良好的方块形状设计,绘制七种常见的基本图形〔长条形、Z字形、反Z形、田字形、7字形、反7形、T字型,各个方块要能实现它的变形,可设为顺时针或逆时针变形,一般为顺指针。键盘处理事件:方块下落时,可通过键盘方向键〔J、K、L键对该方块进行旋转、向左、向右移动。显示需求:当不同的方块填满一行时可以消行,剩余方块向下移动。4设计分析4.1系统方案设计支持4.1.1开发环境本次设计使用的软件是Altera公司生产的QuartusⅡ软件。它是Altera公司的综合性PLD开发软件,可以完成从设计输入到硬件配置的完整PLD设计流程。4.1.2编程语言本次设计使用的编程语言是硬件编程语言VHDL,主要用于描述数字系统的结构,行为,功能和接口。除了含有许多具有硬件特征的语句外,VHDL的语言形式和描述风格与句法是十分类似于一般的计算机高级语言。VHDL的程序结构特点是将一项工程设计,或称设计实体〔可以是一个元件,一个电路模块或一个系统分成外部〔或称可视部分,及端口和内部〔或称不可视部分,既涉及实体的内部功能和算法完成部分。在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。4.1.3硬件平台本次设计使用的核心器件是AlteraCycloneⅡEP2C35F484C84.2系统实现框图本游戏有通过FPGA实现的,主要通过键盘送入数据,通过PS/2接口送入到FPGA中,然后通过FPGA程序控制,通过VGA接口输出到VGA显示频上,所以我的设计方案如图4.2.1所示:图4.2.1设计框图设计方案介绍:由于VGA是有640×480的显示矩阵显示,所以我们将俄罗斯方块分成20×10的矩阵,每一个矩阵代表一个方块,每一个方块一起显示,如图4.2.2所示:图4.2.2方块显示图这样当有一个地方有方块时,就会有将矩阵对应的地方显示,其他没有方块的地方就不显示。4.3模块实现4.3.1实验电路图图4.3.1实验电路图上图给出了系统的连接组成关系:PS/2模块:键盘接收模块,读取键盘发送的扫描码maichong模块:分频得到1S电子时钟,控制游戏时间Jiankong模块:游戏控制模块,程序主控单元,通过状态机控制rand模块:随机产生0-14共15个随机整数,分别代表15种方块的形状fun1模块:产生VS、HS两路垂直扫描信号和水平扫描信号4.3.2随机产生模块随机数模块用于产生0-14共15个随机整数,分别代表15种方块的形状。它的产生机理是参考了信道编码中的线性反馈移位寄存器〔LFSR,所产生的其实是一列伪随机数。具体原理如下:在游戏里,我们需要的是一个更大的随机数,这次我们用了一个16bit的伪随机数。通过查找资料,我们找到不同bit的本原多项式如图4.3.4所示:图4.3.4伪随机序列图根据16bit的本原多项式可以画出它的电路原理图4.3.5如下:图4.3.516bit的电路原理图之后再将产生的16bit二进制数化成十进制,并对15取余,则可以得到一列0-14的伪随机数列。图4.3.6伪随机序列图形生产图每次执行首先为随机数产生一个不同的初值随机选取一个图形当前图形在4×4网格中的位置信息改变图形形状定义一个4x4方阵,共16个小格。用"0"和"1"来表示每个方格是绘制还是空白,由此可以组合出多种图形,如图所示:图4.3.7随机序列生产的7种方块图形4.3.3PS/2键控模块键盘作为嵌入式系统的一种最常用人机接口设备,在嵌入式系统中有着相当广泛的应用。但开发者一般均采用自行设计的简易矩阵键盘,这类键盘仅仅是按行、列排列起来的矩阵开关,往往需要单独设计并制作,通用性不强。当需要较多的按键时,则会占用较多的I/O端口,在软件上则要进行上电复位按键扫描及通信处理,而且还要加上按键的去抖动处理,增大了系统的软硬件开销。而PS/2键盘,内嵌自动去除按键抖动的设计,自动地识别键的按下与释放,软硬件可发简便,价格便宜,稳定可靠,将PS/2键盘作为嵌入式系统的输入设备已经成为可行的方案。而目前关于PS/2键盘控制的应用大部分采用单片机控制,与单片机相比,FPGA具有比单片机更加灵活,集成度更高,容易移植等特点。PS/2物理特性PS/2设备接口用于许多现代的鼠标和键盘,它最初由IBM开发,最常见的为6脚mini-DIN,其引脚结构和外形如图4.3.8所示。图4.3.8PS/2接口图PS/2设备有主从之分,现在广泛使用的PS/2键盘鼠标均工作在从设备方式下。PS/2接口的时钟与数据线都是集电极开路结构,必须外接上拉电阻,一般上拉电阻设置在主设备中,主从设备之间的数据通信采用双向同步方式传输,时钟信号一般由从设备产生。2、数据包的结构键盘的状态每改变一次,键盘至少会发出三个字节的数据包,在有键按下时会向主机发送该键的通码<MakeCode>,当键释放时发送断码<BreakCode>。例如:键"A"的通码为0x1C,因此当要传送键"A"时,键盘发送的数据包的代码是:0x1C,0xF0,0x1C。接口的时序逻辑PS/2协议是一种双向半双工串行通信协议,时钟信号由键盘产生,最大时钟频率为33kHz,推荐频率在15kHz。通信两端通过Clock同步,通过Data交换数据,任何一方如果想禁止另一方通信时,只需将Clock拉到低电平。其传输时序根据传输的方向不同分为发送和接收两个不同时序逻辑,图4.3.9是从键盘到主机的时序图。图4.3.9键盘到主机的时序图其中:Start:起始位,总为‘0’<低电平>Data0~Data7:8位数据位<低位在前,高位在后>Parity:奇偶校验位<为奇校验>Stop:停止位,总为‘1’<高电平>当键盘要向主机通信时,键盘总是首先检查时钟线是否为高电平,如果不是则表明是主机正在通信,必须缓冲要发送的数据直到重新获得总线的控制权<键盘有16个字节的缓冲区>,即等到时钟线是高电平才能发送数据。而且从键盘到主机的数据只能在时钟的下降沿时才能被读取。当主机到键盘进行通信时,主机会首先把时钟线和数据线设置为"请求发送"状态。具体方式为:首先下拉时钟线至少100μs来抑制通信,然后下拉数据线"请求发送",最后释放时钟。在此过程中,键盘在不超过10μs的间隔内就会检查这个状态。当键盘检查到这个状态时,就开始产生时钟。和键盘发送的数据读取方式不一样,主机发送的数据必须在时钟的上升沿读取。程序设计过程S0S00ps2dataps2data1S1S1cnt<11data_tmp←ps2data&cnt<11data_tmp←ps2data&data_tmp<10downto1>,cnt←cnt+101图4.3.10PS/2程序设计过程4.3.4VGA显示模块当前显示器越来越廉价,如果用显示器作为嵌入式设备的显示终端,不管从显示效果和成本上,都比常用的单色液晶、低分辨率彩色液晶等都有优势。VGA显示器因为其输出信息量大,输出形式多样等特点已经成为现在大多数设计的常用输出设备,FPGA以其结构的优势可以使用很少的资源产生VGA的各种控制信号。因此我们采用基于FPGA的VGA显示系统,实现真彩色显示。VGA显示概述CRT显示器作为一种通用型显示设备,如今已广泛应用于我们的工作和生活中。与嵌入式系统中常用的显示器件相比,它具有显示面积大、色彩丰富、承载信息量大、接口简单等优点,如果将其应用到嵌入式系统中,可以显著提升产品的视觉效果。如今随着液晶显示器的出现,越来越多的数字产品开始使用液晶作为显示终端。但基于VGA标准的显示器仍是目前普及率最高的显示器。若驱动此类显示器,需要很高的扫面频率,以及极短的处理时间,正是由于这些特点,所以可以用FPGA来实现对VGA显示器的驱动。本次专业课程设计即选用FPGA来实现VGA的显示。随着FPGA的不断发展及其价格的不断下降,FPGA的可编程逻辑设计的应用优势逐渐显现出来。现在,越来越多的嵌入式系统选择了基于FPGA的设计方案。在基于FPGA的大规模嵌入式系统设计中,为实现VGA显示功能,既可以使用专用的VGA接口芯片如SPX7111A等,也可以设计和使用基于FPGA的VGA接口软核。虽然使用VGA专用芯片具有更稳定的VGA时序和更多的显示模式可供选择等优点,但设计和使用VGA接口软核更具有以下优势:<1>使用芯片更少,节省板上资源,减小布线难度;<2>当进行高速数据传输时,具有更小的高频噪声干扰;<3>FPGA<现场可编程门阵列>设计VGA接口可以将要显示的数据直接送到显示器,节省了计算机的处理过程,加快了数据的处理速度,节约了硬件成本。VGA显示接口VGA接口负责向显示器输出相应的显示信号。VGA接口是一种D型接口,上面共有15个针孔,非对称地分成3排,每排5个,其排列及接口定义如图4.3.11所示。图4.3.11VGA接口图VGA接口为显示器提供两类信号,一类是数据信号,一类是控制信号。数据信号包括红<red>、绿〔green、蓝〔blue三种信号,简称RGB信号,控制信号包括水平同步信号和垂直同步信号。如果能从FPGA发出这5个信号到VGA接口,就可以实现对VGA的控制。输出不同分辨率时,水平同步信号和垂直同步信号的频率也不同。图4.3.12是在部分分辨率条件下使用的相应频率分辨率垂直同步信号频率HZ水平同步信号频率HZ图像时钟频率MHZ640*48075.00037.50031.500800*60075.00046.87549.500图4.3.12VGA部分分辨率条件下使用的相应频率VGA显示原理VGA显示图像原理:常见的彩色显示器,一般由CRT〔阴极射线管构成。彩色是有R,G.B〔红:RED,绿:GREEN,蓝:BLUE三基色组成。显示是用逐行扫描的方式解决,阴极射线枪发出电子束打在涂有银光粉的荧光屏幕上,产生R,G,B三基色,合成一个彩色像素。扫描从屏幕的左上方开始,从左到右,从上到下,进行扫描,每扫完一行,电子束回到屏幕的左边下一行的起始位置,在这期间,CRT对电子束进行消隐,每行结束时,用行同步信号进行同步,扫描完所有行,用场同步信号进行场同步,并使扫描回到屏幕的左上方,同时进行场消隐,预备下一场的扫描。图4.3.13行场扫描时序图图4.3.14行扫描时序要求〔单位:像素VGA硬件实现VGA的图形模式分为3类:CGA、EGA兼容的图形模式;标准的VGA图形模式;VGA扩展图形模式。后两种图形模式统称为VGA图形模式。本研究基于标准VGA模式来实现。常见的彩色显示器一般由CRT〔阴极射线管构成,每一个像素的色彩由红、绿、蓝三基色构成。显示时采用的是逐行扫描的方式。VGA显示模块产生的由水平同步信号和垂直同步信号控制阴极射线管中的电子枪产生电子束,轰击涂有荧光粉的屏幕,产生红、绿、蓝三基色,于显示屏上合成一个彩色像素点。图4.3.16表示的是VGA显示模块与CRT显示器的控制框图。图4.3.16VGA显示模块与CRT显示器的控制框图电子束扫描一幅屏幕图像上的各个点的过程称为屏幕扫描。现在显示器都是通过光栅扫描方式来进行屏幕扫描。在光栅扫描方式下,电子束按照固定的路径扫过整个屏幕,在扫描过程中通过电子束的通断强弱来控制电子束所经过的每个点是否显示或显示的颜色。电子枪在VGA显示模块产生的行同步、场同步等控制信号的作用下进行包括水平扫描、水平回扫、垂直扫描、垂直回扫等过程。光栅扫描的路径通常为:从上到下扫过每一行,在每一行中从左到右地进行扫描。其过程如下:电子束从屏幕左上角开始向右扫,当到达屏幕的右边缘时,电子束关闭〔水平消隐,并快速返回屏幕左边缘〔水平回扫,然后在下一条扫描线上开始新的一次水平扫描。一旦所有的水平扫描均告完成,电子束在屏幕的右下角结束并关闭〔垂直消隐,然后迅速返回到屏幕的左上角〔垂直回扫,开始下一次光栅扫描。图4.3.17VGA与FPGA引脚连接VGA算法流程图图4.3.18VGA设计流程在屏幕上显示图案则在需要图案显示的行和列设置显示颜色,就类似点阵和led液晶屏的显示操作。我们将要显示的图案分模块,每个模块并行运行,最后用或的方式将所有要显示的模块图案一同并起来在屏幕上显示。〔具体见程序4.3.5分频模块在数字电路中,常需要对较高频率的时钟进行分频操作,得到较低信号的是时钟频率。我们知道,此次试验使用的FPGA是频率为50M的晶振,那么需要分频得到1S的电子时钟,控制游戏运行时间实现代码如下所示:ifreset='0'then count<=<others=>'0'>; elsifrising_edge<clk>then ifcount=25000000then count<=<others=>'0'>; else count<=count+1; endif; endprocess; time_1s<=count<24>;4.3.6键控模块键控模块是俄罗斯方块游戏的核心版块,它主要控制游戏的左、右、旋转按键的实现。5仿真分析5.1随机数产生序列仿真由于PS/2模块仿真的意义不大,而且不能很好的体现程序的正确性,因此我们的仿真分析主要在于VGA显示模块,而其余的功能验证我们通过硬件检验,更具有现实意义并且直观可行。从随机数生成器中产出了0~15的随机数5.2VGA显示模块仿真波形图5.2.1屏幕上方的白色横条显示仿真以上截图波形为显示屏幕上方的的白色横条,根据程序可知,应该有11行整行均显示白色横条,也就是RGB=111。从以上波形可以看出,11行均显示正确。图5.2.2屏幕上方的白色横条显示仿真5.3实现运行结果仿真随机产生5.3.1方块随机产生结果图向下掉落5.3.2方块向下掉落图向右移动5.3.3方块向右移动图向左移动5.3.4方块向左图消行5.3.5整行满消除6总结与展望6.1本文完成的主要工作本次设计基于FPGA采用硬件描述语言实现俄罗斯方块游戏,涉及到非常复杂的时序控制、程序控制,以及VGA硬件接口,PS2协议等,对通信协议、程序设计、复杂数字系统设计有全面的检验与提升。此次设计已经实现了俄罗斯方块游戏的简单操作及用户界面,能实现游戏的显示,方块的随机出现,下落及左右移动,图形旋转。本文对俄罗斯方块游戏的历史追溯和可行性分析及用户需求等等方面进行了全面的叙说,简单的分析及介绍对俄罗斯方块游戏的设计起了一定的现实意义,使得此次设计更加具有可操作性。有了这些全面的分析,我确立了自己的设计思路,完成了游戏的整个实验电路图,各个模块功能的实现,通过硬件描述语言VHDL来完成此次设计。本文我主要介绍了我的设计思想,各个模块的实验原理。其中重点介绍了PS/2键盘控制、VGA视频显示这两个模块,此次设计遇到的难题也是在此。PS/2协议是一种双向半双工串行通信协议,设计复杂,但在嵌入式系统中有非常广泛的应用。VGA视频显示模块也是此次设计较重要的一部分,占据的比例较大,也是整个设计的灵魂,在本文中也有较大的篇幅对其原理及其设计思路进行了全面而又详细的介绍。6.2未来研究展望此次设计的俄罗斯方块游戏只是实现了简单的用户操作界面和基本的游戏规则,鉴于现阶段资历尚浅,对VHDL的掌握有限,很多应用没有在这次设计中加入,所以整个设计稍显欠缺,存在很多不足与有待改进的地方。如果时间允许,我希望在不远的将来,能对此次设计进行全面的改进,完善游戏的用户体验。同时计划能通过更进一步对硬件描述语言VHDL的学习来提升本身的编程能力。俄罗斯方块游戏产生较早,设计简单,各方面的技术已经成熟,但是游戏方式依然保守,从最初的无人不玩到而今的鲜有问津,这种局面的形成很大程度上取决于游戏模式单一,创新不足。传统的俄罗斯方块游戏多在掌机或手机上,只能一个人游戏,游戏缺少玩家之间的交互,不免单挑乏味。如今用户热衷的英雄联盟、地下城与勇士等等游戏,符合时下年轻人的娱乐性,多人分组对战,具有更大的挑战性和吸引力,从而成功地拥有大批粉丝。鉴于此,俄罗斯方块游戏应该设计多人对战模式,而多人分组对战俄罗斯方块游戏在原来的基础上加入了网络互联,可以支持多人分组对战。增加了游戏玩家的互动性,这是一种全新的设计理念。因此也会使程序的设计难度大大增加。但从各方面来看开发一款别开生面的俄罗斯方块游戏是一个具有前景的选择,也将是一个新旅程的开始。致谢大学四年,毕业设计的完结也意味着我四年学习生涯的结束,有很多的不舍和感触。首先,从心底感谢我的指导教师,没有他的悉心指导,我想,这次设计可能真的完不成。其次,我要感谢我的同学和学弟,他们的帮助了我莫大的支持和鼓励,在这次顺利完成毕业设计的旅程中起了至关重要的作用。一起走过的四年,有陪伴,有成长,一切的一切,因为有彼此的携手,四年的生活变得丰富多彩、意义非凡。真的很幸运,在我大学四年里遇到唐老师这样敬业又负责的老师,从之前的代课老师到现在的毕业设计指导老师,唐老师一如既往地兢兢业业,从不曾懈怠,做事一直有规划,有原则,我们的毕业设计进度在老师的督促下,一直能顺利完成学校每次下达的任务,这方面给了我很大的启发。唐老师严谨治学的态度也一直令我膜拜不已,在我心中留下了深刻的印象,在以后的人生路上,我要学习唐老师的求实精神。在毕业设计实验的过程中,因为我的不慎操作,把学校实验板给烧坏了,当我忐忑不安地等着一顿批评的时候,唐老师并没有指责我,反而是安慰,那次经历,让我学会了对别人宽容反而是最好的教育方式,一味地批评责骂只会适得其反。在此,感谢我的父母对我的支持,没有他们的支持,我走不到今天。同样感谢我的同学和朋友,四年的陪伴,让我感受到独处异乡也是温暖无比的。没有他们,我走不过这一路的风风雨雨,跌跌撞撞,他们的每一次帮助,每一次支持和理解都让我倍感欣慰,也坚定了我一直往前走的信念。我爱他们,就像爱祖国,爱河流,爱山川。参考文献[1]杨军,面向SOPC的FPGA设计与应用[M]科学出版社,2012,3[2]郝建国,基于NisoⅡ内核的FPGA电路系统设计[M]电子工业出版社,2010,4[3]王刚,基于FPGA的SOPC嵌入式系统设计与典型实例[M]电子工业出版社,2009,1[4]刘延飞,基于AlteraFPGA/CPLD的电子系统设计及工程实践[M]人民邮电出版社,20XX09月[5]〔澳阿申登著,夏宇闻等译,Verilog嵌入式数字系统设计教程,北京航空航天大学出版社,20XX07月[6]朱恭生,胡冬琴,EDA工程实践入门丛书FPGA/CPLD系统设计与应用案例,中国电力出版社,20XX07月[8]刘福奇,FPGA嵌入式项目开发实战,电子工业出版社,20XX01月[9]詹仙宁,VHDL开发精解与实例剖析,电子工业出版社,20XX09月[10]徐洋等,基于VerilogVHDL的FPGA设计与工程应用,人民邮电出版社,20XX10月[11]刘昌华,管庶安,数字逻辑原理与FPGA设计,北京航空航天大学出版社,20XX09月[12]ALTERACorporatNIOSⅡSoftwareDeveloper’sHandbook.2009[13]ALTERACorporatNIOSⅡProcessorReferenceHandbook.2009[15]Yang,YansiYang.SoftwaredesignofSDcardrederandimageprocessorbasedonFPGA.Proceedings2011InternationalConferenceonMechatronicScience,ElectricEngineeringandCOmputer,MEC2011,p1864-1867,2011,Proceedings2011InternationalConferenceonMechatronicScience,ElectricEngineeringandComputer,MEC2011.附录:PS2.vhdlibraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entityps2isport<resetn:instd_logic;--activelowresetclock:instd_logic;--systemclockps2_clk:instd_logic;--PS/2clocklineps2_dta:instd_logic;--PS/2datalinecs:outstd_logic;ascii:outstd_logic_vector<7downto0>;--LEDoutputs key:outintegerrange0to7>;endps2;architecturebehavioralofps2istypestate_typeis<IDLE,START,DATA,PARITY>;--FSMstatessignalps2_dv:std_logic;--PS/2datavalidsignalprv_ps2_clk,act_ps2_clk:std_logic;--auxiliarysignalssignalrecdata:std_logic_vector<7downto0>;--readdatasignalshift:std_logic;--enableforshiftreg.signaln_shift:std_logic;--auxiliarysignalsignallatch:std_logic;--latchreaddatasignaln_latch:std_logic;--auxiliarysignalsignalerr:std_logic;--parityorstoperrorsignaln_err:std_logic;--auxiliarysignalsignalparset:std_logic;--presetforparitychecksignaln_parset:std_logic;--auxiliarysignalsignalc_state,n_state:state_type;--current&nextstatessignalzero:std_logic;--counteriszerosignalparbit:std_logic;--oddparityofdatasignalleds:std_logic_vector<7downto0>;signalhit:std_logic;beginPS_CLK_SYNC:process<clock,resetn>beginif<resetn='0'>thenprv_ps2_clk<='1';act_ps2_clk<='1';act_ps2_clk<=ps2_clk;prv_ps2_clk<=act_ps2_clk;endif;endprocess;ps2_dv<=<notact_ps2_clk>andprv_ps2_clk;SIPO:process<clock,resetn>beginif<resetn='0'>thenrecdata<=<others=>'0'>;elsif<clock'eventandclock='1'>thenif<shift='1'>thenrecdata<=ps2_dta&recdata<7downto1>;endif;endif;endprocess;COUNT8:process<resetn,clock>beginif<resetn='0'>thencntval<=<others=>'0'>;elsif<clock'eventandclock='1'>thenif<shift='1'>thencntval<=cntval+1;endif;endif;endprocess;zero<=not<cntval<0>orcntval<1>orcntval<2>>;PARITY_CHECK:process<clock,parset>beginif<parset='1'>thenparbit<='1';elsif<clock'eventandclock='1'>thenif<shift='1'andps2_dta='1'>thenparbit<=notparbit;endif;endif;endprocess;beginif<resetn='0'>thenc_state<=IDLE;shift<='0';latch<='0';err<='0';parset<='1';elsif<clock'eventandclock='1'>thenc_state<=n_state;shift<=n_shift;latch<=n_latch;err<=n_err;parset<=n_parset;endif;endprocess;--CombinatorialprocessofcontrolstatemachineFSM_COMB:process<c_state,ps2_dv,ps2_dta,zero>begin--defaultvaluesn_shift<='0';casec_stateis--waittoreceivedatawhenIDLE=>if<<ps2_dvand<notps2_dta>>='1'>thenn_state<=START;n_parset<='1';elsen_state<=IDLE;endif;--receivefirstdatabitwhenSTART=>if<ps2_dv='0'>thenn_state<=START;elsen_state<=DATA;n_shift<='1';endif;--receiveremainingdatabitsandparitywhenDATA=>if<ps2_dv='0'>thenn_state<=DATA;elsif<zero='0'>thenn_state<=DATA;n_shift<='1';elsen_state<=PARITY;if<parbit/=ps2_dta>thenn_err<='1';endif;endif;--receivestopbitwhenPARITY=>if<ps2_dv='0'>thenn_state<=PARITY;elsen_state<=IDLE;n_latch<='1';n_err<=notps2_dta;endif;endcase;endprocess;--OutputlatchLED_OUTPUTS:process<resetn,clock>beginif<resetn='0'>thenleds<=<others=>'1'>;elsif<clock'eventandclock='1'>thenif<err='1'>thenleds<=<others=>'1'>;elsif<latch='1'>thenleds<=recdata;endif;endif;endprocess;PROCESS<leds>BEGIN cs<='1'; caseledsiswhen"01000101"=>ascii<="00110000";cs<='1';--0when"00010110"=>ascii<="00110001";cs<='1';--1when"00011110"=>ascii<="00110010";cs<='1';--2when"00100110"=>ascii<="00110011";cs<='1';--3when"00100101"=>ascii<="00110100";cs<='1';--4when"00101110"=>ascii<="00110101";cs<='1';--5when"00110110"=>ascii<="00110110";cs<='1';--6when"00111101"=>ascii<="00110111";cs<='1';--7when"00111110"=>ascii<="00111000";cs<='1';--8when"01000110"=>ascii<="00111001";cs<='1';--9when"00011100"=>ascii<="01100001";cs<='1';--awhen"00110010"=>ascii<="01100010";cs<='1';--bwhen"00100001"=>ascii<="01100011";cs<='1';--cwhen"00100011"=>ascii<="01100100";cs<='1';--dwhen"00100100"=>ascii<="01100101";cs<='1';--ewhen"00101011"=>ascii<="01100110";cs<='1';--fwhen"00110100"=>ascii<="01100111";cs<='1';--gwhen"00110011"=>ascii<="01101000";cs<='1';--hwhen"01000011"=>ascii<="01101001";cs<='1';--iwhen"00111011"=>ascii<="01101010";cs<='0';key<=1;--jwhen"01000010"=>ascii<="01101011";cs<='0';key<=2;--kwhen"01001011"=>ascii<="01101100";cs<='0';key<=4;--l when"00111010"=>ascii<="01101101";cs<='1';--mwhen"00110001"=>ascii<="01101110";cs<='1';--nwhen"01000100"=>ascii<="01101111";cs<='1';--owhen"01001101"=>ascii<="01110000";cs<='1';--pwhen"00010101"=>ascii<="01110001";cs<='1';--qwhen"00101101"=>ascii<="01110010";cs<='1';--rwhen"00011011"=>ascii<="01110011";cs<='1';--swhen"00101100"=>ascii<="01110100";cs<='1';--twhen"00111100"=>ascii<="01110101";cs<='1';--uwhen"00101010"=>ascii<="01110110";cs<='1';--vwhen"00110101"=>ascii<="01111001";cs<='1';--ywhen"00011010"=>ascii<="01111010";cs<='1';--zwhen"00111001"=>ascii<="00100000";cs<='1';--spacebarwhen"01100110"=>ascii<="00100000";cs<='1';--backspacewhen"01110001"=>ascii<="11100000";cs<='1';--delwhenothers=>ascii<="00100000";cs<='1';--''forunlistedcharacters.endcase; ENDPROCESS;endbehavioral;shuchu.vhdlibraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;useieee.std_logic_arith.all;entityshuchuis port<cc:inintegerrange0to800; ll:inintegerrange0to525; rgb1:instd_logic_vector<2downto0>; clk:instd_logic; rgb:outstd_logic_vector<2downto0> >;endshuchu;architecturebehavofshuchuisbegin process<clk> begin rgb<="000"; ifcc>=248andcc<454then ifll>=68andll<474then ifcc>=251andcc<451then ifll>=71andll<471then rgb<="000"; ELSErgb<="001"; endif; elsergb<="001"; endif; endif; endif; ifcc>250andcc<451then ifll>70andll<471then rgb<=rgb1; endif; endif;endprocess;endbehav;rand.vhdlibraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityrandisport<clk:instd_logic;r:outintegerrange0to14>;endentity;architecturebehavofrandis";signalb:integerrange0to65535;signalcount:std_logic_vector<18downto0>;signaltime_1s:std_logic;signalr1:integerrange0to14;begin process<clk> begin ifrising_edge<clk>then ifcount=250000then count<=<others=>'0'>; else count<=count+1; endif; endif; endprocess; time_1s<=count<17>;process<clk>beginif<rising_edge<clk>>thenL1:foriin0to9loopa<i+1><=a<i>;endloopL1;a<0><=a<15>;a<11><=a<10>XORa<15>;a<12><=a<11>;a<13><=a<12>XORa<15>;a<14><=a<13>XORa<15>;a<15><=a<14>;b<=conv_integer<a>;r1<=bMOD15;endif;endprocess;process<time_1s>beginiftime_1s'eventandtime_1s='1'then r<=r1;endif;endprocess;endbehav;jiankong.vhdlibrarywork;usework.shuzu_1.all;libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;useieee.std_logic_arith.all;entityjiankongis port<reset,clk,cs:instd_logic; key:inintegerrange0to7; r:inintegerrange0to15; dianz1:outshuzu>;endjiankong;architecturebehavofjiankongissignalcount:std_logic_vector<25downto0>;signaltime_1s:std_logic;typezongleiisarray<0to15>ofintegerrange0to9;constanthang_0:zonglei:=<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0>;constanthang_1:zonglei:=<0,0,1,1,1,0,1,0,1,0,1,1,1,0,0,0>;constanthang_2:zonglei:=<1,0,2,1,1,0,1,1,1,1,1,1,2,0,1,1>;constantlie_0:zonglei:=<4,3,4,4,4,3,4,3,4,4,4,5,4,3,3,4>;constantlie_1:zonglei:=<5,4,4,3,4,4,3,4,3,5,4,3,4,4,4,5>;constantlie_2:zonglei:=<4,5,4,4,5,5,4,4,4,3,5,4,4,5,4,4>;constantlie_3:zonglei:=<5,6,4,5,4,4,4,5,3,4,5,5,5,3,4,5>;signaldianz:shuzu;beginprocess<clk> begin ifreset='0'then count<=<others=>'0'>; elsifrising_edge<clk>then ifcount=25000000then count<=<others=>'0'>; else count<=count+1; endif; endif; endprocess; time_1s<=count<24>; process<reset,cs> variablelie1,lie2,lie3,lie0:integerrange0to9; variablehang0,hang1,hang2,hang3:integerrange0to19; variablei:integerrange0to20; variablerand:integerrange0to15; variablemark,mark1,mark2,flag:std_logic; begin ifreset='0'then dianz<0><="00000000000000000000"; dianz<1><="00000000000000000000"; dianz<2><="00000000000000000000"; dianz<3><="00000000000000000000"; dianz<4><="00000000000000000000"; dianz<5><="00000000000000000000"; dianz<6><="00000000000000000000"; dianz<8><="00000000000000000000"; dianz<9><="00000000000000000000"; rand:=r; flag:='0'; lie0:=lie_0<rand>;lie1:=lie_1<rand>;lie2:=lie_2<rand>;lie3:=lie_3<rand>; hang0:=hang_0<rand>;hang1:=hang_1<rand>;hang2:=hang_2<rand>;hang3:=hang_3<rand>; dianz<lie0><hang0><='1';dianz<lie1><hang1><='1'; dianz<lie2><hang2><='1';dianz<lie3><hang3><='1'; else ifcs'eventandcs='1'then ifcount<16777300andcount>16777100then ifhang3<19then caserandis when0=>ifdianz<lie2><hang2+1>='0'anddianz<lie3><hang3+1>='0'then mark:='1'; elsemark:='0';endif; when1=>ifdianz<lie0><hang0+1>='0'anddianz<lie1><hang1+1>='0'anddianz<lie2><hang2+1>='0'anddianz<lie3><hang3+1>='0'then mark:='1'; elsemark:='0';endif; when2=>ifdianz<lie3><hang3+1>='0'then mark:='1'; elsemark:='0';endif; when3=>ifdianz<lie1><hang1+1>='0'anddianz<lie3><hang3+1>='0'anddianz<lie2><hang2+1>='0'then mark:='1'; elsemark:='0';endif; when4=>ifdianz<lie2><hang2+1>='0'anddianz<lie3><hang3+1>='0'then mark:='1'; elsemark:='0';endif; when5=>ifdianz<lie0><hang0+1>='0'anddianz<lie3><hang3+1>='0'anddianz<lie2><hang2+1>='0'then mark:='1'; elsemark:='0';endif; when6=>ifdianz<lie1><hang1+1>='0'anddianz<lie3><hang3+1>='0'then mark:='1'; elsemark:='0';endif; when7=>ifdia

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论