第5章〓时序逻辑电路设计 【内容概要】 时序逻辑电路的设计,就是针对给定的时序逻辑命题,设计出能实现要求的电路。时序逻辑设计也称为时序逻辑综合,是时序逻辑分析的逆过程。 一般情况下,时序逻辑命题只给出要求实现的功能及要达到的技术指标。设计者应根据实际条件,决定采用什么样的工作方式、电路结构及元器件。目标是在达到设计要求的前提下,确保稳定性和可靠性,尽可能使电路简化。 本章首先结合调宽码译码器设计的具体实例,介绍同步时序电路设计的基本方法和步骤; 其次,结合典型实例对各关键步骤依次阐述其实现原则和基本原理; 最后,以较复杂时序逻辑问题序列检测器设计和任意进制计数器设计为例,进一步讨论针对特定应用的时序逻辑电路设计的方法和技巧。 【学习目标】 通过学习本章内容,学生能利用同步时序电路设计的基本方法和步骤,针对给定的同步时序逻辑命题,设计出可实现要求的电路,从而提高解决复杂工程问题的能力,培养创新意识。 【思政元素】 时序逻辑电路的设计关键在于根据设计需求,确定电路的所有状态及状态之间的转换关系。通过学习时序逻辑电路设计中确定电路状态的方法和技巧,引导学生在面对纷繁复杂的事物或看似无从入手的问题时应沉着冷静、多观察、多思考,培养自身敏锐的洞察力和丰富的联想力,以发现事物的本质特征,提高获取有效信息、解决问题的能力。 视频讲解 5.1同步时序逻辑电路设计的基本方法◆ 在进行同步时序逻辑电路设计时,首先应根据文字描述的功能要求,建立时序逻辑电路的原始状态图和状态表,然后对原始的状态表加以化简,最后选择合适的集成电路器件或给定的集成电路器件来实现状态表,从而达到电路设计目的。需要强调指出的是,同步时序逻辑电路设计中,所有的触发器的时钟输入均由一个公共的时钟脉冲(即同步时序)所驱动。 时序电路的设计是一个比较复杂的问题。虽然同步时序电路的设计在许多方面已有较为完善的方法可以遵循,但在某些方面(如状态化简、状态分配等)还没有完全成熟的方法,需要靠设计者的经验,或从大量方法中进行比较选择。本章尽可能系统地介绍同步时序逻辑电路设计的主要步骤和方法,并通过一些例子做进一步说明。 目前,中、大规模集成电路种类很多,通过对文字描述的逻辑功能要求做一定的分析后,不必按照本章介绍的步骤逐一套用,只要灵活地应用其中的一些思想及方法,就可以设计出简单、实用、可靠性高的电路。 从设计系统化的角度出发,同步时序电路的设计包括建立原始状态表、状态化简、状态分配(或称状态编码)、选择触发器类型、确定激励函数和输出函数、画出逻辑图、检查逻辑电路的功能等步骤。 本节以一个实例,引出同步时序逻辑设计的基本步骤及方法。 【例51】设计一个调宽码译码器。 解: 调宽码是一种串行码。因抗噪声干扰能力较强,常用于无线或红外数据通信中。例如,很多家用电器的红外遥控数据就是调宽码。图5.1所示为调宽码的编码格式,其中同步时钟的周期为T,用于对调宽码进行定位。图5.1中假定待传送的原始数据为10010100。由图5.1可看出,调宽码用不同的宽度和占空比代表原始数据的1和0,调宽码的特征见表5.1。 图5.1调宽码的编码格式 表5.1调宽码的特征 原始数据位 调宽码 宽度占空比说明 13T1/3前两个T内为高电平,后一个T内为低电平 02T1/2前一个T内为高电平,后一个T内为低电平 第1步,分析命题,规划电路框架。 记调宽码流为X,译出的数据为Z,同步时钟为clk。要将X译为Z,可在clk脉冲的上升沿对X取样。如果连续取样得到的序列为110,则Z=1; 如果为10,则Z=0; 否则就是误码。显然,待设计的逻辑电路应该记忆X中的0以前的取样,才能决定当前的Z是1还是0。因此,待设计的电路是时序逻辑电路。 电路需要一个调宽码流输入端X,一个公共时钟输入端clk,电路中的所有触发器都要使用clk。需要两个输出端Z及E,Z用于输出译码值,E用于指示当前的Z是否有效,约定E=1时表示Z值有效。其电路框架见图5.2。 第2步,根据设计功能要求,建立原始状态图及状态表。 由图5.1看出,一个原始数据位对应的码流以X=0为结束标志,且由E在此时的值指明是否被译出。因此,E的表达式中含有变量X,即采用Mealy型电路有利于产生输出量E。 下面逐步分析需要建立哪些状态,这些状态各代表什么含义。先给出原始状态图(见图5.3),并说明各状态及相互关系。 图5.2调宽码译码逻辑电路框架图 图5.3例51的原始状态图 状态S0: 连续0误码状态。本状态表示已连续收到X=0的次数大于1。在此状态下,若再收到X=0,则应维持本状态; 若再收到X=1,则说明误码结束,可能下一个原始数据位正在到来,应转入状态S2处理。 状态S1: 等待状态。此时已译出一位原始数据,等待下一位原始数据的到来。在此状态下,若收到X=0,则是误码,应转入S0状态; 若收到X=1,则说明下一个原始数据位正在到来,应转入下个状态S2,进一步判断正在到来的原始数据位是0还是1,或是误码。 状态S2: 已收到待译出数据的第一次X=1的取样。在此状态下,若再收到X=0,则译出1个为0的原始数据位,应转入状态S1,同时输出ZE=01; 若再收到X=1,则说明正在到来的原始数据位可能为1或误码,需转入状态S3进一步判断。 状态S3: 已收到待译出数据到的第二次X=1的取样。在此状态下,若再收到X=0,则译出一个为1的原始数据位,应转入状态S1,同时输出ZE=11; 若再收到X=1,则说明是误码,需转入状态S4处理。 状态S4: 连续1误码状态。此时已连续收到X=1的次数大于2。在此状态下,若再收到X=1,则应维持本状态,等待误码结束; 若再收到X=0,则说明误码结束,转入S1。 除上面指定的ZE输出值外,其余情况下必须令E=0,表示Z无效。现将Z无效时的值记为无关项Ф,以简化Z的生成逻辑。原始状态图如图5.3所示。由原始状态图可作出原始状态表,如表5.2所示。 表5.2例51的原始状态表 现态 次态/输出(Si/ZE) X=0X=1 S0S0/00S2/10 S1S0/00S2/10 S2S1/01S3/10 S3S1/11S4/10 S4S1/00S4/10 第3步,原始状态化简。 在第2步中,按事件的自然发展规律指定了5个状态。状态越多,记忆状态所需的触发器也就越多。状态化简就是把某些多余的或重复的状态加以合并,使状态的数目减为最少。观察表5.2中的两个现态S0及S1,不难发现: (1) 当输入为X=0时,它们都转到次态S0,且都输出ZE=00; (2) 当输入为X=1时,它们都转到次态S2,且都输出ZE=10。 这说明S0和S1可以合并为一个状态,记为S1,于是得到化简后的状态图,如图5.4所示。对应的状态表如表5.3所示。通过化简使原来的5个状态减少了一个。 必须指出,仅凭一般观察很难全面、合理地完成状态化简,尤其是对于复杂的时序逻辑设计。这一问题将在5.3节中详细讨论。 图5.4例51化简后的状态图 表5.3例51化简后的状态表 现态 次态/输出(Si/ZE) X=0X=1 S1S1/Ф0S2/Ф0 S2S1/ 01S3/Ф0 S3S1/ 11S4/Ф0 S4S1/Ф0S4/Ф0 第4步,状态编码。 以上对各状态用符号进行了命名。状态是用触发器记忆的,因此可用二进制代码表示各状态,以便能在触发器中存储。已知n个触发器能表示的状态数为2n个,用2个触发器恰好能表示4个状态。如果不化简,则存储原来的5个状态至少需要3个触发器。 2个触发器能存储4种代码: 00,01,10,11。究竟哪个代码分配给哪个状态?这就是编码。编码方案不同,所设计电路的复杂程度也不同。常见编码方案有自然二进制码、格雷码和独热码3种,本例采用如下自然二进制码方案: S1: 00,S2: 01,S3: 10,S4: 11 用编码代替状态名,得到编码后的状态表,如表5.4所示。 第5步,确定激励函数及输出方程。 要使状态按照既定的目标转移,必须为各触发器的激励端配置合适的激励逻辑电路。首先,要选择触发器的类型。原则上,选用任何类型的触发器都可达到设计目的,但触发器类型不同,激励函数的复杂程度也不同。究竟选用什么类型的触发器为好?目前尚无行之有效的理论方法。实际操作时一般基于经验进行。这里选用JK触发器,时钟控制端为上升沿触发。 将状态代码记为y2y1,两个触发器的激励记为J2、K2和J1、K1。激励函数要根据当前的输入X及现态y2y1,驱动触发器转移到指定的次态。所以,J2、K2及J1、K1均为X、y2、y1的函数。当然,X、Z也是X、y2、y1的函数。这是1个多输入、多输出组合逻辑电路的设计问题,其逻辑结构如图5.5所示。为了设计此组合逻辑,需列出其真值表,如表5.5所示。 表5.4编码后的状态表 现态 y2y1 次态/输出yn+12yn+11/ZE X=0X=1 0000/Ф001/Ф0 0100/0110/Ф0 1000/1111/Ф0 1100/Ф011/Ф0 图5.5例51的逻辑结构 表5.5待设计的组合逻辑真值表 输入 Xy2y1yn+12yn+11 输出 J2K2J1K1ZE 000000Ф0ФФ0 001000ФФ101 01000Ф10Ф11 01100Ф1Ф1Ф0 100010Ф1ФФ0 101101ФФ1Ф0 11011Ф01ФФ0 11111Ф0Ф0Ф0 下面讨论表5.5中的数据是如何推导出来的。对于图5.5中的组合逻辑电路而言,X、y2、y1是输入量,J2、K2、J1、K1及Z、E是输出量。我们的目的是对X、y2、y1的各种组 合值,按状态图的要求确定J2、K2、J1、K1的值。要想确定J2、K2、J1、K1的值,又须知道次态是什么,故在表5.5中列出了次态yn+12yn+11栏。此栏完全是为推导方便而列出的,在后面作卡诺图时不会涉及此栏的值。下面以第1行为例,说明推导过程。为推导时方便起见,将JK触发器的激励表列于表5.6中(表5.6中Ф为任意项)。 表5.6JK触发器激励表 Q→Qn+1JK 001Φ 011Φ 10Φ1 11Φ0 (1) 已知X=0,y2 y1=00,查状态表5.4知: yn+12yn+11=00,ZE=Φ0。将查表结果填入表5.5中(单波浪下画线部分)。 (2) 对于触发器2,已知现态y2=0,次态yn+12=0,查JK触发器的激励表知,实现y2→yn+12转移所需的J2K2=0Ф,将其填入表中(双波浪下画线部分)。 (3) 对于触发器1,已知现态y1=0,次态yn+11=0,查JK触发器的激励表可知,实现y1→yn+11转移所需的J1K1=0Ф,将其填入表5.5中(下画虚线)。 其余各行照此处理。由表5.5,分别作出各输出量的卡诺图,如图5.6所示。 图5.6例51的卡诺图 由卡诺图化简,得到激励函数和输出函数如下: J2=Xy1K2= J1=XK1= y-2+= y2X Z=y2E=y-2y1+y2y-1=(y2y1) 由此可画出调宽码译码器的逻辑电路,如图5.7所示。 图5.7例51的逻辑电路图 本节用一个简单的例子介绍了时序逻辑电路设计的基本步骤和方法,同时也引出了许多需要进一步讨论的问题。如: 采用Moore型还是Mealy型电路?如何化简状态?怎样合理设计分配状态编码?选择什么类型的触发器为好?由此看出,时序逻辑电路设计具有极大的灵活性。在5.2节~5.5节中,将围绕实例,就这些问题展开专门讨论。 视频讲解 5.2建立原始状态◆ 原始状态图是根据问题的文字描述作出的状态图,是对设计要求的第一次抽象,是后续设计的重要依据。因此,把解决问题的整体部署和具体细节,无遗漏地反映在原始状态图中,是成功地实现设计的关键一步。 在建立原始状态图时主要考虑以下4点。 (1) 确定采用Moore型还是Mealy型电路。Moore型电路的输出由状态量决定,记忆历史输入需要状态量,产生输出也需要状态量参与,故一般情况下,Moore型电路需要的状态数比Mealy型的多。但Moore型电路的设计较简单,如果输出可由状态编码完全确定中,或状态编码本身就是希望的输出(如计数器),则可采用Moore型电路; 如果求输出量时,有输入量参与运算较简便,则可采用Mealy型电路。必须指出,很多时序逻辑设计既可采用Moore型又可采用Mealy型电路,但设计的复杂程度不同。 (2) 找准第一个状态(即初始状态)。时序逻辑电路在输入信号作用前的状态称为初始状态。描述某个电路的状态图或状态表中,用不同状态作为初始状态时,对相同输入序列所产生的状态响应序列和输出序列是不相同的。因此,在建立原始状态图时,应首先找到初始状态,然后从初始状态出发考虑在各种输入作用下的状态转移和输出响应。 (3) 根据需要记忆的信息,从初始状态开始,逐步扩充新状态。同步时序逻辑电路中状态数目的多少取决于需要记忆和区分的信息量。一般而言,当某个状态下输入信号作用的结果能用已有的某个状态表示时,应转向相应的已有状态。仅当某个状态下输入信号作用的结果不能用已有的某个状态表示时,才令其转向新的状态。注意,所扩充的状态是现有状态不能表示的状态。如果一时不能确定,宁愿扩充也不要造成遗漏。如果该状态是重复的,在状态化简时会得以合并。 (4) 边扩充新状态边确定状态的转移及输入、输出变量。时序电路的功能是通过输出对输入的响应来体现的。在建立原始状态图时,必须确定各时刻的输出。在Moore型电路中,应指明每种状态下对应的输出; 在Mealy型电路中则应指明从每个状态出发,在不同输入作用下对应的输出值。注意,如果输入有n个,则从任一状态出发、指向其他状态的转移线一般有2n条。当然,可能存在几个不同的输入组合值共用一条转移线到达另一状态的情况,此时必须明确标明,否则原始状态表中将会缺少数据项。 【例52】设计一个4位串行二进制码奇偶检测器电路。 解: 数据的传输方式有并行传输与串行传输。并行传输即通过一组导线同时传输数据的各个二进制位,速度快,但线路成本高,适用于近距离传输。串行传输则是逐位传输数据,速度较慢,但因传输导线少而成本低,适用于远距离传输。 本例传输的数据为4位二进制码,即每4位二进制位为一组,以串行方式输入检测电路。图5.8所示为输入数据的格式,同步时钟clk的上升沿与每位数据x的中点对齐,检测电路在clk的上升沿采集x。每当一组数据的最后一位到达后,即判断该组中含有多少个1。含有偶数个1时电路的输出z=1,否则z=0。图5.9为奇偶检测电路的框架。 图5.8串行数据格式 图5.9奇偶检测电路的框架 依据上述关于电路的分析,本例采用Mealy型电路。 假设以等待一组数据的首位到来为第一个状态A。当收到首位数据为0时,转到状态B并输出0; 若首位数据为1,则转到状态C并输出0,于是扩充了两个新状态B和C。在B和C状态下,输入数据均可能是0或1。故由B状态可扩充D和E状态,由C状态可扩充F和G状态。因此,共得到15个状态。其中H~O状态在收到第4位数据输入后,就能判断应输出z=0还是z=1,并且都转到A状态,等待检测下一组数据。由此得到原始状态图如图5.10所示。 如果采用Moore型电路,则原始状态图将如图5.11所示。因为输出仅由状态量决定,图5.11中缺少输出z=1的状态,故需要增加一个状态P,用于输出z=1。由此可见,本例若采用Moore型电路,则需要的状态数比Mealy型的多。 由Mealy型原始状态图作出原始状态表,如表5.7所示。 图5.10例5.2的Mealy型原始状态图 图5.11例5.2的Moore型原始状态图 表5.7例52的原始状态表 现态 次态/输出 x=0x=1现态 次态/输出 x=0x=1 AB/0C/0IA/0A/1 BD/0E/0JA/0A/1 CF/0G/0KA/1A/0 DH/0I/0LA/0A/1 EJ/0K/0MA/1A/0 FL/0M/0NA/1A/0 GN/0O/0OA/0A/1 HA/1A/0 5.3状态化简◆ 原始状态图往往带有主观性,与设计者的经验有很大的关系。状态化简是设计的重要步骤。现有多种化简方法,在介绍之前先讨论化简的基本原理。 5.3.1状态化简的基本原理 情形1次态相同 若有状态Si和Sj,在相同的输入下,都转到同一个次态,并且产生相同的输出,则Si和Sj可以合并。称Si和Sj为等效对,记为(Si,Sj)。这一情形如图5.12所示, 图5.12情形1次态相同 将合并后的状态记为Si。图5.12(a)中Sm、Sn为次态; 图5.12(b)中Sn为一个次态,另一个次态即Si。表5.7中存在着大量的等效对,例如(H,K)、(I、J)、(J、L)、(K,M)等,在5.3.2节中再详细讨论对它们的合并。 这里必须说明两点: 次态可以是与现态相同的状态; 欲考察两个状态是否为等效对,必须考察每个状态下的所有输入值,如果电路的输入量有n个,则输入值有2n种,并且要考察各状态在相同的输入值下,是否都产生相同的输出并且都转到同一个次态。下面的讨论中,除特别说明外均默认如此。 情形2次态交错 若Si和Sj在某些输入值下互为次态且输出相同,但在其他输入值下满足情形1,则Si和Sj为等效对,可以合并。 如图5.13所示,当输入为0时,Si和Sj互为次态且输出均为1; 当输入为1时,Si和Sj都转到Sm态且输出都为0。因此,Si和Sj为等效对,可将其合并为一个状态,记为Si。 情形3状态对封闭链 若有几对状态,对于每一对状态而言,在相同的输入下,能产生相同的输出但到达的次态不同。若它们构成所谓“状态对封闭链”,则这些状态对均为等效对。 如图5.14所示上部原始状态图,Si和Sj、Sq和Sp、Sm和Sn均为等效对。 图5.13情形2次态交错 图5.14情形3状态对封闭链 对于Si和Sj,在输入为0时都转到Si状态且都输出0; 在输入为1时,尽管输出相同(都为1),但分别转到不同的状态Sq和Sp。如果Sq和Sp为可以合并,则Si和Sj就为等效对。为此,需考察Sq和Sp。 对于Sq和Sp,在输入为1时次态交错且都输出0; 在输入为0时,尽管输出相同(均为0),但分别转到不同的状态Sm和Sn。如果Sm和Sn可以合并,则Sq和Sp就为等效对。为此,又需考察Sm和Sn。 对于Sm和Sn,在输入为0时次态分别为上述需要考察的Sq和Sp,且都输出1; 在输入为1时,次态也分别为上述需要考察的Si和Sj。 综上所述可以看出,如果Si和Sj为可以合并,则Sm和Sn就能合并; 如果Sm和Sn可以合并,则Sq和Sp就能合并; 如果Sq和Sp可以合并,则Si和Sj就能合并。这种相互依从的关系称为状态对封闭链。 状态对封闭链中的每对状态都是可以合并的。这是因为: 对于链中的任一对状态,例如Sq和Sp,任给一个输入序列,分别从Sq和Sp出发,产生的输出序列必然相同。例如,给定输入序列01101001,从Sq出发产生的输出序列为00100001; 从Sp出发产生的输出序列也为00100001。图5.14所示下部的状态图即为化简结果。 5.3.2完全定义状态化简方法 所谓完全定义状态图(或状态表),是指对于所涉及的任一状态,都明确定义了对全部输入值的具体次态响应。以上的讨论仅限于完全定义的状态图(或状态表)。 实际中,存在不完全定义状态图(或状态表)。所谓不完全定义,是指所涉及的状态中,有些状态对于某些输入值的次态响应不需要给出定义或为任意,即次态为任意态Ф。 完全定义和不完全定义状态图(或状态表)的化简方法不同。本节仅讨论完全定义的状态图(或状态表)的化简。 1. 有关定义 首先,给出几个涉及化简的定义。 等效对: 若两个状态Si和Sj,对于所有可能的输入序列,分别从Si和Sj出发,产生的输出序列相同,则称Si与Sj等效; 称Si和Sj为等效状态对,简称等效对,记为(Si,Sj)。所谓“所有可能的输入序列”是指序列的长度及值的组合任意。这样的序列有无穷多个,要想以此检测等效对是不现实的,而应采用5.3.1节所述的方法。 等效对的传递性: 若状态Si和Sj为等效对,状态Sj和Sm为等效对,则Si和Sm也为等效对,称为等效对的传递性,记为(Si,Sj),(Sj,Sm)→(Si,Sm)。 等效类: 若一个状态集合中的任何两个状态都互为等效,则称该状态集合为等效类。例如,若有(Si,Sj),(Sj,Sm)→(Si,Sm),则{Si,Sj,Sm}为等效类。 注意: 只含有一个状态的集合也是等效类。 最大等效类: 将状态图(或状态表)中的全部状态划分为若干等效类,若某个等效类中的状态不能与其他等效类中的状态构成等效对,则这个等效类称为最大等效类。最大等效类与其他等效类的交集为空集合。 由以上定义可知,最大等效类中的状态可以合并为1个状态。因此,状态化简的过程就是将全部状态划分为若干最大等效类的过程。 2. 隐含表化简方法 从原始状态表或状态图上直接寻找状态对,对于5.3.1节中的情形1较容易,但对于情形2和情形3则较困难。用隐含表化简法则能全面找出状态对,进而确定全部最大等效类。现在继续求解例52,完成状态化简。以表5.7为例,介绍隐含表化简方法。 隐含表即图5.15所示的三角形框架表格。在各行的左侧依从上到下次序标出状态名称,从第二个状态开始直到最后一个状态; 各列的下边依从左到右次序标出状态名称,从第一个状态开始直到倒数第二个状态。每格代表其所在行、列的状态。这种表格能使所有状态彼此配对而又不重复,因而不会遗漏可能存在的等效对。 图5.15例52的隐含表 化简分以下3步进行。 (1) 判断各方格代表的状态是否为等效对。例如: ① 状态A与O,当x=0时都输出0,但当x=1时输出不同,因此断定A与O不是等效对,在对应格中填入“×”。 ② 状态I与O,当x=0时都输出0且都转倒A状态,当x=1时都输出1且都转到A状态,因此断定I与O是等效对,在对应格中填入“√”。 ③ 状态A与B,当x=0都输出0,但分别转到B、D,当x=1时都输出0,但分别转到C、E,由此可见,A与B能否等效,要看B与D能否等效且C与E能否等效,因此在代表BA的格中同时填入“BD”和“CE”,表示暂时未决。 以此类推,完成全部表格的填写。 (2) 审查未决格中记录的状态对,只要有一对可断定为非等效对,则该格代表的状态就不是等效对,将其画上“/”线以示否定,如: ① 代表G与F的格。该格中记录了L与N、M与O两个状态对。先看L与N,代表L与N的格中为“×”,因此立即判定G与F不是等效对,将对应格画上“/”线。判断流程示意如下: ② 代表B与A的格。该格中记录了B与D、C与E两个状态对。先看B与D,代表B与D的格中又记录了D与H、E与I两个状态对。再看D与H,代表D与H的格中为“×”。因此判定B与D 不是等效对,由此又判定B与A不是等效对。判断流程示意如下: 以此类推,完成全部未决格的判定。如果最后还有形成封闭链的未决格,则这些格代表的状态都是等效对,在这些格中标上“√”。 (3) 求最大等效类。用等效对的传递性容易证明: 在同一列上的“√”格及这些“√”格所在的行上的“√”格涉及的状态构成一个最大等效类。观察图5.15,可以看出: ① H列、M行、N行及K行上的所有“√”格涉及的状态构成最大等效类。 Q1={H,M,N,K} ② I列、O行、L行及J行上的“√”格涉及的所有状态构成最大等效类。 Q2={I,O,L,J} ③ (D,G)、(E,F)分别构成最大等效类。 Q3={D,G},Q4={E,F} Q1、Q2中未涉及的状态与其他状态不能构成等效对,它们各自构成最大等效类。 将Q1中的状态合并为1个状态,记为H; 将Q2中的状态合并为1个状态,记为I。Q3合并记为D,Q4合并记为E,于是得到最小化状态表,如表5.8所示。所需状态数由原来的15个减少到7个。对应的最小化状态图如图5.16所示。 表5.8例52的最小化状态表 现态 次态/输出 x=0x=1 AB/0C/0 BD/0E/0 CE/0D/0 DH/0I/0 EI/0H/0 HA/1A/0 IA/0A/1 图5.16例52的最小化状态图 5.4状态编码◆ 状态编码就是用二进制代码表示各状态,从而实现用一组触发器来存储状态。为此需要研究: 编码的长度(即二进制代码的位数)取多少合适,以确定要使用多少个触发器; 把哪个代码指派给哪个状态,能使输出函数最简单。后者是个十分复杂的问题,尤其是当状态数目较多时,可用的分配方案数量极大。企图将每种方案一一实现,再从中选择最佳结果,是不现实的。而且,分配方案的好坏还与触发器类型的选择相关。在理论上,状态分配问题至今尚未很好解决,下面将介绍一种基于经验的状态分配方法——相邻编码法。 5.4.1确定存储状态所需的触发器个数 设简化后的状态表共含有n个状态,希望能用尽可能短的编码长度代表这些状态,使所需触发器的个数m最少。则n与m应满足: 2m≥n≥2m-1,或m=「log2n」(51) 式(51)中,「log2n」表示求不小于log2n的最小整数。 继续求解例52。表5.8中共有7个状态,由式(51)求得所需触发器的个数m=3。故状态代码为3位,将其记为y3y2y1。 5.4.2用相邻编码法实现状态编码 时序电路的输出是输入变量和状态变量的函数,对于例52有z=f(x,y3,y2,y1)。这说明,选择合适的状态分配方案是简化输出函数的一条途径。 对于一个状态,给予的代码不同,在卡诺图中对应的位置也不同。如图5.17所示,如果将代码001指派给状态A,则在卡诺图中对应的位置为A′; 如果将代码101指派给状态A, 图5.17代码指派与位置示意 则在卡诺图中对应的位置为A″。这说明,通过指派代码使得各状态在卡诺图中形成合理的分布,获得尽可能大的卡诺圈,就能达到简化输出函数的目的。这就是相邻编码法的依据。 所谓相邻编码,就是为2个状态指派的二进制代码只有一位不同。在卡诺图上表现为2个状态左右或上下相邻。例如,上述代码001与101仅最高位不同,在图5.17中的位置A′与A″ 即为上下相邻。相邻编码法的规则如下。 规则1输入相同且次态相同的现态应为相邻编码。 观察表5.8,H和I符合规则1,应取相邻编码。 规则2同一现态的次态应为相邻编码。 观察表5.8,状态B和C,D和E,H和I,应分别取相邻编码。 规则3输入不同但输出相同的现态应为相邻编码。 观察表5.8,状态A~E应分别取相邻编码。 由此可以发现,有些状态同时满足几条规则。此时应按“规则1→规则2→规则3”的优先顺序处理。对表5.8按上述规则进行操作的结果如图5.18所示。其中状态A作为初始态,配以代码000。在系统上电时(即开始接通电源的时刻)一般都将所有的触发器清0,故系统上电后电路即处于A态,等待输入。编码后的状态表如表5.9所示。 图5.18表5.9的状态分配 表5.9表5.8编码后的状态表 现态 y3y2y1 次态/输出 x=0x=1 000001/0011/0 001100/0101/0 011101/0100/0 100010/0110/0 101110/0010/0 010000/1000/0 110000/0000/1 5.5确定激励函数及输出方程◆ 5.5.1选定触发器类型 激励函数的任务是根据电路的现态和当前输入,驱动触发器转移到指定的次态。触发器类型不同,所需激励函数也不同。因此,在确定激励函数之前,应选定触发器的类型。 在触发器的选型上,常依赖经验判断。对于数据锁存、移位类时序逻辑电路,宜选用D触发器; 对于计数类时序逻辑电路,宜选用T触发器; 当无明显规律时,则可选用JK触发器,也可以同时选用几种类型的触发器。但情况并非总是如此,设计者应以激励函数最简单为目标。D触发器只有一个激励端,这意味着只需要一个激励函数便可驱动翻转,可作为优选对象。JK触发器虽有两个激励端,但其功能丰富,不失为一种可取的选择。 现在为例52选择触发器。电路需要存储4位串行数据,最终作出判断,在性质上属数据锁存、移位类逻辑,不妨选用D触发器。对应于y3y2y1,各触发器的激励端记为D3D2D1。 5.5.2求激励函数及输出函数 各驱动方程激励函数和输出函数都是组合逻辑问题,其输入为串行数据x和电路的现态y3y2y1,输出为各激励量D3D2D1和判断结果z。因需要根据现态和次态来确定激励量,故在列真值表时将次态作为索引的中间量列入表中,如表5.10所示。由D触发器的激励方程D=Qn+1可知,D3D2D1=yn+13yn+12yn+11,因此很容易列出各输出量。 表5.10例52的真值表 输入中间量输出 xy3y2y1yn+13yn+12yn+11zD3D2D1 00000010001 00011000100 00111010101 01000100010 01011100110 00100001000 01100000000 10000110011 10011010101 10111000100 11001100110 11010100010 10100000000 11100001000 0111---ФФФФ 1111---ФФФФ 在编码时,多余的代码“111”未指派具体状态。如果电路能按照状态转换图工作,就不会进入这种状态。即“111”代表的状态为无关状态(任意项),故表5.10中将其对应的输出以任意项Ф列出,以期达到简化激励函数的目的。 由表5.10可以看出,输出量z的最小项很少,故直接求出其函数较简单 z= x-y-3y2y-1+xy3y2y-1= x-y-3y2y-1xy3y2y-1(52) 画出各激励量的卡诺图并化简,如图5.19所示。显然,图5.19中不存在相切的卡诺圈,即无产生险象的因素。 图5.19例52的卡诺图 由图5.19可得 D3=xy3y-2y-1+ x-y1+ y-3y1= xy3y-2y-1x-y1y-3y1 D2=xy-2y-1+y3y-2= xy-2y-1y3y-2 D1= y-3y-2y-1+xy-3y-2+ x-y2y1= y-3y-2y-1xy-3y-2x-y2y1 (53) 由式(52)、式(53)画出电路图,如图5.20所示。 图5.20例52的电路图 5.5.3电路的“挂起”及恢复问题 例52假设电路能按照状态转换图工作,不会进入无关状态“111”,这只是一种理想的情况。实际运行中,电路可能受到外界的强电磁干扰,使触发器产生误翻转而进入这种所谓的“无关状态”。未分配的编码越多,进入无关状态的可能性越大。由此产生的后果有以下3种情形。 (1) 进入无关状态后,无论什么输入都不能使电路回到正常状态,即在无效状态间形成无限循环。称这种情况为“挂起”。显然,电路挂起后将丧失全部功能。 (2) 进入无关状态后,再经过若干时钟周期能自动恢复到正常状态,但中途产生错误的输出,进而使后续电路执行错误动作。 (3) 进入无关状态后,再经过若干时钟周期能自动恢复到正常状态,且不产生错误的输出。 上述3种情形中,前两种是不允许发生的。后一种情形虽危害性较小,但希望恢复速度越快越好。 要解决这一问题,首先要判断电路是否存在这一情形。由式(52)及式(53)可计算出表5.10中各输出量Ф的具体值如下: (1) 当xy3y2y1=0111时,计算得zD3D2D1=0101。即一旦进入“无关状态”后,若输入为0,则输出z=0,并在下个时钟脉冲的下降沿转到101状态(即正常状态E)。 图5.21例52的完整状态图 (2) 当xy3y2y1=1111时,计算得zD3D2D1=0000。即一旦进入“无关状态”后,若输入为1,则输出z=0,并在下个时钟脉冲的下降沿转到000状态(即正常状态A)。 由此,可作出如图5.21所示的完整状态图,图中虚线表示无关状态及其转移线。由图5.21可见,当电路进入无关状态后,无论输入如何,只要下个时钟脉冲到达,就立即转移到正常状态。故本例的电路不会挂起,但正常的工作秩序已被短暂扰乱。 如果电路挂起或产生错误输出,则应在保证设计功能的前提下,修改激励函数或输出函数,强制其进入正常状态或消除错误输出。 5.6时序逻辑设计举例◆ 本节以几个常用的逻辑问题为例,进一步讨论时序逻辑电路的设计,并引出设计与实现中的若干具体问题及其处理方法与技巧。 视频讲解 5.6.1序列检测器设计 序列检测器的功能是,在串行传输的数据序列中找到特定的子序列。这一功能通常用于串行数据的定位。例如,在如下数据序列中寻找子序列“110”,如找到,则输出高电平脉冲。 数据序列: … 011000101111010010 … 输出序列: … 000100000000100000 … 数据序列中带下画线的数为“110”序列。 【例53】设计1个“111”序列检测器,当连续收到3个(或3 个以上)“1”后,电路输出Z=1; 否则,输出Z=0。 解: 第1步,分析题意,构建电路框架。 依题意,序列检测器框图如图5.22所示,输入、输出时序图如图5.23所示。 图5.22序列检测器框图 图5.23输入、输出时序图 第2步,建立原始状态图和状态表。 设初态S0收到1个“0”,并且用Si(i=1,2,3)表示收到第i个“1”,由此可得到如图5.24(a)所示Mealy型原始状态图,以及原始状态表(见表5.11),表5.11中设电路开始处于初始状态为S0。第一次输入“1”时,由状态S0转入状态S1,并输出“0”; 若继续输入“1”,由状态S1转入状态S2,并输出“0”; 如果仍接着输入“1”,由状态S2转入状态S3,并输出“1”; 此后若继续输入“1”,电路仍停留在状态S3,并输出“1”。电路无论处在什么状态,只要输入“0”,都应回到初始状态S0,并输出“0”,以便重新计数“1”。 图5.24例53状态图及其化简 第3步,状态化简。 原始状态图中,凡是在输入相同时,输出相同、要转换到的次态也相同的状态,称为等价状态。状态化简就是将多个等价状态合并成1个状态,把多余状态都去掉,得到最简状态图。图5.24(a)中,状态S2和S3等价,因为它们在输入为“1”时输出都为“1”,且都转换到次态S3; 在输入为“0”时输出都为“0”,且都转换到次态S0。所以它们可以合并为一个状态,合 表5.11例53的原始状态表 现态 次态/输出Z x=0x=1 S0S0/0S1/0 S1S0/0S2/0 S2S0/0S3/0 S3S0/0S3/1 并后的状态用S2表示,得到如图5.24(b)所示的简化状态图。 第4步,状态分配。 根据简化状态图,可得状态编码: S0=00; S1=01; S2=10。最后画出其简化后的二进制状态图如图5.24(c)所示。由原始状态表5.11及简化后的二进制状态图5.24(c),可得其简化状态转移表(见表5.12)。表5.12中,由于S3状态为不确定项,用任意项d表示。 表5.12例53的简化状态转移表 输入X 现态次态 Q1Q0Qn+11Qn+10输出Z 000000 001000 010000 011ddd 100010 101100 110101 111ddd 第5步,选触发器,求时钟、输出、状态、驱动方程。 采用同步设计方案,选用2个CP下降沿触发的JK触发器,分别用JK0、JK1表示。根据表5.12所示的简化状态转移表及JK触发器激励方程,可得到序列检测器状态方程和输出方程表达式(54)和式(55)。 次态方程: Qn+10=Xn1n0;Qn+11=XQn0n1+XQn1(54) 输出方程: Z=XQn1(55) 用JK触发器的特性方程Qn+1=Jn+Qn和式(54)、式(55)比较,得J、K的激励方程式(56): J0=Xn1K0=1 J1=XQn0K1= (56) 第6步,检查电路能否自启动。 将无效状态Q1Q0=11代入式(54)和式(55)计算得: X=0时,Q1Q0=00,Z=0; X=1时,Q1Q0=10,Z=1。电路能够自启动,因此设计符合要求。 第7步,画逻辑电路图。 根据式(55)和式(56)得图5.25所示例53逻辑电路图。 图5.25例53逻辑电路图 视频讲解 5.6.2计数器设计 如4.5.2节所述,计数器是一种最常用的时序逻辑部件。例如,计算机中的定时器、地址发生器、节拍发生器等,都要用到计数器。电子钟实际上就是一个六十进制、十二/二十四进制的计数器。计数器的基本功能是记录某事件发生的次数。 计数器的种类很多,通常有不同的分类方法。按其工作方式可分为同步计数器和异步计数器; 按其进位制可分为二进制计数器、十进制计数器和任意进制计数器; 按其功能又可分为加法计数器、减法计数器和加/减可逆计数器等。 下面以一个模7加法计数器设计为例,讨论时序逻辑电路计数器的设计方法。 【例54】用JK触发器设计一个按自然态序变化的七进制同步加法计数器,计数规则为逢七进一,产生一个进位输出。 解: 第1步,分析题意。 根据题目所给的条件,待设计的计数器默认为模7计数,且不要求加载初值。故电路只需时钟输入端clk,clk作为电路的同步时钟,不必当作输入变量对待; 输出一个七进制数要3个输出端,记为Q2Q1Q0。要有输出进位信号Y,故共需要4个输出端。因输出量Q2Q1Q0就是计数值,故采用Moore型电路较合适。 图5.26例54原始状态转移图 第2步,建立原始状态图。 模7计数器要求有7个记忆状态,且逢七进一。由此可以作出如图5.26所示的原始状态转移图。由于模7计数器必须要有7个记忆状态,所以不需要再简化。 第3步,状态分配。 由于最大模值为7,因此必须取编码位数n=3。假设令S0=000,S1=001,S2=010,S3=011,S4=100,S5=101,S6=110,则可以作出状态转移表,如表5.13所示。由于在状态转移表中111状态未出现(偏离状态),此处作任意项x处理。 表5.13例54状态转移表 输入CP 现态次态 Q2Q1Q0Qn+12Qn+11Qn+10输出Y(t) 00000010 10010100 20100110 30111000 41001010 51011100 61100001 7111xxxx 第4步,选触发器,求时钟、输出、状态、驱动方程。 因需用3位二进制代码,选用3个CP下降沿触发的JK触发器,分别用FF0、FF1、FF2表示。由于要求采用同步方案,故时钟方程为 CP0=CP1=CP2=CP 由表5.13可以作出次态卡诺图及输出函数的卡诺图,如图5.27所示。 图5.27例54的次态及输出函数卡诺图 根据卡诺图求出状态方程式(57),输出方程式(58)。不必化简,以便使之与JK触发器的特性方程的形式一致。 Qn+10=n2n0+n1n0 = Qn2Qn1n0+1-Qn0(57) Qn+11=Qn0n1+n2n0Qn1 Qn+12=Qn1Qn0n2+n1Qn2 Y=Qn1Qn2(58) 与JK触发器的特性方程Qn+1=Jn+Qn比较,得驱动方程式(59)。 J0= Qn2Qn1、K0=1 J1=Qn0、K1= n2n0(59) J2=Qn1Qn0、K2=Qn1 第5步,检查电路能否自启动。 将无效状态111代入状态方程式(57),计算得 Qn+10= Qn2Qn1n0+1-Qn0=0 Qn+11=Qn0n1+n2n0Qn1=0 Qn+12=Qn1Qn0n2+n1Qn2=0 (510) 分析式(510)可见,无效状态111的次态可转移到有效状态000,电路能够自启动。 第6步,画逻辑电路图。 根据式(58)和式(59)得图5.28所示例54逻辑电路图。 图5.28例54逻辑电路图 5.6.3基于MSI器件实现任意模值计数器 中规模集成(medium scale integration,MSI)计数器应用范围很广,从简单的二进制计数器到十进制可逆计数器等,种类较多。表5.14给出了常见MSI计数器芯片。不过需提醒读者注意的是: 集成十进制同步加法计数器74160、74162的引脚排列图、逻辑功能示意图与74161、74163相同; 74190引脚排列图和逻辑功能示意图与74191相同; 74192引脚排列图和逻辑功能示意图与74193相同。 表5.14常见MSI计数器芯片 CP脉冲引入方式型号计 数 模 式清 零 方 式预置数方式 同步74160十进制加法计数器异步(低电平)同步 同步74162十进制加法计数器同步同步 同步(单时钟)74190十进制可逆计数器无异步 同步741614位二进制加法计数器异步(低电平)同步 同步741634位二进制加法计数器同步(低电平)同步 同步(双时钟)741934位二进制可逆计数器异步(高电平)异步 同步(单时钟)741914位二进制可逆计数器无异步 异步(双时钟)742934位二进制加法计数器异步无 异步74290二五十进制加法异步异步 应用N进制中规模集成计数器实现任意模值M(M<N)计数器时,主要是从N进制计数器的状态转移表中跳越(N-M)个状态,从而得到M个状态转移,即M进制计数器。通常通过控制中规模集成计数器的清0端(复位法)和置数端(置数法)来实现。 1. 复位法 当中规模N进制计数器从S0状态开始计数时,计数脉冲输入M个脉冲后,N进制计数器处于SM状态。如果利用SM状态产生一个清零信号,加到计数器的清零端,使计数器返回到S0状态,这样就跳越了(N-M)个状态,从而实现模值为M的计数器。 【例55】用MSI器件74161来构成一个十二进制计数器。 解: 74161是4位二进制加法计数器,其功能真值表如表5.15所示。 表5.1574161/74160功能真值表 输入输出 CLRNLDNENTENPCPDCBAQDQCQBQARCO 0XXXXXXXX00000 10XX↑DCBADCBA 1111↑XXXX步进计数 110XXXXXX保持 11X0XXXXX保持0 十二进制计数器即为模12计数器。模12计数要求在输入12个脉冲后电路返回到0000,且产生一个输出脉冲。74161共有16个状态。模12计数器只需12个状态,因此在74161基础上,外加判别和清0信号产生电路。图5.29所示为应用74161构成的模12计数器电路。 图5.29模12计数器电路 图5.29中G1门为判别门,当第12个计数脉冲上升沿输入后,74161的状态进入1100,则门G1输出X=0,作用于门G2和G3组成的基本触发器,使Q端为0,作用74161的CLRN端,则使74161清0。在计数脉冲CP下降沿到达后,又使门G3输出Q=1,NQ=0。此后又在计数脉冲作用下,从0000开始计数,每当输入12个脉冲电路进入1100,就通过74161的CLRN端使电路复0,同时输出一个脉冲,实现模12计数。 这种方法比较简单,复位信号的产生电路是一种固定的结构形式,由门G1、G2、G3组成,其中门G2和G3所构成的基本RS触发器保证归零信号有足够的作用时间,使计数器能够可靠归零。 用异步清零功能的中规模N 进制计数器设计任意模值M(M<N)计数分频器时,只需将计数模值M的二进制代码中1的输出连接至判别门的输入端,即可实现模值为M的计数器。同理可验证利用同步清零功能的中规模N进制计数器(如74163)设计任意模值M(M<N)计数器时,只需将计数模值M-1的二进制代码中1的输出连接至判别门的输入端,即可实现模值为M的计数器。 这种方法在对分频比要求较大的情况下,应用更加方便。例如,图5.30所示为用2片十进制同步计数器74160构成模值45的计数器电路。74160的功能见表5.15,2片74160十进制计数器串接最大计数值为99。当计数脉冲输入到第45个时,这时片(2)状态为(0100),片(1)状态为(0101),CR产生清除信号,使片(1)、片(2)的输出都为0,从而实现45计数分频,为保证归零信号有足够的作用时间,使计数器能够可靠归零,设计中利用一个基本RS触发器,Y为45分频信号输出。 图5.30采用2片74160构成模值45的计数器电路图 2. 置位法 置位法适用于具有置数控制端的中规模集成器件,通过置入某一固定二进制数值的方法,使N进制计数跳越(N-M)个状态,实现规模值为M的计数分频。在其计数过程中,可将它输出的任何1个状态通过译码,产生1个预置数控制信号,并反馈至预置数控制端,在下一个CP脉冲作用下会把预置数输入端DCBA的状态置入输出端,预置数控制信号消失后,计数器从被置入的状态开始重新计数。 【例56】用4位二进制同步计数器74163,实现模12计数分频器。 解: 由74163功能表(表5.15),当LDN=0 时,执行同步置数功能。用74163构成十二进制分频器,可把输出QDQCQBQA=1011状态译码产生的预置数控制信号P(此时为0),反馈至LDN端,在下一个CP的上升沿到达时置入0000状态,如图5.31所示。 图5.31基于置位法的模12计数分频器原理图 反馈置数操作可在74163计数循环状态(0000~1111)中的任何一个状态下进行,如将QDQCQBQA=1111状态译码产生的预置数控制信号P加至LDN端,这时预置数输入端应为1111-1100+1=0100。 3. MSI计数器的级联应用 若一片计数器的计数容量不够用时,可取若干片扩展。同步式连接: 以低位片的进位输出作为高位片的工作状态控制信号,各片共用同一时钟。 异步计数器一般没有专门的进位信号输出端,通常可以用本级的高位输出信号驱动下一级计数器计数,即采用串行进位方式来扩展容量。 同步计数器有进位或借位输出端,可以选择合适的进位或借位输出信号来驱动下一级计数器计数。同步计数器级联的方式有两种: 一种级间采用串行进位方式,即异步方式,这种方式是将低位计数器的进位输出直接作为高位计数器的时钟脉冲,异步方式的速度较慢; 另一种级间采用并行进位方式,即同步方式,这种方式一般是把各计数器的CP端连在一起接统一的时钟脉冲,而低位计数器的进位输出送高位计数器的计数控制端。 【延伸思考】 根据需求设计相应的时序逻辑电路,是学习本课程所必须掌握的一项基本技能,其关键是确定待设计的时序电路的所有状态以及状态之间的转换关系。在当今信息化的时代,世事纷繁复杂,实际生活中的设计需求也往往较为复杂,因此需要我们具备透过现象看本质的能力,从看似复杂的问题需求中抽丝剥茧,明确问题的根本和关键,从而高效地解决问题、推进工作。 回望历史,透过现象看本质是中国共产党一贯倡导的科学认识方法,是中国共产党领导革命、建设和改革事业取得伟大成就的重要经验总结。毛主席曾说过: “我们看事情必须要看它的实质,而把它的现象只看作入门的向导,一进了门就要抓住它的实质,这才是可靠的科学的分析方法。”土地革命时期,面对黑云压城、白色恐怖、革命低潮,中国共产党透过极为险恶和残酷的环境,看到了“星星之火,可以燎原”的革命必胜前景,为中国革命指明了正确方向; 党的十一届三中全会后,中国共产党总结正反两方面经验教训,抓住了社会主义的本质,为经济发展和国家富强开辟了道路。当前,面对世界百年未有之大变局,以习近平同志为核心的党中央,洞察我国发展环境面临的深刻复杂变化,指出我国发展仍然处于重要战略机遇期,我们正处于大有可为的新时代的重要论断,为广大党员矢志奋斗鼓足了劲、加满了油。实践表明,只有善于透过现象看本质,才能科学认识事物的客观规律,准确把握时代的发展大势,从而正确地指导实践。 作为新时代的爱国青年,我们只有不断提升运用马克思主义辩证法和方法论的能力,练就透过现象看本质的“火眼金睛”,做到眼睛亮、见事早、行动快,才能在学习、工作中把握关键、剑指要害,更好地解决实际问题,推动社会主义建设的持续高速发展。