第5章
时序逻辑的分析与设计




逻辑电路有两大类: 一类是组合逻辑电路,另一类是时序逻辑电路。
组合逻辑电路: 电路的输出只与当时的输入有关,而与电路以前的状态无关。
时序逻辑电路: 电路的输出不仅与当前输入有关,还与以前的输入有关。
时序逻辑电路按其工作方式不同,又分为同步时序逻辑电路和异步时序逻辑电路。本章从时序逻辑电路的基本概念入手,重点讨论同步时序逻辑电路的分析和设计方法,同时对异步时序的概念及分析和设计方法也作简单的介绍。


视频讲解


5.1时序逻辑电路的结构与类型
组合逻辑电路是由门电路构成的,其结构如图51所示。
图中x1,x2,…,xn为某一时刻的输入; Z1,Z2,…,Zm为该时刻的输出。组合逻辑电路的输出可用下列输出函数集来描述: 

Zi=fi(x1,x2,…,xn),i=1,2,…,m

输出Zi仅是输入xi的函数,即只与当前的输入有关。
时序逻辑电路的结构如图52所示,它由组合逻辑和存储器件两部分构成。图中x1,x2,…,xn为时序逻辑电路的外部输入; Z1,Z2,…,Zm为时序逻辑电路的外部输出; y1,y2,…,yr为时序逻辑电路的内部输入(或称状态); Y1,Y2,…,Yp为时序逻辑电路的内部输出(或称激励)。


图51组合逻辑电路的结构




图52时序逻辑电路的结构


时序逻辑电路的组合逻辑部分用来产生电路的输出和激励,存储器件部分是用其不同的状态(y1,y2,…,yr)来“记忆”电路过去的输入情况的。
如图52所示的时序逻辑电路逻辑功能函数的一般表达式为

Zi=gi(x1,x2,…,xn;  y1,y2,…,yr),i=1,2,…,m(51)

Yj=fj(x1,x2,…,xn;  y1,y2,…,yr),j=1,2,…,p(52) 


式(51)称为输出函数,式(52)称为激励函数。这两个函数都与变量x,y有关,也即电路的输出不仅与电路的输入有关,而且与电路的状态有关。
时序逻辑电路按其工作方式可分为同步时序逻辑电路和异步时序逻辑电路。同步时序逻辑电路的存储器件由时钟控制触发器组成,并且有统一的时钟信号,只有当时钟信号到来时,电路状态(y1,y2,…,yr)才发生变化。其余时间,即使输入发生变化,电路的状态也不会改变。时钟信号来之前的状态称为现态,记为yni(右上标也可省略); 时钟信号到来之后的电路状态称为次态,记为yn+1i。异步时序逻辑电路的存储器件可为触发器或延迟元件,电路中没有统一的时钟信号。
由于时序逻辑电路与组合逻辑电路在结构和性能上不同,因此在研究方法上两者也有所不同。组合逻辑电路的分析和设计所用到的主要工具是真值表,而时序逻辑电路的分析和设计所用到的工具主要是状态表和状态图。
同步时序逻辑电路在形式上又分成Mealy型和Moore型,它们在用状态表、状态图描述时其格式略有不同。



第
5
章

时序逻辑的分析与设计


数字逻辑电路设计(第4版·微课视频版)

5.1.1Mealy型电路
如果同步时序逻辑电路的输出是输入和现态的函数,即Zi=fi(x1,x2,…,xn; y1,y2,…,yp),i=1,2,…,m,则称该电路为Mealy型电路。也就是说输出与输入有直接的关系,输入的变化会影响输出的变化。
Mealy型同步时序逻辑电路状态表的格式如表51所示。表格的上方从左到右列出输入x1,x2,…,xn的全部组合,表格左边从上到下列出电路的全部状态y,表格的中间列出对应不同输入组合的现态下的次态yn+1和输出Z。这个表的读法是,处于状态y的时序电路,当输入x时,输出为Z,在时钟脉冲的作用下,电路进入次态yn+1。
例如,某同步时序逻辑电路有一个输入x,一个输出Z,4个状态A、B、C、D,该时序逻辑电路的状态表如表52所示。


表51Mealy型电路状态表格式



现态输入

…x…


︙
yyn+1/Z
︙



表52某Mealy型电路状态表



yx
01

AD/0C/1
BB/1A/0
CB/1D/0
DA/0B/1


从该状态表可看出,若电路的初态为A,当输入x=1时,输出Z=1,在时钟脉冲的作用下,电路进入次态C。假定电路的输入序列为

x:   10100110

那么,与每个输入信号对应的输出响应和状态转移情况为
时钟:    12345678
x:    1 0100110
y:   ACBADACD
yn+1:  CBADACDA 
Z:   11000100

需要指出的是: 
(1) 如果同步时序逻辑电路的初始状态不同,那么尽管输入序列相同,但输出响应序列和状态转移序列也将不同。
(2) 电路的现态和次态是相对某一时刻而言的,该时刻的次态就是下一个时刻的现态。
Mealy型电路的状态图格式如图53所示,在状态图中,每个状态用一个圆圈表示,圈内用字母或数字表示状态的名称,用带箭头的直线或弧线表示状态的转移关系,并把引起这一转移的输入条件和相应的输出标注在有向线段旁边。例如上面某电路的状态表可描述为如图54所示的状态图。


图53Mealy型电路状态图




图54某电路的状态图



5.1.2Moore型电路
如果同步时序逻辑电路的输出仅是现态的函数,即Z=fi(y1,y2,…,yp),i=1,2,…,m,则称该电路为Moore型电路。也就是说该时序逻辑电路可能没有输入,或输入与输出没有直接关系。Moore型电路的状态表格式如表53所示。因为Moore型电路的输出Z仅与电路的状态y有关,所以将输出单独作为一列,其值完全由现态确定。次态与Mealy型一样,由现态和输入共同确定。该表的读法是,当电路处于状态y时,输出为Z。若输入x,在时钟脉冲的作用下,电路进入次态yn+1。例如某Moore型时序逻辑电路的状态表如表54所示,当电路处于A状态时,其输出为0。若x=1,在时钟脉冲作用下,电路进入状态B,新的输出为1。假定电路的初始状态为B,输入序列为
x:    11001001

那么电路的状态转换序列和输出响应序列为


图55某Moore型电路的状态图


时钟:   12345678
x:      11001001 
y:   BCACBCBB
yn+1:  CACBCBBC
Z:      10001011


Moore型电路的状态图与Mealy型电路状态图的区别仅在于Moore型电路的输出与状态一起标注在圆圈内,如上例的Moore型电路的状态图如图55所示。


表53Moore型电路状态表格式



现态输入
…x…输出

︙
yyn+1Z
︙



表54某Moore型电路状态表



y
x
01
Z

AC B  0
BB C  1
CB A  0


5.2同步时序逻辑电路的分析
时序逻辑电路的分析就是对一个给定的时序逻辑电路,研究在一系列输入信号作用下,电路将会产生怎样的输出,进而说明该电路的逻辑功能。
在输入序列的作用下,时序电路的状态和输出变化规律通常表现在状态表、状态图或时间图中。因此,分析一个给定的同步时序电路,实际上是要求出该电路的状态表、状态图或时间图,以此确定该电路的逻辑功能。
本节将介绍分析同步时序电路的两种方法,并通过示例分析,了解和熟悉几种常用的数字逻辑电路。


视频讲解


5.2.1同步时序逻辑电路的分析方法
同步时序电路的分析方法有两种: 表格法和代数法。两种方法的分析过程示意图如图56所示。


图56同步时序逻辑电路的分析过程示意图



下面介绍两种分析方法的一般步骤。
1. 表格法的一般步骤
(1) 根据给定的同步时序逻辑电路,写出输出函数表达式和激励函数表达式。
(2) 列出激励矩阵,即将激励函数以卡诺图的形式表示出来,若干激励合成激励矩阵。
(3) 根据所用触发器的状态表及激励矩阵、输出矩阵(输出函数的卡诺图形式)形成YZ矩阵。YZ矩阵实际就是二进制形式的状态表。
(4) 由YZ矩阵可得时序电路的状态表、状态图。
(5) 假定某一输入序列画出时间图,并用文字描述电路的逻辑功能。 
2. 代数法的一般步骤 
(1) 同表格法的(1)。
(2) 把激励函数表达式代入该电路触发器的次态方程,导出电路的次态方程组。
(3) 根据电路的次态方程组和输出函数表达式做出同步时序电路的状态表,画出状态图。
(4) 同表格法(5)。
两种方法的本质是相同的,视具体情况灵活选用。下面举例说明。


视频讲解


例51分析如图57所示的同步时序电路的逻辑功能。假定在初态为00时,输入x的序列为0000011111,画出时间图。
解: 由电路图可写出激励函数、输出函数。

K0=J0=1

K1=J1=xy0=xy-0+x-y0

Z= x·y-1= x-+y1

方法一: 表格法。
将激励函数、输出函数表示在卡诺图上,如图58所示。



图57例51图




图58J、K和Z的卡诺图


将J、K的卡诺图合并画到一个卡诺图上便可得电路的激励矩阵,如表55所示。再根据JK触发器的状态表和输出矩阵,可将激励矩阵转换成YZ矩阵,如表56所示。



表55激励矩阵J1K1和J0K0



y1y0x
01

0000,1111,11
0111,1100,11 
1111,1100,11
1000,1111,11



表56YZ矩阵



y1y0x
01

 00 01/111/0
 01 10/100/0
 11 00/110/1
 10 11/101/1

YZ矩阵实际上就是二进制状态表,将编码00、01、10、11分别用状态q1、q2、q3、q4表示,代入YZ矩阵可得状态表,由状态表可画出状态图,如图59所示。


图59状态表和状态图



该电路是一个Mealy型时序电路。由状态表和状态图可以看出,当输入x=0时,在时钟脉冲CP的作用下,电路的状态按加1顺序变化,即
00→01→10→11→00→…

当x=1时,在时钟脉冲CP的作用下,电路的状态按减1顺序变化,即
11→10→01→00→11→…

因此,该电路既具有加1计数功能,又具有减1计数功能,且4个状态为一个循环,是一个模4的二进制可逆计数器。
假定计数器的初态y1y0为00(即q1),输入x的序列为0000011111,计数器在时钟脉冲CP控制下工作。下面先利用状态图做出时序电路的状态响应序列,而后再作时间图。状态响应序列如下: 
CP12345678910 
x0000011111
y(Y)q1q2q3q4q1q2q1q4q3q2
Z1111100110
在CP1到来前,时序电路处于现态q1。当x=0时,由状态图可知,输出Z=1,次态为q2(CP1到来后的状态)。在CP2到来前,电路处于现态q2,当x=0时,产生输出1,次态为q3,以此类推,可得到整个状态响应序列。然后,再根据状态响应序列做出时间图。由于状态y由y1y0来表示,所以只要将状态qi按二进制代码表示后,就可画出按电平高低表示的Y1、Y0时间图。例如,q2的代码为01,则在Y1、Y0的时间图中,Y1为低电平,Y0为高电平。图510表示该电路的时间图。


图510可逆计数器的时间图



方法二: 代数法。
以上过程用代数法也能很简单地求出结果。因为JK触发器的次态方程为

Qn+1=J+Q


对于本例的逻辑图,两个触发器的次态方程为

yn+11=J1y-1+1y1

yn+10=J0y-0+0y0


将已求得的电路的激励函数代入该次态方程组就可得该电路的次态方程组。

yn+11=J1y-1+1y1=(xy0)y-1+(xy0)y1

= x-y-1y0+x-y1y-0+xy-1y-0+xy1y0

yn+10=J0y-0+0y0= y-0


将电路的次态方程组和输出函数表示到卡诺图上,如图511所示; 将两个次态卡诺图与输出函数的卡诺图合并就形成了二进制形式的状态表,如表57所示。可以看出该二进制形式的状态表与上面表格法求得的YZ矩阵是一样的。



