异步清零计数器的竞争和冒险

概述

本文从异步清零计数器的故障出发,详细分析和测试了竞争和冒险。通过用同步置位的方法解决这个故障,引出了建立时间和保持时间的概念。这个实例看似简单,却引出了数字逻辑中常常要考虑的基本问题。为后续设计复杂的,健壮的数字电路、FPGA开发等工作打下基础,起到一个抛砖引玉的作用。

关键字:同步异步,竞争冒险,建立时间,保持时间

异步清零计数器的问题

在一次实验中,用74HC161和74HC00设计一个从0计数到9的计数器,计数结果送数码管显示。一个简单的方法就是每当计数器计数到10的时候对计数器清零。这样计数器可见的计数是从0到9周期循环。

74HC161的清零端是低电平有效,将计数器输出的4位经过组合逻辑产生清零信号。所以计数值0到9都对应1,计数值10到15都对应0. 在multisim里写出真值表并转为逻辑门电路。

使用multisim的Logic converter工具将真值表转换为逻辑门。
相当于用卡诺图化简。

img

Logic converter

img

真值表、化简和转换门电路

可以看到最小项是 A’+B’C’,(A是高位),然后转换为与非门电路。

img

将74HC161和74HC00在面包板上按原理图连接电路。CLR是异步清零管脚。74HC00一个芯片中有4个与非门。

img

实物图

img

使用硬木课堂仪器平台对这个计数器电路进行测试。首先打开电源给电路供电

img

然后将平台仪器的Dout0连接到74HC161的CLK管脚,给计数器提供时钟。打开主界面中的 StaOut来配置Dout0产生时钟信号

img

img

然后将74HC161的QA QB QC QD这4根数据线接硬木课堂仪器平台的Din0 Din1 Din2 Din3。用StaIn里面的数码管工具来测试计数器输出。

img

img

观察发现计数值从0到7循环,并不是设计中的0到9循环。——问题出现了

使用逻辑分析仪和示波器排查问题

用逻辑分析仪来找一下问题原因。为了配合逻辑分析仪的高速采样,将Dout0的时钟频率改为500KHz。将CLR异步清零管脚接DIN4同时进行观察。

img

img

可以看到数据线QA到QD从0到7循环,跟数码管显示结果一致。CLR上出现一个毛刺0,使得计数到7后被清零。这就是计数器没有按设计从0到9计数的原因。CLR上出现了异常的毛刺0.

img

进一步排插组合逻辑产生CLR信号。将电路的CLR信号断开,不要这个清零反馈。按上图接线。DIN0测试E点,DIN1测试F点。DIN4测试G点信号。

img

可以看到在最后一级与非门的E和F信号同时发生跳变时,G点信号产生毛刺。理论分析如下,F和E同时发生跳变时,当F点跳变超前E点跳变则会在G点产生毛刺。这个毛刺为低,使计数器错误清零。

img

用示波器观察信号的对齐时间差别,AIN1黄色线测试E点,AIN2蓝色线测试F点,AIN3红色线测试G点。打开cursor功能,用虚线卡一下跳变的边沿,可以看到蓝色线超前黄色线跳变,出现了一个20ns的同为1的时刻,红色线就出现了毛刺。实测跟理论分析一致。

img

理解竞争和冒险

通过示波器,我们观察到了竞争和冒险的情况。数字电路中对竞争和冒险描述如下。

竞争:在组合电路中,信号经由不同的途径达到某一会合点的时间有先有后,这种现象称为竞争。

冒险:由于竞争而引起电路输出发生瞬间错误现象称为冒险。表现为输出端出现了原设计中没有的窄脉冲,常称其为毛刺。

竞争与冒险的关系:有竞争不一定会产生冒险,但有冒险就一定有竞争。

数字电路设计中,竞争和冒险一定会出现。但是好的设计不会让竞争冒险制造问题。好的设计可以让数字电路的速度跑的更快。

一种不是很好的解决问题的方法

