序言
在上一章中,我们已经可以根据用户的需求,设计出对应的组合逻辑电路,来实现各种各样的功能
但是这样就足够了吗?
答案还是No
现在假如请你帮助小猴子完成这样一个任务:
每按下一次开关,LED状态就翻转一次
假如原来LED灯是亮的,按下开关后,它就会变暗
假如原来LED灯是暗的,按下开关后,它就会变亮
你说这任务还不简单嘛,立马拿起笔画真值表,打算化简列表达式
但是仔细想想发现根本下不了手,假如要列出来真值表的输出,还需要知道LED灯先前的状态是怎么样,输出的变化不仅仅和当前的输入有关,还和之前的状态相关联 ,这是我们之前学习的组合电路无法实现的功能
组合电路我们说它是无记忆(Memoryless)的,一般我们说一个人不长记性(无记忆),在相同地方连续摔倒两次,这显然不会是一个好的评价
那怎么解决这个问题呢?
我们需要设计一个器件,它应该具备记忆的功能 ,至少要把我们上次的输出(状态)存储起来,这样才能帮我们的小猴子解决这个难题吧
触发器(flip-flop)
明确目标
于是我们从零开始,尝试搭建这样一个具有记忆的器件
首先明确一下我们的设计目标
第一.这个器件要具有存储能力(自行保持 )
第二.它能够根据我们的输入信号,存0或者存1
按照触发方式 和逻辑功能 的不同,我们还可以将触发器划分为不同的种类
只有两者同时结合起来描述,才是正确的描述,单单说沿边沿触发的触发器,别人是不知道这个触发器实现的功能是什么;或者仅仅只是说这是一个D触发器,别人不知道它是如何触发的
这就好比我们出去外面旅游,可以开汽车,可以坐火车,或者说坐飞机,这些出行方式都是我们的实现方式(触发方式)
而到达目的地,比如说去北京,去南京等等,这些都是我们想要实现的逻辑功能
只有告诉别人,你想要去哪,并且怎么去,才是一个完整的行程安排.
正反馈
我们先来看一下这样一个电路
两个反相器首尾相接
我们说它就是一个很完美的存储电路
为什么呢?
假如出现噪声,根本不会影响到这个电路存储"1"还是"0"
如果此时信号处在0和1之间的任何一个电平(亚稳态)
由我们反相器的VTC曲线可以知道,只要不是处在0和1这两个稳定状态,而是之间任意一个值,经过不断循环,最终也一定会到达这两个稳定状态
第一次输入假如是这样,我们记输出为 V o u t 1 V_{out1} Vout1(此时还是亚稳态)
第二次输入是上一次的输出 V o u t 1 V_{out1} Vout1,作为新的输入 V i n 2 V_{in2} Vin2
第二次输出,我们记输出为 V o u t 2 V_{out2} Vout2
随着循环次数的不断增多,输出会不断往左边或者右边移动
最终直到0或者1,才能真正稳定下来,并且 V i n = V o u t V_{in} = V_{out} Vin=Vout
这就好比我们爬山,要么登顶,要么在山脚不出发一样,最终状态都只有这两个
我们把这种,输出反馈回到输入,使输入变得更强,从而输出也变得更强,这样一个不断循环的过程,称之为正反馈(positive feedback)
最常见的,我们把麦克风放到音响输入处,只要有一点点微弱的声音,声音会不断放大,直到信号失真,这也是一种正反馈,只不过是不稳定的正反馈
由此也可以看出来,正反馈与最后的结果是否稳定并没有直接关联
正反馈不一定带来的是不稳定的状态,它也可以是稳定的,比如我们上述两个反相器首位相接实现的存储电路(负反馈也不一定带来稳定,我们也可以用它来产生振荡)
但是,还有一个关键问题没有解决,0和1怎么放进去呢?
所以我们自然想到,要把输入引出来,电路的结构还要再变化一下
SR锁存器(SR Latch)
原本我们是用两个反相器首位相接的形式,现在我们改一下电路,用两个或非门来首尾相接
可以起到存储的作用吗?
可以,当输入 V 11 = V 12 = 0 V_{11} = V_{12} = 0 V11=V12=0的时候,上面的电路其实就退化为我们原来反相器首尾相接的电路(逻辑或非,只有输入都为0,输出才为1)
但是这样看上去,怪别扭的,于是我们将这个电路输入都画在同一边,输出都画在同一边
并且将输入信号改为R和S,而不叫 V 11 或 V 12 V_{11} 或V_{12} V11或V12
输出信号为Q和Q',而不叫 V o 1 或 V o 2 V_{o1} 或V_{o2} Vo1或Vo2,用来告诉用户这两个输出信号始终是相反的
怎么存0呢?
我令R = 1,S = 0,这样上面G1或非门就必定输出0 (逻辑或非,只有输入都为0,输出才为1),0就顺利打进输出Q
然后我们再将R,S都设置为0,变回我们当初首尾相接的反相器结构,不就顺利将0存储下来?
怎么存1呢?
我令R = 0,S = 1,这样上面G2或非门就必定输出0 (逻辑或非,只有输入都为0,输出才为1),0就顺利打进输出Q',那1实际就顺利打进输出Q
然后我们再将R,S都设置为0,变回我们当初首尾相接的反相器结构,不就顺利将1存储下来?
最后一步,将这个电路简单封装一下,便得到我们的RS触发器
当R = 0, S = 0 时,输出Q保持不变
当R = 1, S = 0 时,输出Q置0
当R = 0, S = 1 时,输出Q置1
为什么叫输入信号R和S其实也就清楚了
R代表Reset,S代表Set,其中一个为1,就发挥对应的置0或者置1功能
假如我拿到RS触发器这样一个器件,然后发现输入信号R = S = 0,问输出是什么?
我们说不知道,只知道此时它发挥的是保持 功能,具体输出是什么,还要看上一个时间的输出是什么
所以,我们说时序电路中的变量和之前组合电路的变量最大的区别,是引入了时间的概念
我们把 Q n Q^{n} Qn称作为初态, Q n + 1 Q^{n+1} Qn+1称作次态(有时候也用 Q ∗ Q^{*} Q∗表示次态)
假如想要知道下一个状态(次态) Q n + 1 Q^{n+1} Qn+1为多少,我们需要看初态 Q n Q^{n} Qn的值为多少
当然,假如单纯用语言来描述,是做不到准确描述RS触发器的功能的,我们应该将所有的输入可能列成一张表
它其实还是我们之前的真值表,但是有一点很大的不同,Q会同时出现在输入和输出之中 ,更为准确的说,初态 Q n Q^{n} Qn作为输入,会影响次态 Q ∗ Q^{*} Q∗的值
和我们之前描述的其实一样
当S = R = 0时,次态输出保持不变
当S = 1,R = 0时,次态输出置1 (Set信号为1)
当S = 0,R = 1时,次态输出置0 (Reset信号为1)
还有一种情况,我们其实前面一直在规避,就是R = S = 1
为什么要规避这种情况呢?
因为当R = S = 1时,电路稳定下来的时候,输出就不再是两者相反的形式,而是输出都为0
而且我们设计出来锁存器,应该就是利用它置0或者置1,或者保持,以实现我们的存0或者存1功能,S = R = 1,两个输入信号都为1,这根本没有任何实际意义 ,我们说出现这种情况,是电路的设计和使用者出现问题
但我用户输入信号就都为1(一身反骨),想要输出都为0,这有问题吗?
我们说同时都输入1,并不会带来问题,但是当输入信号同时消失的时候(同时输入0),输出就会陷入不定状态 ,我们不知道输出是0还是1,这问题就大了
或非表达式,两者同为0的时候,才会输出1
此时按照理论分析,输出 Q 和 Q ∗ Q和Q^{*} Q和Q∗都会置1
现在就是两个"1"比赛的过程,看谁跑得快
假如上面的1跑得快,就会把 Q ∗ Q^{*} Q∗端的输出变为0,然后稳定下来
假如下面的1跑得快,就会把 Q Q Q端的输出变为0,然后稳定下来
但我们并不知道上面的1跑得快还是下面的1跑得快,于是出现我们无法确定输出Q是什么的情况,这就是不定态 的含义,所以,在正常工作中,我们都应该遵循输入信号R和S不能同时为0的约束条件
通过列真值表 的方式,将SR= 0作为约束条件,我们就可以得到SR Latch的逻辑表达式 Q* = S + Q,SR = 0
除了或非门实现RS锁存器之外,我们还可以用与非门来实现锁存器,原理都是一样的
不过此时输入信号变成低电平有效
S = 0,R = 1,电路置1
S = 1,R = 0,电路置0
出现这种改变的根本原因是与非门的特性,出0容易,出1难
只有两个输入同时都为1时,才输出0;其余情况都输出1

