其实我应该先写模拟电子电路的心得,因为那是半年前就已结束的课程,自己也积累了颇多经验,不过由于鄙人的惰性,一直没写出来。然而,今天的一个电路实在是让我愤怒到一点脾气也没有了,所以才决意在这么繁忙的时刻写点东西。
本次设计是一个时序电路,要求如下:
设计并安装一个简易数字钟电路,要求如下:
•可以按六十进制进行“分钟”计数,并通过数码管显示
•具有手动清零功能
•基于数字钟实现定时控制功能,用三只发光二极管对电暖气的定时控制过程进行模拟显示:
电暖气工作状态 | 数字钟显示 | 灯1 | 灯2 | 灯3 | 灯4 |
上电 | 0 | 亮 | 灭 | 灭 | 灭 |
启动,预热 | 000-003 | 亮 | 亮 | 灭 | 灭 |
快速加热,升温 | 004-023 | 亮 | 灭 | 亮 | 灭 |
保温 | 024-047 | 亮 | 灭 | 灭 | 亮 |
停止 | 停留在048 | 亮 | 灭 | 灭 | 灭 |
本实验指定使用器件盒中的中规模器件74LS90、74LS161(计数器)和74LS74(D触发器),门电路IC可根据需要自由选用。
应该说,设计十分简单,思路也很快就有,分模块,第一模块是计数,由两个计数器拼接,引出八个ouput,作为接口,第二模块是LED控制,input是第一模块的八个output中若干,总共四个状态,两个D触发器就足以实现。
5月7日晚,设计、仿真的实现,不超过一个半小时。
5月8日下午、晚上,总共5小时,完成搭线。
5月11日中午,到实验室做实验。现象:第一模块完全符合预期,第二模块的灯2和灯3异常,灯2在4s到24s之间亮,灯3一直不亮。
调试过程:第一反应,电路有导线虚接或短路,于是拿万用表短路档去测电路中各引脚之间连接,确保无误。第二反应,有芯片没接电源或地,但很快就排除了,因为灯4中用的门已覆盖所有芯片,既然灯4正常,说明芯片是能正常工作的。第三反应,拿电压档测关键点电平,我首先测的是第一个D触发器的CLK,没测出4s的上升沿,于是把问题锁定在第一个D触发器的回路。又重新测量各连线是否正确连接,并检查各芯片引脚是否按照datasheet的原理图正确使用。发现正确。然后就测D触发器CLK的驱动门的电平,发现在4s时刻,某或非门的input1从0变1,input2从1变0,似乎有竞争冒险的嫌疑,此后,思路就陷入其中。曾试图利用多接几个非门来制造延迟时间,以确保CLK的建立时间,但是,没有收到成效。于是,就怀疑是设计的问题,因为仿真器也许不会考虑竞争冒险,所以我怀疑这是个有先天缺陷的设计。最后,叫了自动化系的助教过来,他问了我半天实验原理,看了我的设计图,没看懂,弄了半天,大家沉默了半天,就这样,实验课下课,我实验超时。于是十分郁闷地赶去上游泳课。
5月11日晚上,重新看了仿真,第三次检查线路,各引脚。重新考虑设计,发现设计是合理的,而且各逻辑已达到十分好的优化,思路清晰。但是,我的分析发现许多相悖的问题。首先,灯2的输入完全与24s的接口无关,但是实验中24s时灯2会自动灭,这个十分诡异。其次,第一个D触发器的输入端的测量,是符合预期的,说明它已实现了状态控制。然而这和灯3不亮的现象是相悖的。总共耗了3个小时。
我顿时心里非常烦闷,现在每天的节奏已经是紧张得不断挑战着我的极限,而这个实验却耗了我太多太多的时间。而且我认为我的设计是对的。但实验中,就是有个小问题始终解决不了。当时心里烦的真想干脆不做这次实验了,记0分算了,但是之前浪费那么多时间设计、搭电路,叫我这样放弃,我又心有不甘。当时真有英雄末路之感。没想到我小關也有今天!众人都能做出来的电路,为何就我的电路出问题?
然而在和哨菠交流中,他问了我几个关键的问题,第一,有没有对两个触发器的状态进行检测?第二,有没有强行设置电平,来实现分模块调试?他的分析,真是一针见血,一语中的,很到点子上。而且他的那种态度,理性、冷静的思维,真是值得我学习。
听君一席言,胜读十年书。我恍然大悟。于是5月12日晚上,我完全不知道自己能不能做成,要是做不成,由于实验室开放时间所限,下一次实验迫在眉睫,面板表又不能拆(要留着完成这次时序电路),我想我这门实验课就挂定了。但是,我的心态已经很坦然、平和、自信了。因为我相信我的设计、我的电路,而且我已经掌握了调试的思路。
19:20进实验室,接好接口,上电那一刻,我发现有个LED灯插错位置了,灯3插到了灯2的位置,那么也就是说,真实情况为灯3正常,只有灯2一直不亮。然后我在灯2的输出级(一个或非门)加上一个强设的电平,灯2还是不亮,一下子就确定是那个或非门出问题了,然后按一下那个或非门的芯片74ls02,灯2亮了!!!19:30,验收完毕。
对此我做出反思。此前组合电路实验的计算器设计比较幸运,根本没出过错,就过了。所以自己这学期以来还没试过对数字电子电路进行调试,也没掌握要领。这一次,代价是惨重的,因为在现在时间特别宝贵的情况下,花了太多的时间,做了太多的无用功,走了太多的弯路。但是无论如何,总算收获到调试的经验。
第一,心境很重要。这次其实我的心理有恐惧,在搭电路的时候,心理总是怕,要是这么复杂的电路到时出问题了怎么办,根本调不了。没想到实验中还真遇到问题了,一开始心里还波澜不惊,等到下课前30分钟心里就开始发毛了。其实topengineer不光有着过硬的技术,他的心理素质也应该是达到S级的。遇到问题不要紧,关键是沉住气来进行解决。工程师都是很实际的人,而不是空想主义者。
第二,关于仿真器。我看过许多国外书籍,都说了仿真器的不可靠,因此一直以来我都不太信任,或者不敢太信任simulatortools。但是,这次我得到一个经验,仿真成功确实不代表电路正确,但是如果理论分析无误,那么,这个设计正确的可能性就已经足够高了,以至于几乎不用怀疑。这次实验中,我几乎浪了一半的时间在想着如何更改设计、甚至是重新设计上。
第三,调试顺序。调试的目标是要尽快、尽可能缩小范围,最终锁定目标(比方说落实到某个门或某根导线上)。在仿真与理论分析无误的情况下,首先想的不应该是去改设计,因为这是代价最高的,意味着所有的接线要全改动,且之前的设计要完全放弃。首先要找的也不是去检查线路连接,因为数字电子电路中导线的数量实在很恐怖,检查完一遍,估计一个下午就没了。所以,首先要测的是关键点电平序列,比如锁存器,触发器,状态控制量。如果发现锁存器状态符合预期,再检查它所控制的下一级门。如果触发器状态根本不对,那问题就有点大,要检查这个触发器的驱动回路。根据测得的点,进行判断,常见错误有:虚接、IC没接电源或地、导线裸露太多、发生误短接,IC引脚弄错、IC接触不良、模块之间的接口有误、input,output接口有误等等。
第四,由于时序电路会随时间变化,给调试带来困难,因此可以用强行设置电平的方法,临时将电路分模块,并强行设置状态进行检测。
第五,需要多培养自己的直觉和敏锐度。比如说,这次实验,很明显的,一开始灯2其实是扮演了灯3的角色,很容易就会发现原来是output接错了,但是我没有反应过来,于是一直纠结于“灯2没接灯3的控制信号,然而灯3的控制信号灭了灯2,而灯3一直没亮”这个诡异的问题。
这次付出大,收获大,然而收获小于付出。希望我的这些心得,能让有缘人以小的付出,得到大的收获。谨作前车之鉴。数字电子电路的调试方法和模拟电子电路迥然不同,这点在这次实验我得以充分体会。这次暴风雨,也让我成长了许多。