ImageVerifierCode 换一换
格式:DOCX , 页数:61 ,大小:4.30MB ,
资源ID:4920023      下载积分:12 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4920023.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数字电路与逻辑设计综合实验掷骰子游戏.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

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

1、数字电路与逻辑设计综合实验掷骰子游戏数字电路与逻辑设计综合实验掷骰子游戏电路的设计与实现学院:信息与通信工程学院班级:2012XXXXXX学号:2012XXXXXX姓名:学渣班内序号:XX目录:一、设计课题的任务要求3二、系统设计31、设计思路32、总体框图4 (1)ASM图4 (2)MDS图63、分块设计6(1)分频器模块6(2)状态机控制模块(主功能模块)7(3)数码管显示模块13(4)点阵显示模块13三、仿真波形及波形分析15四、源程序及注释17五、功能说明及资源利用情况39六、实现效果图40七、故障及问题分析43八、总结和结论44一、设计课题的任务要求:设计并实现一个掷骰子游戏电路。基

2、本要求:1、电路可供甲乙二人游戏,游戏者甲使用的按键为BTN0,游戏者乙使用的按键为BTN1。2、每按一次按键,代表掷一次骰子,可随机得到 16 范围内的两个数字。3、甲乙按键产生的随机数字分别用数码管DISP0-DISP1、DISP2-DISP3 显示,并用DISP7 显示比赛局数,比赛结束用88 点阵显示获胜方,并伴有声音效果。4、具体游戏规则如下:(1) 第一局比赛,甲乙依次各按一次按键,按键所得两数之和为7 或11 者胜;若无人取胜,则进行第二局比赛;(2) 第二局比赛,甲乙每人各按一次按键,按键所得二数之和与第一局比赛相同者获胜,若无人获胜,则进行第三局比赛,重复进行步骤(2),直到

3、出现胜者为止。(3) 游戏局数最多进行六局。在第六局比赛时,若重复进行步骤(2)仍未出现胜者,以按键所得两数之和最大者为获胜方。提高要求:1、增加多人游戏的功能,数码管可分时记录显示每个游戏者的骰子点数。2、点阵显示增加游戏开机动画、结束动画,并伴有乐曲播放。3、自拟其它功能。二、系统设计1、设计思路:系统结构框图如下:由系统框图可以看出,该系统的核心部分是游戏控制模块,也即状态机部分。游戏控制模块以外部输入的随机数生成信号、游戏控制信号以及时钟信号为依据,实现了甲乙随机数的产生,也即完成了甲乙掷骰子的效果;实现了每一局的比较,判别比赛的胜负;以及状态之间的转换。最后,游戏控制模块输出的信号将

4、分别给到数码管显示模块、点阵显示模块以及蜂鸣器播放模块,将游戏的结果以可视可听的效果呈现给玩家,实现优质的用户体验。随机数生成信号由按键输入,游戏控制信号由拨码开关输入,时钟信号由实验板给出,数码管扫描显示、点阵扫描显示以及蜂鸣器的鸣响的频率则由各个不同的分频器给出。为了更加方便的实现状态机、实现状态之间的跳转以及各个模块之间的连接,我采用了整体编写代码的方式,即将所有的程序代码都写在一个VHDL文件当中,其中以不同的进程来划分不同的模块。2、总体框图:ASM图: 游戏控制及状态转移部分的MDS图: 游戏控制模块有9个状态,athrow和bthrow分别是甲和乙掷骰子的状态,athrow是游戏

5、启动的第一个状态,该状态下按下按键才会跳到bthrow状态,否则将保持在本状态。在bthrow状态也是只有按下按键才会跳到s1s6状态中,否则将会保持在本状态。s0是过渡状态,在这个状态将所有的信号都初始化为原始的状态。s1s6是六个局数的状态。转换到s1s6之中的哪一个状态,是由next_state信号决定的。3、分块设计:分频器模块(以用于产生随机数两个分频器为例):FENPINONE: PROCESS (clk)BEGIN IF clkevent AND clk = 1 THEN IF tmp1 = 6 THEN tmp1 = 1; clktmp1 = not clktmp1; ELSE