还有一点不同,当输入信号同时有效,即S = R = 0时,输出都为1而不是0(或非门实现)
如下图中的竖线,当S = R = 0时,输出Q和Q*都为1
我们说单纯指一个器件的逻辑功能 是什么,还不足够描述一个器件,还有一点需要关注,它的动作特点是什么
刚刚实现的RS触发器,其动作特点是
在任何时刻,输入都能直接改变输出的状态
这也就意味着,这样的电路非常灵敏,电路灵敏有好有坏
好处是存储起来,至少非常方便,只要输入端直接改值就好
但是坏处也很明显,我们的记忆器件,往往是和组合逻辑电路接在一起的,用来存储组合电路处理出来的结果
如果有噪声呢?前面组合逻辑电路有什么风吹草动都直接反映在我们的输出,直接破坏我们原来想要存储的值,这显然并不是我们想要的
我们想要的是什么?
我让你存数据的时候,你才存 ;不让你存的时候,你不要把噪声等等干扰数据存进来
因此关键是,我们少了一个指示什么时候存储数据的信号(端)
前面数据输入部分还要做一点修改
引入时钟信号与异步信号
怎么改呢?
我们再描述一遍我们的需求
只有当某个控制信号,姑且称它为CLK时钟信号到达时,SR锁存器才正常工作,其余情况,不工作
换句话说,CLK = 1时,不会影响我们的输入信号,器件正常工作;CLK = 0时,输入信号失去效果,全部变为0接到我们的RS锁存器上
这时候我们就想到再用两个与非门 (和0相与必定输出0;和1相与输出原来的数字)
由于多了个非,我们输入可以直接接S,R
当CLK = 1时,RS锁存器才会被打开
当CLK = 0时,数据会继续保持
此时修改过后的电路,逻辑功能依旧是RS触发器,但是动作特点(触发方式)却改变了
只有CLK = 1的全部时间里面,S和R的变化才会带来输出状态的变化 ,我们也把这种触发方式,称作沿电平触发
但这样只是缓解了问题,在CLK = 1,即高电平期间,S,R多次变化翻转,同样可能会带来输出的多次变化
而且最致命的一个问题,当CLK为0的时候,其实就等价于给RS锁存器都输入0(R,S信号同时都撤了),出现不定的概率反而变得更大了
在正式处理不定态问题 之前,我们再介绍有关异步信号的概念,它和我们后面要介绍的电路知识关联程度不大,但我们在日常生活中,实际使用的触发器,往往都需要加异步信号端
我们对电路作出如下改变,直接在RS锁存器处引两个输入信号 S D ′ 和 R D ′ S'{D}和R'{D} SD′和RD′
不难看出,它们的优先级是比输入信号R,S还要更高,由于没有经过与非门,所以它们都是低电平有效,并且不能同时为0
这两个信号发挥的是和R,S信号一样的功能 ,但是和时钟信号无关,不受它控制,我们把这样的输入信号(优先级高),称为异步信号
把像R,S这样,和触发信号CLK相配合,受它控制的这样一个动作状态和信号,我们称为同步信号
那为什么我们需要异步信号呢?
很多电路模块设计,在刚开始上电的时候,状态都是不定的,因此,我们需要异步端,不受时钟控制的直接先将电路置位,进行初始化.
D触发器(D Latch)
当然,异步信号的引入,并没有解决我们不定态的问题,应该如何解决呢?
不难发现下面两个重要事实
1.我们在置1或者置0的时候,输入信号总是不同的
2.之所以会出现不定态,就是因为两个输入信号都为1的时候,它从设计者的角度来看,就不太合理,其没有任何实际意义
所以,有人就对SR锁存器做了下改进,变成下面的电路
这下好了,直接从源头根除问题,输入信号只有一个D
由于反相器的作用,R和S必定不可能同时为1,也就不可能出现不定态的问题(不用考虑约束条件,RS锁存器不会再发疯 ,说我不告诉你输出结果是啥,你自己猜吧)
但是这样有代价吗?
我们说有
从直观上来看,至少电路多了一个反相器,这就是一个代价
最关键的,其实是丢失了一个RS锁存器原本有的功能------保持,因为输入信号始终不同,R和S不可能同时为1,那也不可能同时为0了
所以,假如要保持我们的数据,只有不触发或者一直写相同的输入数据
除了用两个与非门加一个反相器实现D触发器,我们还可以用一个二选一数据选择器 来实现D触发器
在输出引一条回路接到输入,就轻松完成了D触发器的实现
当G = 1时,输出Q取决于当前输入的数据D是什么
当G = 0时,输出Q保持不变
下面的时序图也可以很好的反映我们的说法(数据有延迟,不可能立马改变)
当G = 1时,D是多少,Q就是多少
当G = 0时,不管D怎么变化,都一直维持V2的数据不变
当我们研发出来D触发器后,当初小猴子的问题,我们就能尝试开始解决它
任务说明:
每按下一次开关,LED状态就翻转一次
假如原来LED灯是亮的,按下开关后,它就会变暗
假如原来LED灯是暗的,按下开关后,它就会变亮
将原本Memory Device的部分,用D触发器来替换
上次LED灯的状态输出,会经过反馈回路,送到我们的D触发器存起来
当我们摁下开关的时候(其实就是打开D触发器),就会将存起来的状态送到我们的组合逻辑电路(小猴子的任务中,其实这就是一个简单的反相器就可以实现)作为输入,一起处理