图511yn+11、yn+10和Z的卡诺图



表57二进制形式的状态表



y1y0
x
01


00
01
11
10

01/111/0
10/100/0
00/110/1
11/101/1



例52分析如图512所示的同步时序电路。


视频讲解




图512例52图



解: 注意,本例比较特殊,没有外部输入,也没有外部输出。
首先写出它的激励函数。

D0= Q32Q1=3+2Q1

D1=Q0

D2=Q1

D3=Q2


将以上4个激励函数一起画到一幅卡诺图上就得到激励矩阵,如表58所示。因为D触发器的次态方程为Qn+1=D,即次态与激励相等,所以求出的激励矩阵也就是Y矩阵或二进制形式的状态表。很容易可得该电路的状态图如图513所示。


表58激励矩阵



Q1Q0
Q3Q2
00011110


00
01
11
10

   0 0 0 11 0 0 11 0 0 00 0 0 0
   0 0 1 11 0 1 11 0 1 00 0 1 0
   0 1 1 11 1 1 11 1 1 00 1 1 1
   0 1 0 11 1 0 11 1 0 00 1 0 1




图513状态图 



由状态图可以看出,这是一个循环移位计数器。在计数时循环移位规则如下: 
Q0→Q1Q1→Q2Q2→Q33→Q0

这种计数器的循环长度L=2n,其中n为位数,这里,n=4,L=8。
由状态图还可看出,图左半部8个状态形成闭环,称为“有效序列”,右半部8个状态称为“无效序列”。如果该时序电路在某种偶然因素的作用下,使电路处于“无效序列”中的某一状态,则它可以在时钟脉冲CP的作用下,经过若干节拍后,自动进入有效序列。因此,该计数器称为具有自恢复功能的扭环移位计数器。
该电路的时间图如图514所示。根据Q0~Q3这4个基本波形,经过简单组合,可以形成各种不同的时序控制波形。在计算机中,常常用它作为节拍信号发生器。


视频讲解


例53分析图515的串行加法器电路,该电路有两个输入端x1和x2,用来输入加数和被加数。有一个输出端Z,用来输出相加的“和”。JK触发器用来存储“进位”,其状态yn为低位向本位的进位,yn+1为本位向高位的进位。



图514时间图




图515例53的电路图



解: 首先写出电路的激励函数和输出函数表达式。

Z=x1x2y

J=x1x2

K= x1+x2


JK触发器的次态方程为

yn+1=Jy+Ky

将激励函数表达式代入,得电路的次态方程为

yn+1=x1x2y+(x1+x2)y=x1x2y+x1y+x2y

=x1x2+x1y+x2y


根据电路的次态方程可做出它的状态表和状态图,如图516所示。


图516例53的状态表和状态图



设电路初始状态为0。加数x1=1 0 1 1,被加数x2=0 0 1 1,加数、被加数均按照先低位后高位的顺序串行地加到相应的输入端。输出Z也是从低位到高位串行地输出的。
根据状态图做出的响应序列为
CP:1234 
x1x2:11110010
yn:  0110
yn+1:  1100
Z:  0111
从以上状态响应序列可以看出,每位相加产生的进位由触发器保存了下来,以便参加下一位的相加。从输出响应序列可以看出,x1和x2相加的“和”由Z端输出。
可以看出,两数相加的和为Z=1 1 1 0。
由于该电路的输入和输出均是在时钟脉冲作用下,按位串行输入加数和被加数、串行输出“和”数的,故称此加法器为串行加法器。
如果需要保存相加的“和”数,可在输出端连接一个“串行输入/并行输出”的移位寄存器。加数和被加数也可事先放入“并行输入/串行输出”的移位寄存器中。
从这个例子可以看到,用组合逻辑电路实现的功能有的也可用时序电路来实现,不同的是,组合电路采用的是并行工作方式,而时序电路采用的是串行工作方式。因此,在完成同样的逻辑功能的情况下,组合电路比时序电路工作速度快,但时序电路的结构较组合电路简单。


视频讲解


例54分析如图517所示的节拍信号发生器电路。


图517例54的图



解: 首先写出激励函数和输出函数。

J1= 2,K1=Q2,J2=Q1,K2= 1

W0= 12,W1=Q12,W2=Q1Q2,W3=1Q2


JK触发器的次态方程为

Qn+11=J11+1Q1

Qn+12=J22+2Q2


将激励函数表达式代入,得电路的次态方程组为

Qn+11= 12+Q12

Qn+12=Q12+Q1Q2

根据电路的次态方程组就可得电路的状态表如表59所示。


表59例54的状态表



 现态次态输出

Q2Q1Qn+12Qn+11W0W1W2W3

00011000
01110100
11100010
10000001



图518时间图


这是一个Moore型电路,输出仅与现态有关。根据状态表可做出时间图如图518所示。由时间图可以看出,触发器FF2,FF1构成模4计数器,8个与非门用来组合产生4个节拍电平信号,电路在时钟脉冲的作用下,按一定的顺序轮流地输出节拍信号。


节拍信号发生器通常用在计算机的控制器中。计算机在执行一条指令时,总是把一条指令分成若干基本动作,由控制器发出一系列节拍电平和节拍脉冲信号,以控制计算机完成一条指令的执行。


视频讲解


5.2.2常用同步时序逻辑电路
1. 寄存器 
寄存器用于寄存一组二值代码,它被广泛地用于各类数字系统和数字计算机中。

因为1个触发器能存储1位二进制代码,所以用N个触发器组成的寄存器能存储N位二进制代码。
对寄存器中的触发器只要求它们具有置1、置0的功能即可,因而无论是用同步RS结构触发器,还是用主从结构或边沿触发结构的触发器,都可以组成寄存器。
图519是一个用同步RS触发器组成的4位寄存器的实例——74LS75的逻辑图。由同步RS触发器的动作特点可知,在CP的高电平期间,Q端的状态跟随D端的状态而变,在CP变成低电平以后,Q端将保持CP变为低电平时D端的状态。


74LS175则是用维持阻塞触发器组成的4位寄存器,它的逻辑图如图520所示。根据维持阻塞结构触发器的动作特点可知,触发器输出端的状态仅仅取决于CP上升沿到达时刻D端的状态。可见,虽然74LS75和74LS175都是4位寄存器,但由于采用了不同结构类型的触发器,其动作特点是不同的。为了增加使用的灵活性,有些寄存器电路还加了一些附加控制电路,如异步置0(将寄存器的数据直接清除,而不受时钟信号的控制)、输出三态控制和“保持”等功能。所谓“保持”就是将触发器的输出反馈到输入,当CP信号到达时下一个状态仍保持原来的状态。例如CMOS电路CC4076就属于这样一种寄存器,它的逻辑图如图521所示。
这是一个具有三态输出的4位寄存器。
当LDA+LDB=1时,电路处于装入数据的工作状态,输入数据D0、D1、D2、D3经与或门G5、G6、G7、G8分别加到4个触发器的输入端。在CP信号的下降沿到达后,将输入数据存入对应的触发器中。



图51974LS75的逻辑图




图52074LS175的逻辑图




图521CC4076逻辑图




当LDA+LDB=0时,电路处于保持状态。触发器的Q端经与或门接回自己的输入端,故CP到达时还是原来的状态值。
当 ENA=ENB=0时,门G1输出高电平,使三态门G10~G13处于工作状态,电路正常输出。当ENA、ENB中任一个为高电平时,则G1输出为低电平,使G10~G13处于高阻态,将触发器与输出端的联系切断。
当D=0时,将寄存器中的数据清除。
上面介绍的三个寄存器电路中,接收数据时所有位的代码是同时输入的,而且触发器中的数据是并行地出现在输出端的,因此将这种输入、输出方式叫并行输入、并行输出方式。


视频讲解


2. 移位寄存器
移位寄存器除了具有存储代码的功能以外,还具有移位功能。所谓移位功能,是指寄存器里存储的代码能在移位脉冲的作用下依次左移或右移。因此,移位寄存器不但可以用来寄存代码,还可以用来实现数据的串行并行转换、数值的运算以及数据处理等。

例如,由边沿触发结构的D触发器组成的4位移位寄存器(见图522),其中第一个触发器(左边)的输入端接收输入信号,其余的每个触发器输入端均与前面一个触发器的Q端相连。当CP的上升沿同时作用于所有触发器时,加到寄存器输入端Di的代码存入FF0,其余触发器的状态为原左边一位触发器的状态,即总的效果是将寄存器里原有的代码右移了一位。


图522用D触发器构成的移位寄存器



例如,在4个时钟周期内输入代码依次为Q0Q1Q2Q3=0000,那么在移位脉冲(也就是触发器的时钟脉冲)的作用下,移位寄存器里代码的移动情况将如表510所示。可以看到,经过4个CP信号以后,串行输入的4位代码全部移入了移位寄存器中,同时在4个触发器的输出端得到了并行输出的代码。因此,利用移位寄存器可以实现代码的串行并行转换。为便于扩展逻辑功能和增加使用的灵活性,在定型生产的移位寄存器集成电路上有的又附加了左、右移控制,数据并行输入、保持、异步置零等功能。如74LS194A就是一个4位双向移位寄存器,它的逻辑图如图523所示。


表510移位寄存器中代码的移动情况



CP的顺序输入DiQ0Q1Q2Q3
000000
111000
200100
311010
411101









图5234位双向移位寄存器74S194A的逻辑图



图523中的DiR为数据右移串行输入端; DiL为数据左移串行输入端; D0~D3为数据并行输入端; Q0~Q3为数据并行输出端。移位寄存器的工作状态由控制端S1和S0的状态指定,其功能如表511所示。


表51174LS194A的功能表



DS1S0工 作 状 态

0dd置零
100保持
101右移
110左移
111并行输入


现以第二位触发器FF1为例,分析一下S1、S0为不同取值时移位寄存器的工作状态。由图523可见,FF1的输入控制电路是由门G11和门G21组成的一个具有互补输出的4选1数据器的互补输出作为FF1的输入信号。
当S1=S0=0时,G11最右边的输入信号Qn1被选中,使触发器FF1的输入为S=Qn1,R=n1,故CP上升沿到达时FF1被置成Qn+11=Qn1。因此,移位寄存器工作在保持状态。

当S1=S0=1时,G11左边第二个输入信号D1被选中,使触发器FF1的输入为S=D1、R=1,故CP上升沿到达时FF1被置成Qn+11=D1,移位寄存器处于数据并行输入状态。


图524用T触发器构成的同步
二进制加法计数器

当S1=0,S0=1时,G11最左边的输入信号Qn0被选中,使触发器FF1的输入为S=Qn0,R=Qn0,故CP上升沿到达时FF1被置成Qn+11=Qn0,移位寄存器工作在右移状态。

当S1=1,S0=0时,G11右边第二个输入信号Qn2被选中,使触发器FF1的输入为S=Qn2,R=n2,故CP上升沿到达时触发器被置成Qn+11=Qn2,这时移位寄存器工作在左移状态。
此外,D=0时FF0~FF3将同时被置成Q=0,所以正常工作时应使D处于高电平。


视频讲解


3. 计数器
在数字系统中计数器是使用最多的一种电路。它不仅能用于对时钟脉冲计数,还可以用于分频、定时、产生节拍脉冲和脉冲序列以及进行数字运算等。
计数器的种类繁多,本节主要讨论同步计数器。目前生产的同步计数器芯片基本上分为二进制和十进制两种,下面分别举例说明。
1) 同步二进制计数器
图524是由T触发器构成的同步二进制加法计数器。由图可得到它的激励函数和输出函数的表达式为

T0=1,T1= Q0,T2=Q0Q1,T3=Q0Q1Q2

C= Q0Q1Q2Q3



T触发器的次态方程为 

Qn+1=T+Q


将激励函数代入,得电路的次态方程组为


Qn+10= 0

Qn+11=Q01+0Q1

Qn+12=Q0Q12+ Q0Q1Q2