6、 tmp1 = tmp1 + 1; END IF; END IF;END PROCESS FENPINONE;FENPINTWO: PROCESS (clktmp1)BEGIN IF clktmp1event 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至6之间进行计数,当按键按下时,随机数产生,也即tmp1信号将分

7、别赋值给甲的disp0信号和乙的disp2信号,tmp2信号将分别赋值给甲的disp1信号和乙的disp3信号,用于数码管显示随机数,同时tmp1和tmp2还用于两个随机数的相加,以完成之后的比较判断,即如下所示:disp0 = tmp1; disp1 = tmp2;jiaadd = tmp1 + tmp2; disp2 = tmp1; disp3 = tmp2;yiadd = tmp1 + tmp2;由于两个分频器所检测的时钟边缘不一样,并且甲乙游戏过程中按键的时刻不相同,所以随机性得以保证。其次,这两个分频器结合,实现了对原始时钟信号的196分频。其余的分频器与上述两个分频器的实现相同,由

8、于数码管、点阵都需要扫描显示,并且点阵需要完成动画效果,蜂鸣器需要实现开机音乐,所以总共设置了八个分频器,分得的不同频率信号clktmp和计数信号tmp用于以上功能的实现。状态机控制模块(主功能模块):该模块用于实现随机数的产生、比较随机数的和、判断胜负关系、进行状态转移,以及实现胜利的声音效果和开机声音效果。该模块主要用CASE-WHEN语句实现,关键分析如下:(1)甲掷骰子的状态。当CASE语句检测到athrow这个游戏状态时,将进入这个WHEN语句中。在该状态下,如果甲按键,即btn0 = 1,则将当前时刻分频器中的两个计数信号tmp1和tmp2赋值给数码管显示信号;将tmp1和tmp2

9、进行相加成为随机数之和,用于后续比较;将游戏状态gamestate转换为bthrow状态;由于这是掷骰子阶段,所以将游戏结果gameresult赋值为3,表示是过渡的状态。如果甲没有按键,则游戏状态一直保持athrow这个状态。由于这些都是对信号SIGNAL的赋值操作,只有当控制模块这个进程结束的时候信号赋值才会生效(其实这个时间很短,人看起来是近乎同时的),所以为了在一个人按键按下之后,而不是两个人按键都按下之后,数码管显示出当前比赛局数,我用一个register_disp7来事先存储局数,在甲按下按键的时候赋给disp7信号,实现上述功能。(2)s0状态。s0是某一方胜利之后将会跳转进入的

10、状态,在这个状态中,实现对所有信号的初始化或者清零,避免进入下一场比赛后影响比赛的比较判断。(3)s1状态。s1表示的是第一局比赛的状态,在第一局比赛中,甲乙双方只要有某一方的随机数合数等于7或者11,那么那一方将获胜,否则将进入下一局。若甲乙双方都满足以上条件,则产生平局,然后进入下一局。在这个状态中,next_state信号也想当于一个寄存器,存储了该局比赛结束后的下一个状态,这样在掷骰子的时候才能判断该跳转进入哪一个状态。tmpj和tmpy两个信号分别用于存储第一局甲乙两人投掷出的随机数之和,用于第二局至第六局的比较判断。(4)s2s5状态。这四个状态分别代表了第二局至第五局的比赛状态,

11、这四局比赛的比较判断标准都是一样的,只有当甲乙中的某一方的随机数合数等于他们自身的第一局随机数合数时,才能获胜。若甲乙双方都满足以上条件,则产生平局,然后进入下一局。(5)s6状态。s6状态代表第六局比赛的状态,该局比赛下,先进行与前四局相同的比较判断,如果还没有胜利的一方出现,则随机数合数较大的一方胜利。若甲乙双方都满足以上条件,则产生平局。不论结果怎么样,游戏都将结束,状态跳转进入s0状态,将所有的信号初始化或者清零。(6)甲乙胜利之后的声音效果。为了区别甲胜或者乙胜,还分别使用了不同的时钟,在时钟信号等于1的时候,让蜂鸣器鸣响,时钟信号等于0的时候,蜂鸣器不鸣响。(7)开机音乐模块。以上

