数字电路与逻辑设计综合实验——掷骰子游戏

余年寄山水
807次浏览
2021年02月19日 08:30
最佳经验
本文由作者推荐

-

2021年2月19日发(作者:李春郁)



数字电路与逻辑设计综合实验



掷骰子游戏电路的设计与实现




学院:信息与通信工程学院



班级:


2012XXXXXX


学号:


2012XXXXXX


姓名:学渣



班内序号:


XX


实用文档



目录:



一、设计课题的任务要求……


3


二、系统设计……


3


1


、设计思路……


3


2


、总体框图……


4




1



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




2



每按一次按 键,代表掷一次骰子,可随机得到


1



6


范围内的两个数字。



3


、甲乙按键产生的随机数字分别用数码管


DISP0-DISP1

< p>


DISP2-DISP3


< br>示


,


并用


DISP7


显示比赛局数,比赛结束用


8


×


8


点阵显示获胜方,并伴有声音


效果。



4


、具体游戏规则如下:




1




第一局比赛,


甲乙依次各按一次按键,


按键 所得两数之和为


7



11



胜;若无人取胜,则进行第二局比赛;




2




第二局比赛,甲乙每人各按一次按键,按键所得二数之和与第一局比


赛相同者获胜,若无人获胜,则进行第三局比赛,重复进行步骤(


2


,直到出现


胜者为止。




3




游戏局数最多进行六局。在第六局比赛时,若重复进行步骤(


2


)仍


未出现胜者,以按键所得两数之和最大者为获胜方。

< p>


提高要求:



1


、增加多人游戏的功能,数码管可分时记录显示每个游戏者的骰子点数。



2


、点阵显示增加游戏开机动画、结束动画,并伴有乐曲播 放。



3


、自拟其它功能。



二、系统设计



1


、设计思路:



系统结构框图如下:



.


实用文档




由系统框图可以看出,


该系统的核心部分是游戏控制模块,


也即 状态机部分。


游戏控制模块以外部输入的随机数生成信号、游戏控制信号以及时钟信号为 依


据,实现了甲乙随机数的产生,


也即完成了甲乙掷骰子的效果 ;


实现了每一局的


比较,判别比赛的胜负;以及状态之间的转换 。最后,游戏控制模块输出的信号


将分别给到数码管显示模块、


点阵显示模块以及蜂鸣器播放模块,


将游戏的结果


以可视可听的 效果呈现给玩家,实现优质的用户体验。



随机数生成信号由按 键输入,


游戏控制信号由拨码开关输入,


时钟信号由实


验板给出,


数码管扫描显示、


点阵扫描显示以及 蜂鸣器的鸣响的频率则由各个不


同的分频器给出。


< p>
为了更加方便的实现状态机、实现状态之间的跳转以及各个模块之间的连


接 ,我采用了整体编写代码的方式,即将所有的程序代码都写在一个


VHDL


文件


当中,其中以不同的进程来划分不同的模块。



2


、总体框图:



ASM


图:



.


实用文档




.


实用文档





游戏控制及状态转移部分的


MDS


图:




游戏控制模块有

< br>9


个状态,


athrow



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;


这两个分频器实现了两个功能:



首先,


tmp1



tmp2


信号在整型数


1


< p>
6


之间进行计数,当按键按下时,随


机数产生,< /p>


也即


tmp1


信号将分别赋值给甲的


disp0


信号和乙的


disp2


信号,


tmp2


信号将分别赋值给甲的


disp1


信号和乙的


disp3


信号,用于数码管显示随机数,


同时


tmp1



tmp2


还用于两个随机数的相加,


以完成之后的比较判断,


即如下所


示:



disp0 <= tmp1;



disp1 <= tmp2;


jiaadd <= tmp1 + tmp2;



disp2 <= tmp1;



disp3 <= tmp2;


yiadd



<= tmp1 + tmp2;


由于两个分频器所检测的时钟边缘不一样,


并且甲 乙游戏过程中按键的时刻


不相同,所以随机性得以保证。



其次,这两个分频器结合,实现了对原始时钟信号的


196


分频。



其余的分频器与上述两个分频器的实现 相同,


由于数码管、


点阵都需要扫描


显 示,并且点阵需要完成动画效果,


蜂鸣器需要实现开机音乐,


所 以总共设置了


八个分频器,


分得的不同频率信号


clktmp


和计数信号


tmp


用于以上功能的实现。



状态机控制模块(主功能模块)



< /p>


该模块用于实现随机数的产生、


比较随机数的和、判断胜负关系、 进行状态


转移,以及实现胜利的声音效果和开机声音效果。



该模块主要用


CASE- WHEN


语句实现,关键分析如下:



.


实用文档





1


)甲掷 骰子的状态。当