Qn+13=Q0Q1Q23+ Q0Q1Q2Q3


整理得

Qn+10= 0

Qn+11=Q01+0Q1

Qn+12=Q0Q12+0Q2+1Q2

Qn+13=Q0Q1Q23+0Q3+1Q3+2Q3


将该方程组反映到卡诺图上得Y矩阵,如表512所示。


表512Y矩阵



Q1Q0
Q3Q2
00011110


00
01
11
10

0 0 0 10 1 0 11 1 0 11 0 0 1
0 0 1 00 1 1 01 1 1 01 0 1 0
0 1 0 0 1 0 0 00 0 0 01 1 0 0 
0 0 1 10 1 1 11 1 1 11 0 1 1 

根据Y矩阵和输出函数,很容易得到该电路的状态图(见图525)和时间图(见图526)。


图525状态图




图526时间图



从时间图上可以看出,若计数输入脉冲的频率为f0,则Q0、Q1、Q2和Q3端输出脉冲的频率将依次为 f0/2、f0/4、f0/8、f0/16。针对计数器的这种分频功能,也把它叫作分频器。此外,每输入16个计数脉冲,计数器工作一个循环,并在输出端C产生一个进位输出信号,所以又把这个电路叫十六进制计数器。n位二进制计数器也称为2n进制计数器,它所能计到的最大数为2n-1。
在实际生产的计数器芯片中,往往还附加一些控制电路,以增加电路的功能和使用的灵活性。如中规模集成芯片74161,逻辑图如图527所示。这个电路除了二进制加法计数功能外,还具有预置数、保持和异步置零等功能。图527中LD为预置数控制端,D0~D3为数据输入端,C为进位输出端,D为异步置零(复位)端,EP和ET为工作状态控制端。74161的功能表如表513所示。


图5274位同步二进制计数器74161的逻辑图



表5134位同步二进制计数器74161的功能表



CPDLDEPET工 作 状 态 

d0ddd置零
10dd预置数
d1101保持
d11d0保持(但C=0)
111 1计数


由图527可见,当D=0时所有触发器将同时被置零,而且置零操作不受其他输入端状态的影响。


图528同步十进制加法计数器电路



当D=1,LD=0时,电路工作在预置数状态,这时门G16~G19的输出始终是1,所以FF0~FF3输入端J、K的状态由D0~D3的状态决定。例如,若D0=1,则J0=1,K0=0,CP上升沿到达后FF0被置1。
当D=LD=1而EP=0,ET=1时,由于这时门G16~G19的输出均为0,亦即FF0~FF3均处在J=K=0的状态,所以CP信号到达时它们保持原来的状态不变,同时C的状态也得到保持。如果ET=0,则EP不论为何状态,计数器的状态也将保持不变,但这时进位输出C等于0。
当D=LD=EP=ET=1时,电路工作在计数状态,与图524电路的工作状态相同。从电路的0000状态开始连续输入16个计数脉冲时,电路将从1111状态返回0000状态,C端从高电平跳变至低电平,可以利用C端输出的高电平或下降沿作为进位输出信号。
74LS161在内部电路结构形式上与74161有些区别,但外部引线的配置、引脚排列以及功能表都和74161相同。


视频讲解


2) 同步十进制计数器
图528是用T触发器构成的同步十进制加法计数器电路。由图528可写出电路的激励函数、输出函数的表达式为

T0=1 

 T1=Q03

T2=Q0Q1 

T3=Q0Q1Q2+Q0Q3 

C=Q0Q3 



T触发器的次态方程为

Qn+1=T+Q


将激励函数代入,得电路的次态方程组为

Qn+10= 0
Qn+11=Q031+ Q03Q1
Qn+12=Q0Q12+ Q0Q1Q2 
Qn+13=(Q0Q1Q2+Q0Q3)3+(Q0Q1Q2+Q0Q3)Q3 


整理得

Qn+10= 0

Qn+11=Q013+0Q1+Q1Q3

Qn+12=Q0Q12+0Q2+1Q2

Qn+13=Q0Q1Q23+0Q3

将电路的次态方程组反映到卡诺图上,得Y矩阵如表514所示。


表514Y矩阵



Q1Q0
Q3Q2
00011110


00
01
11
10

0 0 0 10 1 0 11 1 0 11 0 0 1
0 0 1 00 1 1 00 1 0 00 0 0 0 
0 1 0 01 0 0 00 0 1 00 1 1 0
0 0 1 10 1 1 11 1 1 11 0 1 1 

由Y矩阵很容易可得状态图如图529所示。从图上可看出有效序列有10个状态,进行十进制的加法计数,从0000~1001重复计数。另外6个状态为无效序列,但能自动进入有效序列,该电路具有自恢复功能。


图529同步十进制加法计数器状态图


与二进制计数器类似,中规模集成芯片74160为同步十进制加法计数器,逻辑图如图530所示。它除了计数功能外,还有预置数、保持、异步置零等功能。图中的控制信号及功能表与上面讨论的74161完全一样,只是74160是十进制而74161是十六进制。


图530同步十进制加法计数器74160逻辑图



3) 任意进制计数器
从降低成本考虑,集成电路的定型产品必须有足够大的批量,因此目前常见的计数器芯片在记数进制上只做成应用较广的几种类型,如十进制、十六进制、7位二进制、12位二进制、14位二进制等。如需要其他任意进制时,只能用现有产品的进制计数器加一些辅助电路来实现。
假定已有N进制计数器,而需要得到M进制计数器。下面分两种情况来讨论。
① M<N的情况。
在N进制计数器的顺序计数过程中,设法使之越过N-M个状态,就可以得到M进制计数器了。实现跳跃的方法有置零法(或称复位法)和置数法(或称置位法)两种。
下面通过实例来说明这两种方法。


视频讲解


例55试利用同步十进制计数器74160接成同步六进制计数器。
解: 74160的逻辑图及功能在前面已讨论过了,它兼有异步置零和同步置数功能,所以置零法和置数法均可采用。
如图531所示的电路是采用异步置零法接成的六进制计数器。当计数器从0000(S0)计成Q3Q2Q1Q0=0110(即SM)状态时,担任译码器的门G输出低电平信号给D端,将计数器置零,回到0000状态。电路的状态图如图532所示。


图531置零法将74160接成六进制计数器




图532状态图



由于置零信号随着计数器被置零而立即消失,所以置零信号持续时间极短,如果触发器的复位速度有快有慢,则可能动作慢的触发器还未来得及复位,置零信号就已经消失,导致电路误动作。因此,这种接法的电路可靠性不高。
为了克服这个缺点,经常采用如图533所示的改进电路。图中的与非门G1起译码器的作用,当电路进入0110状态时,它输出低电平信号。与非门G2和G3组成了基本RS触发器,以它端输出的低电平作为计数器的置零信号。


图533图531电路的改进



若计数器从0000状态开始计数,则第6个计数输入脉冲上升沿到达时计数器进入0110状态,G1输出低电平,将基本RS触发器置1,端的低电平立刻将计数器置零。这时虽然G1输出的低电平信号随之消失了,但基本RS触发器的状态仍保持不变,因而计数器的置零信号得以维持。直到计数脉冲回到低电平以后,基本RS触发器被置零,端的低电平信号才消失。可见,加到计数器D端的置零信号宽度与输入计数脉冲高电平持续时间相等。
同时,进位输出脉冲也可以从基本RS触发器的Q端引出。该脉冲的宽度与计数脉冲高电平宽度相等。有些计数器产品中,将G1,G2,G3组成的附加电路直接制作在计数器芯片上,这样在使用时就不用外接附加电路了。
74160是异步置零,一旦置零信号出现,立即把计数器清零,而不必等脉冲的到来。所以上面的计数器电路一进入0110(SM)状态后,立即又被置成0000(S0)状态,所以SM状态仅在极短的瞬间出现,在稳定的状态循环中不包括SM状态。而采用置数法就不一样了,因为74160是同步置数,产生了置数信号后再等下一个脉冲来到才完成置数,故产生置数的状态包含在稳定的状态循环中。
采用置数法时可以从计数循环中的任何一个状态置入适当的数值而跳越N-M个状态,得到M进制计数器。图534中给出了两个不同的方案,其中图534(a)的接法是用Q3Q2Q1Q0=0101状态译码产生LD信号,下一个CP信号到达时置入0000状态,从而跳过0110~1001这4个状态,得到六进制计数器,如图535中的实线所表示的那样。


图534用置数法将74160接成六进制计数器



若采用图534(b)电路的方案,则可以从C端得到进位输出信号。在这种接法下,用0100状态译码产生LD=0信号,下个CP信号到来时置入1001(如图535中的虚线所示),因而循环状态中包含了1001这个状态,每个计数循环都会在C端给出一个进位脉冲。


图535状态图



由于74160的预置数是同步式的,即LD=0以后,还要等下一个CP信号到来时才置入数据,而这时LD=0的信号已稳定地建立了,所以不存在异步置零法中因置零信号持续时间过短而可靠性不高的问题。
② M>N的情况。
这时必须用多片N进制计数器组合起来,才能构成M进制计数器。各片之间(或称为各级之间)的连接方式可分为串行进位方式、并行进位方式、整体置零方式和整体置数方式几种。下面仅以两级之间的连接为例说明这4种连接方式的原理。
若M可以分解为两个小于N的因数相乘,即M=N1×N2,则可采用串行进位方式或并行进位方式将一个N1进制计数器和一个N2进制计数器连接起来,构成M进制计数器。
在串行进位方式中,以低位片的进位输出信号作为高位片的时钟输入号; 在并行进位方式中,以低位片的进位输出信号作为高位片的工作状态控制信号(计数的使能信号)。两片的CP输入端同时接计数输入信号。
例56试用两片同步十进制计数器接成百进制计数器。


视频讲解


解: 本例中M=100,N1=N2=10,将两片74160直接按并行进位方式或串行进位方式连接即得百进制计数器。
如图536所示的电路是并行进位方式的接法。以第(1)片的进位输出C作为第(2)片的EP和ET输入,每当第(1)片计成9(1001)时C变为1,下个CP信号到达时第(2)片为计数工作状态,计入1,而第(1)片计成0(0000),它的C端回到低电平。第(1)片的EP和ET恒为1,始终处于计数工作状态。


图536例56电路的并行进位方式



如图537所示的电路是串行进位方式的连接方法。两片74160的EP和ET恒为1,都工作在计数状态。第(1)片每计到9(1001)时C端输出变为高电平,经反相器后使第(2)片的CP端为低电平。下个计数输入脉冲到达后,第(1)片计成0(0000)状态,C端跳回低电平,经反相后使第(2)片的输入端产生一个正跳变,于是第(2)片计入1。可见,在这种接法下两片74160不是同步工作的。


图537例56电路的串行进位方式


在N1、N2不等于N时,可以先将两个N进制计数器分别接成N1进制计数器和N2进制计数器,然后再以并行进位方式或串行进位方式将它们连接起来。
当M为大于N的素数时,不能分解成N1和N2,上面讲的并行进位方式和串行进位方式就行不通了,这时必须采取整体置零方式或整体置数方式构成M进制计数器。
所谓整体置零方式,是首先将两片N进制计数器按最简单的方式接成一个大于M进制的计数器(例如N×N进制),然后在计数器计为M状态时译出异步置零信号D=0,将两片N进制计数器同时置零。这种方式的基本原理和M<N时的置零法是一样的。


整体置数方式也一样,在N×N进制的基础上进行,基本原理和M<N时的置数法类似,但要求已有的N进制计数器本身必须具备预置数功能。当M不是素数时整体置零法和置数法也可以使用。
例57试用两片同步十进制计数器74160接成二十九进制计数器。
解: 因为M=29是一个素数,所以必须用整体置零法或整体置数法构成二十九进制计数器。图538是整体置零方式的接法。首先将两片74160以并行进位方式连成一个百进制计数器。当计数器从全0状态开始计数,计入29个脉冲时,经门G1译码产生的低电平信号立刻将两74160同时置零,于是便得到了二十九进制计数器。需要注意的是计数过程中第(2)片74160不出现1001状态,因而它的C端不能给出进位信号。而且,门G1输出的脉冲持续时间极短,也不宜作进位输出信号。如果要求输出进位信号的持续时间为一个时钟信号周期,则应从电路的28状态译出当电路计入28个脉冲后门G2输出变为低电平,第29个计数脉冲到达后门G2的输出跳变为高电平。