12、部分(因为太长没有完全截图,详细请见源代码)实现的是开机音乐的播放功能,当复位信号reset为0的时候,CASE语句检测tmp8信号,tmp8信号的频率接近1Hz,因此音乐的每个音符的间隔大约为1秒。当时钟信号为1时,蜂鸣器鸣响,不同的时钟信号,对应于不同的频率,频率不同则蜂鸣器发出的声音的音调也就有所不同。所以,通过计算可以得出一首歌中音符对应的频率,然后通过分频器分出相应的频率,最终可以实现一首歌的播放功能。数码管显示模块:数码管的显示是通过扫描实现的,在扫描的过程中,每次扫描点亮一个数码管,同时将之前在控制模块接收随机数赋值的disp信号赋值给变量NUM,由于NUM是变量,赋值之后立即生

13、效,所以可以在一个进程中的下一个CASE语句中立刻检测,然后让当前点亮的数码管显示出相应的随机数。当扫描频率大于(30*6)Hz时,由于人眼暂留效应,玩家将看到五个数码管上的数字持续显示(有一个数码管没有用上,禁止其显示)。但是,频率不能取得太高,否则会出现数码管亮度不够的情况。点阵显示模块(只截取部分作解释):点阵显示模块有两种模式,其一,是显示游戏的胜负平以及一个过渡状态,所以由CASE语句通过检测游戏结果gameresult这个信号来完成。其二,是显示开机动画,用CASE语句检测tmp8信号,动画的每个画面停留的时间间隔大约为1秒,不同画面之间的跳转变换,组合成游戏的开机动画。点阵的显示

14、也是通过扫描实现的,行列信号各是8位信号,当点阵中的某一个点对应的行信号的位为0、列信号的位为1时,该点将被点亮。这里实现的方案是运用了行扫描,即每隔一个时间间隔扫描一行,此时这行对应的行信号的位为0,再看列信号,列信号为1的位对应的该行的列就会被点亮。根据这个原理,就可以一个一个将开机动画的图案在稿纸上确定下来,然后用程序实现。三、仿真波形及波形分析:上图是乙按下按键之后的状态转移波形图。可见,乙按下按键之前(btn1为低电平),游戏状态gamestate保持在bthrow状态,乙按下按键之后经过一个时钟周期,游戏状态转移到s1状态,即进入第一局进行比较判断,又经过一个时钟周期之后,比较判断

15、结束,游戏状态转移到athrow状态,等待甲下一次按键。上图是点阵显示的仿真波形。可见,点阵行信号一直在扫描,每次使能一行点阵,在行信号为0的时刻,对应的列信号的位为1时,则该行的对应列将被点亮。波形分析如下:(1)在甲掷骰子之后、乙掷骰子之前,点阵将显示绿色的过渡图案,即一个笑脸图案;(2)甲乙第一次掷出骰子后,程序将进行比较判断,由图可以看出,仿真中出现的结果是平局,在点阵上将显示一个红色的“平”字样;(3)甲乙第二次掷出骰子后,仿真中出现的结果是乙胜,在点阵上将显示绿色的“乙胜”字样,在下一次按键按下之前,可以看到,扫描会重复进行;(4)甲乙第三次掷出骰子后,点阵将显示红色的“平”字样。