大功告成,成功完成小猴子任务
但是这样真的就满意了吗?有没有什么问题?
如果当G = 1时,会发生什么?
当G = 1时,D触发器其实就相当于不存在,是一个透明(Transparent)的器件,把输入送到输出而已
这样就会发生一件很尴尬的事,G可以控制D触发器打开时间可长可短
我们希望的效果是,按一次开关,LED状态翻转一次
而不是按下开关时,G = 1,然后LED不断亮灭亮灭...
在我们眼里看来,虽然摁下开关,是很短的时间,但是在组合逻辑电路的眼中,ns级别才是家常便饭,足够它来回跑很多个循环
所以,我们还要对电路进行改进
边沿触发
小猴子的任务虽然完成了,但我们显然对结果是还不满意的
仔细思索一下,我们需要关心的只是有没有摁下开关这个动作,而不关心摁下开关的时间长短
怎么修改呢?我们说知识源于生活,可以先看一个简单的例子
相信大家都走过高速,在进高速公路之前,都需要经过收费站
每台车都需要排队,一个接着一个交钱(除非国庆等假期)
假设车运行速度很快(远远快于收费站杆落下的速度),而且司机也不遵守交通规则,会发生什么情况呢?
可能就会遇到第一辆车交钱后,后面的车不交钱,直接全部往前冲,由于杆落下的速度相较于车的速度很慢,我们的收费站完全起不到拦截它们的作用
车就相当于我们的数据,收费站其实就相当于我们电平触发的D触发器
我们想要的,其实是一台车交一次钱,数据一个个的通过D触发器,但是现在变成了,只要CLK = 1,D触发器打开,数据立马一窝蜂的往前冲,如入无人之境,D触发器是什么?我不知道
有没有办法解决这个问题呢?
假如我现在收费站变成这样子,可不可以?
变成两道杆,而且一次只打开一道杆 (当然,杆与杆之间的距离只够放下一辆车,不能是多辆车)
前面的杆负责从车队伍里面进一辆车,后面的杆负责拦截
这下就彻底解决我们之前的困扰了,想在杆落下之前,不交钱直接迅速通过?不可能的!
按照上述思想,我们就可以设计出脉冲触发的D触发器
两个D触发器顺接在一起,而且两个触发电平不一样,一次只会有一个D触发器打开
前面一个D触发器,我们称为主触发器(master)
后面一个D触发器,我们称为从触发器(Slave)
把这样的结构,称为主从结构(Master-Slave FF)
当CLK = 0时,主触发器打开,从触发器关闭,数据通过D输入,来到两个D触发器之间
但是由于从触发器关闭,所以此时输出并没有任何变化
当CLK = 1时,主触发器关闭,从触发器打开,数据顺利从两个D触发器之间来到输出
和我们先前电平触发的D触发器不同,CLK = 1输出也不会有任何的变化,只有CLK由0变化到1,这一个动作出现,输出才会有变化
将变化变成沿边沿而不是电平,关注动作,而不是关注时间维持长短 ,这是边沿触发最大的魅力所在
当然,上面我们CLK由0变到1,有一次输出变化,我们称之为上升沿 ;那自然也有下降沿,当CLK由1变为0,即主从切换的时候,是由高电平到低电平,我们称之为下降沿
有了边沿触发的D触发器,我们就可以正式说,完美解决小猴子的任务
只有我摁下开关这一个动作发生,输出LED灯才会翻转一次,我一直摁着开关,输出并不会发生改变
可不可以将这种主从结构推广到其它的触发器上呢?
答案肯定是可以的!
脉冲触发
将上面的D触发器换成RS触发器,我们就得到主从SR触发器
当CLK = 0时,主触发器不会打开,保持原状态不变
在CLK = 1时,主触发器会被打开,从触发器关闭
主触发器的输出将会根据S和R输入信号被置成对应的状态
当CLK = 0时,即下降沿到来时,主触发器关闭,保持状态不变,从触发器打开
输出将会被置成和主触发器相同的状态
由此可见,在一个时钟周期里,输出端的状态只可能改变一次,而且发生在CLK的下降沿
那有人可能就会疑惑了,为什么还要专门叫它沿脉冲触发呢?我感觉它和沿边沿触发也没什么区别啊?
从直观上来看,好像的确如此
但是聪明的你仔细思索下,不难发现
由于在CLK高电平期间主触发器可能随S和R状态的变化而发生多次翻转,输出端的状态不可能始终与输入状态保持一致
因此,在脉冲触发SR触发器中,我们不是根据CLK下降沿时,输入端S和R的状态来确定输出端Q的状态,而是必须考察CLK = 1期间主触发器状态的变化情况,来决定最后输出端的值
通俗点讲,CLK在等于1,即主触发器打开时, Q 1 Q_{1} Q1和S,R输入信号说:"大哥,小弟跟着你混,你让我去东,我绝不去西;你让我走南,绝不走北"(我 Q 1 Q_{1} Q1只会保持你主触发器最后一次打开的变化值 )
但是 Q 2 Q_{2} Q2最终的输出知道你前面 Q 1 Q_{1} Q1发生的所有变化吗?
不知道,它只会在时钟下降沿到来时,才会随 Q 1 Q_{1} Q1而变化
边沿触发的D触发器有这个问题吗?
我们说没有,根本原因就在于D触发器丢掉了保持的功能 ,要么置1,要么置0
所以D触发器只需要考察边沿到来时D的值 ,就可以决定对应的输出是什么,而不用考查CLK =1时主触发器的状态变化
这就是脉冲触发 和边沿触发 的区别所在!
当然,有上升沿和下降沿,自然也有对应的正脉冲和负脉冲
下面给出一道王文俊老师举的例题,大家可以参考看看
这其实蛮尴尬的,有了主从结构后,在每一个时钟周期,我的输出状态的确也只是变化一次
但是我们更想要的是,屏蔽掉电平期间我输入数据对结果的影响 ,有没有什么办法解决这个问题呢?
关于这个疑惑,我们先按下不表,再来看看另外一种主从结构设计.
JK触发器
虽然成功实现了主从结构的RS触发器,但是一提到RS触发器,我们就不自觉会联想到约束条件,即R和S输入信号不能同时为1,否则就会可能出现不定态
主从结构根本就没有解决这个问题,之前我们是舍弃了保持这个功能来解决的
还有没有其它办法解决这个问题呢?
答案是有的!
有一些奇思妙想的天才就想到一个很好的办法(今天我们也来体会一把 )
目标:不能让输入S,R输入信号同时为1
已知:
1.与非门能实现屏蔽的功能 ,只要你其中有一个输入信号为0,不管你其它输入信号为什么,输出都为1
2.输出始终是相反的 状态,即Q,Q'始终不同
3.触发器的一大特点是引入反馈
于是,结合已知的知识,我们在原来的电路基础上,又加了两个大反馈,并且把输入信号的名字,再次变一下,变为J和K,并起了一个新名字------JK触发器,以作区分
PS:J是原来的S端(用来置1的),K是用来的R端(用来置0的)
这样看还是怪别扭,我们说分析,就应该按模块进行分析,我们再对它进行简化,变成下面这个图
那现在J,K输入信号可以同时为1吗?
我们说可以了!因为Q和Q'输出一定有一个1,另一个为0
0的输出信号通过反馈接到主触发器的与非门输入,就会把输入都为1时,其中一个1给屏蔽掉 ,以解决输入信号同时为1的问题(从输入上来看,是可以都为1,但在电路结构上来看,本质上其实一个输入端已经被屏蔽)
比如Q = 0,Q' = 1时,输出Q通过反馈,实际上屏蔽掉K输入端(不管K输入什么,与非门都是输出0),实际上电路发挥的是置1的功能
当Q = 1,Q' = 0时,输出Q通过反馈,实际上屏蔽掉J输入端(不管J输入什么,与非门都是输出0),实际上电路发挥的是置0的功能
总结下来,J = K =1时,电路起到翻转功能
现在的关键就是,这样引入两个大反馈,会对电路原来的功能有影响吗?假如有影响,那还不如不改
当输入信号同为0(J = K = 0),不管你有没有反馈,经过主触发器的与非门后,输出都是0,所以没有影响保持 功能
当J = 1,K = 0时,分两种情况讨论
当Q = 0,Q' = 1时,输出Q通过反馈,实际上屏蔽掉K输入端(不管K输入什么,与非门都是输出0)
但不影响我J输入信号,当我J = 1时,电路正常发挥置1的功能
当Q = 1,Q' = 0时,输出Q通过反馈,实际上屏蔽掉J输入端(不管J输入什么,与非门都是输出0)
此时K = 0,电路正常发挥保持的功能 ,即原本Q就为1,置1相当于什么都没有做
当J = 0,K = 1时,同样也分两种情况讨论
当Q = 0,Q' = 1时,输出Q通过反馈,实际上屏蔽掉K输入端(不管K输入什么,与非门都是输出0)
但不影响我J输入信号,当我J = 0时,电路正常发挥保持的功能 ,即原本Q就为0,置0相当于什么都没有做
当Q = 1,Q' = 0时,输出Q通过反馈,实际上屏蔽掉J输入端(不管J输入什么,与非门都是输出0)
此时K = 1,电路正常发挥置0的功能
所有总结如下:
可以看到,JK触发器解决了输入信号同时不能同时为1的约束,并将其转换为翻转 的新功能,其余情况和主从结构RS触发器的操作时一样
但是我们说对电路作出改进,带来好处的同时,肯定也会有新问题出现
我们说主从结构的脉冲触发的JK触发器,主触发器在打开期间只能翻转一次
我们不仅要像主从触发的SR锁存器那样分析前半周期,还要多一个新规则,只能翻转一次
怎么理解这句话呢?
其实很简单,JK触发器能解决约束条件,就是因为增加了两个大反馈,使其中一个输入端实际上在电路刚输入时就被屏蔽
而问题出现也正因为于此
假如K被屏蔽,那JK触发器此时可能置0吗?
绝对不可能,要K = 1才可以置0
假如电路原本输出为0,则无论输入是K = J = 1,使电路翻转;还是J = 1,K = 0,使电路置1,一旦输出变化为1后,就变不回去了!
同理,假如J被屏蔽,那JK触发器此时可能置1吗?
绝对不可能,要J = 1才可以置1
假如电路原本输出为0,则无论输入是K = J = 1,使电路翻转;还是J = 0,K = 1,使电路置0,一旦输出变化为0后,就变不回去了!
这就是我们说的只能变化一次
王文俊老师举了一个例子,供大家参考
我们看第三个时钟下降沿,假如按照J = 0,K = 1来说,最后的输出应该保持为0
但此时Q = 0,屏蔽掉了K输入端,所以不可能置0,只可以置1
在第三个时钟高电平期间,出现过J = 1,K = 1的翻转操作,因此在第三个时钟下降沿到来时,输出Q变为1,而不是0
不同触发器之间的转换
虽然我们成功设计出来主从结构的JK触发器,它的变化确实也是一个周期变化一次,但是从它屏蔽干扰的能力来看,并不见得有多优秀
比如说我们上面例子的第二段
在CLK高电平期间,K出现一个小小的脉冲(一小段高电平),输出Q就会在时钟下降沿到来时,将我们的输出Q置0
而这个K出现的小小脉冲,其实很有可能是干扰噪声
虽然是只能变化一次,但是这个变化也足够致命了
我们真正想要的,是把作用时间再进一步缩短 ,只用根据在时钟下降沿时,J和K的输入,来判断输出,而不用观察整个 CLK高电平期间J,K的变化
通俗点讲,其实我们想要的是边沿触发的触发器 ,而不是脉冲触发的触发器
有没有什么办法,将我们脉冲触发的JK触发器,改为边沿触发的JK触发器 呢?
假如从头开始设计,我们说太累了!绝对不干
但现在我们已经有了边沿触发的D触发器 ,问题就转变为怎么将D触发器改为JK触发器?
毫无疑问,主体部分肯定是D触发器,我们真正需要改的是输入信号
首先,写出两个触发器的特性方程
对比一下,其实只要将D输入信号变为下面和J,K相关的式子即可
当然,下面还利用到了我们之前学习过的逻辑代数公式进行进一步的化简
A B + A ′ C = A B + A ′ C + B C AB + A'C = AB + A'C + BC AB+A′C=AB+A′C+BC A A ′ = 0 AA'= 0 AA′=0这样我们实际上只需要用一个或门,一个与门,还有一个与非门,就能处理JK信号,对D触发器进行封装
对应的逻辑图如下:
然后再用一个大的框框将它封装起来,仅留下输入端口J,K;和输出端口Q,Q',我们便成功实现了边沿触发的JK触发器
对于边沿触发的JK触发器 来说,触发器的次态仅取决于CLK的下降沿(上升沿)到来时的输入信号,缩短了写数据的时间,进一步增强了抗干扰的能力
商品的边沿JK触发器品种其实有很多,下面的图列出了应用较广的两种类型,一种是正边沿触发的,仍然用J,K形式输入;另一种也是J,K形式输入,但触发是在时钟负沿进行的
PS:器件型号前的 1 2 \frac{1}{2} 21,表示它们都是双触发器(主从结构)封装的
当然,除了可以用边沿触发的D触发器封装设计出边沿触发的JK触发器,不同的触发器之间其实都可以转换,而这项技能也是我们需要掌握的,因为在市面上,其实我们只能找到D触发器和JK触发器的商品
那不同触发器之间转换的核心是什么?
它们的特性方程,而不是波形图分析,波形图并不是一个抽象度高的描述,所以了解不同触发器的特性方程就很有必要
SR触发器:

