躲避障碍游戏讲解.docx

上传人:b****9 文档编号:25038366 上传时间:2023-06-04 格式:DOCX 页数:25 大小:179.06KB
下载 相关 举报
躲避障碍游戏讲解.docx_第1页
第1页 / 共25页
躲避障碍游戏讲解.docx_第2页
第2页 / 共25页
躲避障碍游戏讲解.docx_第3页
第3页 / 共25页
躲避障碍游戏讲解.docx_第4页
第4页 / 共25页
躲避障碍游戏讲解.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

躲避障碍游戏讲解.docx

《躲避障碍游戏讲解.docx》由会员分享,可在线阅读,更多相关《躲避障碍游戏讲解.docx(25页珍藏版)》请在冰豆网上搜索。

躲避障碍游戏讲解.docx

躲避障碍游戏讲解

深圳大学研究生试题纸

学院信息工程学院专业集成电路工程,电子与通信工程

课程名称数字系统设计

拟题人审题人

课程设计:

采用FPGA实现一个VGA显示的小游戏

基本要求:

1)采用Verilog语言在Spartan3AFPGA开发板实现该设计

2)该游戏应该采用纯逻辑实现,不能在FPGA内部嵌入CPU或者外接CPU

3)该游戏应该有VGA接口输出

4)该游戏应该具有按键或者其他输入方式

5)游戏的复杂度将作为一个评分依据

6)游戏的创新性和可玩性将作为一个加分依据

设计报告要求:

1.报告的格式采用标准的深圳大学设计报告格式。

2.报告中应提供CPU的工作流程说明,如果实现了高级要求,应提供新增功能的说明和介绍。

3.报告中应包括ASM图,以及verilog代码,并且代码应该与ASM图相一致。

4.设计报告应包括该电路的verilog仿真。

5.设计报告应该有布局布线后资源利用以及运行速度的评价结果。

 

深圳大学研究生课程论文

 

题目基于FPGA实现VGA的小游戏成绩

专业电子与通信工程课程名称数字系统设计

年级2014届姓名李曼曼

学号2141130208时间2015年1月15号

任课教师徐渊

 

 

摘要

本次课程设计介绍了用FPGA来驱动VGA显示躲避障碍游戏的具体实现方法。

躲避障碍的游戏规则是玩家使用方向键操控一个方块不断躲避障碍,同时方块若果到达指定位置则游戏胜利,当方块碰到障壁时游戏结束。

本课程设计采用VerilogHDL语言编写,VGA显示,状态机等相关知识。

关键词:

FPGA;VGA;VerilogHDL;躲避障碍游戏

 

 

1游戏功能概述

游戏的主要功能设计如下:

(1)方块在整个屏幕边框内可以通过按键上下左右控制进行移动;

设置屏幕分辨率为600*800,边框宽度为5,并且颜色为黄色。

方块大小为60*60颜色为红色,游戏中设有四个不断垂直下落的长方块障碍物,障碍物的长度为200,宽度为10,以不同的速率下降。

在屏幕的左上方还有一个特定的区域,没用颜色显示,有特定的坐标位置。

(2)障碍物自发下落,;

游戏中有四个不同颜色的障碍长方块,不断下落。

当小方块碰到长方块时,游戏界面停止,进入到死亡状态,障碍物也消失。

(3)游戏的三个状态和三个不同界面

当通过按键对小方块进行上下左右移动时,游戏一直停留在游戏界面。

如果小方块碰到四个当中任何一个障碍物,则游戏结束并显示一个“N”的标志表示死亡。

如果小方块到达指定的左上方区域,则游戏胜利,并显示一个“Y”的标志即游戏获胜。

不管游戏胜利或者结束,按下复位键,游戏又重新开始。

综上,本游戏设置四个按键控制小方块的移动,障碍物则自己不断下落。

A7为上按键,M4为下按键,G11为左按键,G12为右按键。

游戏通过P11开关设定为游戏的复位键,让游戏重新开始。

 

2系统分析和方案

2.1系统分析