16、上图左边和右边分别是甲、乙第一次按键之前之后的数码管信号的仿真波形图。由图可见,不论甲乙按键与否,数码管使能信号SMGCAT都在逐个定时扫描,其中SMGCAT1一直设置为1,也即禁止其显示。首先看左图,由于是第一次按键,甲按键之前的各种状态都是初始状态,所以SMGOUT信号为”0000001”,也即显示中间的一条横杆。当甲按键按下产生两个随机数之后,SMGCAT5和SMGCAT4为0时,也即前两个数码管可以显示的时候,对应的SMGOUT信号的值变为”0110000”和”1011011”,分别对应数字1和5。然后看右图,乙按键之前的状态一直保持不变,乙按键之后,SMGCAT3和SMGCAT2为0

17、时,也即中间两个数码管可以显示的时候,对应的SMGOUT信号的值变为”0110000”和”0110000”,分别对应数字1和1。此时,对应于甲掷出骰子的随机数显示SMGOUT信号没有变化,也即甲乙投掷骰子产生的随机数互相不影响。四、源程序及注释:-掷骰子游戏信通XXXXXXX2012XXXXXXLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY touzi ISPORT(clk: IN STD_LOGIC;-时钟输入信号reset: IN STD_LOGIC;-开机动画开启关闭输入信号s

18、tart: 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 STD_LOGIC;-分频器输出时钟信号,为了分析的方便,仅此而已-row,col1,col2:out std_logic_vector(7 downto 0);-点阵行列输出信号,col1是红,col2是

19、绿(行0列1时点阵亮)beep_out: OUT STD_LOGIC-蜂鸣器输出信号);END touzi;ARCHITECTURE touzisignal OF touzi IS TYPE state_type IS (athrow,bthrow,s0,s1,s2,s3,s4,s5,s6);-游戏状态(甲掷乙掷&16局&s0过渡态用于复位) SIGNAL gamestate,next_state: state_type;-游戏状态信号 -分频器中的计数标志 SIGNAL tmp1: INTEGER RANGE 1 TO 6;-只取16避免出现异常情况 SIGNAL tmp2: INTEGER

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

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

22、;-D0D3 数码管信号的传递信号,显示随机数 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 R

23、ANGE 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;

24、 - -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用于产生随机数 16BEGIN IF clkevent AND clk = 1 THEN IF tmp1 = 6 THEN tmp1 = 1;

25、 clktmp1 = not clktmp1; ELSE tmp1 = tmp1 + 1; END IF; END IF;END PROCESS FENPINONE;FENPINTWO: PROCESS (clktmp1)BEGIN IF clktmp1event 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 I

26、F clktmp2event 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 clktmp3event AND clktmp3 = 1 THEN IF tmp4 = 1 THEN tmp4 = 0; clktmp4 = not clktmp4; ELSE tmp4 = tmp4 + 1; END IF;

27、END IF;END PROCESS FENPINFOURE;FENPINFIVE: PROCESS (clktmp4)-用tmp5来控制点阵扫描显示单个图案 所以07BEGIN IF clktmp4event 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)-用其中的clktmp6信号来控制甲胜之后的声音效果BEGIN

28、 IF clktmp5event AND clktmp5 = 1 THEN IF tmp6 = 12 THEN tmp6 = 0; clktmp6 = not clktmp6; ELSE tmp6 = tmp6 + 1; END IF; END IF;END PROCESS FENPINJIASOUND;FENPINYISOUND:PROCESS(clktmp6)-用其中的clktmp7信号来控制乙胜之后的声音效果BEGIN IF clktmp6event AND clktmp6 = 1 THEN IF tmp7 = 2 THEN tmp7 = 0; clktmp7 = not clktmp7

29、; ELSE tmp7 = tmp7 + 1; END IF; END IF;END PROCESS FENPINYISOUND;FENPINDONGHUA: PROCESS(clktmp7)-用tmp8信号控制点阵动画BEGIN IF clktmp7event 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;-状态机控制模块-产生随机数&比较判断&状态转移&声音效果SUIJISHU: PROCESS(clk)BEGIN IF (start = 0) THEN-初始化&复位 disp0 = 0; disp1 = 0; disp2 = 0; disp3 = 0; gamestate = athrow; g

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

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