JK触发器:

T触发器:
这个我们第一次接触,我们说D触发器抛弃了保持功能,只有置1和置0
而T触发器则是抛弃了置1和置0功能,只剩下保持和翻转的功能
当T为0时,输出保持
当T为1时,输出翻转

那T触发器怎么实现呢?
看T触发器的特性方程,有没有觉得它和JK触发器的特性方程很像?
其实T触发器就是由JK触发器而来(其中一个设计思路)
把J,K接到一起,统一由一个输入信号T控制,其实就变为T触发器
那T触发器有什么用呢?
不难看出,假如T一直保持1的话,输出信号其实就是时钟信号的二分频 (一个时钟周期只有一个下降沿或上升沿)
那我们可以用它来对时钟的个数进行计数 ,更进一步说,它只是计数二进制的最低位
假如我们用多个T触发器级联在一起,那计数的值就可以进一增大,并且实现2的n次方分频
T'触发器:
除了T触发器之外,还有一个T'触发器
它和T触发器相比,又"极端"了一些,只保留了翻转这个新功能,其余功能全部没有(原因无它,只是因为翻转这个功能经常可能会被使用)
如何实现呢?
这里提供两种方案
第一,利用JK触发器
第二,利用D触发器
D触发器:

触发器的动态特性
建立时间 t s e t u p t_{setup} tsetup
在触发器时钟上升沿到来之前,输入信号必须跳变到某一逻辑电平并保持不变,以保证D触发器获得稳定输入。
该时间的最小值称为建立时间 ,用 t s e t u p t_{setup} tsetup或者 t s u t_{su} tsu来表示.
简单做一个类比,它就好比我们跑步,在听到正式发枪信号到来之前,我们要做好已经在跑道,准备随时出发,而不是等听到发枪信号的时候,才上跑道.
同样,在触发器触发之前,就要把数据信号准备好,假如在时钟到来时,信号还没稳定保持不变,则未必触发器可以准确采集到准确的数据
保持时间 t h o l d t_{hold} thold
输入信号在时钟上升沿到来后还要保持一段时间,才能保证输入信号可靠地传送到输出端。
该时间的最小值称为保持时间 t h o l d t_{hold} thold
它和我们的建立时间是互相配合的,它描述的不是信号从输入到输出的时间,而是如果你想把输入稳定写到输出,输入信号之间相互配合的时间
建立时间和保持时间两者结合,要求我们的输入信号遵循一个基本原则------"早点来,晚点走"
传输延迟时间
和我们之前在反相器中学习的是完全一样的,传输延迟时间分为 t p d t_{pd} tpd(propagation delay)和 t c d t_{cd} tcd(contamination delay)
t p d t_{pd} tpd代表的是输入已经从0变到1,输出还需要多长时间变化,毕竟一个个触发器内部就是一个个门电路,我们走路从一个地方到另一个地方需要一定时间,信号经过一个个门,从输入走到输出也需要一定时间
我们的目标就是要让输出有效尽可能快,即 t p d t_{pd} tpd尽可能小
更具体细分:
输出信号从0变化到1,即低电平(low)变化到高电平(high)的时间,我们可以称作为 t p L H t_{pLH} tpLH
输出信号从0变化到1,即低电平(low)变化到高电平(high)的时间,我们可以称作为 t p H L t_{pHL} tpHL
并且以50%作为分界线,因为这是一个趋势,默认一般波形变化后,上去或下来,就不会再拐回去
两者和 t p d t_{pd} tpd的关系如下面的关系所示:
t c d t_{cd} tcd代表的是从0到1(从1到0),中间一定会经过无效区,输出还需要经过多长时间进入无效区,即输出能够保持原来的有效值的时间
对于 t c d t_{cd} tcd来说,它不能是0,也不能为0
如果它一旦为0,输入一旦发生变化,输出就立马无效,这显然不是我们想要的,我们的目标是输出在有效电平的时间加长
t p d t_{pd} tpd(propagation delay)和 t c d t_{cd} tcd(contamination delay)两者关注的其实都是输出的有效 ,只不过前者 t p d t_{pd} tpd关注的是有效到有效的时间,而后者 t c d t_{cd} tcd关注的是无效到无效的时间
最高时间频率
时钟CP在高电平期间,触发器内部完成一系列动作,需要一定的延迟时间,所以对时钟的最高工作频率有所限制。
触发器所能反应的时钟脉冲CP的最高频率,记为 f C P M A X f_{CPMAX} fCPMAX 。