CASE


语句检测到


a throw


这个游戏状态时,将进


入这个


WHEN


语句中。在该状态下,如果甲按键,即


btn0


=



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

< p>


s1


状态。


s1


表示的是第一局比赛的状态,在第一局比赛中,甲乙双方


只要有某一方 的随机数合数等于


7


或者


11


,那么那一方将获胜,否则将进入下


一局。若甲乙双方都满足以上条件, 则产生平局,然后进入下一局。



在这个状态中,


next_state


信号也想当于一个寄存器,存储了该局比赛结束


后的下一个状态,这样在掷骰子的时候才能判断该跳转进入哪一个状态。


tmpj



tmpy


两个信号分别用 于存储第一局甲乙两人投掷出的随机数之和,用于第二


局至第六局的比较判断。



.


实用文档





4



s2~s5


状态。


这四个状态分别代表了第 二局至第五局的比赛状态,


这四


局比赛的比较判断标准都是一样 的,


只有当甲乙中的某一方的随机数合数等于他


们自身的第一局 随机数合数时,才能获胜。


若甲乙双方都满足以上条件,


则产生


平局,然后进入下一局。



.


实用文档





5



s6


状 态。


s6


状态代表第六局比赛的状态,该局比赛下,先进行与前 四


局相同的比较判断,


如果还没有胜利的一方出现,

< p>
则随机数合数较大的一方胜利。


若甲乙双方都满足以上条件,则产生平局。 不论结果怎么样,游戏都将结束,状


态跳转进入


s0

< p>
状态,将所有的信号初始化或者清零。



.


实用文档





6


)甲乙胜利之后的声音效果。为了区别甲胜或者乙胜,还分 别使用了不


同的时钟,在时钟信号等于’


1

’的时候,让蜂鸣器鸣响,时钟信号等于’


0


’的


时候,蜂鸣器不鸣响。




7


)开机音乐模块。以上部分(因为太长没有完全截图, 详细请见源代码)


实现的是开机音乐的播放功能,当复位信号


r eset



0


的时候,


CASE


语句检测


.


实用文档



tmp8

< br>信号,


tmp8


信号的频率接近


1Hz



因此音乐的每个音符的间隔大约为

1


秒。


当时钟信号为’


1


’时,蜂鸣器鸣响,不同的时钟信号,对应于不同的频率,频


率不同则蜂 鸣器发出的声音的音调也就有所不同。


所以,


通过计算可以得出 一首


歌中音符对应的频率,


然后通过分频器分出相应的频率,< /p>


最终可以实现一首歌的


播放功能。



数码管显示模块:




数码管的显示是通过扫描实现的,


在扫描的过程中,


每 次扫描点亮一个数码


管,同时将之前在控制模块接收随机数赋值的


disp


信号赋值给变量


NUM


,由 于


NUM


是变量,赋值之后立即生效,所以可以在一个进程中的 下一个


CASE


语句


中立刻检测,然后 让当前点亮的数码管显示出相应的随机数。当扫描频率大于



3 0*6



Hz


时,由于人眼暂留效应, 玩家将看到五个数码管上的数字持续显示


(有一个数码管没有用上,禁止其显示)


。但是,频率不能取得太高,否则会出


现数码管亮度不够的情况。



点阵显示模块(只截取部分作解释)




.


实用文档





点阵显示模块有两种模式,其一, 是显示游戏的胜负平以及一个过渡状态,


所以由


CASE


语句通过检测游戏结果


gameresult


