《小型数字系统设计-健身自行车控制器.doc》由会员分享,可在线阅读,更多相关《小型数字系统设计-健身自行车控制器.doc(11页珍藏版)》请在金锄头文库上搜索。
1、l 课程名称: 数字逻辑电路设计实践 实验名称: 小型系统设计健身自行车控制器 实验:设计一个健身房使用的健身自行车控制器。控制器的输出信号给D/A转换器,以控制自行车的阻力,从而改变训练强度。输入采用44键盘,显示采用 3位数码管,其中最高位显示训练强度,低2位显示时间。 基本功能:1、使用者骑上自行车时,控制器处于初始状态。按“F”键启动控制器,此时3位数码管显示“000”。2、用户输入从0到9中的任意数字,以改变训练强度,按“E”键确认。选定的训练强度显示在数码管的最高位。3、训练强度选择完成之后,数码管低2位显示“00”,即最长训练时间为1分钟。通过数字键盘输入数字,以决定训练的时间,
2、输入时数字顺序是从左到右。例如,输入2、3应该在显示器上显示“23”,表示训练时间被设定为60-23=37秒,如果输入正确,按下“E”键确认。如果使用者输错了时间,可以按“C”清除,显示恢复“00”的状态。训练时间输入完成后,按下“F”键开始训练。此时4位数码管的低两位显示时间从输入的时间值加计数到“00”。在最后10秒时,发光二极管亮1秒暗1秒。 当计时到设定的时间,控制器恢复到初始状态,此时定时器是“00”,训练强度为前面设定的值。 实验要求:1) 采用自顶向下的设计方法进行设计,画出数据处理单元和控制单元框图、控制单元的ASM图、各单元模块的电路图;2) 行列式键盘设计请参考第四章有关内
3、容;3) 先独立调试各单元模块,后联机调试,要记录和分析实验结果;一、 实验设计1. 控制单元的ASM图InitializationInput=F?10Set strengthInput=E?01Ensure strength strengthInput=09?1Set First time0Input=09?01Set Second timeInput=C?1Input=E?0Ensure time10Input=F?Start counting 10Count=00??1控制单元ASM图 2、各单元模块的电路图 A )键盘电路 B)ROM状态控制电路C)数据处理部分D)总的设计LED灯时间
4、低位时间高位强度二、电路调试本电路主要分为四部分,键盘扫描输入输出部分,ROM状态切换控制部分,三个计数器存储计数部分,LED灯控制部分;下面是调试过程中过程遇到的实际问题以及自己的解决方法:首先是对键盘扫描电路的调试,发现100Hz扫描型号输入正确,按键时输出地址正确,该电路内储存地址的两个74LS161计数器也实现了储能功能,所以开始调试ROM状态切换控制电路部分。ROM状态切换控制电路的问题如下:1) 用于储存状态的74LS161在按键过程中总是出现紊乱,没有储存住。原先设计的电路图中ROM部分四位状态的存储74LS141计数器加的时钟信号为100Hz,结果按键清零后,始终无法设置强度。
5、用逻辑分析仪分析发现ROM状态在自动切换!这是一个非常低级的错误该存储器的时钟频率应该是受按键控制,即按一次键状态转换一次,而不是100Hz自动切换。 解决方法很简单,只是将键盘控制电路中的D触发器(没按一次键产生一个上升沿)的输出接到该存储计数器的时钟信号端。测试发现存储状态稳定。2) ROM状态切换时,有时会无法清零,各项操作都无法进行。这个问题具体是这样的:当你开启电源后,按键F开始实验后,它并没有清零,或者原来就是零,按下F后无法继续设置强度。这个问题出现的原因是设计时默认假设不准确:原先设计时一直默认开启电源后电源就达到初始状态0000,而实际情况是开启电源后各计数器(用作寄存器)的
6、初始状态是随机的,并不一定是0000。比如某次开启电源时出现的初始状态是1000,那么按下F时,输出的下一个状态一定是1111(由于仅使用00000111八个状态,因次其他状态对应的ROM输出未进行改写,默认为FF),那岂不是永远无法到达0000初始状态。问题的解决办法有两个:手动清零,重写ROM。手动清零是指开启电源后,手动使状态寄存器清零端接地,状态自动切换到0000;重写ROM是指用00来填充ROM中未使用的状态输出(默认是),从而一开机便进入初始状态。这有个问题就是可能初始状态是00000111中一个就无法实现了,因次采用第一种方法,测试后解决这一问题。3) 设置时间强度第一位时,发现
7、第二位自动设置这个问题具体是这样的,当你确认强度后,输入时间时间高位2时,数码管上两个时间同时显示22,而本来是应该只改变时间高位的。 问题出现后首先想到的当然是ROM是否编写错误,但是上面已经检查过ROM了,因次排除了这方面的可能。原理上分析,既然时间地位设置上去了,必然说明时间低位说对应的寄存器的load置数端有效了,这只可能在状态0101,但是时间高位输入后状态是0100!问题就出在这里!由于键盘电路会储存上一次按键产生的地址,因次ROM输入的地址八位在时间高位2输入后就一直在(下一次键盘再输入时才改变),所以ROM一位是键盘又输入了一个2,就把状态改为0101。这同时说明了上升沿是有一
8、个过程的,并不是在一瞬间完成的(因为在这种情况下,一个上升沿实现了两次状态转化),这在实验之前我根本没想过,而整个思想在下面问题中也同样会出现。这个问题解决是通过改变键盘电路的D触发器的输入时钟频率为500Hz做到的,但是有时候还是会出现一两次同时置数,所以还在考虑更好的方法。(注:和我实验电路设计类似的同学有好几位,但只有三位同学有这个情况,所以一直在考虑是否是硬件出问题)4) 有时设置完时间后使用C清零时,将时间、强度都清零了这个问题用状态来描述是这样的,有时输入时间结束后状态为0101,按键C清零按原理是直接回到状态0011,从而对两个时间进行清零,但是实际情况是把强度为也顺带清零了,而
9、强度只有可能在0001状态才能清零的。这个理论上不可能出现的问题出现了,我分析电路、ROM可能出错的地方,没找到错误。后联想到计逻课上黄老师曾讲到“状态转换时,最好的方法是使用安全码”,这才让我猛然领悟:在状态变化过程中各位的变化不是同时的(虽然ROM是按地址查找,并行输出,但也一定存在时间差),也就是说会出现中间态。在本次按键后进行的状态转换中,由0101变为0011过程中可能会出现0001,0111两种中间状态,而0001就是初始后按键F后对各位清零的状态,所以有时候按键C时会出现全部清零。解决这个问题的方法是使用安全码,而不让其直接转换,由0101按键后先让其变为0111,再变为0011
10、,这样就不会出现0001这个状态。但是当初这样解决的时候还担心一点,就是一个始终上升沿能否保证进行两次状态转换,因为如果不保证这个的话,我的状态转换就会有问题。于是我改写了ROM重新进行实验,发现不再出现这个问题,所以上述那个假定还是满足的。调试完ROM控制电路部分后,进行调试数据处理、存储部分计数器。1) 计数器实现模60方法错误这是一个逻辑错误,当时采用低位逢10进位,同时异步清零。实验中发现时间总是在2029重复计数,时间高位根本没有进位,原因是10出现时马上进行异步清零,所以就没有进位信号,无法实现进位。解决方法是使用逢9产生进位信号,逢10异步清零。问题解决。2) 时间到达00后将时
11、间强度一并清零。这个问题当初设计的时候是这样处理的:计数计到00时,使ROM中的状态寄存器异步清零,直接回到0000。这样处理主要是少考虑了一个问题:键盘电路模块中会把上一次的按键寄存在两个寄存器内,也就是相当与上次计数开始按键的F一直保存在寄存器内,当计数寄到零的时候,状态切换到0000,而键盘地址输出仍然为F键对应的输出,两个一作用相当于又按下键F,状态自动变为0001,对强度位进行清零,所以导致出错。分析找到原因后,解决方法很简单:在计数至00时,不仅把状态寄存器清零,同时也把键盘电路中的两个地址寄存器异步清零。操作改进之后,问题解决。最后是调试LED灯,发现没有错误。进行整体调试,发现
12、没有错误。本次实验结束。附:ROM烧制:地址(hex)数据(hex)077F107B,07D,07EF00B7,0BB,0BD,0BEF00D7,0DB,0DD,0DEF00E7,0EB,0ED,0EEF0177,17B,17D,17E,1B7,1BBF11BD921BE821D7721DB621DD521DE421E7321EB221ED121EE0227BF3277,27D,27EF22B7,2BB,2BD,2BEF22D7,2DB,2DD,2DEF22E7,2EB,2ED,2EEF2377,37B,37D,37E,3B7,3BBF33BD943BE843D7743DB643DD543DE
13、443E7343EB243ED143EE04477,47B,47D,47E,4B7,4BBF44BD954BE854D7754DB654DD554DE554E7354EB254ED154EE05577,57D,5B7,5BBF557BF657EF75BD955BE855D7755DB655DD555DE555E7355EB255ED155EE0567BF7677,67D,67EF66B7,6BB,6BD,6BEF66D7,6DB,6DD,6DEF66E7,6EB,6ED,6EEF6777,77B,77DF777EF3(为实现安全码设置)7B7,7BB,7BD,7BEF77D7,7DB,7DD,7DEF77E7,7EB,7ED,7EEF7