猜数字游戏
学号61010119
姓名卢旭
1、申请题目:升级版猜数字游戏
2、课题背景:
n 一款简单而又锻炼人推理能力的小游戏,但游戏模式单一,而且不能满足多人游戏需要,所以我想到了设计一款升级版的游戏,使之更具趣味性。
3、项目规划:
n 功能、指标、规模
游戏分两种模式,第一种模式适合一个人游戏,由系统随机产生一个四位数,然后游戏者根据系统给出的提示猜数。第二种模式主要用于两人之间的娱乐活动,一人提前设定一个数字,由另一人来猜。游戏分为三种难度,简单,普通和困难,三种难度猜数的次数不同。
n 面板(显示)、操作、规则
主要由六个数码管显示,前两个数码管显示倒计时,后四个数码管显示游戏者猜的数,并且显示提示。
单人游戏时,游戏者按C开始猜数,系统倒计时开始,按A结束猜数,然后系统根据游戏者猜的数给出提示,依次继续,游戏过程中任何时候游戏者可以按F放弃游戏,这种情况或者系统倒计时时间到或者猜的次数达到10次,则游戏失败,显示游戏失败的绿色指示灯亮,如果游戏者在10次机会内猜出了答案,则显示猜数成功的红色指示灯亮。双人游戏时,首先由一人按E输入答案,再次按E确认,然后由另一人猜,规则与单人模式相同。
n 输入、输出接口
输入:clk时钟信号
Reset 复位信号
col_scan[3..0] 扫描信号
输出:row_scan[3..0] 扫描信号
number3[7..0]
number2[7..0]
number1[7..0]
number0[7..0]后四个数码管的信号,显示猜的数或者提示
time0[7..0]
time1[7..0] 前两个数码管的信号,显示倒计时
win lose 成功或者失败的信号
4、实现方案:
n 核心问题
核心问题1:如何控制输入的四个数字不相同?
核心问题2:如何控制系统要能产生出随机数并且四位各不相同,并在复位前记忆住,还能在每次判断时实时调用?
解决方案
1. 在输入第一位数字后,将第一位数字存入一个锁存器,输入第二位数字时进行一次判定,若何第一位 数字相同,则不允许输入。输入完第二个数字后再将第二位数字也存入锁存器,以此类推。
2. 系统答案采用伪随机产生方式。在随机数发生模块预置一组(32个)不同的答案,通过随机数地址选择模块对系统时钟上升沿的统计产生随机地址在随机数发生模块中选择对应的随机数。之后经过一个答案锁存模块,只有当复位信号、胜利信号或者失败信号作用到锁存模块上时,锁存模块更新一次。锁存模块的输出接到后面电路作为每一局系统答案。
5、系统结构:
n 系统框图
n 模块功能描述
设定模块:主要的功能是产生答案,模式一由伪随机思想产生一个随机的四位答案,模式二由游戏者输入答案。
比较模块:进行数值的比较,并且输出结果,不同模式下的比较规则不同,根据模式的选择进行比较。
显示模块:每次比较时,显示输入的数字,输入完后要显示比较结果,输出在后四位数码管上。前两个数码管显示倒计时。
n 模块接口标注(参数、协议)
例如EP1C6Q240C8实验箱的输入输出的实际连线与管脚表
输入输出名称
|
芯片引脚号
|
实验箱标注
|
钉子线连接
|
row_scan[0]
|
120
|
ROW1
|
无
|
row_scan[1]
|
121
|
ROW2
|
无
|
row_scan[2]
|
122
|
ROW3
|
无
|
row_scan[3]
|
123
|
ROW4
|
无
|
Clk
|
28
|
2Mhz时钟
|
无
|
Reset
|
139
|
乒乓开关1
|
无
|
win
|
233
|
红色指示灯1
|
无
|
lose
|
221
|
绿色指示灯1
|
无
|
number3[7..0]
|
无
|
数码管4
|
无
|
Number2[7..0]
|
无
|
数码管3
|
无
|
Number1[7..0]
|
无
|
数码管2
|
无
|
Number0[7..0]
|
无
|
数码管1
|
无
|
time1[7..0]
|
无
|
无
|
数码管6
|
Time0[7..0]
|
无
|
无
|
数码管5
|
6、状态流程图:
n 系统工作状态流程
7、各主要模块仿真结果波形
n 各模块的仿真波形,详细注释输入输出功能端口
倒计时模块
锁存模块
比较模块
控制显示模块
整个模块仿真图
这是初步功能的仿真图,后来的修改都是在实验箱上直接修改完成,所以部分模块仿真结果可能有所改动。
8、课程设计总结
n 预期的目标与当前实现功能的差异详细注释
1. 难度选择没有实现
这一功能没有做的主要原因是游戏本身的10次机会较为合理,增加或者减少猜数次数都显得没有实际意义,因此,最后放弃了这部分功能。
2. 没有实现几轮两个人的比赛
这主要是针对第二种模式,即用于双人游戏的时候,如果用于两人比赛,仅仅是简单的状态的重复,毫无意义可言。
n 可以进一步发挥提高的部分
1.这次设计中的随机答案的“随机程度”不够高,换句话说是随机种子做的不是非常理想。尽管理论上真正的随机是做不到的,但是目前计算机原理中还是有很多随机数发生的算法的,这点可以多参考一些资料来改进我的随机数产生器。
2.游戏的胜负目前只是用了简单的红绿LED灯显示。实际上还可以编写一段分频器以及控制电路实现简单音乐播放,根据游戏室胜利或是失败选择不同的分频方式使蜂鸣器播放不同的音乐,这点很容易实现,只是最后由于时间仓促没有实现。
n 课程设计体会
回头看本次数字系统课程设计,我觉得我设计的比较好的是以下两方面,
1.状态机的编程。由于是用语言写,比起用原理图来搭电路实现状态的顺序和非顺序跳转要方便很多。因此我坚定地使用type语句定义了含十几个状态的状态变量表,看似比较多,但实际上为我的编程带来了极大的方便,因为我只需要写清楚在哪个状态下对哪些信号和变量赋什么值、满足什么条件时跳转到哪一个状态就可以了。为了正确简明地实现状态跳转以及当前状态下赋值,我把这两块写在了两个进程中,让他们能同时进行。另外结构体中我用shared variable类型代替了signal类型,避免信号赋值的延时可能带来的错误。
2.总线思想的使用。一开始设计的时候我发现需要用到14个数码管,2个用来倒计时,4个用来输入数字,4个用来给出提示,四个用来显示答案。这样十分浪费资源,而且必须使用三个个实验箱。后来在学习微机接口原理课程中了解到了总线的思想,我就想到将总线技术用到我的设计中。我选择使用6个数码管,分为AB两组,A组2个,用来显示倒计时B组4个用来输入数字,显示提示和显示答案。将控制机与每组数码管之间分别通过一条总线相连,由控制机发出总线控制信号来控制总线的使用权(详细参见程序清单中相应代码的注释)。这样节省了数码管以及芯片的管脚,而且让我更深一层地体会了总线接口技术的作用。
整个设计过程如下:
学期刚刚开始,数字系统课程设计这门课便引起了我的兴趣。这是我第一次独立地设计出一整套数字系统。虽然设计的很是简单,但还是给我很深的体会。
从刚开始定下题目开始,我便开始着手准备起来,我到图书馆查看了许多书,主要是想宏观地把握设计一个数字系统的步骤和方法。经过第五周整整一周的准备,我对我的题目基本上有了清晰地思路。我的项目最核心的部分在于比较输入的数与答案,我想到了写一个RAM对所有数据进行随机存取。这个方案有了初步眉目后,我先从外围电路开始下手。第七周我顺利地写出了键盘电路以及倒计时电路,并在实验室实际电路上通过。由于之后要期中考试,我便暂时停下了我的设计。第九周期中考试一结束我便重拾任务,当我要编程时我重新审视了我的项目。我发现用RAM实在是小题大做,而且对于RAM时序上的控制也难以准确把握。因此我果断的放弃了RAM,改用简单的赋值。此时我又遇到了新的问题。我一开始的计划中要用到12个数码管,我发现这不合理。好在接下来的微机接口原理课程中学到了总线接口技术,我便将总线技术用到了我的设计中。
一开始我对VHDL语言不甚了解,当时我总是用C语言风格的思想来考虑VHDL编程,于是遇到了不少算法上的矛盾。后来静下心来翻阅了黄正瑾老师编的《计算机结构与逻辑设计》一书附录中的VHDL简明教程以及一些EDA设计实例,我才对VHDL的思想渐渐有了了解。从数据类型、基本运算符、到时序电路、状态机设计,我将从书本中学到的应用到具体代码的设计中。
这次为期一个学期的数字系统设计的实践,让我经历了一个项目从申请到实施、中途经历的学习、解决问题、等等诸多环节,我感觉我解决实际问题的能力得到了训练。总而言之,这次的设计过程让我受益匪浅。
9、参考文献
[1] 计算机结构与逻辑设计[M].黄正瑾.北京:高等教育出版社.2000.
[2] VHDL语句[OL/DB]. http://eae.seu.edu.cn/.