数字电路与逻辑设计综合实验——掷骰子游戏
-
数字电路与逻辑设计综合实验
掷骰子游戏电路的设计与实现
学院:信息与通信工程学院
班级:
2012XXXXXX
学号:
2012XXXXXX
姓名:学渣
班内序号:
XX
实用文档
目录:
一、设计课题的任务要求……
3
二、系统设计……
3
1
、设计思路……
3
2
、总体框图……
4
(
1
)
p>
ASM
图……
4
(
2
)
MDS
图……
6
3
、分块设计……
6
(
1
)分频器模块……
6 <
/p>
(
2
)状态机控制模块(主功能模块)…
…
7
(
3
)
数码管显示模块……
13
(
4
)点阵显示模块……
13
三、仿真波形及波形分析……
15
四、源程序及注释……
17
五、功能说明及资源利用情况……
39
六、实现效果图……40
七、故障及问题分析……
43
八、总结和结论……
44
.
实用文档
一、设计课题的任务要求:
设计并实现一个掷骰子游戏电路。
基本要求:
1
、电路可供甲乙二人游戏,游戏者甲使用的按键为
BTN0
,
游戏者乙使用的
按键为
BTN1
。
p>
2
、
每按一次按
键,代表掷一次骰子,可随机得到
1
~
6
范围内的两个数字。
3
、甲乙按键产生的随机数字分别用数码管
DISP0-DISP1
、
DISP2-DISP3
显
< br>示
,
并用
DISP7
显示比赛局数,比赛结束用
8
×
8
点阵显示获胜方,并伴有声音
效果。
4
、具体游戏规则如下:
(
1
)
p>
第一局比赛,
甲乙依次各按一次按键,
按键
所得两数之和为
7
或
11
者
胜;若无人取胜,则进行第二局比赛;
(
2
)
p>
第二局比赛,甲乙每人各按一次按键,按键所得二数之和与第一局比
赛相同者获胜,若无人获胜,则进行第三局比赛,重复进行步骤(
2
)
,直到出现
胜者为止。
(
3
)
p>
游戏局数最多进行六局。在第六局比赛时,若重复进行步骤(
2
p>
)仍
未出现胜者,以按键所得两数之和最大者为获胜方。
提高要求:
1
、增加多人游戏的功能,数码管可分时记录显示每个游戏者的骰子点数。
2
、点阵显示增加游戏开机动画、结束动画,并伴有乐曲播
放。
3
、自拟其它功能。
二、系统设计
1
、设计思路:
系统结构框图如下:
.
实用文档
由系统框图可以看出,
该系统的核心部分是游戏控制模块,
也即
状态机部分。
游戏控制模块以外部输入的随机数生成信号、游戏控制信号以及时钟信号为
依
据,实现了甲乙随机数的产生,
也即完成了甲乙掷骰子的效果
;
实现了每一局的
比较,判别比赛的胜负;以及状态之间的转换
。最后,游戏控制模块输出的信号
将分别给到数码管显示模块、
点阵显示模块以及蜂鸣器播放模块,
将游戏的结果
以可视可听的
效果呈现给玩家,实现优质的用户体验。
随机数生成信号由按
键输入,
游戏控制信号由拨码开关输入,
时钟信号由实
验板给出,
数码管扫描显示、
点阵扫描显示以及
蜂鸣器的鸣响的频率则由各个不
同的分频器给出。
为了更加方便的实现状态机、实现状态之间的跳转以及各个模块之间的连
接
,我采用了整体编写代码的方式,即将所有的程序代码都写在一个
VHDL
文件
当中,其中以不同的进程来划分不同的模块。
2
、总体框图:
ASM
图:
.
实用文档
.
实用文档
游戏控制及状态转移部分的
MDS
图:
游戏控制模块有
< br>9
个状态,
athrow
和
p>
bthrow
分别是甲和乙掷骰子的状态,
athrow
是游戏启动的第一个状态,该状态下按下按键才会跳到
bthrow
状态,否
则将保持在本状态。在
bthrow
状态也是只有按下按键才会跳到
s1~
s6
状态中,
否则将会保持在本状态。
s0
是过渡状态,在这个状态将所有的信号都初始化为
原始的状
态。
s1~s6
是六个局数的状态。转换到
s1~s6
之中的哪一个状态,是由
next_state
信号决定的。
3
、分块设计:
分频器模块(以用于产生随机数两个分频器为例)
:
FENPINONE: PROCESS (clk)
BEGIN
IF
clk'event AND clk = '1' THEN
IF tmp1 = 6
THEN
tmp1 <= 1;
clktmp1 <= not
clktmp1;
ELSE
tmp1 <= tmp1 + 1;
.
实用文档
END IF;
END IF;
END PROCESS FENPINONE;
FENPINTWO: PROCESS (clktmp1)
BEGIN
IF
clktmp1'event AND clktmp1 = '1' THEN
IF tmp2 = 6
THEN
tmp2 <= 1;
clktmp2 <= not
clktmp2;
ELSE
tmp2 <= tmp2 + 1;
END IF;
END IF;
END PROCESS
FENPINTWO;
这两个分频器实现了两个功能:
p>
首先,
tmp1
和
tmp2
信号在整型数
1
至
6
之间进行计数,当按键按下时,随
机数产生,<
/p>
也即
tmp1
信号将分别赋值给甲的
p>
disp0
信号和乙的
disp2
信号,
tmp2
信号将分别赋值给甲的
disp1
信号和乙的
disp3
信号,用于数码管显示随机数,
同时
tmp1
和
tmp2
还用于两个随机数的相加,
以完成之后的比较判断,
即如下所
示:
disp0 <= tmp1;
disp1 <= tmp2;
jiaadd <=
tmp1 + tmp2;
disp2 <= tmp1;
disp3 <= tmp2;
yiadd
<= tmp1 +
tmp2;
由于两个分频器所检测的时钟边缘不一样,
并且甲
乙游戏过程中按键的时刻
不相同,所以随机性得以保证。
p>
其次,这两个分频器结合,实现了对原始时钟信号的
196
分频。
其余的分频器与上述两个分频器的实现
相同,
由于数码管、
点阵都需要扫描
显
示,并且点阵需要完成动画效果,
蜂鸣器需要实现开机音乐,
所
以总共设置了
八个分频器,
分得的不同频率信号
clktmp
和计数信号
tmp
用于以上功能的实现。
状态机控制模块(主功能模块)
:
<
/p>
该模块用于实现随机数的产生、
比较随机数的和、判断胜负关系、
进行状态
转移,以及实现胜利的声音效果和开机声音效果。
该模块主要用
CASE-
WHEN
语句实现,关键分析如下:
.
实用文档
(
1
)甲掷
骰子的状态。当
CASE
语句检测到
a
throw
这个游戏状态时,将进
入这个
WHEN
语句中。在该状态下,如果甲按键,即
btn0
p>
=
‘
1
’,则
将当前
时刻分频器中的两个计数信号
tmp1
< br>和
tmp2
赋值给数码管显示信号;将
< br>tmp
1
和
< br>tmp2
进行相加成为随机数之和,用于后续比较;将游戏状态
< br>gamestate
转换为
bthrow
状态;
由于这是掷骰子阶段,
所以将游戏结果
gameresult
赋值为
3
,
表示是过渡的状态。如果甲没有按键,则游戏状态一直保持
< br>athrow
这个状态。
由于
这些都是对信号
SIGNAL
的赋值操作,只有当控制模块这个
进程结束
的时候信号赋值才会生效(其实这个时间很短,人看起来是近乎同时的)
,所以
为了在一个人按键按下之后,
而不是两
个人按键都按下之后,
数码管显示出当前
比赛局数,我用一个<
/p>
register_disp7
来事先存储局数,在甲按下按键的
时候赋给
disp7
信号,实现上述功能。
.
实用文档
(
2
)
s0
状态。
s0
是某一方胜利之后将会跳转进入的状态,在这个状态中,
实现对所有信号的初始化或者清零,避免进入下一场比赛后影响比赛的比较判
断。
(
3
)
s1
状态。
s1
表示的是第一局比赛的状态,在第一局比赛中,甲乙双方
只要有某一方
的随机数合数等于
7
或者
11
,那么那一方将获胜,否则将进入下
一局。若甲乙双方都满足以上条件,
则产生平局,然后进入下一局。
在这个状态中,
next_state
信号也想当于一个寄存器,存储了该局比赛结束
后的下一个状态,这样在掷骰子的时候才能判断该跳转进入哪一个状态。
tmpj
和
tmpy
两个信号分别用
于存储第一局甲乙两人投掷出的随机数之和,用于第二
局至第六局的比较判断。
.
实用文档
(
4
)
p>
s2~s5
状态。
这四个状态分别代表了第
二局至第五局的比赛状态,
这四
局比赛的比较判断标准都是一样
的,
只有当甲乙中的某一方的随机数合数等于他
们自身的第一局
随机数合数时,才能获胜。
若甲乙双方都满足以上条件,
则产生
平局,然后进入下一局。
.
实用文档
(
5
)
s6
状
态。
s6
状态代表第六局比赛的状态,该局比赛下,先进行与前
四
局相同的比较判断,
如果还没有胜利的一方出现,
则随机数合数较大的一方胜利。
若甲乙双方都满足以上条件,则产生平局。
不论结果怎么样,游戏都将结束,状
态跳转进入
s0
状态,将所有的信号初始化或者清零。
.
实用文档
(
6
)甲乙胜利之后的声音效果。为了区别甲胜或者乙胜,还分
别使用了不
同的时钟,在时钟信号等于’
1
’的时候,让蜂鸣器鸣响,时钟信号等于’
0
’的
时候,蜂鸣器不鸣响。
(
7
)开机音乐模块。以上部分(因为太长没有完全截图,
详细请见源代码)
实现的是开机音乐的播放功能,当复位信号
r
eset
为
0
的时候,
CASE
语句检测
.
实用文档
tmp8
< br>信号,
tmp8
信号的频率接近
1Hz
,
因此音乐的每个音符的间隔大约为
1
秒。
当时钟信号为’
1
’时,蜂鸣器鸣响,不同的时钟信号,对应于不同的频率,频
率不同则蜂
鸣器发出的声音的音调也就有所不同。
所以,
通过计算可以得出
一首
歌中音符对应的频率,
然后通过分频器分出相应的频率,<
/p>
最终可以实现一首歌的
播放功能。
数码管显示模块:
数码管的显示是通过扫描实现的,
在扫描的过程中,
每
次扫描点亮一个数码
管,同时将之前在控制模块接收随机数赋值的
disp
信号赋值给变量
NUM
,由
于
NUM
是变量,赋值之后立即生效,所以可以在一个进程中的
下一个
CASE
语句
中立刻检测,然后
让当前点亮的数码管显示出相应的随机数。当扫描频率大于
(
3
0*6
)
Hz
时,由于人眼暂留效应,
玩家将看到五个数码管上的数字持续显示
(有一个数码管没有用上,禁止其显示)
。但是,频率不能取得太高,否则会出
现数码管亮度不够的情况。
p>
点阵显示模块(只截取部分作解释)
:
.
实用文档
点阵显示模块有两种模式,其一,
是显示游戏的胜负平以及一个过渡状态,
所以由
CASE
语句通过检测游戏结果
gameresult
这个信号来完成。
其二,
是显示
.
实用文档
开机动画,用
CASE
语句检测
tmp8
信号,动画的每个画面停留的时间间隔大约
为
1
秒,不同画面之间的跳转变换,组合成游戏的开机动画。
点阵的显示也是通过扫描实现的,
行列信号各是
8
位信号,
当点阵中的某一
个点对应的行信号的位
为
0
、列信号的位为
1
时,该点将被点亮。这里实现的方
案是运用了行扫描,
即每隔一个时间间隔扫描一行,
此时这行对应的行信号的位
为<
/p>
0
,
再看列信号,
列信号为
1
的位对应的该行的列就会被点亮。
根据这个原理,
就可以一个一个将开机动画的图案在稿纸上确定下来,然后用程
序实现。
三、仿真波形及波形分析:
➢
上图是乙按下按键之后的状态转移波形图。
< br>可见,乙按下按键之前(
btn1
为低电平)
,游戏状态
gamestate
保持在
bthrow
状态,乙按下按键之后经过一个时钟周期,游戏状态转移到<
/p>
s1
状态,即进
入第一局进行比较判断,
又经过一个时钟周期之后,比较判断结束,游戏状
态转移到
at
hrow
状态,等待甲下一次按键。
.
实用文档
➢
上图是点阵显示的仿真波形。
可见,
点阵行信号一直在扫描,每次使能一行点阵,在行信号为
0
的时
刻,
对应的列信号的位为
1
时,则该行
的对应列将被点亮。波形分析如下:
(
1
)在甲掷骰子之后、乙掷骰子之前,点阵将显示绿色的过渡图案,即一
个笑脸图案;
(
2
)甲乙第一次掷出骰子后,程序将进行比较判断,由图可以看出,仿真
中出现的结果是平局,在点阵上将显示一个红色的“平”字样;
(
3
)甲乙第二次掷出骰子后,仿真中出现的结果是乙胜,在
点阵上将显示
绿色的“乙胜”字样,在下一次按键按下之前,可以看到,扫描会重复进行
;
(
4
)甲
乙第三次掷出骰子后,点阵将显示红色的“平”字样。
➢
上图左边和右边分别是甲、乙第一
次按键之前之后的数码管信号的仿真
波形图。
由图可见,不论甲乙按键与否,数码管使能信号
SMGCAT
< br>都在逐个定时扫
描,其中
SMGCAT[1]
一直设置为
1
,也即禁止其显示。首先看左图,由
于是第
一
次
按
键
,
甲
按
键<
/p>
之
前
的
各
种
状
态
都
是
初
始
状
态
,
所
以
SMGOUT
信
号
为”
0000001
”,
也即显示中间的一条横杆。<
/p>
当甲按键按下产生两个随机数之后,
SMGCAT[5]
和
SMGCA
T[4]
为
0
时,也即前两个数码管可以显示的时候,对应的
SMGOUT
信号的值变为”
0110000
p>
”和”
1011011
”,分别对应数字<
/p>
1
和
5
。然
p>
后看右图,乙按键之前的状态一直保持不变,乙按键之后,
SMGC
AT[3]
和
SMGCAT[2]
为<
/p>
0
时,
也即中间两个数码管可以显示的时
候,
对应的
SMGOUT
信
.
实用文档
号的值变
为”
0110000
”和”
01100
00
”,分别对应数字
1
和
1
。此时,对应于甲
掷出骰子的随机数显示
SMGOUT
信号没有变化,也即甲乙投掷骰子产生的随机
数互相不影响。
四、源程序及注释:
--
掷骰子游戏
——
信通
XX
XXXXX
——
2012XXXXXX
LIBRARY IEEE;
USE _LOGIC_;
USE _LOGIC_;
ENTITY touzi IS
PORT(
clk: IN
STD_LOGIC;--
时钟输入信号
reset: IN
STD_LOGIC;--
开机动画开启关闭输入信号
start: IN
STD_LOGIC;--
开始游戏按键
bnt0,bnt1:IN
STD_LOGIC;--
按键信号输入
SMGCAT: OUT STD_LOGIC_VECTOR(5 DOWNTO
0);--
数码管使能端输出信号
SMGOUT: OUT STD_LOGIC_VECTOR(6 DOWNTO
0);--
数码管显示输出信号
--
-----------------------------------------------
clkout1,clkout2,clkout3,clkout4: OUT ST
D_LOGIC;--
分频器输出时钟信号,
为了分析的方
p>
便,仅此而已
------------
-------------------------------------
row,col1,col2:out std_logic_vector(7
downto 0);--
点阵行列输出信号,
col1
是红,
col2
是绿
(行
0
列
1
时
点阵亮)
beep_out: OUT
STD_LOGIC--
蜂鸣器输出信号
);
END touzi;
ARCHITECTURE touzisignal OF touzi IS
TYPE
state_type
IS
(athrow,bthrow,s0,s1,s2,s
3,s4,s5,s6);--
游戏状态(甲掷乙掷
&1~6<
/p>
局
&s0
过渡态用于复位)
SIGNAL
gamestate,next_state:
state_type;--
游戏状态信号
--
分频器中的计数标志
SIGNAL tmp1: INTEGER RANGE
1 TO 6;--
只取
1~6
避免出
现异常情况
SIGNAL
tmp2: INTEGER RANGE 1 TO 6;
SIGNAL tmp3: INTEGER RANGE 0 TO 49;
SIGNAL tmp4: INTEGER RANGE
0 TO 49;
SIGNAL tmp5:
INTEGER RANGE 0 TO 49;
SIGNAL tmp6: INTEGER RANGE 0 TO 12;
SIGNAL tmp7: INTEGER RANGE
0 TO 5;
SIGNAL tmp8:
INTEGER RANGE 0 TO 24;
--
分频后的时钟信号
SIGNAL clktmp1: STD_LOGIC;
SIGNAL clktmp2: STD_LOGIC;
SIGNAL clktmp3: STD_LOGIC;
SIGNAL clktmp4: STD_LOGIC;
SIGNAL clktmp5: STD_LOGIC;
SIGNAL clktmp6: STD_LOGIC;
.
实用文档
SIGNAL clktmp7: STD_LOGIC;
SIGNAL clktmp8: STD_LOGIC;
SIGNAL gameresult: INTEGER
RANGE 0 TO 3;--
游戏输赢结果(胜平
&
过渡状态)
,
用于判断游戏状态走向
&
点阵显示
--SIGNAL winorlose: STD_LOGIC;--
胜利
OR
平局
SIGNAL disp0: INTEGER RANGE
0 TO 6;--D0~D3
数码管信号的传递信号
,
p>
显示随
机数
SIGNAL disp1: INTEGER RANGE 0 TO 6;
SIGNAL disp2: INTEGER RANGE
0 TO 6;
SIGNAL disp3:
INTEGER RANGE 0 TO 6;
SIGNAL disp7: INTEGER RANGE 0 TO
6;--
显示局数
SIGNAL register_disp7: INTEGER RANGE 0
TO 6;--
用于在上一个状态寄存局数信
号
SIGNAL jiaadd: INTEGER
RANGE 0 TO 12;--
甲
两数和
SIGNAL yiadd: INTEGER RANGE 0 TO
12;--
乙
两数和
SIGNAL tmpj: INTEGER RANGE 0 TO 12;--
p>
甲的第一次两数和,
用于判断前后合数
是否
相等
SIGNAL tmpy:
INTEGER RANGE 0 TO
12;--
同上,为乙的
SIGNAL count: INTEGER RANGE 0 TO 5;--
p>
计数,用在
SMG
扫描显示中
--SIGNAL keybeep:
STD_LOGIC;
--SIGNAL
beepcount: INTEGER RANGE 0 TO 40000;
--SIGNAL beeptmp: STD_LOGIC;
SIGNAL beepstart:
STD_LOGIC;
--------------------------
--SIGNAL music_state: INTEGER RANGE 0
TO 35;--
音乐的状态
--SIGNAL mcount1: INTEGER RANGE 0 TO
1000;
--SIGNAL tone:
INTEGER RANGE 0 TO 100000;
--SIGNAL mspk_count: INTEGER RANGE 0 TO
100000;
------------------------
BEGIN
--
分频器组
FENPINONE: PROCESS
(clk)--tmp1,tmp2
用于产生随机数
1~6
BEGIN
IF clk'event AND clk = '1' THEN
IF
tmp1 = 6 THEN
tmp1 <= 1;
clktmp1 <= not
clktmp1;
ELSE
tmp1 <= tmp1 + 1;
END IF;
END IF;
END PROCESS
FENPINONE;
FENPINTWO:
PROCESS (clktmp1)
BEGIN
IF clktmp1'event AND clktmp1 = '1' THEN
IF
tmp2 = 6 THEN
tmp2 <= 1;
clktmp2 <= not
clktmp2;
ELSE
tmp2 <= tmp2 + 1;
END IF;
END IF;
END PROCESS
FENPINTWO;
.
实用文档
FENPINTHREE: PROCESS
(clktmp2)
BEGIN
IF clktmp2'event AND clktmp2 = '1' THEN
IF
tmp3 = 7 THEN
tmp3 <= 0;
clktmp3 <= not
clktmp3;
ELSE
tmp3 <= tmp3 + 1;
END IF;
END IF;
END PROCESS
FENPINTHREE;
FENPINFOURE:
PROCESS (clktmp3)
BEGIN
IF clktmp3'event AND clktmp3 = '1' THEN
IF
tmp4 = 1 THEN
tmp4 <= 0;
clktmp4 <= not
clktmp4;
ELSE
tmp4 <= tmp4 + 1;
END IF;
END IF;
END PROCESS
FENPINFOURE;
FENPINFIVE:
PROCESS (clktmp4)--
用
tmp5
来控制点阵扫描显示单个图案
所以
0~7
BEGIN
IF clktmp4'event AND
clktmp4 = '1' THEN
IF tmp5 = 7 THEN
tmp5 <= 0;
clktmp5 <= not clktmp5;
ELSE
tmp5 <= tmp5 + 1;
END IF;
END IF;
END PROCESS
FENPINFIVE;
FENPINJIASOUND:
PROCESS(clktmp5)--
用其中的
clktmp
6
信号来控制甲胜之后的声音
效果
BEGIN
IF
clktmp5'event AND clktmp5 = '1' THEN
IF tmp6 = 12
THEN
tmp6 <= 0;
clktmp6 <= not
clktmp6;
ELSE
tmp6 <= tmp6 + 1;
END IF;
END IF;
END PROCESS
FENPINJIASOUND;
FENPINYISOU
ND:PROCESS(clktmp6)--
用其中的
clk
tmp7
信号来控制乙胜之后的声音
效果
BEGIN
IF
clktmp6'event AND clktmp6 = '1' THEN
IF tmp7 = 2
THEN
tmp7 <= 0;
clktmp7 <= not
clktmp7;
.
实用文档
ELSE
tmp7 <= tmp7 + 1;
END IF;
END IF;
END PROCESS
FENPINYISOUND;
FENPINDONGHUA: PROCESS(clktmp7)--
用
tmp8
信号控制点阵动画
BEGIN
IF
clktmp7'event AND clktmp7 = '1' THEN
IF tmp8 = 24
THEN
tmp8 <= 0;
clktmp8 <= not
clktmp8;
ELSE
tmp8 <= tmp8 + 1;
END IF;
END IF;
END PROCESS
FENPINDONGHUA;
--
只是为了分析波形方便
---
clkout1 <= clktmp1;
clkout2
<= clktmp2;
clkout3 <= clktmp3;
clkout4 <= clktmp4;
-------------------------
--
-----
状态机控制模块
-------
< br>--
产生随机数
&
比较判断
p>
&
状态转移
&
声音
效果
SUIJISHU: PROCESS(clk)
BEGIN
IF (start = '0') THEN--
初始化
p>
&
复位
disp0 <= 0;
disp1 <= 0;
disp2 <= 0;
disp3 <= 0;
gamestate <= athrow;
gameresult <=
3;--
比赛过渡部分,显示过渡画面
next_state <=
s1;
disp7 <= 0;
register_disp7
<= 1;
beepstart
<= '0';
ELSIF (clk'event AND clk =
'1') THEN
CASE gamestate IS
WHEN athrow =>
IF(bnt0 = '1')THEN
disp0 <= tmp1;
disp1 <= tmp2;
disp2 <= 0;
disp3 <= 0;
jiaadd <= tmp1 + tmp2;
gamestate <=
bthrow;
disp7 <=
register_disp7;
gameresult <= 3;
beepstart <= '1';
ELSE
gamestate <= athrow;
beepstart <= '0';
END
IF;
.
实用文档
WHEN bthrow =>
IF(bnt1 = '1')THEN
disp2 <= tmp1;
disp3 <= tmp2;
yiadd
<= tmp1 +
tmp2;
gamestate <= next_state;
beepstart <= '1';
ELSE
gamestate <= bthrow;
beepstart <= '0';
.
END IF;
WHEN s0 =>
disp0 <= 0;
disp1 <= 0;
disp2 <= 0;
disp3 <= 0;
tmpj <= 0;
tmpy <= 0;
jiaadd <= 0;
yiadd <= 0;
gameresult <=
3;
gamestate <= athrow;
next_state <=
s1;
register_disp7 <= 1;
beepstart <=
'0';
WHEN s1 =>
beepstart <=
'0';
tmpj <= jiaadd;
tmpy <= yiadd;
IF (jiaadd = 7
OR jiaadd = 11) THEN
IF (yiadd /= 7
AND yiadd /= 11) THEN
gameresult <= 1;
gamestate <= athrow;
next_state <= s0;
register_disp7 <= 0;
ELSE
gameresult <= 0;
gamestate <= athrow;
next_state <= s2;
register_disp7 <= 2;
END IF;
ELSE
IF
(yiadd = 7 OR yiadd = 11) THEN
gameresult <= 2;
gamestate <=
athrow;
next_state <=
s0;
register_disp7
<= 0;
ELSE
gameresult <= 0;
gamestate <=
athrow;
next_state <=
s2;
register_disp7
<= 2;
END IF;
END IF;
WHEN s2 =>
实用文档
beepstart <= '0';
.
IF (jiaadd = tmpj AND yiadd /=tmpy)
THEN
gameresult <=
1;
gamestate <= athrow;
next_state <= s0;
register_disp7 <= 0;
ELSIF (jiaadd
/= tmpj AND yiadd = tmpy) THEN
gameresult <= 2;
gamestate <= athrow;
next_state <= s0;
register_disp7 <= 0;
ELSE
gameresult <= 0;
gamestate <= athrow;
next_state <= s3;
register_disp7 <= 3;
END IF;
WHEN s3 =>
beepstart <= '0';
IF
(jiaadd = tmpj AND yiadd /=tmpy) THEN
gameresult <= 1;
gamestate <= athrow;
next_state <= s0;
register_disp7 <= 0;
ELSIF (jiaadd
/= tmpj AND yiadd = tmpy) THEN
gameresult <= 2;
gamestate <= athrow;
next_state <= s0;
register_disp7 <= 0;
ELSE
gameresult <= 0;
gamestate <= athrow;
next_state <= s4;
register_disp7 <= 4;
END IF;
WHEN s4 =>
beepstart <=
'0';
IF (jiaadd = tmpj AND yiadd /=tmpy)
THEN
gameresult <=
1;
gamestate <= athrow;
next_state <= s0;
register_disp7 <= 0;
ELSIF (jiaadd
/= tmpj AND yiadd = tmpy) THEN
gameresult <= 2;
gamestate <= athrow;
next_state <= s0;
register_disp7 <= 0;
ELSE
gameresult <= 0;
gamestate <= athrow;
next_state <= s5;
register_disp7 <= 5;
END IF;
WHEN s5 =>
beepstart <=
'0';
IF (jiaadd = tmpj AND yiadd /=tmpy)
THEN
实用文档
gameresult <= 1;
gamestate <= athrow;
next_state <= s0;
register_disp7 <= 0;
.
ELSIF (jiaadd /= tmpj AND yiadd = tmpy)
THEN
gameresult <=
2;
gamestate <= athrow;
next_state <= s0;
register_disp7 <= 0;
ELSE
gameresult <= 0;
gamestate <= athrow;
next_state <= s6;
register_disp7 <= 6;
END
IF;
WHEN s6 =>
beepstart <= '0';
IF
(jiaadd = tmpj AND yiadd /=tmpy) THEN
gameresult <= 1;
gamestate <= athrow;
next_state <= s0;
register_disp7 <= 0;
ELSIF (jiaadd /= tmpj AND yiadd = tmpy)
THEN
gameresult <=
2;
gamestate <= athrow;
next_state <= s0;
register_disp7 <= 0;
ELSE
IF
(jiaadd > yiadd) THEN
gameresult <= 1;
gamestate <=
athrow;
next_state <= s0;
register_disp7 <= 0;
ELSIF (jiaadd < yiadd) THEN
gameresult <=
2;
gamestate <=
athrow;
next_state <= s0;
register_disp7 <= 0;
ELSE
gameresult <=
0;
gamestate <=
athrow;
next_state <= s0;
register_disp7 <= 0;
END IF;
END
IF;
WHEN OTHERS =>
beepstart <= '0';
gameresult <= 0;
gamestate <= athrow;
next_state <= s0;
register_disp7 <= 0;
END
CASE;
--
胜利之后的声音效果
IF(beepstart = '1')THEN
beep_out <= '1';