第5章 时序逻辑的分析与设计 逻辑电路有两大类: 一类是组合逻辑电路,另一类是时序逻辑电路。 组合逻辑电路: 电路的输出只与当时的输入有关,而与电路以前的状态无关。 时序逻辑电路: 电路的输出不仅与当前输入有关,还与以前的输入有关。 时序逻辑电路按其工作方式不同,又分为同步时序逻辑电路和异步时序逻辑电路。本章从时序逻辑电路的基本概念入手,重点讨论同步时序逻辑电路的分析和设计方法,同时对异步时序的概念及分析和设计方法也作简单的介绍。 视频讲解 5.1时序逻辑电路的结构与类型 组合逻辑电路是由门电路构成的,其结构如图51所示。 图中x1,x2,…,xn为某一时刻的输入; Z1,Z2,…,Zm为该时刻的输出。组合逻辑电路的输出可用下列输出函数集来描述: Zi=fi(x1,x2,…,xn),i=1,2,…,m 输出Zi仅是输入xi的函数,即只与当前的输入有关。 时序逻辑电路的结构如图52所示,它由组合逻辑和存储器件两部分构成。图中x1,x2,…,xn为时序逻辑电路的外部输入; Z1,Z2,…,Zm为时序逻辑电路的外部输出; y1,y2,…,yr为时序逻辑电路的内部输入(或称状态); Y1,Y2,…,Yp为时序逻辑电路的内部输出(或称激励)。 图51组合逻辑电路的结构 图52时序逻辑电路的结构 时序逻辑电路的组合逻辑部分用来产生电路的输出和激励,存储器件部分是用其不同的状态(y1,y2,…,yr)来“记忆”电路过去的输入情况的。 如图52所示的时序逻辑电路逻辑功能函数的一般表达式为 Zi=gi(x1,x2,…,xn; y1,y2,…,yr),i=1,2,…,m(51) Yj=fj(x1,x2,…,xn; y1,y2,…,yr),j=1,2,…,p(52) 式(51)称为输出函数,式(52)称为激励函数。这两个函数都与变量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型同步时序逻辑电路状态表的格式如表51所示。表格的上方从左到右列出输入x1,x2,…,xn的全部组合,表格左边从上到下列出电路的全部状态y,表格的中间列出对应不同输入组合的现态下的次态yn+1和输出Z。这个表的读法是,处于状态y的时序电路,当输入x时,输出为Z,在时钟脉冲的作用下,电路进入次态yn+1。 例如,某同步时序逻辑电路有一个输入x,一个输出Z,4个状态A、B、C、D,该时序逻辑电路的状态表如表52所示。 表51Mealy型电路状态表格式 现态输入 …x… ︙ yyn+1/Z ︙ 表52某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型电路的状态图格式如图53所示,在状态图中,每个状态用一个圆圈表示,圈内用字母或数字表示状态的名称,用带箭头的直线或弧线表示状态的转移关系,并把引起这一转移的输入条件和相应的输出标注在有向线段旁边。例如上面某电路的状态表可描述为如图54所示的状态图。 图53Mealy型电路状态图 图54某电路的状态图 5.1.2Moore型电路 如果同步时序逻辑电路的输出仅是现态的函数,即Z=fi(y1,y2,…,yp),i=1,2,…,m,则称该电路为Moore型电路。也就是说该时序逻辑电路可能没有输入,或输入与输出没有直接关系。Moore型电路的状态表格式如表53所示。因为Moore型电路的输出Z仅与电路的状态y有关,所以将输出单独作为一列,其值完全由现态确定。次态与Mealy型一样,由现态和输入共同确定。该表的读法是,当电路处于状态y时,输出为Z。若输入x,在时钟脉冲的作用下,电路进入次态yn+1。例如某Moore型时序逻辑电路的状态表如表54所示,当电路处于A状态时,其输出为0。若x=1,在时钟脉冲作用下,电路进入状态B,新的输出为1。假定电路的初始状态为B,输入序列为 x: 11001001 那么电路的状态转换序列和输出响应序列为 图55某Moore型电路的状态图 时钟: 12345678 x: 11001001 y: BCACBCBB yn+1: CACBCBBC Z: 10001011 Moore型电路的状态图与Mealy型电路状态图的区别仅在于Moore型电路的输出与状态一起标注在圆圈内,如上例的Moore型电路的状态图如图55所示。 表53Moore型电路状态表格式 现态输入 …x…输出 ︙ yyn+1Z ︙ 表54某Moore型电路状态表 y x 01 Z AC B 0 BB C 1 CB A 0 5.2同步时序逻辑电路的分析 时序逻辑电路的分析就是对一个给定的时序逻辑电路,研究在一系列输入信号作用下,电路将会产生怎样的输出,进而说明该电路的逻辑功能。 在输入序列的作用下,时序电路的状态和输出变化规律通常表现在状态表、状态图或时间图中。因此,分析一个给定的同步时序电路,实际上是要求出该电路的状态表、状态图或时间图,以此确定该电路的逻辑功能。 本节将介绍分析同步时序电路的两种方法,并通过示例分析,了解和熟悉几种常用的数字逻辑电路。 视频讲解 5.2.1同步时序逻辑电路的分析方法 同步时序电路的分析方法有两种: 表格法和代数法。两种方法的分析过程示意图如图56所示。 图56同步时序逻辑电路的分析过程示意图 下面介绍两种分析方法的一般步骤。 1. 表格法的一般步骤 (1) 根据给定的同步时序逻辑电路,写出输出函数表达式和激励函数表达式。 (2) 列出激励矩阵,即将激励函数以卡诺图的形式表示出来,若干激励合成激励矩阵。 (3) 根据所用触发器的状态表及激励矩阵、输出矩阵(输出函数的卡诺图形式)形成YZ矩阵。YZ矩阵实际就是二进制形式的状态表。 (4) 由YZ矩阵可得时序电路的状态表、状态图。 (5) 假定某一输入序列画出时间图,并用文字描述电路的逻辑功能。 2. 代数法的一般步骤 (1) 同表格法的(1)。 (2) 把激励函数表达式代入该电路触发器的次态方程,导出电路的次态方程组。 (3) 根据电路的次态方程组和输出函数表达式做出同步时序电路的状态表,画出状态图。 (4) 同表格法(5)。 两种方法的本质是相同的,视具体情况灵活选用。下面举例说明。 视频讲解 例51分析如图57所示的同步时序电路的逻辑功能。假定在初态为00时,输入x的序列为0000011111,画出时间图。 解: 由电路图可写出激励函数、输出函数。 K0=J0=1 K1=J1=xy0=xy-0+x-y0 Z= x·y-1= x-+y1 方法一: 表格法。 将激励函数、输出函数表示在卡诺图上,如图58所示。 图57例51图 图58J、K和Z的卡诺图 将J、K的卡诺图合并画到一个卡诺图上便可得电路的激励矩阵,如表55所示。再根据JK触发器的状态表和输出矩阵,可将激励矩阵转换成YZ矩阵,如表56所示。 表55激励矩阵J1K1和J0K0 y1y0x 01 0000,1111,11 0111,1100,11 1111,1100,11 1000,1111,11 表56YZ矩阵 y1y0x 01 00 01/111/0 01 10/100/0 11 00/110/1 10 11/101/1 YZ矩阵实际上就是二进制状态表,将编码00、01、10、11分别用状态q1、q2、q3、q4表示,代入YZ矩阵可得状态表,由状态表可画出状态图,如图59所示。 图59状态表和状态图 该电路是一个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为高电平。图510表示该电路的时间图。 图510可逆计数器的时间图 方法二: 代数法。 以上过程用代数法也能很简单地求出结果。因为JK触发器的次态方程为 Qn+1=J+Q 对于本例的逻辑图,两个触发器的次态方程为 yn+11=J1y-1+1y1 yn+10=J0y-0+0y0 将已求得的电路的激励函数代入该次态方程组就可得该电路的次态方程组。 yn+11=J1y-1+1y1=(xy0)y-1+(xy0)y1 = x-y-1y0+x-y1y-0+xy-1y-0+xy1y0 yn+10=J0y-0+0y0= y-0 将电路的次态方程组和输出函数表示到卡诺图上,如图511所示; 将两个次态卡诺图与输出函数的卡诺图合并就形成了二进制形式的状态表,如表57所示。可以看出该二进制形式的状态表与上面表格法求得的YZ矩阵是一样的。 图511yn+11、yn+10和Z的卡诺图 表57二进制形式的状态表 y1y0 x 01 00 01 11 10 01/111/0 10/100/0 00/110/1 11/101/1 例52分析如图512所示的同步时序电路。 视频讲解 图512例52图 解: 注意,本例比较特殊,没有外部输入,也没有外部输出。 首先写出它的激励函数。 D0= Q32Q1=3+2Q1 D1=Q0 D2=Q1 D3=Q2 将以上4个激励函数一起画到一幅卡诺图上就得到激励矩阵,如表58所示。因为D触发器的次态方程为Qn+1=D,即次态与激励相等,所以求出的激励矩阵也就是Y矩阵或二进制形式的状态表。很容易可得该电路的状态图如图513所示。 表58激励矩阵 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 图513状态图 由状态图可以看出,这是一个循环移位计数器。在计数时循环移位规则如下: Q0→Q1Q1→Q2Q2→Q33→Q0 这种计数器的循环长度L=2n,其中n为位数,这里,n=4,L=8。 由状态图还可看出,图左半部8个状态形成闭环,称为“有效序列”,右半部8个状态称为“无效序列”。如果该时序电路在某种偶然因素的作用下,使电路处于“无效序列”中的某一状态,则它可以在时钟脉冲CP的作用下,经过若干节拍后,自动进入有效序列。因此,该计数器称为具有自恢复功能的扭环移位计数器。 该电路的时间图如图514所示。根据Q0~Q3这4个基本波形,经过简单组合,可以形成各种不同的时序控制波形。在计算机中,常常用它作为节拍信号发生器。 视频讲解 例53分析图515的串行加法器电路,该电路有两个输入端x1和x2,用来输入加数和被加数。有一个输出端Z,用来输出相加的“和”。JK触发器用来存储“进位”,其状态yn为低位向本位的进位,yn+1为本位向高位的进位。 图514时间图 图515例53的电路图 解: 首先写出电路的激励函数和输出函数表达式。 Z=x1x2y J=x1x2 K= x1+x2 JK触发器的次态方程为 yn+1=Jy+Ky 将激励函数表达式代入,得电路的次态方程为 yn+1=x1x2y+(x1+x2)y=x1x2y+x1y+x2y =x1x2+x1y+x2y 根据电路的次态方程可做出它的状态表和状态图,如图516所示。 图516例53的状态表和状态图 设电路初始状态为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。 由于该电路的输入和输出均是在时钟脉冲作用下,按位串行输入加数和被加数、串行输出“和”数的,故称此加法器为串行加法器。 如果需要保存相加的“和”数,可在输出端连接一个“串行输入/并行输出”的移位寄存器。加数和被加数也可事先放入“并行输入/串行输出”的移位寄存器中。 从这个例子可以看到,用组合逻辑电路实现的功能有的也可用时序电路来实现,不同的是,组合电路采用的是并行工作方式,而时序电路采用的是串行工作方式。因此,在完成同样的逻辑功能的情况下,组合电路比时序电路工作速度快,但时序电路的结构较组合电路简单。 视频讲解 例54分析如图517所示的节拍信号发生器电路。 图517例54的图 解: 首先写出激励函数和输出函数。 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 根据电路的次态方程组就可得电路的状态表如表59所示。 表59例54的状态表 现态次态输出 Q2Q1Qn+12Qn+11W0W1W2W3 00011000 01110100 11100010 10000001 图518时间图 这是一个Moore型电路,输出仅与现态有关。根据状态表可做出时间图如图518所示。由时间图可以看出,触发器FF2,FF1构成模4计数器,8个与非门用来组合产生4个节拍电平信号,电路在时钟脉冲的作用下,按一定的顺序轮流地输出节拍信号。 节拍信号发生器通常用在计算机的控制器中。计算机在执行一条指令时,总是把一条指令分成若干基本动作,由控制器发出一系列节拍电平和节拍脉冲信号,以控制计算机完成一条指令的执行。 视频讲解 5.2.2常用同步时序逻辑电路 1. 寄存器 寄存器用于寄存一组二值代码,它被广泛地用于各类数字系统和数字计算机中。 因为1个触发器能存储1位二进制代码,所以用N个触发器组成的寄存器能存储N位二进制代码。 对寄存器中的触发器只要求它们具有置1、置0的功能即可,因而无论是用同步RS结构触发器,还是用主从结构或边沿触发结构的触发器,都可以组成寄存器。 图519是一个用同步RS触发器组成的4位寄存器的实例——74LS75的逻辑图。由同步RS触发器的动作特点可知,在CP的高电平期间,Q端的状态跟随D端的状态而变,在CP变成低电平以后,Q端将保持CP变为低电平时D端的状态。 74LS175则是用维持阻塞触发器组成的4位寄存器,它的逻辑图如图520所示。根据维持阻塞结构触发器的动作特点可知,触发器输出端的状态仅仅取决于CP上升沿到达时刻D端的状态。可见,虽然74LS75和74LS175都是4位寄存器,但由于采用了不同结构类型的触发器,其动作特点是不同的。为了增加使用的灵活性,有些寄存器电路还加了一些附加控制电路,如异步置0(将寄存器的数据直接清除,而不受时钟信号的控制)、输出三态控制和“保持”等功能。所谓“保持”就是将触发器的输出反馈到输入,当CP信号到达时下一个状态仍保持原来的状态。例如CMOS电路CC4076就属于这样一种寄存器,它的逻辑图如图521所示。 这是一个具有三态输出的4位寄存器。 当LDA+LDB=1时,电路处于装入数据的工作状态,输入数据D0、D1、D2、D3经与或门G5、G6、G7、G8分别加到4个触发器的输入端。在CP信号的下降沿到达后,将输入数据存入对应的触发器中。 图51974LS75的逻辑图 图52074LS175的逻辑图 图521CC4076逻辑图 当LDA+LDB=0时,电路处于保持状态。触发器的Q端经与或门接回自己的输入端,故CP到达时还是原来的状态值。 当 ENA=ENB=0时,门G1输出高电平,使三态门G10~G13处于工作状态,电路正常输出。当ENA、ENB中任一个为高电平时,则G1输出为低电平,使G10~G13处于高阻态,将触发器与输出端的联系切断。 当D=0时,将寄存器中的数据清除。 上面介绍的三个寄存器电路中,接收数据时所有位的代码是同时输入的,而且触发器中的数据是并行地出现在输出端的,因此将这种输入、输出方式叫并行输入、并行输出方式。 视频讲解 2. 移位寄存器 移位寄存器除了具有存储代码的功能以外,还具有移位功能。所谓移位功能,是指寄存器里存储的代码能在移位脉冲的作用下依次左移或右移。因此,移位寄存器不但可以用来寄存代码,还可以用来实现数据的串行并行转换、数值的运算以及数据处理等。 例如,由边沿触发结构的D触发器组成的4位移位寄存器(见图522),其中第一个触发器(左边)的输入端接收输入信号,其余的每个触发器输入端均与前面一个触发器的Q端相连。当CP的上升沿同时作用于所有触发器时,加到寄存器输入端Di的代码存入FF0,其余触发器的状态为原左边一位触发器的状态,即总的效果是将寄存器里原有的代码右移了一位。 图522用D触发器构成的移位寄存器 例如,在4个时钟周期内输入代码依次为Q0Q1Q2Q3=0000,那么在移位脉冲(也就是触发器的时钟脉冲)的作用下,移位寄存器里代码的移动情况将如表510所示。可以看到,经过4个CP信号以后,串行输入的4位代码全部移入了移位寄存器中,同时在4个触发器的输出端得到了并行输出的代码。因此,利用移位寄存器可以实现代码的串行并行转换。为便于扩展逻辑功能和增加使用的灵活性,在定型生产的移位寄存器集成电路上有的又附加了左、右移控制,数据并行输入、保持、异步置零等功能。如74LS194A就是一个4位双向移位寄存器,它的逻辑图如图523所示。 表510移位寄存器中代码的移动情况 CP的顺序输入DiQ0Q1Q2Q3 000000 111000 200100 311010 411101 图5234位双向移位寄存器74S194A的逻辑图 图523中的DiR为数据右移串行输入端; DiL为数据左移串行输入端; D0~D3为数据并行输入端; Q0~Q3为数据并行输出端。移位寄存器的工作状态由控制端S1和S0的状态指定,其功能如表511所示。 表51174LS194A的功能表 DS1S0工 作 状 态 0dd置零 100保持 101右移 110左移 111并行输入 现以第二位触发器FF1为例,分析一下S1、S0为不同取值时移位寄存器的工作状态。由图523可见,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,移位寄存器处于数据并行输入状态。 图524用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) 同步二进制计数器 图524是由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矩阵,如表512所示。 表512Y矩阵 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矩阵和输出函数,很容易得到该电路的状态图(见图525)和时间图(见图526)。 图525状态图 图526时间图 从时间图上可以看出,若计数输入脉冲的频率为f0,则Q0、Q1、Q2和Q3端输出脉冲的频率将依次为 f0/2、f0/4、f0/8、f0/16。针对计数器的这种分频功能,也把它叫作分频器。此外,每输入16个计数脉冲,计数器工作一个循环,并在输出端C产生一个进位输出信号,所以又把这个电路叫十六进制计数器。n位二进制计数器也称为2n进制计数器,它所能计到的最大数为2n-1。 在实际生产的计数器芯片中,往往还附加一些控制电路,以增加电路的功能和使用的灵活性。如中规模集成芯片74161,逻辑图如图527所示。这个电路除了二进制加法计数功能外,还具有预置数、保持和异步置零等功能。图527中LD为预置数控制端,D0~D3为数据输入端,C为进位输出端,D为异步置零(复位)端,EP和ET为工作状态控制端。74161的功能表如表513所示。 图5274位同步二进制计数器74161的逻辑图 表5134位同步二进制计数器74161的功能表 CPDLDEPET工 作 状 态 d0ddd置零 10dd预置数 d1101保持 d11d0保持(但C=0) 111 1计数 由图527可见,当D=0时所有触发器将同时被置零,而且置零操作不受其他输入端状态的影响。 图528同步十进制加法计数器电路 当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时,电路工作在计数状态,与图524电路的工作状态相同。从电路的0000状态开始连续输入16个计数脉冲时,电路将从1111状态返回0000状态,C端从高电平跳变至低电平,可以利用C端输出的高电平或下降沿作为进位输出信号。 74LS161在内部电路结构形式上与74161有些区别,但外部引线的配置、引脚排列以及功能表都和74161相同。 视频讲解 2) 同步十进制计数器 图528是用T触发器构成的同步十进制加法计数器电路。由图528可写出电路的激励函数、输出函数的表达式为 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矩阵如表514所示。 表514Y矩阵 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矩阵很容易可得状态图如图529所示。从图上可看出有效序列有10个状态,进行十进制的加法计数,从0000~1001重复计数。另外6个状态为无效序列,但能自动进入有效序列,该电路具有自恢复功能。 图529同步十进制加法计数器状态图 与二进制计数器类似,中规模集成芯片74160为同步十进制加法计数器,逻辑图如图530所示。它除了计数功能外,还有预置数、保持、异步置零等功能。图中的控制信号及功能表与上面讨论的74161完全一样,只是74160是十进制而74161是十六进制。 图530同步十进制加法计数器74160逻辑图 3) 任意进制计数器 从降低成本考虑,集成电路的定型产品必须有足够大的批量,因此目前常见的计数器芯片在记数进制上只做成应用较广的几种类型,如十进制、十六进制、7位二进制、12位二进制、14位二进制等。如需要其他任意进制时,只能用现有产品的进制计数器加一些辅助电路来实现。 假定已有N进制计数器,而需要得到M进制计数器。下面分两种情况来讨论。 ① M<N的情况。 在N进制计数器的顺序计数过程中,设法使之越过N-M个状态,就可以得到M进制计数器了。实现跳跃的方法有置零法(或称复位法)和置数法(或称置位法)两种。 下面通过实例来说明这两种方法。 视频讲解 例55试利用同步十进制计数器74160接成同步六进制计数器。 解: 74160的逻辑图及功能在前面已讨论过了,它兼有异步置零和同步置数功能,所以置零法和置数法均可采用。 如图531所示的电路是采用异步置零法接成的六进制计数器。当计数器从0000(S0)计成Q3Q2Q1Q0=0110(即SM)状态时,担任译码器的门G输出低电平信号给D端,将计数器置零,回到0000状态。电路的状态图如图532所示。 图531置零法将74160接成六进制计数器 图532状态图 由于置零信号随着计数器被置零而立即消失,所以置零信号持续时间极短,如果触发器的复位速度有快有慢,则可能动作慢的触发器还未来得及复位,置零信号就已经消失,导致电路误动作。因此,这种接法的电路可靠性不高。 为了克服这个缺点,经常采用如图533所示的改进电路。图中的与非门G1起译码器的作用,当电路进入0110状态时,它输出低电平信号。与非门G2和G3组成了基本RS触发器,以它端输出的低电平作为计数器的置零信号。 图533图531电路的改进 若计数器从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进制计数器。图534中给出了两个不同的方案,其中图534(a)的接法是用Q3Q2Q1Q0=0101状态译码产生LD信号,下一个CP信号到达时置入0000状态,从而跳过0110~1001这4个状态,得到六进制计数器,如图535中的实线所表示的那样。 图534用置数法将74160接成六进制计数器 若采用图534(b)电路的方案,则可以从C端得到进位输出信号。在这种接法下,用0100状态译码产生LD=0信号,下个CP信号到来时置入1001(如图535中的虚线所示),因而循环状态中包含了1001这个状态,每个计数循环都会在C端给出一个进位脉冲。 图535状态图 由于74160的预置数是同步式的,即LD=0以后,还要等下一个CP信号到来时才置入数据,而这时LD=0的信号已稳定地建立了,所以不存在异步置零法中因置零信号持续时间过短而可靠性不高的问题。 ② M>N的情况。 这时必须用多片N进制计数器组合起来,才能构成M进制计数器。各片之间(或称为各级之间)的连接方式可分为串行进位方式、并行进位方式、整体置零方式和整体置数方式几种。下面仅以两级之间的连接为例说明这4种连接方式的原理。 若M可以分解为两个小于N的因数相乘,即M=N1×N2,则可采用串行进位方式或并行进位方式将一个N1进制计数器和一个N2进制计数器连接起来,构成M进制计数器。 在串行进位方式中,以低位片的进位输出信号作为高位片的时钟输入号; 在并行进位方式中,以低位片的进位输出信号作为高位片的工作状态控制信号(计数的使能信号)。两片的CP输入端同时接计数输入信号。 例56试用两片同步十进制计数器接成百进制计数器。 视频讲解 解: 本例中M=100,N1=N2=10,将两片74160直接按并行进位方式或串行进位方式连接即得百进制计数器。 如图536所示的电路是并行进位方式的接法。以第(1)片的进位输出C作为第(2)片的EP和ET输入,每当第(1)片计成9(1001)时C变为1,下个CP信号到达时第(2)片为计数工作状态,计入1,而第(1)片计成0(0000),它的C端回到低电平。第(1)片的EP和ET恒为1,始终处于计数工作状态。 图536例56电路的并行进位方式 如图537所示的电路是串行进位方式的连接方法。两片74160的EP和ET恒为1,都工作在计数状态。第(1)片每计到9(1001)时C端输出变为高电平,经反相器后使第(2)片的CP端为低电平。下个计数输入脉冲到达后,第(1)片计成0(0000)状态,C端跳回低电平,经反相后使第(2)片的输入端产生一个正跳变,于是第(2)片计入1。可见,在这种接法下两片74160不是同步工作的。 图537例56电路的串行进位方式 在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不是素数时整体置零法和置数法也可以使用。 例57试用两片同步十进制计数器74160接成二十九进制计数器。 解: 因为M=29是一个素数,所以必须用整体置零法或整体置数法构成二十九进制计数器。图538是整体置零方式的接法。首先将两片74160以并行进位方式连成一个百进制计数器。当计数器从全0状态开始计数,计入29个脉冲时,经门G1译码产生的低电平信号立刻将两74160同时置零,于是便得到了二十九进制计数器。需要注意的是计数过程中第(2)片74160不出现1001状态,因而它的C端不能给出进位信号。而且,门G1输出的脉冲持续时间极短,也不宜作进位输出信号。如果要求输出进位信号的持续时间为一个时钟信号周期,则应从电路的28状态译出当电路计入28个脉冲后门G2输出变为低电平,第29个计数脉冲到达后门G2的输出跳变为高电平。 图538例57电路的整体置零方式 通过这个例子可以看到,整体置零法不仅可靠性较差,而且往往还要另加译码电路才能得到需要的进位输出信号。 采用整体置数方式可以避免置零法的缺点。如图539所示的电路是采用整体置数法接成的二十九进制计数器。首先仍需将两片74160接成百进制计数器,然后将电路的28状态译码产生LD=0信号,同时加到两片74160上,在下个计数脉冲(第29个输入脉冲)到达时,将0000同时置入两片74160中,从而得到二十九进制计数器。进位信号可以直接由门G的输出端引出。 图539例57电路的整体置数方式 5.3同步时序逻辑电路的设计 同步时序逻辑电路的设计也称同步时序逻辑电路的综合。实际上设计是分析的逆过程,就是根据给定的逻辑功能要求,设计出能实现其逻辑功能的时序电路。设计的流程如图540所示,一般步骤如下: 图540同步时序电路设计流程图 (1) 根据逻辑问题的文字描述建立原始状态表。进行这一步时,可借助于原始状态图,再构成原始状态表。这一步得到的状态图和状态表是原始的,其中可能包含多余的状态。 (2) 采用状态化简方法将原始状态表化为最简状态表。 (3) 进行状态分配(或状态赋值)。即将状态符号用代码表示,得到二进制形式的状态表。 (4) 根据二进制状态表和选用的触发器特性求电路的激励函数和输出函数。求激励函数可用表格法或代数法,具体方法在举例中讨论。 (5) 根据激励函数和输出函数的表达式,画出所要求的逻辑图。 一般说来,同步时序电路设计按上面5个步骤进行。但是,对于某些特殊的同步时序电路,由于状态数量和状态编码方案都已给定,上述设计步骤中的状态化简和状态编码便可以省略,从第(1)步直接跳到第(4)步。 视频讲解 5.3.1建立原始状态表 建立原始状态表的方法可以先借助于原始状态图,画出原始状态图以后再列出原始状态表。目前还没有一个建立原始状态图的系统的算法,主要是采用直观的经验方法。设计一个时序电路首先应该考虑其包括几个状态、状态间如何进行转换、怎样产生输出。 一般的过程是这样: 首先假定一个初始状态A,从这个初始状态A开始,每加入一个输入,就可确定其次态和输出。该次态可能是现态本身,也可能是已有的另一个状态,或是新增加的一个状态。继续这个过程,直到每种输入的可能性、每个现态向其次态的转换都已被考虑到,并且不再构成新的状态为止。 例58建立一个模5的加1/加2计数器的状态图和状态表。 解: 对于模5计数器,显然应有5个状态,设为A~E,以分别记住所输入的脉冲个数。由于这个计数器既可累加1,又可累加2,故需设一个控制输入信号x,当x=0时加1,x=1时加2,Z为输出,表示有进位。 经以上分析后,可画出该计数器的原始状态图和状态表,如图541所示。 图541例58的状态图和状态表 例59有一个串行数据检测器。对它的要求是: 连续输入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的个数。根据以上分析可得该检测器的原始状态图和状态表如图542所示。 图542例59的状态图和状态表 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) 化简方法 这里介绍一种叫隐含表的方法。它的基本思想是: 先对原始状态表中的各状态进行两两比较,找出等价状态对; 然后利用等价的传递性,得到等价类; 最后确定一组等价类,以建立最简状态表。 根据等价状态的定义,两个状态是否等价的条件可归纳为如下两点: 第一,在各种输入取值下,它们的输出完全相同。 第二,在第一个条件满足的前提下,它们的次态满足下列条件之一,即 ① 次态相同; ② 次态交错; ③ 次态循环; ④ 次态对等价。 图543隐含表格式 这里的次态交错是指在某种输入取值下,如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)。隐含表的格式如图543所示。 (2) 顺序比较。顺序比较隐含表中各状态之间的关系,比较结果有如下三种情况: ① qi和qj输出完全相同,次态也相同,或者为现态本身或者交错,qi和qj等价,在隐含表相应的方格内标以√。 ② qi和qj输出不同,表示qi和qj不等价,在对应的方格内标以×。 ③ qi和qj输出相同,但次态既不相同,也不交错。qi和qj是否等价有待进一步考察,在对应的方格内标以qi和qj的次态对。 (3) 关联比较。顺序比较中不能确定的关系的状态对标在方格中,由关联比较进一步考察。这一步在隐含表上直接进行,若后续状态对等价或出现循环,则这些状态对都是等价的; 若后续状态对中出现不等价,则在它以前的状态对都是不等价的。 (4) 找最大等价类,作最简状态表。关联比较后,由等价的传递性可确定最大等价类。 注意: 不与其他任何状态等价的单个状态也是一个最大等价类。每个最大等价类可以合并为一个状态,并以一个新符号表示。这样,由一组新符号构成的状态表便是所求的最简状态表。 例510化简如图544(a)所示的原始状态表。 图544例510图 解: 化简步骤如下。 ① 画隐含表,如图544(b)所示。 ② 顺序比较,结果如图544(b)所示。 ③ 关联比较。AB→BC→× BD→BC→× 说明BC不等价,那么AB,BD也不等价。 ④ 列最大等价类。由关联比较结果可得最大等价类为 (A,D),(B),(C) 令a=(A,D),b=(B),c=(C) 得最简状态表如图544(c)所示。 例511化简如图545(a)所示的原始状态表。 解: 化简步骤如下。 ① 画隐含表,如图545(b)所示。 ② 顺序比较,结果如图545(b)所示。 图545例511的图 ③ 关联比较。 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表示,得最简状态表如图545(c)所示。 视频讲解 2. 不完全确定的状态表的化简 对于不完全确定的状态表的化简是建立在状态相容概念的基础上的。为此先讨论相容的几个概念。 1) 相容概念 ① 相容状态。设A和B是时序电路状态表的两个状态,如果从A和B开始,任何加到时序电路的有效输入序列均产生相同的输出序列(除不确定的那些位之外),那么A和B是相容的,记作(A,B)。相容状态可合并。 ② 相容状态无传递性。(A,B),(B,C),但不一定有(A,C)。 ③ 相容类。所有状态之间都两两相容的状态集合。 ④ 最大相容类。若一个相容类不是任何其他相容类的子集时,则称此相容类为最大相容类。 2) 化简方法 与完全确定的状态表的化简过程大致相同,主要有以下几步: (1) 作隐含表,找相容状态对。 (2) 画合并图,找最大相容类。合并图就是在圆周上标上代表状态的点,点与点之间的连线表示两状态之间的相容关系,而所有点之间都有连线的多边形就构成一个最大相容类。 (3) 做出最简状态表。这一步与完全给定的状态表化简不一样。首先需要从最大相容类(或相容类)中选出一组能覆盖原始状态表全部状态的相容类,这一组相容类必须满足以下三个条件。 ① 覆盖性。所选相容类集合应包含原始状态表的全部状态。 ② 最小性。所选相容类个数应最小。 ③ 闭合性。所选相容类集合中的任一相容类,在原始状态表中任一输入条件下产生的次态应该属于该集合中的某一个相容类。 同时具有覆盖、最小、闭合三个条件的相容类集合,称为最小闭覆盖,这就组成了最简状态表。 例512简化如图546(a)所示的状态表。 图546例512的图 解: 化简步骤如下。 ① 作隐含表,找相容状态对。隐含表如图546(b)所示。顺序比较后进行关联比较。 ② AF→CD→√ BC→ AB→√ DE→√ BD→DE→√ BE→BF→CD→√ CE→AF→√ CF→CE→√ DF→CE→√ 图547合并图 则得到全部相容状态对。 (A,B), (A,F), (B,C), (B,D), (B,E), (B,F), (C,D), (C,E), (C,F), (D,F), (D,E), (E,F) ③ 作合并图,求最大相容类。 状态合并图如图547所示。图中B,C,D,E,F各点都有连线,构成一个全互连多边形,A,B,F构成一个三角形。于是,找到两个最大相容类。 (A,B,F),(B,C,D,E,F) ④ 作最简状态表。 从最大相容类和相容类中选择一组能覆盖原始状态表中全部状态的相容类,假设就选两个最大相容类(A,B,F),(B,C,D,E,F),作闭合覆盖表,检查其是否满足覆盖性和闭合性。闭合覆盖表如表515所示。 表515例512的闭合覆盖表 相容类覆盖闭合 ABCDEFX=0X=1 ABFABFBCD BCDEFBCDEFABFCDE 从表515可看出: 相容类集合(A,B,F),(B,C,D,E,F)覆盖了状态表图546(a)的全部状态,而且每个相容类在任何一种输入情况下的次态集合都完全落在相容类集合中的某个相容类中,因此它们满足了闭合和覆盖这两个条件。此外,相容类的数目已不能再少,满足了最小条件。如果令A′=(A,B,F),B′=(B,C,D,E,F),则可得最简状态表如表516所示。从表中可看出,当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表示,如表517所示。这样处理有利于相应电路的简化,这在后面进行设计电路时可得到进一步理解。有时选取的最大相容类作为相容类集合在闭合检查并不能使次态都属于某个相容类,即会出现不闭合的情况,这时可调整相容类集合的选取,有时不选用最大的相容类而选其中的一个子集反而能满足闭合、覆盖、最小的条件,得到最简状态表。这里不再举例说明,读者可参阅有关参考文献。 表516最简状态表 Q x 01Z A′A′B′B′0 B′A′B′1 表517处理后的最简状态表 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种状态分配方案,如表518所示。这24种分配方案中,实际上只有3种独立的分配方案,其他的方案实质上是等效的(对于电路的难易程度),彼此独立的分配方案KU为 KU=(2n-1)!(2n-N)!n! 当变量数目增加时,其分配方案的数就会急剧增大。表519表明了状态数与状态分配方案的关系。 表518N=4,n=2时的全部分配方案 状态方案 123456789101112 A001001110001101100100111 B011100101011000111011000 C110110001110010001110010 D100011010100111010001101 状态方案 131415161718192021222324 A 000110110010011100011011 B 111001001000110101001110 C 101100010111001010110001 D 010011101101100011100100 表519状态数与状态分配方案总数的关系 状态数N二进制代码 位数n独立分配方案 数KU状态数N二进制代码 位数n独立分配方案 数KU 10 —63 420 21 173 840 32 383 840 42 39410810800 53 14010475675600 在如此众多的状态分配方案中找出一种最佳的分配方案十分困难,且它还与采用什么类型的触发器有关系,因此没有必要将所有分配方案研究一遍。在实际工作中,常采用经验的方法,通过按一定的原则进行分配来获得接近最佳的分配方案。 状态分配的原则为: (1) 在相同输入条件下,次态相同,现态应相邻编码。 (2) 在不同输入条件下,同一现态的次态应相邻编码。 (3) 输出完全相同,两个现态应相邻编码。 以上三个原则中,第一条最重要,应优先考虑。下面举例说明。 例513对表520的最简状态表进行状态分配。 表520例513状态表 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应相邻编码。 图548状态分配 综合上述要求,AB、AC应给予相邻编码,这是三个原则都要求的。借用卡诺图,很容易得到满足上述相邻要求的状态分配方案,如图548所示。根据该图可得状态编码为 A=00,B=01,C=10,D=11 将上述编码代入状态表得二进制状态表如表521所示。当然,上述分配方案不是唯一的。大多数情况下,根据以上三个原则进行状态分配是有效的。不同的状态分配方案并不影响同步时序电路的逻辑功能及稳定性,仅影响电路的复杂程度。 表521二进制状态表 y1y0 X 01 0010/011/0 0110/000/0 1001/011/0 1100/101/1 5.3.4求激励函数和输出函数 在求出了二进制状态表后,可用表格法或代数法求激励函数、输出函数,进而可画出逻辑图。 1. 表格法 (1) 将二进制状态表变换成YZ矩阵。 视频讲解 将二进制状态表排成卡诺图的形式,即得YZ矩阵。例如,将表521的二进制状态表变换成YZ矩阵,如表522所示。 (2) 由YZ矩阵变换成激励矩阵和输出矩阵。 YZ矩阵可看成由Y矩阵和Z矩阵两部分构成。Y矩阵给出每一现态yi的次态值y n+1i,而由现态yi向次态y n+1i的转换依靠触发器的输入激励,这个激励可根据所选触发器的激励表来确定。把Y矩阵中的次态值y n+1i代之以相应的触发器的激励值,就得到激励函数的卡诺图形式,这个卡诺图称为激励矩阵。由YZ矩阵的另一部分Z矩阵,直接可得输出矩阵。例如,假定选JK触发器来实现表522的YZ矩阵,则它的激励矩阵和输出矩阵如表523和表524所示。 表522YZ矩阵 y1y0x 01 0010/011/0 0110/000/0 1100/101/1 1001/011/0 表523激励矩阵J1K1和J0K0 y1y0x 01 001d,0d1d,1d 011d,d10d,d1 11d1,d1d1,d0 10d1,1dd0,1d 表524输出矩阵Z y1y0x 01 0000 0100 1111 1000 关于触发器的激励表在第4章已讨论过,为了设计电路方便查阅,将RS、JK、D、T触发器的激励表列于表525~表528,表中Q为现态,Qn+1为次态。 表525RS触发器的激励表 QQn+1RS 00d1 0110 1001 111d 表526JK触发器的激励表 QQn+1JK 000d 011d 10d1 11d 0 表527D触发器的激励表 QQn+1D 000 011 100 111 表528T触发器的激励表 QQn+1T 000 011 101 110 (3) 由激励和输出矩阵,求激励函数和输出函数。 激励矩阵可以看成各个输入激励填在同一个卡诺图上。因此,在求各个激励函数时,只要分别画出各个输入激励的卡诺图,并由此写出各个激励函数的最简表达式即可。同理,由输出矩阵可写出输出函数的最简表达式。 例如,根据表523和表524可得J1,K1,J0,K0,Z这5个卡诺图,如图549所示,并由此可写出激励函数、输出函数表达式。 图549卡诺图 J1=x-+y-0K1=y0+x-J0=x+y1K0=x-+y-1Z=y1y0 视频讲解 2. 代数法 根据YZ矩阵(二进制状态表)写出电路的次态方程如下: 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描述 图550Moore型电路的 状态转移图 利用VHDL设计时序电路,不需要按照传统的设计方法进行烦琐的状态简化、状态分配、求解激励函数和输出函数等就可以简便地根据状态转移图直接进行描述。所有的状态均可表示为CASE_WHEN结构中的一条CASE语句,而状态的转移则通过IF_THEN_ELSE语句实现。时序电路分为Moore型和Mealy型电路,其VHDL描述略有差别。 例514用VHDL描述Moore型电路的状态转移,状态转移图如图550所示。 解: 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语句来实现。 例515用VHDL描述Mealy型电路的状态转移,状态转移图如图551所示。 图551Mealy型电路的状态转移图 解: 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同步时序逻辑电路设计举例 以上花了较多的篇幅讨论了同步时序逻辑电路的设计方法。一般而言,设计方法要比分析方法复杂一些,对于前面讲的设计步骤,应根据实际情况灵活运用。下面举几个设计实例。 例516将例59的111…序列检测器的问题进一步完成设计。 解: 在例59中已经得到该检测器的原始状态表。现重列出如表529所示,经简化为表530。 表529原始状态表 Qx 01 AA/0B/0 BA/0C/0 CA/0D/1 DA/0D/1 表530最简状态表 Qx 01 AA/0B/0 BA/0C/0 CA/0C/1 图552状态分配 简化状态表共三个状态,所以需要两位触发器Q1和Q0。根据状态分配的原则,一种较简单的分案如图552所示。根据这个状态分配方案可得二进制状态表(YZ矩阵),如表531所示。 若选用JK触发器作为存储元件。如用表格法,可根据JK触发器的激励表得到电路的激励矩阵,如表532所示。 表531YZ矩阵 Q1Q0x 01 0000/001/0 0100/010/0 11dd/ddd/d 1000/010/1 表532激励矩阵J1K1和J0K0 Q1Q0x 01 000d,0d0d,1d 010d,d11d,d1 11dd,dddd,dd 10d1,0dd0,0d 分别画出各激励函数J1,K1,J0,K0和输出函数Z的卡诺图,如图553所示。 图553卡诺图 由卡诺图可得激励函数和输出函数为 J1=xQ0,K1= x-,J0=x1, K0=1,Z=xQ1 如用代数法,则可根据YZ矩阵先写出电路的次态方程。 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 结果与表格法一致,根据激励函数和输出函数可得逻辑图如图554所示。从这个逻辑图可推出实际的电路状态图如图555所示。该状态图表明,当电路进入无效状态11后,若x=1则次态转入10; 若x=0则次态转入00,因此这个电路是能够自启动的。 图554例516逻辑图 图555图554的状态图 本例中若改用D触发器,则由于D触发器的次态方程为 Qn+1=D,即电路的次态方程就是D触发器的激励方程。 D1=xQ1+xQ0=x10 D0=x10 逻辑图如图556所示。 图556用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程序运行的仿真图如图557 所示,这是Mealy型时序电路,输入变量X的变化直接影响到输出变量Z,而状态的变化会等到时钟有效边沿到来时才发生。还可注意到,此电路是111…序列检测器,即检测到3个及3个以上连续的1时,输出Z=1,但从时间仿真图中看到第二个脉冲的有效边沿后就出现Z=1,这就是Mealy型电路的特点,这时实际上已进入第三个节拍段,也就是第三个1已经出现,Z的变化与输入X同步,所以有Z=1。 图557111…序列检测器的时间仿真图 例517设计一个自动售饮料机的逻辑电路,它的投币口每次只能投入一枚五角或一元的硬币。投入一元五角硬币后,机器会自动给出一杯饮料; 投入两元(两枚一元)硬币后,在给出饮料的同时找回一枚五角的硬币。 解: 取投币信号为输入逻辑变量,投入一枚一元硬币时用A=1表示,未投入时A=0; 投入一枚五角硬币用B=1表示,未投入时B=0。给出饮料和找钱为两个输出变量,分别以Y,Z表示。给出饮料时Y=1,不给时Y=0; 找回一枚五角硬币时Z=1,不找时Z=0。 图558例517的状态图 假定通过传感器产生的投币信号(A=1或B=1)在电路转入新状态的同时也随之消失,否则将被误认作又一次投币信号。 设未投币前电路的初始状态为S0,投入五角硬币以后为S1,投入一元硬币(包括投入一 枚一元硬币和投入两枚五角硬币的情况)以后为S2。再投入一枚五角硬币后电路返回S0,同时输出为Y=1,Z=0; 如果投入的是一枚一元硬币,则电路也应返回S0,同时输出为Y=1,Z=1。因此,电路的状态数M=3已足够。根据以上分析,可得自动售饮料机的逻辑电路的状态图如图558所示。 根据状态图可得状态表如表533所示。因为正常工作中不会出现AB=11的情况,所以这时次态和输出均为无关项。又因该状态表已为最简形式,所以不必再进行化简过程。 表533例517的状态表 状态 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作无关状态,则得二进制状态表(YZ矩阵)如表534所示。 表534二进制状态表(YZ矩阵) 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触发器实现,则刚刚求出的YZ矩阵中的Y矩阵也就是激励矩阵。这是因为D触发器的次态方程为Qn+1=D。根据激励矩阵可得激励和输出的卡诺图如图559所示。 图559卡诺图 根据卡诺图可得激励函数和输出函数的表达式为 D1=Q1AB+Q1Q0A+Q0B D0= Q1Q0B+Q0A B Z=Q1A Y=Q1B+Q1A+Q0A 根据激励函数和输出函数可得逻辑图如图560所示,该逻辑图的实际状态图如图561所示。实际的状态图画法是将卡诺图化简过程中圈进去的无关项作为1,没有圈进去的无关项作为0,就可推出。 图560例517的逻辑图 图561图560电路的状态图 从图561可看出,当电路进入无效状态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; 例518试设计一个带有进位输出端的十三进制计数器。 解: 首先进行逻辑抽象。 因为计数器的工作特点是在时钟信号的操作下自动地依次从一个状态转为下一个状态,所以它没有输入逻辑变量,只有进位输出信号。因此,计数器是属于Moore型的一种简单时序电路。 取进位信号为输出逻辑变量C,同时规定有进位输出时C=1,无进位输出时C=0。 图562例518的状态图 十三进制计数器应该有13个有效状态,若分别用S0,S1,…,S12表示,则按题意可以画出如图562所示的电路状态转换图。 因为十三进制计数器必须用13个不同的状态表示已经输入的脉冲数,所以状态转换图已不能再化简。 根据状态数可知,现要求N=13,故应取触发器位数n=4,因为 23<13<24 假如对状态分配无特殊要求,可以取自然二进制数的0000~1100作为S0~S12的编码,于是得到了表535中的状态编码。 表535例518电路的状态表 状态变化顺序 状 态 编 码 Q3Q2Q1Q0进位输出C等效十进制数 S0000000 S1000101 S2001002 S3001103 S4010004 S5010105 S6011006 S7011107 S8100008 S9100109 S101010010 S111011011 S121100112 S0 000000 将状态表表示成卡诺图形式,也就是得到的YZ矩阵(二进制状态表)如表536所示。卡诺图中不会出现的三种状态1101,1110和1111作为无关项处理。 表536例518的YZ矩阵 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 图563卡诺图 将表536的YZ矩阵分解为5张卡诺图,如图563所示,从卡诺图很容易求出电路的次态方程和输出方程为 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 根据激励函数和输出函数得逻辑图,如图564所示。 图564十三进制同步计数器电路 最后还应检查电路能否自启动。将三个无效状态1101、1110和1111分别代入最后改写过的电路次态方程中计算,所得次态分别为0010、0010和0000,故电路能自启动。图565就是图564逻辑电路的实际状态图。 图565图564的状态图 该计数器用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. 分析举例 例519分析如图566所示的脉冲异步时序电路。 图566例519的脉冲异步时序电路 解: 从电路图可以看出,这个电路的时钟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。其余以此类推,就得出表537的电路次态真值表。 表537例519的电路次态真值表 输入脉冲数Q3Q2Q1CP3CP2(Q1)CP1Qn+13Qn+12Qn+11Z 00000000000 10001010010 20011110100 30101010110 40111111100 51001010001 61011110101 71101010101 81111110001 要注意的是: 表中CP=1,表示时钟输入端有下降沿到达; CP=0,表示没有时钟信号到达,触发器保持原来的状态不变。各个触发器的CP端信号不是在同一时刻出现的,有先后差错,但在状态变化稳定后,下一轮时钟信号才会再出现。 第四步,做出状态表(表538)和状态图(图567)。 表538例519的状态表 Q3Q2Q1Qn+13Qn+12Qn+11Z 0000010 0010100 0100110 0111000 1000001 1010101 1100101 1110001 Q3Q2Q1/Z 图567例519的状态图 第五步,画时间图,如图568所示。功能分析如下: 图568例519的时间图 从上面画出的状态图、状态表及时间图可以看出,该电路在有效脉冲信号作用下,状态在000到100这5个状态之间进行循环,其他三个状态101、110、111在一个脉冲作用后会自动进入有效循环中。所以该电路为异步五进制计数器。 5.6.2脉冲异步时序逻辑电路的设计 脉冲异步时序逻辑电路的设计方法与同步时序逻辑电路的设计基本类似。不同的是设计脉冲异步时序逻辑电路时,每个触发器的CP端不再是同一个时钟脉冲,而是与其他输入端一样作为触发器的一个激励来考虑。另外,为了使电路工作可靠,输入信号必须是串行序列脉冲,在第二个脉冲达到时,第一个脉冲所引起的电路响应必须已经完成,电路处于稳定状态。也就是前面所说的“在同一个时刻,只允许一个输入”。 由于电路中没有统一时钟,电路中触发器的时钟作为激励来处理,这就意味可以通过控制时钟端的输入脉冲的有无来控制触发器翻转还是不翻转。基于这一思想,在设计脉冲异步时序逻辑电路时,可以使用表539~表542所列的4种常用触发器(带CP)的激励表。 表539RS触发器的激励表(CP) QQn+1RSCP 00d0d 00dd0 01011 10101 110dd 11dd0 表540JK触发器的激励表(CP) QQn+1JKCP 000dd 00dd0 011d1 10d11 11d0d 11dd0 表541T触发器的激励表(CP) QQn+1TCP 000d 00d0 0111 1011 111d 11d0 表542D触发器的激励表(CP) QQn+1DCP 000d 00d0 0111 1001 111d 11d0 从表539~表542可以看出,在要求触发器状态保持不变时,有两种不同的处理方式: 一是令CP为d,输入端取相应的值; 二是令CP为0,输入端取任意值。例如,当要使D触发器维持不变时,可令CP为d,D为Q; 也可令CP为0,D为d。这使激励函数的确定更加灵活。一般选择CP为0,输入为任意值。 例520设计一个脉冲异步时序逻辑检测器。该电路有三个输入x1、x2、x3,一个输出Z,当检测到输入脉冲序列为x1→x2→x3 时,输出Z为1,其后当检测到输入脉冲出现x2 时,输出Z由1变为0。 解: 分析题意,可以得到输入、输出信号的波形关系如图569所示。 图569例520的波形图 首先可以参照同步时序电路设计那样建立电路的原始状态图和状态表。假设A为初始态,B为接收到x1的状态,C为接收到脉冲序列x1→x2的状态,D为接收到脉冲序列x1→x2→x3的状态,这样可以得到部分原始状态图,如图570(a)所示,然后再从每个状态出发,做出所有可能输入条件下的状态转换关系,从而建立完成的原始状态图如图570(b)所示。 图570例520的原始状态图 由图570(b)可以得到原始状态表如表543所示。 表543例520的原始状态表 Q Qn+1 x1x2x3Z ABAA0 BBCA0 CBAD0 DDAD1 按照状态表化简规则,该原始状态表已经是最简形式。该电路为Moore型,共有4个状态,可以两个状态变量Q2Q1来表示,根据状态分配原则,将A分配00、B分配01、C分配11、D分配10,得到二进制状态表如表544所示。 如采用D触发器来实现,将CP看作激励,D触发器的次态方程可以写成 Qn+1=DCP+QCP 表544例520的二进制状态表 Q2Q1 Qn+12Qn+11 x1x2x3Z 000100000 010111000 110100100 101000101 根据表542,在D触发器的激励表中,如状态没有变化,可以使CP=0,D为任意,也可以令D=Q,CP为任意。根据化简的需求,可以灵活地运用,使得电路有最简的结果。将表544与表542一起来对照,可得到简化了的激励矩阵,如图571所示。 图571例520的简化卡诺图 图572例520的逻辑电路图 图571的卡诺图实际上应该是5变量的卡诺图,但由于脉冲异步时序电路不允许两个或多个输入脉冲同时出现,即输入的变量组合不允许出现011、101、110、111,而000时,电路保持不变,故可将5变量卡若图简化成图571的形式。但此时卡诺图的各列是不相邻的,化简仅仅是在给定的列中进行,每列只允许一个输入变量出项。经如图571所示的合并方案得激励函数为 D2=x22Q1CP2=x1Q1+x2 D1=x1CP1=x12+x2Q2+x3 由表543也可得输出函数为 Z=Q21 根据激励函数、输出函数表达式可以画出如图572的逻辑电路图。 5.7小结 时序逻辑电路的特点是: 电路的输出不仅与当前输入有关,还与以前的输入有关。 本章用大量的篇幅讨论了同步时序电路的分析与设计方法。同步时序电路工作稳定、可靠,设计简单,在数字系统中被广泛采用。与组合逻辑电路比较,主要多了存储元件部分。作为存储元件的器件主要有RS触发器、JK触发器、D触发器、T触发器,根据电路中所用触发器类型的特性,利用表格法或代数法可对同步时序电路进行分析和设计。 寄存器、计数器是数字系统中最常用的时序逻辑电路构件,其功能是: 在某一时刻将数据并行打入其中进行保存,或通过移位寄存器的移位功能实现数据左移、右移、并入并出、串入并出、并入串出等逻辑功能。 同步时序电路分析的步骤为: ①根据逻辑图写出输出函数和激励函数表达式。②根据所用触发器的特性用代数法或表格法求电路的YZ矩阵(二进制状态表)。③根据YZ矩阵得状态表和状态图。④根据状态表和状态图作时间图并用文字描述电路的逻辑功能。 同步时序电路的设计步骤为: ①根据给定的逻辑要求作原始状态图和状态表。②状态表化简。③状态分配。④根据选用的触发器特性用表格法或代数法求激励函数和输出函数的表达式。⑤根据激励函数、输出函数表达式画逻辑图。 硬件描述语言VHDL对时序电路的描述与对组合电路的描述有所不同。 而异步时序电路没有统一的时钟脉冲,电路状态的改变完全由外部输入信号的变化引起。根据输入信号的不同,异步时序电路又分为脉冲型异步时序电路和电平型异步时序电路。顾名思义,脉冲型异步时序电路的输入包含脉冲信号,而电平异步时序电路的输入仅由电平信号构成。 异步时序电路的分析、设计的方法与同步时序电路不同。脉冲型、电平型的异步时序电路的分析与设计的方法也不尽相同,此章中简要介绍了脉冲型异步时序电路的分析与设计。 5.8习题与思考题 1. 简化如表545和表546所示的状态表。 表545题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 表546题1表(b) QX 01 AD/dC/0 BD/1E/d Cd/dE/1 DA/0C/d EB/1C/d 2. 根据状态分配方法,分别对状态表547和表548进行状态分配,列出二进制状态表。 表547题2表(a) QX 01 AA/0B/0 BC/0B/0 CD/0B/0 DB/1A/0 表548题2表(b) QX 01 AB/0E/0 BD/0A/1 CD/1A/0 DB/1C/1 EA/0A/0 3. 试分析如图573所示的时序电路的逻辑功能,画出状态表和状态图。 图573题3的图 4. 试分析如图574所示的时序电路的逻辑功能,画出状态表和状态图,检查电路能否自启动。 图574题4的图 5. 试分析如图575所示的时序电路,画出状态表和状态图,检查电路能否自启动,说明电路实现的功能。 图575题5的图 6. 试分析如图576所示的时序电路,画出状态表和状态图,并做出当电平输入x为0110101序列时电路的时间图。 7. 试分析如图577所示的时序电路,画出状态表和状态图,并做出当电平输入x为0110110序列时电路的时间图。 图576题6的图 图577题7的图 8. 分析如图578所示的计数器电路,说明这是多少进制的计数器。十进制计数器74160的功能表(同74LS161的功能表)见表513。 9. 分析如图579所示的计数器电路,画出电路的状态图,说明这是多少进制的计数器。十六进制计数器74LS161的功能表见表513。 图578题8的图 图579题9的图 10. 用4位同步二进制计数器74LS161接成十二进制计数器,标出输入、输出端。可以附加必要的门电路。74LS161的功能见表513。 11. 试分析图580的计数器在M=1和M=0时各为几进制。74160的功能见表513。 12. 图581的电路是可变进制计数器。试分析当控制变量A为1和0时电路各为几进制计数器。74LS161的功能见表513。 图580题11的图 图581题12的图 13. 设计一个可控进制计数器,当输入控制变量M=0时工作在五进制,M=1时工作在十五进制。请标出计数输入端和进位输出端。 14. 试分析图582计数器电路的分频比(即Y与CP的频率之比)。74LS161的功能见表513。 图582题14的图 15. 图583的电路是由两片同步十进制计数器74160组成的计数器。试分析这是多少进制的计数器,两片之间是几进制。74160的功能见表513。 图583题15的图 16. 分析图584给出的电路,说明这是多少进制的计数器,两片之间是多少进制。74LS161的功能见表513。 图584题16的图 17. 用同步十进制计数器芯片74160设计一个365进制的计数器。要求各位间为十进制关系。允许附加必要的门电路。74160的功能见表513。 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位循环码计数器,它的状态转换表应如表549所示。 表549题22的表 计 数 顺 序 电 路 状 态 Q3Q2Q1Q0进位输出C 000000 100010 200110 300100 401100 501110 601010 701000 811000 911010 1011110 1111100 1210100 1310110 1410010 1510001 1600000 图585题23的图 23. 设计一个控制步进电动机三相六状态工作的逻辑电路。如果用1表示电机绕组导通,0表示电机绕组截止,则三个绕组ABC的状态转换图应如图585所示。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. 分析如图586所示的脉冲异步时序逻辑电路,指出该电路的功能。 图586题27的图 28. 试用D触发器设计x1→x2→x2→…序列检测器。