早上在那台快要报废的笔记本里找资料,翻到了大二大三时做过的两个硬件项目。 像见到了多年未见的老朋友一样,很亲切,虽然完全看不懂做的是啥傻逼玩意儿了, 尤其是这个,满满的中二气息,不信可以看看第二节的设计内容,羞耻感爆棚。
这个游戏机应该是大二数电课设做的,我骨子里比较不羁,总想着要跟别人不一样,所以自己设计了一个题目。电路设计十分复杂, 实验器材又比较老旧,所以撘了很多次,最后一天验收时才成功了,因为态度认真,又是自己设计的课题,老师很欣赏,嘻嘻。
作 者: 月牙眼的楼下小黑
联 系: zhanglf_tmac (Wechat)
声 明: 欢迎转载本文中的图片或文字,请说明出处
1. 设计题目
从老师推荐的题目中,深受拔河游戏机 启发,想到小时候风靡一时的拳皇快打游戏,萌生利用 isp
器件设计一款“ crashfighter
”游戏机的想法,游戏面板设计如下:
2. 设计内容
-
1). “战局显示”部分可以记录胜负,按“战局复零键”可初始化 0:0.
-
2). 按“再来一局”键可以重新进行一局游戏,此时应该做到:
a. 蜂鸣器响起,倒计时 3 秒,两方“战力值”(同后文提到的血气值,体力值)显示部分初始化 20.
b. “战力指示灯”部分亮起三盏灯。
c. 在这 3 秒内,玩家操作无效,战力值不变,战力指示灯不变。 -
3)玩家操作按单脉冲开关模拟出拳,以己方为例,若己方出拳比对方块,自己血气值提升1,对方下降1;
-
4).当己方战力值提升到 30,也即“满血”“满气”状态,会触发大招“定魂术”,会有如下效果:
a.第四盏(从左往右数)指示灯亮,即“大招指示灯”,将维持 9 秒。
b.在这 9 秒内,对方攻击无效,毫无还手之力,此谓“定魂”。
c. 在这 9 秒内,己方出拳四次,对方减血四点,而自己体力值仅仅下降一点。 -
5).在对方减血过程中,战力值< 20 时,第三盏灯灭;战力值小于 10 时,第二盏灯灭;战力值下降到 0 后,第一盏灯也灭。宣告本局结束,战局显示为 1:0,且此时玩家的操作无效,战力值显示不变。按“再来一局”键可以开始新的一局游戏。
3. 设计思路
采用自顶向下的设计思路,基于上述各设计内容,顶层模块设计如下:
一共有六大自定义模块:
-
CLK : 产生秒脉冲以及喇叭源信号
-
ATTACK: 产生双方计数脉冲,控制双方可逆计数器的加减
-
定时模块: 分为 3 秒倒计时和大招 9 秒定时
-
LT_SHOW 模块:控制战力指示灯的显示
3. 1 CLK模块:
设计过程:输入试验箱提供的 100k hz
的脉冲源,利用 5
个十分频器可得到秒脉冲,由前两级分频器可得到 1k
赫兹的喇叭脉冲源,此处输出与秒脉冲的输出处理不同,是由于考虑到分频后脉冲占空比变大,若以此作为喇叭输入源,喇叭声音很小,故改用 jk
翻转触发器输出,以提高输出脉冲占空比,喇叭声音会有很大的提升。
仿真:
3.2 ATTACK模块
设计过程:采用脉冲开关来模拟出拳,利用基本 rs
触发器输出两路互补控制信号,分别控制两个可逆计数器的加减。由于触发大招时,lock1
和 lock
中必有一个从 0
变为 1
,将 lock1
和 lock2
信号输入或门,当或门输出为 1
时,此时必定已经触发大招,将两个可逆计数器加减控制信号锁为1
(9
秒),即两个计数器都工作在减法计数状态。将脉冲开关产生的计数脉冲进过过一次 4
分频,将得到的新脉冲和原来的脉冲一起输入数据选择器,将两个 lock1
, lock2
作为数据选择器的地址信号,根据地地址信号来决定可逆计数器此采用哪一路的计数脉冲。.
3.3 LT_SHOW模块
设计过程:战力指示灯的显示跟并行模数转换器的设计思路十分类似,一开始我效仿着利用 8
个 8
位数据比较器设计的,结果可想而知,大大地超出了资源。后来转换思路,只要关注高两位和低四位的信号高低电平变换即可,设计电路如上图,大大简化了电路.
仿真:
3.4 定时模块
设计思路:因为刚刚做完电子钟的项目,并且利用延时触发器实现了其中的整点报时,喇叭鸣叫十秒的功能,一开始我也是沿用这种利用多个 D
触发器进行定时的思路,但是行不通,原因是在这种定时方案里,被延时的信号的输入必须跟秒脉冲沿同步。而我这里的两个被延时的信号 regame,kill
的输入一般情况下是不可能与计时脉冲沿同步的。冥思极久,口中喃喃念着“ 5,4,3,2,1........
”突然灵光乍现,我刚刚念叨着的不就是一个减法计数器嘛!遂设计电路如上。
TIMER3 仿真:
TIMER9 仿真:
4. 验收演示
-
1.开启电源,按“再来一局”键,喇叭鸣叫三秒,三秒内双方操作无效,战力值显示
20:20
,战力指示灯有三盏灯亮验收情况:符合预期效果
-
2 .为便于演示,一方按键明显快于另一方,己方加一,对方减1,对方战力值小于
20
时,灭一盏灯,小于10
,再灭一盏灯。验收情况:符合预期效果
-
3. 当己方战力值达到
30
时,第四盏灯亮并维持九秒,此时对方攻击无效,不会改变战力值和战力指示灯的显示,自己攻击四次,血气值下降一点,对方下降四点。九秒过后,对方攻击解锁,攻击有效。验收情况:符合预期效果
-
4. 对方战力值下降到零后,战力指示灯全灭,此时双方的操作都被锁定,战力值和战力指示灯不再改变,除非再按一次“再来一局”键。战局显示为
1:0
验收情况:符合预期效果;基本符合预期效果,除了战局显示不正常,将战局显示部分的计数器的计数脉冲用一个测试灯接出来,发现一 局结束后确实是有一个计数脉冲到来的,但是数器就是无法计数,思考了两天都无法解决。这应该是本次课程设计中的 美 中不足之处吧。
5. 后记
我于今日(7,17
)再次来到实验室,精挑细选了一块好板,重新连线,战局计数功能实现!(后附演示视频), 果然如王老师所言,原先实验板的芯片引脚功能有问题。
6. 感想收获
如何较好地利用原理图输入的方法进行数字电路设计,个人愚见总结如下:
-
1.对基本组合逻辑模块,时序逻辑模块的功能及用途要了然于胸,这是进行数字电路设计的基础。巧妇难为无米之炊,熟知典型的功能模块,设计思路才显得有保障,有效率。
-
2. 应充分利用“自顶向下”设计优点和层次化的设计概念。进行顶层模块设计时,注重各模块之间的联系、反馈,自定义模块设计可以比拟于
C++
中的面向对象的思想,可先注重其行为,忽略内部的实现,而且先设计模块的IO
口,可以起到事倍功半的效果。 -
3. 可以看到,仅仅利用原理图设计数字电路,对于较简单的数字电路,还是能体其现直观、方便的优点的,但是,对于复杂的数字电路系统,其局限性不可避免,排线布线变得十分繁杂,电路的修改也将变得非常不方便,模块之间参数的通信也十分困难,并且这样的设计电路势必变得难以阅读。所以,数字电路的设计手段不可能仅仅局限于原理图输入这种方法,它应该有更高级,更抽象的设计方法,也就是我们即将学习的硬件描述语言。
-
4.多与身边的同学交流,吸取其较好的设计思路,遇到问题若一时不能解决,要主动向老师寻求帮助,节省时间且能学到更多知识以及对问题的看法。
历时两个星期的数字电路课程设计令我获益匪浅,是学以致用的绝佳途径。在这里感谢王老师,杨老师的悉心指导,感谢同学们对我的帮助。
网友评论