图538例57电路的整体置零方式



通过这个例子可以看到,整体置零法不仅可靠性较差,而且往往还要另加译码电路才能得到需要的进位输出信号。
采用整体置数方式可以避免置零法的缺点。如图539所示的电路是采用整体置数法接成的二十九进制计数器。首先仍需将两片74160接成百进制计数器,然后将电路的28状态译码产生LD=0信号,同时加到两片74160上,在下个计数脉冲(第29个输入脉冲)到达时,将0000同时置入两片74160中,从而得到二十九进制计数器。进位信号可以直接由门G的输出端引出。


图539例57电路的整体置数方式



5.3同步时序逻辑电路的设计
同步时序逻辑电路的设计也称同步时序逻辑电路的综合。实际上设计是分析的逆过程,就是根据给定的逻辑功能要求,设计出能实现其逻辑功能的时序电路。设计的流程如图540所示,一般步骤如下: 


图540同步时序电路设计流程图


(1) 根据逻辑问题的文字描述建立原始状态表。进行这一步时,可借助于原始状态图,再构成原始状态表。这一步得到的状态图和状态表是原始的,其中可能包含多余的状态。
(2) 采用状态化简方法将原始状态表化为最简状态表。
(3) 进行状态分配(或状态赋值)。即将状态符号用代码表示,得到二进制形式的状态表。
(4) 根据二进制状态表和选用的触发器特性求电路的激励函数和输出函数。求激励函数可用表格法或代数法,具体方法在举例中讨论。
(5) 根据激励函数和输出函数的表达式,画出所要求的逻辑图。

一般说来,同步时序电路设计按上面5个步骤进行。但是,对于某些特殊的同步时序电路,由于状态数量和状态编码方案都已给定,上述设计步骤中的状态化简和状态编码便可以省略,从第(1)步直接跳到第(4)步。


视频讲解


5.3.1建立原始状态表 
建立原始状态表的方法可以先借助于原始状态图,画出原始状态图以后再列出原始状态表。目前还没有一个建立原始状态图的系统的算法,主要是采用直观的经验方法。设计一个时序电路首先应该考虑其包括几个状态、状态间如何进行转换、怎样产生输出。
一般的过程是这样: 首先假定一个初始状态A,从这个初始状态A开始,每加入一个输入,就可确定其次态和输出。该次态可能是现态本身,也可能是已有的另一个状态,或是新增加的一个状态。继续这个过程,直到每种输入的可能性、每个现态向其次态的转换都已被考虑到,并且不再构成新的状态为止。
例58建立一个模5的加1/加2计数器的状态图和状态表。
解: 对于模5计数器,显然应有5个状态,设为A~E,以分别记住所输入的脉冲个数。由于这个计数器既可累加1,又可累加2,故需设一个控制输入信号x,当x=0时加1,x=1时加2,Z为输出,表示有进位。
经以上分析后,可画出该计数器的原始状态图和状态表,如图541所示。


图541例58的状态图和状态表



例59有一个串行数据检测器。对它的要求是: 连续输入3个或3个以上的1时输出为1,其他输入情况输出为0。例如: 
输入序列x:  1 0 1 1 0 0 1 1 1 0 1 1 1 1 0
输出序列Z:  0 0 0 0 0 0 0 0 1 0 0 0 1 1 0

解: 设电路在没有输入1以前的状态(初态)为A,输入一个1以后的状态为B,连续输入两个1以后的状态为C,连续输入3个或3个以上1以后的状态为D,此时输出Z为1。当输入一个0时,不管当时电路处于何种状态,电路都将回到初始状态A,表示检测器需要重新记录连续输入1的个数。根据以上分析可得该检测器的原始状态图和状态表如图542所示。


图542例59的状态图和状态表



5.3.2状态表的化简
在建立原始状态表的过程中,为了满足给定的功能要求,可能引入了多余的状态。电路中状态的数目越多,所需的存储元件就越多。因此,在得到原始状态表后,下一步工作就是进行状态表的化简。以尽量减少所需状态的数目,使实现它的电路最简单。
完全确定状态表和不完全确定状态表的化简方法有所不同。下面分别讨论。



视频讲解


1. 完全确定状态表的化简 
完全确定状态表的化简是建立在状态等价这个概念的基础上的。为此先讨论等价的几个概念。
1) 等价的概念
① 等价状态:  设A和B是时序电路状态表的两个状态,如果从A和B开始,任何加到时序电路上的输入序列均产生相同的输出序列,则称状态A和B为等价状态或等价状态对,并记为(A,B)或{A B}。等价状态可以合并。
② 等价状态的传递性:  若状态A和B等价,状态B和C等价,则状态A和C也等价,记为(A,B),(B,C)→(A,C)。
③ 等价类: 彼此等价的状态集合,称为等价类。若(A,B)和(B,C),则有等价类(A,B,C)。
④ 最大等价类:  若一个等价类不是任何别的等价类的子集,则此等价类称为最大等价类。显然,状态表化简的根本任务在于从原始状态表中找出所有的最大等价类。下面介绍具体的化简方法。
2) 化简方法
这里介绍一种叫隐含表的方法。它的基本思想是: 先对原始状态表中的各状态进行两两比较,找出等价状态对; 然后利用等价的传递性,得到等价类; 最后确定一组等价类,以建立最简状态表。
根据等价状态的定义,两个状态是否等价的条件可归纳为如下两点: 
第一,在各种输入取值下,它们的输出完全相同。
第二,在第一个条件满足的前提下,它们的次态满足下列条件之一,即
① 次态相同; 
② 次态交错; 
③ 次态循环; 
④ 次态对等价。



图543隐含表格式


这里的次态交错是指在某种输入取值下,如Si的次态为Sj,Sj的次态为Si。次态循环是次态之间的关系构成闭环,如Si、Sj的次态是Sl、Sk,而Sl、Sk的次态又是Si、Sj。

化简的具体步骤如下: 

(1) 画隐含表。隐含表是一个三角形矩阵。设原始状态表有n个状态q1~qn,在隐含表的水平方向标以状态q1,q2,…,qn-1,垂直方向标以q2,q3,…,qn,即垂直方向“去头”,水平方向“少尾”。隐含表中每个小方格表示一个状态对(qi,qj)。隐含表的格式如图543所示。


(2) 顺序比较。顺序比较隐含表中各状态之间的关系,比较结果有如下三种情况: 
① qi和qj输出完全相同,次态也相同,或者为现态本身或者交错,qi和qj等价,在隐含表相应的方格内标以√。
② qi和qj输出不同,表示qi和qj不等价,在对应的方格内标以×。
③ qi和qj输出相同,但次态既不相同,也不交错。qi和qj是否等价有待进一步考察,在对应的方格内标以qi和qj的次态对。
(3) 关联比较。顺序比较中不能确定的关系的状态对标在方格中,由关联比较进一步考察。这一步在隐含表上直接进行,若后续状态对等价或出现循环,则这些状态对都是等价的; 若后续状态对中出现不等价,则在它以前的状态对都是不等价的。
(4) 找最大等价类,作最简状态表。关联比较后,由等价的传递性可确定最大等价类。
注意: 不与其他任何状态等价的单个状态也是一个最大等价类。每个最大等价类可以合并为一个状态,并以一个新符号表示。这样,由一组新符号构成的状态表便是所求的最简状态表。
例510化简如图544(a)所示的原始状态表。


图544例510图




解: 化简步骤如下。
① 画隐含表,如图544(b)所示。
② 顺序比较,结果如图544(b)所示。
③ 关联比较。AB→BC→×

BD→BC→×
说明BC不等价,那么AB,BD也不等价。
④ 列最大等价类。由关联比较结果可得最大等价类为
(A,D),(B),(C)
令a=(A,D),b=(B),c=(C)
得最简状态表如图544(c)所示。
例511化简如图545(a)所示的原始状态表。

解: 化简步骤如下。
① 画隐含表,如图545(b)所示。
② 顺序比较,结果如图545(b)所示。


图545例511的图 


③ 关联比较。
AB→CF→√,所以AB等价; 
AE→BE→CF→√,AE,BE构成循环。

所以AE,BE都等价。
DG→CD→×,则DG不等价。

↘DE→×
④ 列出最大等价类。
本例中得最大等价类为
(A,B,E),(C,F),(D),(G)
将最大等价类(A,B,E),(C,F),(D),(G)分别用新符号a,b,c,d表示,得最简状态表如图545(c)所示。 


视频讲解


2.  不完全确定的状态表的化简 
对于不完全确定的状态表的化简是建立在状态相容概念的基础上的。为此先讨论相容的几个概念。
1) 相容概念
① 相容状态。设A和B是时序电路状态表的两个状态,如果从A和B开始,任何加到时序电路的有效输入序列均产生相同的输出序列(除不确定的那些位之外),那么A和B是相容的,记作(A,B)。相容状态可合并。
② 相容状态无传递性。(A,B),(B,C),但不一定有(A,C)。
③ 相容类。所有状态之间都两两相容的状态集合。
④ 最大相容类。若一个相容类不是任何其他相容类的子集时,则称此相容类为最大相容类。
2) 化简方法
与完全确定的状态表的化简过程大致相同,主要有以下几步: 
(1) 作隐含表,找相容状态对。
(2) 画合并图,找最大相容类。合并图就是在圆周上标上代表状态的点,点与点之间的连线表示两状态之间的相容关系,而所有点之间都有连线的多边形就构成一个最大相容类。
(3) 做出最简状态表。这一步与完全给定的状态表化简不一样。首先需要从最大相容类(或相容类)中选出一组能覆盖原始状态表全部状态的相容类,这一组相容类必须满足以下三个条件。
① 覆盖性。所选相容类集合应包含原始状态表的全部状态。
② 最小性。所选相容类个数应最小。
③ 闭合性。所选相容类集合中的任一相容类,在原始状态表中任一输入条件下产生的次态应该属于该集合中的某一个相容类。
同时具有覆盖、最小、闭合三个条件的相容类集合,称为最小闭覆盖,这就组成了最简状态表。 
例512简化如图546(a)所示的状态表。


图546例512的图


解: 化简步骤如下。
① 作隐含表,找相容状态对。隐含表如图546(b)所示。顺序比较后进行关联比较。
② AF→CD→√

BC→ AB→√




DE→√

BD→DE→√

BE→BF→CD→√


CE→AF→√

CF→CE→√

DF→CE→√



图547合并图

则得到全部相容状态对。
(A,B), (A,F), (B,C), (B,D), (B,E), (B,F),

(C,D), (C,E), (C,F), (D,F), (D,E), (E,F)
③ 作合并图,求最大相容类。

状态合并图如图547所示。图中B,C,D,E,F各点都有连线,构成一个全互连多边形,A,B,F构成一个三角形。于是,找到两个最大相容类。
(A,B,F),(B,C,D,E,F)
④ 作最简状态表。

从最大相容类和相容类中选择一组能覆盖原始状态表中全部状态的相容类,假设就选两个最大相容类(A,B,F),(B,C,D,E,F),作闭合覆盖表,检查其是否满足覆盖性和闭合性。闭合覆盖表如表515所示。 


表515例512的闭合覆盖表



相容类覆盖闭合

ABCDEFX=0X=1

ABFABFBCD
BCDEFBCDEFABFCDE