通过之前的分析,是E点信号的延时导致了竞争,冒险产生了G点的毛刺。将F点的信号进行延时,让它跟E点信号对齐跳变,就可以消除竞争。用门电路来进行延时,在F信号中插入两个非门。这样QD到F的时延跟QB QC到E的时延都是两个门电路。

img

用示波器测试,AIN1黄色线测试E点,AIN2蓝色线测试F点,AIN3红色线测试G点。可以看到添加门延时后,信号跳变对齐,毛刺消失。

img

将G点接回到CLR上,构成异步清零计数器。Dout0的时钟改为1Hz。将74HC161的QA QB QC QD这4根数据线接硬木课堂仪器平台的Din0 Din1 Din2 Din3用数码管观察。数码管0到9循环显示。

img

用逻辑分析仪测试,DIN4接CLR。Dout0的频率改为500KHz,这样可以配合使用逻辑分析仪的高采样率。可以看到0到9的计数循环,并且状态10的短暂瞬间也可以看到。因为状态10被异步清零。教科书中将异步清零的这个状态称为“过渡态”

img

为什么说这是一种不是很好的解决问题的方法呢。因为靠逻辑门延时很不可靠。门延时受到多个因素影响,比如器件的温度,器件的工艺(器件的型号里的字母丝印),供电电压等等。比如用这个方法在FPGA芯片里面设计,有可能换了一个FPGA芯片型号,电路就出故障了。(本文以计数器举例,请不要局限于计数器电路,可以推广到数字电路中的诸多控制和时序设计中。)

一种好的解决问题的方法

将异步清零改为同步置数,也可以解决问题。Load管脚是74HC161的同步置数端。将组合逻辑输出的G点接Load管脚。计数到10的时候G=0,由于是同步置数,要一个时钟周期在第11步置数为0. 这样电路不改的情况下就是0到10计数,比异步清零计数器多一个数。鉴于本文讨论的内容,这个区别可以忽略。

img

先用数码管测试,Dout频率改为1Hz。将74HC161的QA QB QC QD这4根数据线接硬木课堂仪器平台的Din0 Din1 Din2 Din3用数码管观察。数码管显示0到0x0A循环计数。功能正常。

img

用逻辑分析仪测试。Load接DIN4。QA QB QC QD接 Din0 Din1 Din2 Din3。可以看到0到0x0A的整个计数过程。由于组合逻辑没有改变,在7到8跳变时load上也会有冒险造成的毛刺。

img

为什么这个load管脚上的毛刺没有造成问题呢?咱们用示波器观察一下。AIN1黄色线测试E点,AIN2蓝色线测试F点,AIN3红色线测试G点。AIN4绿色线测试CLK。可以看到时钟CLK的边沿之前红色线Load都是稳定的,在时钟边沿后才出现竞争冒险的毛刺。

img

通过示波器的观察测试,引出时序逻辑中的两个重要概念。建立时间和保持时间。

建立时间:是指在触发器的时钟信号上升沿到来以前,数据稳定不变的时间,如果建立时间不够,数据将不能在这个时钟上升沿被稳定的打入触发器,Tsu就是指这个最小的稳定时间。

保持时间:是指在触发器的时钟信号上升沿到来以后,数据稳定不变的时间,如果保持时间不够,数据同样不能被稳定的打入触发器,Th就是指这个最小的保持时间。

从示波器的测试波形可以看出,绿色时钟边沿之前load信号都是稳定的,必然满足建立时间。74HC161对保持时间要求为0 。必然也就满足了保持时间。所以同步置数可以解决竞争冒险问题。

img

同步时序逻辑对组合逻辑的时延要求不像异步那么苛刻。并且如果组合逻辑时延过长,还可以在组合逻辑中加一级触发器暂存中间结果,将组合逻辑分为两个部分。这样组合逻辑时延就减半,多一个节拍。可以使整个数字电路速度提高。

img

总结

本文对竞争冒险,建立时间和保持时间做了一个入门讲解,通过实验使读者有一个直观的认识。并且通过一个简单实例的排查过程,给读者展示了数字电路的调试技巧和思路。关于建立时间和保持时间在FPGA的理论书中有详细说明,这里不再赘述。