这个信号来完成。


其二,


是显示


.


实用文档



开机动画,用


CASE


语句检测


tmp8


信号,动画的每个画面停留的时间间隔大约



1


秒,不同画面之间的跳转变换,组合成游戏的开机动画。


点阵的显示也是通过扫描实现的,


行列信号各是


8


位信号,


当点阵中的某一


个点对应的行信号的位 为


0


、列信号的位为


1


时,该点将被点亮。这里实现的方


案是运用了行扫描,


即每隔一个时间间隔扫描一行,


此时这行对应的行信号的位


为< /p>


0



再看列信号,


列信号为


1


的位对应的该行的列就会被点亮。


根据这个原理,


就可以一个一个将开机动画的图案在稿纸上确定下来,然后用程 序实现。




三、仿真波形及波形分析:






上图是乙按下按键之后的状态转移波形图。


< br>可见,乙按下按键之前(


btn1


为低电平)

< p>
,游戏状态


gamestate


保持在

< p>
bthrow


状态,乙按下按键之后经过一个时钟周期,游戏状态转移到< /p>


s1


状态,即进


入第一局进行比较判断, 又经过一个时钟周期之后,比较判断结束,游戏状


态转移到


at hrow


状态,等待甲下一次按键。




.


实用文档





上图是点阵显示的仿真波形。



可见, 点阵行信号一直在扫描,每次使能一行点阵,在行信号为


0


的时 刻,


对应的列信号的位为


1


时,则该行 的对应列将被点亮。波形分析如下:




1


)在甲掷骰子之后、乙掷骰子之前,点阵将显示绿色的过渡图案,即一


个笑脸图案;




2


)甲乙第一次掷出骰子后,程序将进行比较判断,由图可以看出,仿真


中出现的结果是平局,在点阵上将显示一个红色的“平”字样;




3


)甲乙第二次掷出骰子后,仿真中出现的结果是乙胜,在 点阵上将显示


绿色的“乙胜”字样,在下一次按键按下之前,可以看到,扫描会重复进行 ;




4


)甲 乙第三次掷出骰子后,点阵将显示红色的“平”字样。






上图左边和右边分别是甲、乙第一 次按键之前之后的数码管信号的仿真


波形图。



由图可见,不论甲乙按键与否,数码管使能信号


SMGCAT

< br>都在逐个定时扫


描,其中


SMGCAT[1]

< p>
一直设置为


1


,也即禁止其显示。首先看左图,由 于是第









键< /p>









< p>








SMGOUT




为”

< p>
0000001


”,


也即显示中间的一条横杆。< /p>


当甲按键按下产生两个随机数之后,


SMGCAT[5]



SMGCA


T[4]



0


时,也即前两个数码管可以显示的时候,对应的

< p>
SMGOUT


信号的值变为”


0110000


”和”


1011011


”,分别对应数字< /p>


1



5


。然


后看右图,乙按键之前的状态一直保持不变,乙按键之后,


SMGC AT[3]



SMGCAT[2]


为< /p>


0


时,


也即中间两个数码管可以显示的时 候,


对应的


SMGOUT


< p>
.


实用文档



号的值变 为”


0110000


”和”


01100 00


”,分别对应数字


1


< p>
1


。此时,对应于甲


掷出骰子的随机数显示


SMGOUT


信号没有变化,也即甲乙投掷骰子产生的随机

< p>
数互相不影响。



四、源程序及注释:



--

< p>
掷骰子游戏


——


信通


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;--


分频器输出时钟信号,


为了分析的方


便,仅此而已



------------ -------------------------------------


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


数码管信号的传递信号


,


显示随


机数




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;--


甲的第一次两数和,


用于判断前后合数


是否 相等




SIGNAL tmpy: INTEGER RANGE 0 TO 12;--


同上,为乙的







SIGNAL count: INTEGER RANGE 0 TO 5;--


计数,用在


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>--


产生随机数


&


比较判断


&


状态转移


&


声音 效果



SUIJISHU: PROCESS(clk)


BEGIN




IF (start = '0') THEN--


初始化


&


复位





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';

-


-


-


-


-


-


-


-