从表515可看出: 相容类集合(A,B,F),(B,C,D,E,F)覆盖了状态表图546(a)的全部状态,而且每个相容类在任何一种输入情况下的次态集合都完全落在相容类集合中的某个相容类中,因此它们满足了闭合和覆盖这两个条件。此外,相容类的数目已不能再少,满足了最小条件。如果令A′=(A,B,F),B′=(B,C,D,E,F),则可得最简状态表如表516所示。从表中可看出,当x=0时,A′的次态为A′或B′,因为(A,B,F)在x=0时的次态为B,而B既属于相容类(A,B,F),又属于相容类(B,C,D,E,F),因此在表中相应位置填入A′,B′,表明状态A′在x=0时的次态既可以是A′也可以是B′。进一步考虑,该最简状态表中只有A′和B′两个状态,所以可用无关项d表示,如表517所示。这样处理有利于相应电路的简化,这在后面进行设计电路时可得到进一步理解。有时选取的最大相容类作为相容类集合在闭合检查并不能使次态都属于某个相容类,即会出现不闭合的情况,这时可调整相容类集合的选取,有时不选用最大的相容类而选其中的一个子集反而能满足闭合、覆盖、最小的条件,得到最简状态表。这里不再举例说明,读者可参阅有关参考文献。


表516最简状态表



Q x

01Z

A′A′B′B′0
B′A′B′1


表517处理后的最简状态表



Q x

01Z

A′dB′0
B′A′B′1



视频讲解


5.3.3状态分配
所谓状态分配,是指给最小化状态表中的每个字母或数字表示的状态,指定一个二进制代码,形成二进制状态表。
一般情况下,采用的状态编码方案不同,所得到的输出函数和激励函数的表达式也不同,从而设计出来的电路的复杂程度也不同。因此,状态编码的任务是: 
(1) 确定状态编码的长度(即触发器的位数)。
(2) 寻找一种最佳的或接近最佳的状态分配方案,以便使所设计的时序电路最简要。

第一个任务较简单,设最简状态表的状态数为N,状态编码的长度为n,状态数N与状态编码长度n的关系为

2n-1<N≤2n


例如,某状态表的状态数N=4,则状态分配时,二进制代码的位数应为n=2,即需用两位触发器。
第二个任务就没有这么简单。因为状态编码长度确定后,究竟用哪种二进制代码代替哪个状态,这可以有许多种状态分配方案。
一般地,如状态数为N,状态编码长度为n,则可能的分配方案数KS为

KS=2n!(2n-N)!


例如N=4,n=2时,有24种状态分配方案,如表518所示。这24种分配方案中,实际上只有3种独立的分配方案,其他的方案实质上是等效的(对于电路的难易程度),彼此独立的分配方案KU为

KU=(2n-1)!(2n-N)!n!


当变量数目增加时,其分配方案的数就会急剧增大。表519表明了状态数与状态分配方案的关系。


表518N=4,n=2时的全部分配方案



状态方案

123456789101112

A001001110001101100100111
B011100101011000111011000
C110110001110010001110010
D100011010100111010001101

状态方案

131415161718192021222324

A 000110110010011100011011
B 111001001000110101001110
C 101100010111001010110001
D 010011101101100011100100 


表519状态数与状态分配方案总数的关系



状态数N二进制代码
位数n独立分配方案
数KU状态数N二进制代码
位数n独立分配方案
数KU
10    —63   420
21    173   840
32    383   840
42    39410810800
53   14010475675600



在如此众多的状态分配方案中找出一种最佳的分配方案十分困难,且它还与采用什么类型的触发器有关系,因此没有必要将所有分配方案研究一遍。在实际工作中,常采用经验的方法,通过按一定的原则进行分配来获得接近最佳的分配方案。
状态分配的原则为: 
(1) 在相同输入条件下,次态相同,现态应相邻编码。
(2) 在不同输入条件下,同一现态的次态应相邻编码。
(3) 输出完全相同,两个现态应相邻编码。
以上三个原则中,第一条最重要,应优先考虑。下面举例说明。
例513对表520的最简状态表进行状态分配。


表520例513状态表



QX

01

AC/0D/0
BC/0A/0
CB/0D/0
DA/1B/1


解: 有4个状态,选用两位触发器y1y0。
根据原则(1),AB、AC应相邻编码; 
根据原则(2),CD、AC、BD、AB应相邻编码; 
根据原则(3),AB、AC、BC应相邻编码。


图548状态分配

综合上述要求,AB、AC应给予相邻编码,这是三个原则都要求的。借用卡诺图,很容易得到满足上述相邻要求的状态分配方案,如图548所示。根据该图可得状态编码为

A=00,B=01,C=10,D=11



将上述编码代入状态表得二进制状态表如表521所示。当然,上述分配方案不是唯一的。大多数情况下,根据以上三个原则进行状态分配是有效的。不同的状态分配方案并不影响同步时序电路的逻辑功能及稳定性,仅影响电路的复杂程度。


表521二进制状态表



y1y0
X

01

0010/011/0
0110/000/0
1001/011/0
1100/101/1

5.3.4求激励函数和输出函数
在求出了二进制状态表后,可用表格法或代数法求激励函数、输出函数,进而可画出逻辑图。
1. 表格法 
(1) 将二进制状态表变换成YZ矩阵。


视频讲解


将二进制状态表排成卡诺图的形式,即得YZ矩阵。例如,将表521的二进制状态表变换成YZ矩阵,如表522所示。
(2) 由YZ矩阵变换成激励矩阵和输出矩阵。
YZ矩阵可看成由Y矩阵和Z矩阵两部分构成。Y矩阵给出每一现态yi的次态值y n+1i,而由现态yi向次态y n+1i的转换依靠触发器的输入激励,这个激励可根据所选触发器的激励表来确定。把Y矩阵中的次态值y n+1i代之以相应的触发器的激励值,就得到激励函数的卡诺图形式,这个卡诺图称为激励矩阵。由YZ矩阵的另一部分Z矩阵,直接可得输出矩阵。例如,假定选JK触发器来实现表522的YZ矩阵,则它的激励矩阵和输出矩阵如表523和表524所示。


表522YZ矩阵



 y1y0x

01

0010/011/0
0110/000/0
1100/101/1
1001/011/0



表523激励矩阵J1K1和J0K0



 y1y0x

01

001d,0d1d,1d
011d,d10d,d1
11d1,d1d1,d0
10d1,1dd0,1d


表524输出矩阵Z



 y1y0x

01

0000
0100
1111
1000


关于触发器的激励表在第4章已讨论过,为了设计电路方便查阅,将RS、JK、D、T触发器的激励表列于表525~表528,表中Q为现态,Qn+1为次态。


表525RS触发器的激励表



QQn+1RS
00d1
0110
1001
111d



表526JK触发器的激励表



QQn+1JK
 000d
 011d
 10d1
11d 0



表527D触发器的激励表



QQn+1D
000
011
100
111



表528T触发器的激励表



 QQn+1T
000
011
101
110


(3) 由激励和输出矩阵,求激励函数和输出函数。
激励矩阵可以看成各个输入激励填在同一个卡诺图上。因此,在求各个激励函数时,只要分别画出各个输入激励的卡诺图,并由此写出各个激励函数的最简表达式即可。同理,由输出矩阵可写出输出函数的最简表达式。
例如,根据表523和表524可得J1,K1,J0,K0,Z这5个卡诺图,如图549所示,并由此可写出激励函数、输出函数表达式。


图549卡诺图




J1=x-+y-0K1=y0+x-J0=x+y1K0=x-+y-1Z=y1y0




视频讲解


2. 代数法
根据YZ矩阵(二进制状态表)写出电路的次态方程如下: 

yn+11= x-y-1+xy-0

yn+10=xy-0+xy1+y1y-0


因为JK触发器的次态方程为

Qn+1=J+Q


将电路的次态方程转换成以下形式: 


yn+11= x-y-1+xy-0= x-y-1+xy-0(y-1+y1)

= x-y-1+xy-0y-1+xy-0y1=(x-+xy-0)y-1+xy-0y1

=(x-+y-0)y-1+xy-0y1

yn+10=xy-0+xy1+y1y-0=(x+y1)y-0+xy1(y0+y-0)

=(x+y1)y-0+xy1y0


与JK触发器次态方程比较得激励函数为

J1= x-+y-0K1= xy-0= x-+y0

J0=x+y1K0= xy1= x-+y-1




视频讲解


5.4VHDL时序电路的设计特点
5.4.1电路的时钟控制


时序电路的输出和当前的输入以及历史状态有关,它具有“记忆”功能。常用的时序单元电路主要有寄存器、计数器等。构成这些单元电路的基础是触发器、时钟、复位/置位等信号。
时钟信号通常描述时序电路程序的执行条件。时钟边沿分上升沿和下降沿。一般时序电路的同步点在上升沿。为了描述时钟的属性,可以使用时钟信号的属性描述。时钟信号上升沿的属性描述表达式可写为

clk'eventANDclk='1';


同理,下降沿的属性描述只需将表达式中的clk='1'改为clk='0'。
在VHDL中,时序电路总是以时钟进程的形式来描述的,其描述方法有两种。
(1) 在时序电路描述中,时钟信号作为敏感信号显式地出现在PROCESS语句后的括号里。一般描述格式为

PROCESS(时钟信号名[,其他敏感信号])

BEGIN

IF 时钟边沿表达式 THEN

{语句;  }

END IF;  

END PROCESS;  


(2) 在时序电路描述中,时钟不列入进程的敏感信号,而用WAIT ON语句来控制程序的执行。在这种方式中,进程通常停留在WAIT ON语句上,这个点也称为进程的同步点,只有在时钟信号到来且满足边沿条件时,其余的语句才能执行。一般描述格式为

PROCESS

BEGIN

WAIT ON 时钟信号名 UNIT 时钟边沿表达式

{语句;  }

END PROCESS;  

注意: 对时钟边沿说明时,一定要说明是上升沿还是下降沿,WAIT ON语句只能放在进程的最前面或最后面。
时序电路的初始状态一般由复位/置位信号来设置,设置方式有两种。
(1) 同步复位/置位方式: 所谓同步复位/置位方式就是在复位/置位信号有效且给定的时钟边沿到来时,时序电路才被复位/置位。一般格式为

PROCESS(时钟信号名)

BEGIN 

IF 时钟边沿表达式 AND 复位置位条件表达式THEN

[复位/置位语句;  ]

ELSE

[其他执行语句;  ]

END IF;

END PROCESS;

或  

PROCESS 

BEGIN

WAIT ON 时钟信号名 UNTIL 时钟边沿表达式

IF 复位/置位条件表达式 THEN

[复位/置位语句;  ]

ELSE

[其他执行语句;  ]

END IF;

ENDPROCESS;


(2) 异步复位/置位方式: 所谓异步复位/置位,就是复位/置位信号有效时,电路立即复位/置位,与时钟信号无关。在描述异步复位/置位电路时,在进程的敏感表中应同时加入时钟信号和复位/置位信号。一般格式为

PROCESS(时钟信号,复位/置位信号)

BEGIN 

IF 复位/置位条件表达式 THEN 

[复位/置位语句;  ]

ELSIF 时钟边沿表达式 THEN 

[其他执行语句;  ]

END IF;

END PROCESS;



视频讲解


5.4.2状态图的VHDL描述


图550Moore型电路的
状态转移图


利用VHDL设计时序电路,不需要按照传统的设计方法进行烦琐的状态简化、状态分配、求解激励函数和输出函数等就可以简便地根据状态转移图直接进行描述。所有的状态均可表示为CASE_WHEN结构中的一条CASE语句,而状态的转移则通过IF_THEN_ELSE语句实现。时序电路分为Moore型和Mealy型电路,其VHDL描述略有差别。

例514用VHDL描述Moore型电路的状态转移,状态转移图如图550所示。


解: VHDL描述如下。

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity moore is

port(clk,datain,reset:in std_logic;

dataout:out std_logic_vector(1 downto 0));

end moore;

architecture a of moore is

type state_type is (s1,s2,s3,s4);--用户自己定义的枚举类型

