数电综合实验报告贪吃蛇Word格式文档下载.docx
- 文档编号:8612407
- 上传时间:2023-05-12
- 格式:DOCX
- 页数:24
- 大小:1.07MB
数电综合实验报告贪吃蛇Word格式文档下载.docx
《数电综合实验报告贪吃蛇Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《数电综合实验报告贪吃蛇Word格式文档下载.docx(24页珍藏版)》请在冰点文库上搜索。
5秒时
间到
是否按下
60秒时
计时、计分开始,墙初始化
鼠位置重置
撞边
撞蛇
等待?
1
安键
r
Reset
i1
!
理
左
mdS图:
⑶功能模块图:
3.模块设计
(1)分频模块:
由于实验板上的时钟频率为50MHZ相对于电路延时时间来说,频率太高,故需要分频将频率降低来适应器件的反应时间要求;
同时用来扫描点阵和数码管的频率与用来控制的时钟信号频率是不同的,相对而言用来扫描显示的频率要相对低一些,用来扫描按键和控制的时钟频率要低一些,所以此处将50MHZ的频率
分为1MH祢口2KHZ,1MHZ勺频率用来扫描按键和进行信号控制,2KHZ用于扫描显示,在控制模块中,又进行了二次分频,用来控制蛇的移动,鼠步的减少,倒计时时间等,不选择直接在分频模块中将所有的所需时钟频率全部分出的原因是在不同的进程中可能会对同一控制信号进行修改,所以这样就会出现多重驱动的问题,然而在进程内部进行二次分频就可以避免出现这种情况。
(2)游戏控制模块:
这部分又可细分为四个小的模块:
蛇状态判断模块,鼠随机产生模块,方向控制模块,蛇移动及时间控制模块。
1.蛇状态判断模块:
主要完成对蛇“死”“活”状态的修改,而产生状态变化的情况有:
按下reset键,改变开始暂停键的状态,蛇撞墙,总计是时间到,以及游戏通关(即游戏总得分为3分即为通关),而这些情况中reset键的优先级最高,当按下reset键时蛇的状态都会被置为“死(0)”的状态,而当“start/pause”键状态为“1”的话蛇的状态将会被置成“活
(1)”,蛇撞墙,总时间到,通关都会将蛇的状态置为“死(0)”。
2.鼠随机产生模块:
这部分主要完成产生新的老鼠坐标,思路是利用两个不同模值的计数器,分别对8取模,获得0到7之间的两个数作为新老鼠的横纵坐标,同时对产生的新左边进行判断,当和墙的坐标重合时进行修正,此处是将横坐标减一。
而新老鼠的产生时刻是总计是时间到,鼠被吃掉,或蛇走十步后,刚开始是把这一部分单独作为一个线程,但是后来由于对鼠的产生标志信号的控制不是很好处理,所以这部分只是负责产生下次新老鼠的位置坐标,而真正的赋值操作在对蛇的控制状态线程里面。
3.方向控制模块:
主要对控制蛇移动方向的信号进行修改,敏感信号为reset
键和按键扫描时钟,但reset键的优先级较高,当reset键按下时,方向控制信号将会被设置成默认的向右,而其他四个方向控制键的检测则是在时钟信号的驱动下进行,由于按键扫描时钟频率为1MHZ相对较高,所以不会
有很大的迟钝感觉。
4.蛇移动和倒计时模块:
由于此处设计的蛇移动时间间隔恰好是一秒,和倒计时的时间间隔一样,所以将这两个功能放在了一个进程中,这个进程中同时包含对蛇初始位置,总计时时间,鼠步的初始时间等初始化设置,原因也是
为了避免出现双重驱动的问题。
此处的时钟信号为1MHZ在此线程内部进
行了二次分频将其分为1HZ用来控制蛇的移动以及时间计数,在1HZ时钟的驱动下进行剩余时间,剩余鼠步,以及蛇位置坐标的修改控制。
(3)显示模块:
此模块主要完成鼠,墙,蛇,分数,剩余时间的显示,因为要同时显示这几项,故需要进行动态扫描,即在某一时间段内只显示其中一位,程序中用一个
模为六的计数器实现在不同的计数值下显示不同的项,分别如下:
T=0时,扫描老鼠坐标
T=1时,扫描蛇头坐标和右边第一个数码管为SCOR显示
T=2时,扫描蛇身2坐标
T=3时,扫描蛇身3坐标和左边第一个数码管为总计时高位计时显示
T=4时,扫描蛇身4坐标。
T=5时,扫描墙的坐标和左边第四个数码管为总计时的低位计时显示
功能说明:
1.游戏初始化:
按下reset(btnO)键,会对鼠的位置,蛇的位置以及默认移动方向,游戏总时间进行初始化设置,此时分数显示为零,时间为六十秒
2.游戏开始和暂停:
当初始化之后将swO拨上去即为开始游戏,
拨下来即为暂停,暂停后蛇,鼠的位置保持不变,分数时间保持不变,再次将
swO拨回去即可继续游戏。
3.方向控制:
btn7,btn6,btn5,btn4分别对应着上下左右四个方向。
4.当蛇撞墙时,蛇死,游戏重启。
5.当游戏总时间到时,游戏重启。
6.当老鼠十秒后没有被吃掉将会出现在别的地方。
7.当老鼠被蛇吃掉后将会出现新的老鼠,并且分数将会加一分。
8.当吃鼠分数达到三分时,点阵将会全亮,分数固定显示,剩余时间位熄灭,表示游戏通关,按下reset键可重新开始游戏。
仿真波形及波形分析
仿真时的clk_kscan频率为clk_sscan的2倍,clk_kscan的内部分频比为1:
100.
(1)按下reset键后鼠,蛇的位置初始化
tLhJnw
tL事
rt心[T]
njinMJUuuifuinruuuuuuuuuuuuinrLTUuur「v.rrirruiruinruijuuijijinjirinnrnimmuinjinjini
-«
3[31
—
3n
aJLr
Elk.ia<
#iiLto,ii^-«
ri.fdi
卜41tO■-曲松]
1・ttihi
■idift]nil)]
应协
>
ratfUjlas曲0也rrE*a4ri*
1.W1K
rn
口
pcMstLXZQOzj空口mxixz迴uc口
j'
.©
如
动
「JT.fTTxn-苛「
j~LTLrLn_rLrLrtjJiTL
蛇的位置向右移
Start='
(3)分数和时间的初始化显示
UtlffG
M&
ht
dUviEB
7k.WEF•as*ir3Udt
-U4曲・4-liliiWJl
UWC4Iy创・UWC!
]
-3斡【0
CJWDD
rtwl
Ll*1diJuM
■ui
—I個
**:
as
-*ali0iD4]
—JZ'
Hl...「
--.liitDl
叫山戸i诧
•」|住1血
初始化分
数0
初始化时
间高位6
LJ
初始化时间
地位0
\7
r~L
■
UJ
再次复位后蛇鼠坐标重置
LTI__r
X^1cs
n__
Ml-4!
d
Kd|>
l
B5由
as曲Qii「屮山
flSvE
(5)在游戏过程中再次按按下reset键将会重启游戏
:
l■•■呼nN•hmi»
9i■
四.源程序
(1)分频模块
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitydivis
port(clk:
instd_logic;
clk_s,clk_k:
outstd」ogic);
endentity;
architecturediv_aofdivis
signalcounter_sscan:
integerrange0to24999;
--分频得2khz时钟
signalcounter_kscan:
integerrange0to49;
--分频得1mhz时钟
begin
div_sscan1:
process(clk)
ifclk'
eventandclk='
1'
then
ifcounter_sscan=24999then
counter_sscan<
=0;
else
=counter_sscan+1;
endif;
endprocessdiv_sscan1;
div_sscan2:
process(counter_sscan)
begin
ifcounter_sscan<
12499then--占空比为
clk_s<
='
;
elseclk_s<
0'
endprocessdiv_sscan2;
div_kscan1:
eventandclk='
then
ifcounter_kscan=49thencounter_kscan<
elsecounter_kscan<
=counter_kscan+1;
endif;
endprocessdiv_kscan1;
div_kscan2:
process(counter_kscan)begin
ifcounter_kscan<
25thenclk_k<
elseclk_k<
endprocessdiv_kscan2;
enddiv_a;
(2)主程序模块
useieee.std_logic_arith.all;
entityTancsis
port(
clkk:
--系统时钟
start:
--开始/暂停按键
reset:
--重启按键
direction:
instd_logic_vector(3downto0);
row:
outstd_logic_vector(7downto0);
50%
-方向控制按键--点阵的行输出--点阵的列输出
col:
0to200;
--用于随机产生老鼠纵坐标的计数器--剩余时间是否用完的标志位range0to1499999;
--内分频计数器--标志蛇当前状态,‘1'
为活,‘0'
为死
signalsx0,sy0,sx1,sy1,sx2,sy2,sx3,sy3,
--墙的位置坐标
--老鼠的当前位置坐标
range0to7;
--暂存下个老鼠的位置坐标
--原件例化
clk_s,clk_k:
outstd_logic);
endcomponent;
u1:
divportmap(clk=>
clkk,clk_s=>
clk_sscan,clk_k=>
clk_kscan);
--端
口映射wx<
=5;
wy0<
wy1<
=4;
wy2<
=3;
wy3<
=2;
decide:
process(clk_kscan,reset)
ifreset='
then--检测reset键state<
score<
moux<
mouy<
elsifclk_kscan'
eventandclk_kscan='
ifstart='
thenstate<
--检测start/pause键
ifcounter_move=1499999then--内分频,所得频率为一秒(实际分
频--时若果计数器的值按照理值去设置所得的时钟频率明显快于一秒,故此处
将计--数模值加大为原来的1.5倍)
iftime_flag='
then--剩余时间为零
state<
ifmouxx=wxand(mouyy=wy0ormouyy=wy1ormouyy=wy2ormouyy=wy3)then--判断下个要产生老鼠的位置是否与墙重合
=mouxx-1;
elsemoux<
=mouxx;
--进行新老鼠位置的赋值
=mouyy;
elsif(sx0=wxand(sy0=wy0orsy0=wy1orsy0=wy2orsy0=wy3))then--蛇撞墙
ifmouxx=wxand(mouyy=wy0ormouyy=wy1ormouyy=wy2ormouyy=wy3)then
ifmousetime=0then--老鼠剩余时间为零
if(mouxx=wxand(mouyy=wy0ormouyy=wy1ormouyy=wy2ormouyy=wy3))then
ifsx0=mouxandsy0=mouythen--老鼠被吃掉,分数加一score<
=score+1;
ifscore=3then--得分为3分时游戏通关
endprocessdecide;
用于产生随机老鼠的进程
random:
process(clk_kscan)
ifclk_kscan'
thenifmcx=100thenmcx<
elsemcx<
=mcx+1;
ifmcy=200thenmcy<
elsemcy<
=mcy+1;
--产生0到7的老鼠的坐标
mouxx<
=mcxrem8;
mouyy<
=mcyrem8;
endprocessrandom;
dirc:
thentemp_turn<
=1;
event
casedirectioniswhen"
1000"
=>
iftemp_turn<
endif;
when"
0100"
0010"
0001"
whenothers=>
temp_turn<
=temp_turn;
endcase;
endprocessdirc;
and
--方向控制进程
--reset键检测
clk_kscan='
then--上下左右按键检测
temp_turn/=2
temp_turn/=0
temp_turn/=1
temp_turn/=3
then
move:
process(clk_kscan,state)
ifstate='
then--蛇死后游戏时间,老鼠时间,蛇位置的重置
mousetime<
=9;
timeh<
=6;
timel<
sx0<
sy0<
sx1<
sy1<
sx2<
sy2<
sx3<
sy3<
time_flag<
--将初始剩余时间标志设为1
--开始键为一时才开始移动
--老鼠时间的控制
andstart='
ifcounter_move=1499999thenifmousetime=0thenmousetime<
elsemousetime<
=mousetime-1;
iftimel=0andtimeh/=0then--总游戏剩余时间的控制timel<
=timeh-1;
elsiftimel=0andtimeh=0thentime_flag<
elsetimel<
=timel-1;
time_flag<
casetemp_turnis--蛇移动的控制when0=>
ifsy0=7thensy0<
=sy0-7;
elsesy0<
=sy0+1;
when2=>
ifsy0=0thensy0<
=sy0+7;
=sy0-1;
when1=>
ifsx0=7thensx0<
=sx0-7;
elsesx0<
=sx0+1;
when3=>
ifsx0=0thensx0<
=sx0+7;
=sx0-1;
endcase;
=sx0;
=sy0;
sx2<
=sx1;
=sy1;
=sx2;
=sy2;
ifsx0=mouxandsy0=mouythen--蛇吃鼠后鼠剩余时间的重置
counter_move<
--内分频计数器加一
elsecounter_move<
=counter_move+1;
endprocessmove;
lightshow:
process(clk_sscan)--数码管的段码显示进程begin
ifclk_sscan'
eventandclk_sscan='
casetemp_lightis
when9=>
d_light<
="
1111011"
when8=>
1111111"
when7=>
1110000"
when6=>
1011111"
when5=>
1011011"
when4=>
0110011"
1111001"
1101101"
0110000"
when0=>
1111110"
0000000"
endprocesslightshow;
endtancs_a;
五.元器件清单和资源利用情况
1.元器件
系统时钟:
CLK
重启按键RESETBTNO
开始/暂停按键:
SW0
方向控制键:
BTN7BTN6BTN5BTN4
点阵行显示:
ROW—ROW7
点阵列显示:
COL—COL7
数码管的段选:
AA,AB,AC,AD,AE,AF,AG
数码管的位选信号:
CAT0-CAT5
2.资源利用情况
-TutSov6315:
.J5丈CHt
9-Q险JdIS02/25/2QGS5JFuil斜如
Tuci
Tvnet
■战n
EPil210TM«
3
Find
Ko
350/I,?
70(£
S生)
36/1LB(31M)
0/1(0X1
六.故障及问题分析
1.在对整个系统的模块进行划分的时候,没能正确的应用硬件思想来进行规划,而只是简单地将其划分为几个独立的模块,没能顾及各种控制信号的之
间的联系,只是想当然的将其在某种情况下进行修改,但是实际上vhdl是不支持不同进程以及不同时钟沿下对同一信号进行修改的,所以后来将程序写完之
后又重新进行了大规模的合并和修改,浪费了很多时间。
2.对于时序电路的工作机制不是特别熟悉,然后最初决定需要分出几个频率以及决定频率的大小的时候有点不知所措,后来经过一次次实验和比较,最
终采取了分出两个频率,再进一步内分频的模式,其实这样做不是很好,这也
是由于前面的模块划分不是那么清楚明确而导致的,在以后的学习工作中应尽
量避免出现这样的情况。
3.对于上电时的初始化问题,最初设想是能够让系统一上电就能使用,而不是一定要先按下reset键之后才能继续往下,但是
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 综合 实验 报告 贪吃
![提示](https://static.bingdoc.com/images/bang_tan.gif)