二.几种常用的方法
为了消除临界竞争,在确定状态分配方案时常用以下几种方法。
1.相邻状态,相邻分配
由前面对电平异步时序逻辑电路中竞争现象的分析可知,仅当输入变化引起两个或两个以上状态变量发生变化时,电路中才会产生竞争。换而言之,如果能保证每次状态转移时,仅有一个状态变量变化,则不会产生竞争。据此,可通过“相邻状态,相邻分配”的方法消除竞争。
所谓相邻状态,是指稳态下输入取值作相邻变化时,需要直接发生转换的状态。而所谓相邻分配是指分配给相
邻状态的代码为相邻代码(仅一位不同)。
为了找出流程表中各状态的相邻关系,通常借助状态相邻图。
画状态相邻图的方法:先将流程表中的每一个状态用一个圆圈表示,然后从流程表中每一个稳态出发,找出输入取值作相邻变化时的下一个稳态,并用有向线段将其连接起来,表示这两个状态为相邻状态。
例 对表6.25所示流程表进行状态编码,求得二进制流程表。

解 根据“相邻状态,相邻分配”的法则,首先作出表6.24所示流程表的状态相邻图如图6.23所示。由相邻图可知,A和B、A和C、C和D为相邻状态,状态分配时应令其代码相邻。流程表中共有4个状态,需两位代码,设二次状态用y2、y1表示,可选择状态分配方案如图6.24所示。即用00表示A,01表示B,10表示C,11表示D。

注意:并不是所有流程表都能直接用最少的二进制代码位数实现“相邻状态,相邻分配”。
设状态数为n,二进制代码位数为m,n和m的关系为2m≥n>2m-1。由于一个m位代码最多只有m个相邻代码,因此,当相邻图上状态的最大相邻状态数L大于m时,则不可能用m位代码实现相邻分配。
通常解决的办法是增加二进制代码位数,实现相邻分配。由于代码位数对应着电路中的反馈回路数,因此 ,这将增加电路的复杂性。
2.增加过渡状态,实现相邻分配
对于某些流程表,尽管相邻图上状态的最大相邻状态数L不大于状态分配的最小代码位数m,但状态之间的相邻关系出现由奇数个状态构成的闭环,因而无法直接实现状态的相邻分配。一种常用的方法是通过增加过渡状态,实现相邻分配,得到一个无竞争的二进制流程表。
例
对表6.27所示流程表进行状态编码,得到二进制流程表。
解 根据表6.27可作出状态相邻图如图6.25所示

尽管相邻图上每个状态只有两个相邻状态,但由于3个状态之间的相邻关系构成一个闭环,所以,用两位代码无法满足上述相邻关系。
怎么办呢?增加过渡状态,改变相邻关系!
如果在状态A和C之间增加过渡状态D,将A→C改为A→D→C,C→A改为C→D→A,那么,表6.27可被修改成如表6.28所示。修改后的流程表中增加了新的一行,但该行没有稳定状态,因为状态D仅在稳态A和C发生转换时完成过渡作用。
增加过渡状态后的流程表与原流程表描述的逻辑功能相同。表6.28所示流程表的状态相邻图如图6.26所示。显然,用两位代码可以方便地满足图6.26所示的相邻关系。


设二次状态用y2、y1表示,相应激励状态用Y2、Y1表示,令y2y1取值00表示A,01表示B,10表示D,11表示C,即可得到与表6.28对应的二进制流程表如表6.29所示,该流程表描述的电路中不存在竞争 。

解
根据表6.30所示流程表可作出状态相邻图如图6.27所示。显然,用两位二进制代码无法实现相邻状态相邻分配。如何解决呢?
方法一:通过增加过渡状态和增加代码位数实现相邻分配,但这样处理的结果必然增加电路的复杂性。
方法二:允许非临界竞争,避免临界竞争。在该流程表中,状态A和C之间的转换只发生在x2x1=00 和
x2x1=01
这两列,而这两列各只有一个稳定状态,这就意味着A和C发生转换时,即使产生竞争也属于非临界竞争。即在状态分配时A和C可以不相邻。排除A和C的相邻关系后,状态编码只需满足A和B、A和D、D和C、C和B相邻即可。
设二次状态用y2、y1表示,令y2、y1取值00表示A,01表示B,10表示D,11表示C,将其代入表6.30,即可得到表6.31所示二进制流程表。该流程表描述的电路不会产生临界竞争 。