本设计采用VGA显示的方式将游戏展现出来。

游戏中玩家通过四个按键控制方块的身体上下左右移动来到达指定位置以获得胜利,如果方块撞到障碍物,则游戏失败。

所要设计的躲避障碍游戏基于FPGA芯片为硬件,采用VerilogHDL语言编写程序。

在本设计中,有个5按键,分别是上、下、左、右和复位按键。

它们都是输入信号,输出是VGA,在电脑屏幕实现VGA显示游戏画面。

其系统设计结构框图如2.1所示。

图2.1躲避障碍游戏系统设计结构框图

电源给BASYS2开发板供电,将程序下载到BASYS2开发板上,用VGA线将显示器与开发板相连接,在通电情况下,游戏在显示器上显示,可通过开发板上按键控制方块的运动状态。

 

3硬件电路设计

3.1游戏的硬件组成

硬件电路设计包括3个模块,它们分别是:

action:

产生各个VGA扫描部件的坐标及方块和障碍的运动轨迹并控制游戏的三种状态之间的转换

vga:

vga扫描控制模块

key:

按键扫描模块

完成后的RTLview如图3.1所示。

图3.1系统总体设计

3.2VGA控制模块设计

显示器扫描方式为逐行扫描:

逐行扫描是扫描从屏幕左上角一点开始,从左像右逐点扫描,每扫描完一行,电子束回到屏幕的左边下一行的起始位置,在这期间,CRT对电子束进行消隐,每行结束时,用行同步信号进行同步;当扫描完所有的行,形成一帧,用场同步信号进行场同步,并使扫描回到屏幕左上方,同时进行场消隐,开始下一帧。

标准VGA一共15个接口,本设计用到的信号接口有五个,HSYNC行同步信号,VSYNC场同步信号,VGA_R、VGA_G、VGA_B三原色信号。

VGA控制模块硬件设计如图3.2.3所示。

图3.2VGA控制模块硬件设计电路

VGA接口输出模块verilog代码如下:

modulevga(clk,rst,HSYNC,VSYNC,hc,vc);

inputclk;

inputrst;

reghs;

regvs;

regvsenable;

outputHSYNC;

outputVSYNC;

outputreg[9:

0]vc;

outputreg[10:

0]hc;

always@(posedgeclkorposedgerst)

begin

if(rst)

hc<=0;

else

begin

if(hc==1039)

begin

hc<=0;

vsenable<=1;

end

else

begin

hc<=hc+1;

vsenable<=0;

end

end

end

always@(posedgeclkorposedgerst)

begin

if(rst)

vc<=0;

else

begin

if(vsenable==1)

begin

if(vc==665)

vc<=0;

else

vc<=vc+1;

end

else

vc<=vc;

end

end

assignHSYNC=hs;

assignVSYNC=vs;

always@(posedgeclkorposedgerst)

begin

if(rst)

hs<=1'b1;