signal state:state_type;                         --信号声明

begin

demo_process:process(clk,reset)               --状态转移进程,clk,reset为敏感信号

begin

if reset='1' then   state<=s1;        --初始状态为s1,异步设置

elsif clk'event and clk='1' then       	--当clk上升沿到来时执行下面的语句

case state is

when s1=>if datain='1' then 

state<=s2;

end if;

when s2=>if datain='0' then 

state<=s3;

end if;

when s3=>if datain='1' then 

state<=s4;

end if;

when s4=>if datain='0' then 

state<=s1;

end if;

end case;

end if;

end process;

output_p:process(state)                   --输出变化进程,状态为敏感信号

begin

case state is

when s1=>dataout<="01";

when s2=>dataout<="10";

when s3=>dataout<="11";

when s4=>dataout<="00";

end case;

end process;

end a;


Mealy型电路的VHDL描述与上面的程序大体相同,差别就在于输出变化进程中的输出信号需要根据输入信号的变化来确定输出值,可以用IF_THEN_ELSE语句来实现。
例515用VHDL描述Mealy型电路的状态转移,状态转移图如图551所示。


图551Mealy型电路的状态转移图



解: VHDL描述如下。

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity mealy is

port(clk,datain,reset:in std_logic;

dataout:out std_logic_vector(1 downto 0));

end mealy;

architecture a of mealy is

type state_type is (s1,s2,s3,s4);                 --用户自己定义的枚举类型

signal state:state_type;                        --信号声明

begin

demo_process:process(clk,reset)              --状态转移进程,clk,reset为敏感信号

begin

if reset='1' then   state<=s1;      --初始状态为s1,异步设置

elsif clk'event and clk='1' then      --当clk上升沿到来时执行下面的语句

case state is

when s1=>if datain='1' then 

state<=s2;

end if;

when s2=>if datain='0' then 

state<=s3;

end if;

when s3=>if datain='1' then 

state<=s4;

end if;

when s4=>if datain='0' then 

state<=s1;

end if;

end case;

end if;

end process;

output_p:process(state)             --输出变化进程,状态为敏感信号

begin

case state is

when s1=> if datain='1' then dataout<="01"; 

--输出值取决于输入值与现态

elsedataout<="00";

end if;

when s2=> if datain='0' then dataout<="10";

elsedataout<="00";

end if;

when s3=> if datain='1' then dataout<="11";

elsedataout<="00";

end if;

when s4=> if datain='0' then dataout<="00";

elsedataout<="01";

end if;

end case;

end process;

end a;

从上述两个例子可以看出,Mealy型电路的输出是现态和现输入的函数,而Moore型电路的输出只与现态有关。

5.5同步时序逻辑电路设计举例
以上花了较多的篇幅讨论了同步时序逻辑电路的设计方法。一般而言,设计方法要比分析方法复杂一些,对于前面讲的设计步骤,应根据实际情况灵活运用。下面举几个设计实例。
例516将例59的111…序列检测器的问题进一步完成设计。
解: 在例59中已经得到该检测器的原始状态表。现重列出如表529所示,经简化为表530。


表529原始状态表



Qx
01

AA/0B/0
BA/0C/0
CA/0D/1
DA/0D/1  


表530最简状态表



Qx
01

AA/0B/0
BA/0C/0
CA/0C/1



图552状态分配



简化状态表共三个状态,所以需要两位触发器Q1和Q0。根据状态分配的原则,一种较简单的分案如图552所示。根据这个状态分配方案可得二进制状态表(YZ矩阵),如表531所示。
若选用JK触发器作为存储元件。如用表格法,可根据JK触发器的激励表得到电路的激励矩阵,如表532所示。



表531YZ矩阵



Q1Q0x
01

0000/001/0
0100/010/0
11dd/ddd/d
1000/010/1



表532激励矩阵J1K1和J0K0



Q1Q0x
01

000d,0d0d,1d
010d,d11d,d1
11dd,dddd,dd
10d1,0dd0,0d


分别画出各激励函数J1,K1,J0,K0和输出函数Z的卡诺图,如图553所示。


图553卡诺图



由卡诺图可得激励函数和输出函数为

J1=xQ0,K1= x-,J0=x1, K0=1,Z=xQ1


如用代数法,则可根据YZ矩阵先写出电路的次态方程。

Qn+11=xQ1+xQ0

Qn+10=x10


因JK触发器的次态方程为

Qn+1=J+Q


将电路次态方程转换成以下形式: 

Qn+11=xQ1+xQ0(Q1+1)=xQ01+xQ1

Qn+10=x10=x10+0Q0


与JK触发器次态方程相比较就得激励函数为

J1=xQ0,K1= x-,J0=x1,K0=1


结果与表格法一致,根据激励函数和输出函数可得逻辑图如图554所示。从这个逻辑图可推出实际的电路状态图如图555所示。该状态图表明,当电路进入无效状态11后,若x=1则次态转入10; 若x=0则次态转入00,因此这个电路是能够自启动的。


图554例516逻辑图




图555图554的状态图



本例中若改用D触发器,则由于D触发器的次态方程为 Qn+1=D,即电路的次态方程就是D触发器的激励方程。


D1=xQ1+xQ0=x10

D0=x10

逻辑图如图556所示。


图556用D触发器组成的序列检测器



这个电路用VHDL的状态图描述如下: 

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity sequence_detector is

port(clk,x,RD: in std_logic;

Z: out std_logic);

endsequence_detector;

architecture one of sequence_detector is

type state_type is (A,B,C);                   --用户自己定义的枚举类型

signal state:state_type;                      --信号声明

begin

process(clk,RD)                          --状态转移进程,clk,RD为敏感信号

begin

ifRD='0' thenstate<=A;      --初始状态为A

elsif clk'event and clk='0' then      --当clk下降沿到来时执行下面的语句

case state is

when A=>ifx='1' then 

state<=B;

end if;

when B=>ifx ='1' then 

state<=C;

elsestate<=A;

end if;

when C=>ifx ='0' then

state<=A;

end if;

end case;

end if;

end process;

output_p:process(state)             --输出变化进程,状态为敏感信号

begin

case state is

when  C=> ifx='1' then 

Z<='1';            --输出值取决于输入值与现态

elseZ<='0';

end if;

whenothers=>Z<='0';           --其余情况输出为零

end case;

end process;

end one;


该VHDL程序运行的仿真图如图557 所示,这是Mealy型时序电路,输入变量X的变化直接影响到输出变量Z,而状态的变化会等到时钟有效边沿到来时才发生。还可注意到,此电路是111…序列检测器,即检测到3个及3个以上连续的1时,输出Z=1,但从时间仿真图中看到第二个脉冲的有效边沿后就出现Z=1,这就是Mealy型电路的特点,这时实际上已进入第三个节拍段,也就是第三个1已经出现,Z的变化与输入X同步,所以有Z=1。


图557111…序列检测器的时间仿真图



例517设计一个自动售饮料机的逻辑电路,它的投币口每次只能投入一枚五角或一元的硬币。投入一元五角硬币后,机器会自动给出一杯饮料; 投入两元(两枚一元)硬币后,在给出饮料的同时找回一枚五角的硬币。
解: 取投币信号为输入逻辑变量,投入一枚一元硬币时用A=1表示,未投入时A=0; 投入一枚五角硬币用B=1表示,未投入时B=0。给出饮料和找钱为两个输出变量,分别以Y,Z表示。给出饮料时Y=1,不给时Y=0; 找回一枚五角硬币时Z=1,不找时Z=0。


图558例517的状态图


假定通过传感器产生的投币信号(A=1或B=1)在电路转入新状态的同时也随之消失,否则将被误认作又一次投币信号。

设未投币前电路的初始状态为S0,投入五角硬币以后为S1,投入一元硬币(包括投入一

枚一元硬币和投入两枚五角硬币的情况)以后为S2。再投入一枚五角硬币后电路返回S0,同时输出为Y=1,Z=0; 如果投入的是一枚一元硬币,则电路也应返回S0,同时输出为Y=1,Z=1。因此,电路的状态数M=3已足够。根据以上分析,可得自动售饮料机的逻辑电路的状态图如图558所示。


根据状态图可得状态表如表533所示。因为正常工作中不会出现AB=11的情况,所以这时次态和输出均为无关项。又因该状态表已为最简形式,所以不必再进行化简过程。


表533例517的状态表



状态
AB
00011110

S0S0/00S1/00d/ddS2/00
S1S1/00S2/00d/ddS0/10
S2S2/00S0/10d/ddS0/11

状态分配。由于状态表中有三个状态,取触发器的位数n=2,即Q1Q0就满足要求,假如令S0=00,S1=01,S2=10,Q1Q0=11作无关状态,则得二进制状态表(YZ矩阵)如表534所示。


表534二进制状态表(YZ矩阵)



Q1Q0
AB
00011110


00
01
11
10

00/0001/00dd/dd10/00  
01/0010/00dd/dd00/10
dd/dddd/dddd/dddd/dd
10/0000/10dd/dd00/11


若电路选用D触发器实现,则刚刚求出的YZ矩阵中的Y矩阵也就是激励矩阵。这是因为D触发器的次态方程为Qn+1=D。根据激励矩阵可得激励和输出的卡诺图如图559所示。


图559卡诺图



根据卡诺图可得激励函数和输出函数的表达式为


D1=Q1AB+Q1Q0A+Q0B

D0= Q1Q0B+Q0A B

Z=Q1A

Y=Q1B+Q1A+Q0A


根据激励函数和输出函数可得逻辑图如图560所示,该逻辑图的实际状态图如图561所示。实际的状态图画法是将卡诺图化简过程中圈进去的无关项作为1,没有圈进去的无关项作为0,就可推出。



图560例517的逻辑图



图561图560电路的状态图


从图561可看出,当电路进入无效状态11以后,在无输入信号的情况下(即AB=00)不能自行返回有效循环,所以不能自启动。当AB=01或AB=10时电路在时钟信号作用下虽然能返回有效循环中去,但收费结果是错误的。因此,在开始工作时应在异步置零端 D上加入低电平信号将电路置为00状态。
这个电路用VHDL的状态图描述如下: 

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity vendor is

port(clk, A,B,RD: in std_logic;

Y,Z: out std_logic);

endvendor;

architecture one of vendor is

type state_type is (s0,s1,s2);--用户自己定义的枚举类型

signal state:state_type;                        --信号声明

begin

process(clk,RD)                   --状态转移进程,clk,RD为敏感信号

begin

ifRD='0' thenstate<=s0;      --初始状态为s0

elsif clk'event and clk='0' then      --当clk下降沿到来时执行下面的语句

case state is

when s0=>ifA='1' then 

state<=s2;

elsifB='1'then

state<=s1;

end if;

when s1=>ifA ='1' then 

state<=s0;

elsifB='1'then

state<=s2;

end if;

when s2=>ifA ='1'or B='1' then 

state<=s0;

end if;

end case;

end if;

end process;

output_p:process(state)                        --输出变化进程,状态为敏感信号

begin

case state is

when s1=> ifA='1' then 

Y<='1';    --输出值取决于输入值与现态

Z<='0';

end if;

when s2=> ifA='1' then 

Y<='1';    --输出值取决于输入值与现态

Z<='1';

elsifB='1' then

Y<='1'; 

Z<='0'; 

end if;

when others=> Y<='0'; Z<='0';      --其余情况输出为零

end case;

end process;

end one;


例518试设计一个带有进位输出端的十三进制计数器。
解: 首先进行逻辑抽象。
因为计数器的工作特点是在时钟信号的操作下自动地依次从一个状态转为下一个状态,所以它没有输入逻辑变量,只有进位输出信号。因此,计数器是属于Moore型的一种简单时序电路。
取进位信号为输出逻辑变量C,同时规定有进位输出时C=1,无进位输出时C=0。


图562例518的状态图


十三进制计数器应该有13个有效状态,若分别用S0,S1,…,S12表示,则按题意可以画出如图562所示的电路状态转换图。

因为十三进制计数器必须用13个不同的状态表示已经输入的脉冲数,所以状态转换图已不能再化简。 根据状态数可知,现要求N=13,故应取触发器位数n=4,因为
23<13<24
假如对状态分配无特殊要求,可以取自然二进制数的0000~1100作为S0~S12的编码,于是得到了表535中的状态编码。


表535例518电路的状态表



状态变化顺序
状 态 编 码

Q3Q2Q1Q0进位输出C等效十进制数

 S0000000
 S1000101
 S2001002
 S3001103
 S4010004
 S5010105
 S6011006
 S7011107
 S8100008
 S9100109
 S101010010
 S111011011
 S121100112
 S0 000000


将状态表表示成卡诺图形式,也就是得到的YZ矩阵(二进制状态表)如表536所示。卡诺图中不会出现的三种状态1101,1110和1111作为无关项处理。


表536例518的YZ矩阵



Q3Q2
Q1Q0
00011110


00
01
11
10

0001/00010/00100/00011/0 
0101/00110/01000/00111/0
0000/1dddd/ddddd/ddddd/d
1001/01010/01100/01011/0



图563卡诺图



将表536的YZ矩阵分解为5张卡诺图,如图563所示,从卡诺图很容易求出电路的次态方程和输出方程为

Qn+13=Q32+Q2Q1Q0

Qn+12= 3Q21+3Q20+2Q1Q0

Qn+11= 1Q0+Q10

Qn+10= 30+20

C=Q3Q2


如果选用JK触发器组成这个电路,则应将以上电路的次态方程变换成JK触发器次态方程的标准形式,即 Qn+1=Jn+Qn,就可以找出激励函数了。为此,将电路次态方程改写为


Qn+13=Q32+Q2Q1Q0(Q3+3)=(Q2Q1Q0)3+2Q3

Qn+12=(Q0Q1)2+(3Q1Q0)Q2

Qn+11=Q01+0Q1

Qn+10=(3+2)0+1Q0= Q3Q20+1Q0



与JK触发器的次态方程进行比较得各个触发的激励函数为

J3=Q2Q1Q0,K3=Q2 

J2=Q1Q0,K2= Q3Q1Q0

J1=Q0,K1=Q0 

J0= Q3Q2,K0=1


根据激励函数和输出函数得逻辑图,如图564所示。


图564十三进制同步计数器电路



最后还应检查电路能否自启动。将三个无效状态1101、1110和1111分别代入最后改写过的电路次态方程中计算,所得次态分别为0010、0010和0000,故电路能自启动。图565就是图564逻辑电路的实际状态图。


图565图564的状态图



该计数器用VHDL描述如下: 

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;	   

ENTITY CNT13 IS

PORT (CLK:IN STD_LOGIC;

Q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);

C: OUT STD_LOGIC);

END cnt13;

ARCHITECTURE ONE OF CNT13 IS

BEGIN

PROCESS(CLK)

VARIABLE QI:STD_LOGIC_VECTOR(3 DOWNTO 0);

BEGIN

IF CLK'EVENT AND CLK='0' THEN         --检测时钟下降沿    

IF QI<"1100"THEN QI:=QI+1;             --计数

ELSE QI:=(OTHERS=>'0');              

END IF;

VEND IF;

IF QI="1100" THENC <='1';              --计数等于12,输出进位信号  

ELSEC<='0';

END IF;

Q<=QI;                               --将计数值向端口输出                         

END PROCESS;

END ONE;


5.6异步时序逻辑电路
前面讨论的同步时序电路的特点是电路由统一的时钟触发内部状态的变化。尽管逻辑门、触发器均有延时,但延时之和小于时钟周期,故在下一个时钟脉冲到来前,电路已处于稳定状态。
而异步时序电路没有统一的时钟脉冲,电路状态的改变完全由外部输入信号的变化引起。根据输入信号的不同,异步时序电路又分为脉冲型异步时序电路和电平型异步时序电路。顾名思义,脉冲型异步时序电路的输入包含脉冲信号,而电平异步时序电路的输入仅由电平信号构成。
由于异步时序电路中没有统一的时钟信号,所以分析、设计的方法也与同步时序电路不同。脉冲型、电平型的异步时序电路的分析与设计的方法也不尽相同,由于篇幅限制,下面主要就脉冲型异步时序电路的分析与设计进行讨论。
5.6.1脉冲异步时序逻辑电路的分析
1. 脉冲异步时序逻辑电路的特点
(1) 与同步时序电路类似,在脉冲异步时序逻辑电路中,记忆部分也是由触发器组成的,但时钟脉冲并不一定送到每位触发器的时钟端。
(2) 输入都以脉冲的形式出现,以0表示没有输入脉冲、1表示有输入脉冲。

(3) 在同一个时刻,只允许一个输入。例如: 设x1、x2、x3为三个输入,则输入组合000,100,010,001是允许出现的,其他的组合形式不允许出现。其中000表示没有输入,其他依次表示输入x1、x2、x3。
(4) 在第一个输入脉冲引起的整个电路响应完全结束后,才允许第二个输入脉冲到来,否则电路会出现不可预测的状态。
2. 分析步骤
与同步时序电路分析类似,异步时序电路的分析也是利用状态表、状态图作为工具,分析步骤也类似: 
(1) 写出电路的输出函数、激励函数表达式。
(2) 列出电路的次态方程组。
(3) 列出电路次态真值表。
(4) 做出状态表和状态图。
(5) 画出时间图并用文字描述电路的逻辑功能。
3. 分析举例
例519分析如图566所示的脉冲异步时序电路。


图566例519的脉冲异步时序电路



解: 从电路图可以看出,这个电路的时钟CP仅送到FF1、FF3的时钟输入端,而没有送到FF2的时钟输入端。FF2的时钟输入端接FF1的输出Q1,所以该电路是异步脉冲时序电路。另外这个电路没有外部输入,仅仅是一个时钟CP的输入,JK触发器的时钟脉冲为下降沿有效。
第一步,写出电路的激励函数、输出函数。


CP1=CP3=CP; CP2=Q1(异步时序电路的时钟端也是激励)

J1=3; K1=1

J2=K2=1

J3=Q2Q1; K3=1

Z=Q3


第二步,将激励函数代入触发器的次态方程得到电路的次态方程组。
JK触发器的次态方程为Qn+1=(J+Q)CP↓,这里加了CP↓,就是次态的变化发生在有效时钟的作用下,原来分析同步时序电路时,因为每个触发器的变化都是在统一时钟的作用下发生的,故时钟的作用是默认的。异步时序电路的触发器时钟端不是接统一时钟的,所以特地标上时钟有效时发生变化。


Qn+11=(J11+1Q1)CP1↓=(31+1Q1)CP↓=31CP↓

Qn+12=(J22+2Q2)CP2↓=(12+1Q2)Q1↓=2Q1↓

Qn+13=(J33+3Q3)CP3↓=(Q2Q13+1Q3)CP↓=Q2Q13CP↓


第三步,列出电路次态真值表。


列出电路的现态Q3Q2Q1的各种组合,并注意到CP下降沿的作用,代入上面求出的电路次态方程组中,得到相应时刻的次态和输出。
当初始状态Q3Q2Q1=000时。如果CP=0(没有下降沿),则CP3CP2(Q1)CP1=000,说明没有时钟输入,触发器不发生变化,所以次态Qn+13Qn+12Qn+11=000; 如果CP=1(出现下降沿),则CP3CP2(Q1)CP1=101,Qn+13=Q2Q13CP↓=0,Qn+12=2Q1↓=0,Qn+11=31CP↓=1,所以次态Qn+13Qn+12Qn+11=001。
当现态Q3Q2Q1=001时,如果CP=1,这时Qn+11=31CP↓=0,Q1从1变为0,即出现了Q1↓,那么CP2=Q1=1,Qn+12=2Q1↓=1,Qn+13=Q2Q13CP↓=0,所以次态Qn+13Qn+12Qn+11=010。其余以此类推,就得出表537的电路次态真值表。


表537例519的电路次态真值表



输入脉冲数Q3Q2Q1CP3CP2(Q1)CP1Qn+13Qn+12Qn+11Z

00000000000
10001010010
20011110100
30101010110
40111111100
51001010001
61011110101
71101010101
81111110001

要注意的是: 表中CP=1,表示时钟输入端有下降沿到达; CP=0,表示没有时钟信号到达,触发器保持原来的状态不变。各个触发器的CP端信号不是在同一时刻出现的,有先后差错,但在状态变化稳定后,下一轮时钟信号才会再出现。
第四步,做出状态表(表538)和状态图(图567)。


表538例519的状态表



Q3Q2Q1Qn+13Qn+12Qn+11Z

0000010
0010100
0100110
0111000
1000001
1010101
1100101
1110001




Q3Q2Q1/Z


图567例519的状态图



第五步,画时间图,如图568所示。功能分析如下:


图568例519的时间图



从上面画出的状态图、状态表及时间图可以看出,该电路在有效脉冲信号作用下,状态在000到100这5个状态之间进行循环,其他三个状态101、110、111在一个脉冲作用后会自动进入有效循环中。所以该电路为异步五进制计数器。
5.6.2脉冲异步时序逻辑电路的设计
脉冲异步时序逻辑电路的设计方法与同步时序逻辑电路的设计基本类似。不同的是设计脉冲异步时序逻辑电路时,每个触发器的CP端不再是同一个时钟脉冲,而是与其他输入端一样作为触发器的一个激励来考虑。另外,为了使电路工作可靠,输入信号必须是串行序列脉冲,在第二个脉冲达到时,第一个脉冲所引起的电路响应必须已经完成,电路处于稳定状态。也就是前面所说的“在同一个时刻,只允许一个输入”。
由于电路中没有统一时钟,电路中触发器的时钟作为激励来处理,这就意味可以通过控制时钟端的输入脉冲的有无来控制触发器翻转还是不翻转。基于这一思想,在设计脉冲异步时序逻辑电路时,可以使用表539~表542所列的4种常用触发器(带CP)的激励表。


表539RS触发器的激励表(CP)



QQn+1RSCP
00d0d
00dd0
01011
10101
110dd
11dd0



表540JK触发器的激励表(CP)



QQn+1JKCP
000dd
00dd0
011d1
10d11
11d0d
11dd0



表541T触发器的激励表(CP)



QQn+1TCP
000d
00d0
0111
1011
111d
11d0



表542D触发器的激励表(CP)



QQn+1DCP
000d
00d0
0111
1001
111d
11d0


从表539~表542可以看出,在要求触发器状态保持不变时,有两种不同的处理方式: 一是令CP为d,输入端取相应的值; 二是令CP为0,输入端取任意值。例如,当要使D触发器维持不变时,可令CP为d,D为Q; 也可令CP为0,D为d。这使激励函数的确定更加灵活。一般选择CP为0,输入为任意值。
例520设计一个脉冲异步时序逻辑检测器。该电路有三个输入x1、x2、x3,一个输出Z,当检测到输入脉冲序列为x1→x2→x3 时,输出Z为1,其后当检测到输入脉冲出现x2 时,输出Z由1变为0。
解: 分析题意,可以得到输入、输出信号的波形关系如图569所示。


图569例520的波形图



首先可以参照同步时序电路设计那样建立电路的原始状态图和状态表。假设A为初始态,B为接收到x1的状态,C为接收到脉冲序列x1→x2的状态,D为接收到脉冲序列x1→x2→x3的状态,这样可以得到部分原始状态图,如图570(a)所示,然后再从每个状态出发,做出所有可能输入条件下的状态转换关系,从而建立完成的原始状态图如图570(b)所示。


图570例520的原始状态图



由图570(b)可以得到原始状态表如表543所示。


表543例520的原始状态表



Q
Qn+1
x1x2x3Z

ABAA0
BBCA0
CBAD0
DDAD1