elseif(hc==10'd0)

hs<=1'b0;

elseif(hc==10'd120)

hs<=1'b1;

end

always@(posedgeclkorposedgerst)

begin

if(rst)

vs<=1'b1;

elseif(vc==10'd0)

vs<=1'b0;

elseif(vc==10'd6)

vs<=1'b1;

end

endmodule

 

3.3移动和控制模块设计

移动控制模块是整个设计中最复杂最核心的模块。

它主要包括四个主要任务:

(1)保持四个障碍物的运动

(2)按键改变方块运动的方向

(3)判断方块是否撞到障碍物或者到达制定目标区

(4)决定VGA显示内容

开始

流程图如下:

Y

按键

 

Y

right

left

up

down

 

到达指定位置

撞到障碍物

Y

NY

死亡界面

胜利界面

复位键

 

躲避障碍移动控制模块硬件设计如图3.3.1所示:

图3.3.1移动控制模块硬件图

移动模块verilog代码如下:

Moduleaction(clk,rst,up_key_press,down_key_press,left_key_press,right_key_press,hc,vc,color);

inputup_key_press,down_key_press,left_key_press,right_key_press;

inputclk;

inputrst;

//方块中心的坐标:

reg[9:

0]move_y;//y方向的移动

reg[10:

0]move_x;//x方向的移动

//小球大小边缘定义:

parameterx_border=30,

y_border=30;//此设计中的Rom为60*60的方块

//场同步输入:

input[10:

0]hc;

input[9:

0]vc;

reg[18:

0]counter;

reg[9:

0]y_addr;//y方向的移动

reg[18:

0]counter1;

reg[9:

0]y_addr1;

reg[18:

0]counter2;

reg[9:

0]y_addr2;

reg[18:

0]counter3;

reg[9:

0]y_addr3;

outputreg[7:

0]color;

regflag,flag1;

assignsquare1=((move_x>0)&&(move_x<200)&&(move_y==y_addr+40));

assignsquare2=((move_x>160)&&(move_x<400)&&(move_y==y_addr1+40));

assignsquare3=((move_x>360)&&(move_x<600)&&(move_y==y_addr2+40));

assignsquare4=((move_x>560)&&(move_x<800)&&(move_y==y_addr3+40));

assignwin=((move_x>=10)&&(move_x<=200)&&(move_y>=20)&&(move_y<=200))?

1'b1:

1'b0;

assigndie=((square1)||(square2)||(square3)||(square4))?

1'b1:

1'b0;

wire[9:

0]xlabel,ylabel;

assignxlabel=hc-11'd187;

assignylabel=vc-10'd31;

//VGA扫描模块:

always@(posedgeclkorposedgerst)

begin

if(rst)

begin

color<=8'b0000_0000;

flag<=0;

end

elseif((die==0)&&(win==0)&&(flag==0))

begin

if((hc>182&&hc<=187)||(hc>981&&hc<=986)||(vc>29&&vc<=34)||(vc>624&&vc<=629))

color<=8'b1111_1100;//边框颜色黄色

elseif((hc>=move_x+182)&&(hc<(move_x+40+182))&&(vc>=move_y+29)&&(vc<(move_y+40+29)))

begin

color<=8'b0100_1000;//小方块

end

elseif((hc-187>=10)&&(hc-187<=200)&&(vc-31>=10+y_addr)&&(vc-31<=50+y_addr))

begin

color<=8'b0100_1011;//第一个横条

end

elseif((hc-187>=200)&&(hc-187<=400)&&(vc-31>=10+y_addr1)&&(vc-31<=50+y_addr1))

begin

color<=8'b1110_1011;//第二个横条

end

elseif((hc-187>=400)&&(hc-187<=600)&&(vc-31>=10+y_addr2)&&(vc-31<=50+y_addr2))

begin

color<=8'b1110_1111;//第三个横条

end

elseif((hc-187>=600)&&(hc-187<=800)&&(vc-31>=10+y_addr3)&&(vc-31<=50+y_addr3))

begin

color<=8'b1111_0000;//第四个横条

end

elsecolor<=8'b0000_0000;

end

/****************************碰撞死亡胜利过程**************************************/

elseif((die==1)||((flag==1)&&(flag1==0)))

begin

if(((xlabel>=240)&&(xlabel<280))&&((ylabel>=140)&&(ylabel<180))||

((xlabel>=280)&&(xlabel<320))&&((ylabel>=180)&&(ylabel<220))||

((xlabel>=320)&&(xlabel<360))&&((ylabel>=220)&&(ylabel<260))||

((xlabel>=360)&&(xlabel<400))&&((ylabel>=260)&&(ylabel<300))||

((xlabel>=240)&&(xlabel<280))&&((ylabel>=180)&&(ylabel<220))||

((xlabel>=240)&&(xlabel<280))&&((ylabel>=220)&&(ylabel<260))||

((xlabel>=240)&&(xlabel<280))&&((ylabel>=260)&&(ylabel<300))||

((xlabel>=400)&&(xlabel<440))&&((ylabel>=260)&&(ylabel<300))||

((xlabel>=400)&&(xlabel<440))&&((ylabel>=220)&&(ylabel<260))||

((xlabel>=400)&&(xlabel<440))&&((ylabel>=180)&&(ylabel<220))||

((xlabel>=400)&&(xlabel<440))&&((ylabel>=140)&&(ylabel<180)))

begin

color<=8'b1111_1100;

end

else

begin

color<=8'b0000_0000;

end

flag<=1'b1;

flag1<=1'b0;

end

elseif((win==1)||((flag1==1)&&(flag==0)))

beginif(((xlabel>=240)&&(xlabel<280))&&((ylabel>=140)&&(ylabel<180))||

((xlabel>=440)&&(xlabel<480))&&((ylabel>=180)&&(ylabel<220))||

((xlabel>=280)&&(xlabel<320))&&((ylabel>=180)&&(ylabel<220))||

((xlabel>=480)&&(xlabel<520))&&((ylabel>=140)&&(ylabel<180))||

((xlabel>=320)&&(xlabel<360))&&((ylabel>=220)&&(ylabel<260))||

((xlabel>=360)&&(xlabel<400))&&((ylabel>=260)&&(ylabel<300))||

((xlabel>=400)&&(xlabel<440))&&((ylabel>=220)&&(ylabel<260))||

((xlabel>=360)&&(xlabel<400))&&((ylabel>=260)&&(ylabel<300))||

((xlabel>=360)&&(xlabel<400))&&((ylabel>=300)&&(ylabel<340))||

((xlabel>=360)&&(xlabel<400))&&((ylabel>=400)&&(ylabel<440))||

((xlabel>=360)&&(xlabel<400))&&((ylabel>=340)&&(ylabel<400)))

begin

color<=8'b1111_1111;

end

else

begin

color<=8'b0000_0000;

end

flag<=1'b0;

flag1<=1'b1;

end

else

begin

color<=8'b0000_0000;

end

end

always@(posedgeclkorposedgerst)

begin

if(rst)

begin

move_x<=340;

move_y<=500;

end

elseif(up_key_press)

begin

if(move_y==0)

begin

move_y<=move_y;

end

else

begin

move_y<=move_y-40;

end

end

elseif(down_key_press)

begin

if(move_y==560)

begin

move_y<=move_y;

end

else

begin

move_y<=move_y+40;

end

end

elseif(left_key_press)

begin

if(move_x==0)

begin

move_x<=move_x;

end

else

begin

move_x<=move_x-40;

end

end

elseif(right_key_press)

begin

if(move_x==760)

begin

move_x<=move_x;

end

else

begin

move_x<=move_x+40;

end

end

end

always@(posedgeclkorposedgerst)

begin

if(rst)

begin

y_addr<=10;

end

else

begin

if(counter==50_0000)

begin

counter<=0;

y_addr<=y_addr+1;

end

elsecounter<=counter+1;

end

end

always@(posedgeclkorposedgerst)

begin

if(rst)

begin

y_addr1<=10;

end

else

begin

if(counter1==30_0000)

begin

counter1<=0;

y_addr1<=y_addr1+1;

end

elsecounter1<=counter1+1;

end

end

always@(posedgeclkorposedgerst)

begin

if(rst)

begin

y_addr2<=10;

end

else

begin

if(counter2==18_0000)

begin

counter2<=0;

y_addr2<=y_addr2+1;

end

elsecounter2<=counter2+1;

end

end

always@(posedgeclkorposedgerst)

begin

if(rst)

begin

y_addr3<=10;

end

else

begin

if(counter3==10_0000)

begin

counter3<=0;

y_addr3<=y_addr3+1;

end

elsecounter3<=counter3+1;

end

end

endmodule

3.4按键消抖模块设计

抖动时间的长短由按键的机械特性决定,一般为5ms~10ms。

本消抖模块消抖时间为10ms。

键抖动会引起一次按键被误读多次。

为确保芯片对键的一次闭合仅作一次处理,必须去除键抖动。

在键闭合稳定时读取键的状态,并且必须判别到键释放稳定后再作处理。

流程图如下:

消抖模块硬件设计如图3.4所示。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 兵器核科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1