按照状态表化简规则,该原始状态表已经是最简形式。该电路为Moore型,共有4个状态,可以两个状态变量Q2Q1来表示,根据状态分配原则,将A分配00、B分配01、C分配11、D分配10,得到二进制状态表如表544所示。
如采用D触发器来实现,将CP看作激励,D触发器的次态方程可以写成

Qn+1=DCP+QCP




表544例520的二进制状态表



Q2Q1
Qn+12Qn+11
x1x2x3Z

000100000
010111000
110100100
101000101




根据表542,在D触发器的激励表中,如状态没有变化,可以使CP=0,D为任意,也可以令D=Q,CP为任意。根据化简的需求,可以灵活地运用,使得电路有最简的结果。将表544与表542一起来对照,可得到简化了的激励矩阵,如图571所示。




图571例520的简化卡诺图




图572例520的逻辑电路图


图571的卡诺图实际上应该是5变量的卡诺图,但由于脉冲异步时序电路不允许两个或多个输入脉冲同时出现,即输入的变量组合不允许出现011、101、110、111,而000时,电路保持不变,故可将5变量卡若图简化成图571的形式。但此时卡诺图的各列是不相邻的,化简仅仅是在给定的列中进行,每列只允许一个输入变量出项。经如图571所示的合并方案得激励函数为


D2=x22Q1CP2=x1Q1+x2

D1=x1CP1=x12+x2Q2+x3


由表543也可得输出函数为

Z=Q21


根据激励函数、输出函数表达式可以画出如图572的逻辑电路图。


5.7小结
时序逻辑电路的特点是: 电路的输出不仅与当前输入有关,还与以前的输入有关。
本章用大量的篇幅讨论了同步时序电路的分析与设计方法。同步时序电路工作稳定、可靠,设计简单,在数字系统中被广泛采用。与组合逻辑电路比较,主要多了存储元件部分。作为存储元件的器件主要有RS触发器、JK触发器、D触发器、T触发器,根据电路中所用触发器类型的特性,利用表格法或代数法可对同步时序电路进行分析和设计。
寄存器、计数器是数字系统中最常用的时序逻辑电路构件,其功能是: 在某一时刻将数据并行打入其中进行保存,或通过移位寄存器的移位功能实现数据左移、右移、并入并出、串入并出、并入串出等逻辑功能。
同步时序电路分析的步骤为: ①根据逻辑图写出输出函数和激励函数表达式。②根据所用触发器的特性用代数法或表格法求电路的YZ矩阵(二进制状态表)。③根据YZ矩阵得状态表和状态图。④根据状态表和状态图作时间图并用文字描述电路的逻辑功能。
同步时序电路的设计步骤为: ①根据给定的逻辑要求作原始状态图和状态表。②状态表化简。③状态分配。④根据选用的触发器特性用表格法或代数法求激励函数和输出函数的表达式。⑤根据激励函数、输出函数表达式画逻辑图。
硬件描述语言VHDL对时序电路的描述与对组合电路的描述有所不同。
而异步时序电路没有统一的时钟脉冲,电路状态的改变完全由外部输入信号的变化引起。根据输入信号的不同,异步时序电路又分为脉冲型异步时序电路和电平型异步时序电路。顾名思义,脉冲型异步时序电路的输入包含脉冲信号,而电平异步时序电路的输入仅由电平信号构成。
异步时序电路的分析、设计的方法与同步时序电路不同。脉冲型、电平型的异步时序电路的分析与设计的方法也不尽相同,此章中简要介绍了脉冲型异步时序电路的分析与设计。
5.8习题与思考题
1. 简化如表545和表546所示的状态表。


表545题1表(a)



QX
01

AE/0D/1
BA/1F/0
CC/0A/1
DB/0A/1
ED/1C/0
FC/0D/1
GH/1G/1
HC/1B/1



表546题1表(b)



QX
01

AD/dC/0
BD/1E/d
Cd/dE/1
DA/0C/d
EB/1C/d


2. 根据状态分配方法,分别对状态表547和表548进行状态分配,列出二进制状态表。


表547题2表(a)



QX
01

AA/0B/0
BC/0B/0
CD/0B/0
DB/1A/0



表548题2表(b)



QX
01

AB/0E/0
BD/0A/1
CD/1A/0
DB/1C/1
EA/0A/0  


3. 试分析如图573所示的时序电路的逻辑功能,画出状态表和状态图。


图573题3的图


4. 试分析如图574所示的时序电路的逻辑功能,画出状态表和状态图,检查电路能否自启动。


图574题4的图


5. 试分析如图575所示的时序电路,画出状态表和状态图,检查电路能否自启动,说明电路实现的功能。


图575题5的图



6. 试分析如图576所示的时序电路,画出状态表和状态图,并做出当电平输入x为0110101序列时电路的时间图。
7. 试分析如图577所示的时序电路,画出状态表和状态图,并做出当电平输入x为0110110序列时电路的时间图。


图576题6的图




图577题7的图




8. 分析如图578所示的计数器电路,说明这是多少进制的计数器。十进制计数器74160的功能表(同74LS161的功能表)见表513。
9. 分析如图579所示的计数器电路,画出电路的状态图,说明这是多少进制的计数器。十六进制计数器74LS161的功能表见表513。


图578题8的图




图579题9的图




10. 用4位同步二进制计数器74LS161接成十二进制计数器,标出输入、输出端。可以附加必要的门电路。74LS161的功能见表513。
11. 试分析图580的计数器在M=1和M=0时各为几进制。74160的功能见表513。
12. 图581的电路是可变进制计数器。试分析当控制变量A为1和0时电路各为几进制计数器。74LS161的功能见表513。


图580题11的图



图581题12的图


13. 设计一个可控进制计数器,当输入控制变量M=0时工作在五进制,M=1时工作在十五进制。请标出计数输入端和进位输出端。
14. 试分析图582计数器电路的分频比(即Y与CP的频率之比)。74LS161的功能见表513。


图582题14的图



15. 图583的电路是由两片同步十进制计数器74160组成的计数器。试分析这是多少进制的计数器,两片之间是几进制。74160的功能见表513。


图583题15的图 



16. 分析图584给出的电路,说明这是多少进制的计数器,两片之间是多少进制。74LS161的功能见表513。


图584题16的图



17. 用同步十进制计数器芯片74160设计一个365进制的计数器。要求各位间为十进制关系。允许附加必要的门电路。74160的功能见表513。
18. 作1010序列检测器的状态图、状态表。已知检测器的输入输出序列如下(序列可以重叠)。
输入:  0 0 1 0 1 0 0 1 0 1 0 1 0 1 1 0
输出:  0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0
19. 设计一个代码检测器,其电路串行输入余3码。当出现非法数字时,电路输出为0,否则输出为1。试做出状态图,并用VHDL描述。
20. 设计一个同步1011序列检测器,序列1011不可重叠,试用JK触发器和适当的门电路实现之,并用VHDL描述。
21. 试用JK触发器设计一个101序列检测器。该同步时序网络有一根输入线x,一根输出线Z。对应于每个连续输入序列101的最后一个1,输出Z=1,其他情况下Z=0。例如: 
x0 1 0 1 0 1 1 0 1
Z0 0 0 1 0 1 0 0 1
22. 用JK触发器和门电路设计一个4位循环码计数器,它的状态转换表应如表549所示。


表549题22的表



计 数 顺 序
电 路 状 态
Q3Q2Q1Q0进位输出C

000000
100010
200110
300100
401100
501110
601010
701000
811000
911010
1011110
1111100
1210100
1310110
1410010
1510001
1600000



图585题23的图



23. 设计一个控制步进电动机三相六状态工作的逻辑电路。如果用1表示电机绕组导通,0表示电机绕组截止,则三个绕组ABC的状态转换图应如图585所示。M为输入控制变量,当M=1时为正转,M=0时为反转。
24. 设计一个自动售邮票机的逻辑电路,并用VHDL描述出来。每次只允许投入一枚五角或一元的硬币,累计投入两元硬币给出一张邮票。如果投入一元五角硬币以后再投入一枚一元硬币,则给出邮票的同时还应找回五角钱。要求设计的电路能自启动。
25. 请分析以下的VHDL描述,说明所定义的各种信号有什么作用,再说明电路完成的是什么功能。

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;	   

ENTITYcounterIS

PORT (clock,clear,count:IN STD_LOGIC;

q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));

END counter;

ARCHITECTURE  one OF counter IS

SIGNAL  pre_q: STD_LOGIC_VECTOR(3 DOWNTO 0);

BEGIN

PROCESS(clock,clear,count)

 BEGIN

IF clear ='1'THEN

pre_q <= pre_q -pre_q;

 ELSIF (clock ='1'ANDclock'EVENT) THEN

 IF count ='1'THEN 

 pre_q <= pre_q +1;

 END IF;

 END IF;

END PROCESS;

q <= pre_q;

END ONE;


26. 请分析下面的VHDL描述,说明电路完成的是什么功能。
(1) 
LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;	 

ENTITYcounterIS

PORT (clk,clr_1,ld_1,enp,ent: IN STD_LOGIC;

d:IN std_logic_vector(3 DOWNTO 0);

q:OUT std_logic_vector(3 DOWNTO 0);

rco:OUT STD_LOGIC);

END counter

ARCHITECTUREone OF counter IS

SIGNALiq: std_logic_vector(3 DOWNTO 0);

BEGIN

PROCESS(clk,ent_1,iq)

 BEGIN

IF clk ' EVENT AND clk ='1'THEN 

IF clr_1 ='1'THENiq<=(OTHERS=>'0');

ELSIF ld_1='0'THENiq<=d;

ELSIF (ent AND enp)= '1' AND (iq=9) THEN iq <=( '0', '0', '0', '0');

ELSIF (ent AND enp)= '1'THEN iq <=iq+1;

END IF;

END IF;

IF (iq =9) AND (ent='1') THEN rco<='1';

ELSErco<='0';

END IF;

 END PROCESS;

 q<=iq;

 END ONE;

(2) LIBRARY ieee;

USE ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;



ENTITY ls160 IS PORT(

data: in std_logic_vector(3 downto 0);

clk,ld,p,t,clr:in std_logic;

count: buffer std_logic_vector(3 downto 0);

tc:out std_logic);

END ls160;



ARCHITECTURE behavior OF ls160 IS

BEGIN

tc<='1' when (count="1001" and p='1' and t='1' and ld='1' and clr='1') else '0';



cale:

process(clk,clr,p,t,ld)

begin

if(rising_edge(clk)) then

if(clr='1')then

if(ld='1')then

if(p='1')then

if(t='1')then

if(count="1001")then

count<="0000";

else 

count<=count+1;

end if;

else 

count<=count;

end if;

else

count<=count;

end if;

else

count<=data;

end if;

else 

count<="0000";

end if; 

end if;

	end process cale;

END behavior;

(3)  
libraryieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;



entity sequencdcheck is

port

(

clk:in std_logic;

reset:in std_logic;

din:in std_logic;

true:out std_logic

);

end sequencdcheck;



architecture arc of sequencdcheck is

type state_type is(s1,s2,s3);

signal state:state_type;	 

signal din_d:std_logic;

begin				 

process(clk)

begin

if clk'event and clk='1' then

din_d<=din;

end if;

end process;

 -----

process(clk,reset)

begin

if reset='1'then 

true<='0';

state<=s1;

elsif clk'event and clk='1'then 

case state is

when s1=>

if din_d='1' then

state<=s2;

else

state<=s1;

end if;	

true<='0';

when s2=>

if din_d='0' then

state<=s3;

else

state<=s2;

end if;	

true<='0';				

when s3=>

if din_d='1' then

state<=s1;

true<='1';

else

state<=s3;

true<='0';

end if;

when others=>

state<=state;

end case;

end if;

end process; 

-----------

end arc;


27.  分析如图586所示的脉冲异步时序逻辑电路,指出该电路的功能。


图586题27的图



28. 试用D触发器设计x1→x2→x2→…序列检测器。