状态机设计简介状态机的设计被广泛地用于时序控制逻辑中,它是许多数字系统的核心。
状态机可以应付众多应用场合的需求,覆盖宽范围的性能和复杂度;例如微处理器与VLSI外围接口的低级别控制,常规微处理器中的总线裁决和时序产生,定制的位片微处理器,数据加密和解密,传输协议等。
通常在设计周期中,控制逻辑的细节安排在最后处理,因为系统需求的改变和特征的增强会对其造成影响。
对于控制逻辑设计,可编程逻辑是一个很宽松的解决方案,因为它允许简单的修改而不必扰乱PCB板布局。
其灵活性提供了在不影响市场化时间的前提下,允许设计改动的机会。
大多数带寄存器的PAL器件应用都是需要使用状态机设计技术的时序控制逻辑。
随着技术的发展,新的高速、高性能的器件不断出现,它们简化了状态机设计的任务。
对于状态机设计,宽范围的不同功能与性能的解决方案是可行的。
在本次讨论中,我们将检验状态机执行的功能,它们在多种器件中的实现,以及它们的选择。
什么是状态机?状态机是一个以有序的方式,遍历预定的状态序列的数字设备。
状态是在电路的不同部分,测量到的一组数值。
一个简单状态机可以由以下几部分构成:基于PAL器件的组合逻辑,输出寄存器和状态寄存器。
这样一个序列发生器中的状态由状态寄存器和/或输出寄存器中所存储的值来决定。
状态机的通用形式可以用图1所示的设备来描述。
除了这一设备的输入和输出,状态机还有两个必需的组成元件:组合逻辑和存储器(寄存器)。
这类似于前面所讨论的带寄存器的记数器设计,它们本质上就是简单的状态机。
存储器用来存储状态机的状态,组合逻辑可以看成两个截然不同的功能模块:下一状态解码器和输出解码器(图2)。
当输出解码器产生实际的输出时,下一状态解码器决定状态机的下一状态。
尽管它们执行截然不同的两个功能,但是它们通常被组合成如图1所示的组合逻辑阵列。
状态机的基本操作有两部分:<!--[if !supportLists]-->1、状态机遍历状态序列,下一状态解码器基于当前状态和输入条件来决定下一状态。
<!--[endif]--><!--[if !supportLists]-->2、状态机提供基于状态转换的输出信号序列,输出解码器基于当前状态和当前输入条件来决定输出。
<!--[endif]-->用输入信号决定下一状态也被称为分支。
除了分支,复杂序列发生器提供循环的能力和子程序。
从一个状态到另一个状态的转换被称为控制定序,决定下一状态所需的逻辑被称为转换函数(图2)。
在决定输出的进程中,输入信号的使用决定了状态机的类型。
有两种被广泛知道的状态机,Mealy和Moore(图3)。
Moore型状态机的输出只是当前状态的函数。
而对于更为普遍的Mealy型状态机,输出是状态和输入信号的函数。
所需的逻辑被称为输出函数。
无论哪种类型,控制定序都取决于状态和输入信号。
多数实际的状态机是依赖于时钟信号来触发状态转换的同步时序电路。
单个时钟被连接到所有状态和输出边沿触发器,允许在时钟上升沿处发生状态转换。
异步状态机也是可能的,它利用组合逻辑的传输延迟来完成状态机的存储功能。
这样的状态机容易出故障,难以设计,很少被使用,在我们的讨论中,只着重于时序状态机。
<!--[if !supportEmptyParas]-->图1 简单状态机的功能块框图图2 状态机,带独立的输出和下一状态解码器图3 两种标准状态机的模型状态机应用状态机适用于很多系统控制应用领域。
下面举个应用的例子,讨论一下状态机是怎样被应用的。
在数字信号处理(DSP)的应用中,状态机不需要复杂微处理器的处理就可以提供高速高效的函数。
对于简单的算法,例如快速傅立叶变换的算法,状态机可以控制相乘和相加的向量组。
对于复杂的DSP操作,可编程DSP芯片更佳。
另外,可编程DSP方案不太可能得到和专用硬件方案一样快的速度。
再考虑视频控制器的例子。
它使用各种次序和长度的记数器来产生用于扫描的地址。
不是用实际的计数器来实现它们,而是用状态机的转换来实现该序列。
除了节约成本外,这种方法还有一个优点,就是释放了微处理器的资源,计数配置被设置或初始化后就不需要微处理器的管理了。
在外围控制中,简单的状态机会非常有效。
例如RLL(run-length-limited)代码。
编码和解码都可以被翻译成状态机,状态机可以在连续的数据流被读出时对其进行检查,并产生输出数据。
工业控制和机器人提供了更广泛的领域来使用简单的控制函数。
如定位机器人的手臂,简单的决策,三角函数计算这样的任务,通常不需要微处理器用堆栈和指针进行的高功耗操作,只需要一个可以存储有限多个状态并允许在各种条件下的简单分支的器件。
数据的解码和编码遇到了对大量媒体进行编码解码时相类似的问题,因为只有这儿不要求所制的图表很明显。
对于这样的问题,带安全位的可编程状态机是最理想的解决方案,因为存储器是内部编程的,不会被使用这个系统的人所访问。
所执行的功能控制器执行的所有系统设计功能都可分为归类到以下的状态机功能:<!--[if !supportLists]-->▪仲裁<!--[endif]--><!--[if !supportLists]-->▪事件监视<!--[endif]--><!--[if !supportLists]-->▪多条件的测试<!--[endif]--><!--[if !supportLists]-->▪时序延时<!--[endif]--><!--[if !supportLists]-->▪控制信号的产生<!--[endif]-->稍后我们会以一个设计实例来显示在设计状态机时,这些功能是如何被使用的。
状态机理论我们来简要分析一下所有时序逻辑系统的原理,有限状态机或简单状态机。
数字系统中,输出取决于过去的输入和当前状态的那部分可被定义为状态机。
其历史可用其内部状态值来概括。
当有新的输入时,FSM依据该输入和当前状态,会产生一个输出,FSM因此而转入下一状态。
这个新的状态同样依据该输入和当前状态。
图2显示了FSM的结构。
内部状态存储在一个标为“Memory”的模块中。
如前所述,需要两个组合函数:转换函数,产生下一状态的值;输出函数,产生状态机输出。
状态图表示如图4所示,FSM的行为可以以图形的方式来说明。
这被称为状态图,或状态转换图,每个椭圆代表一个状态,每个箭头代表状态间的一次转换。
引起转换的输入被显示在各自转换箭头的附近。
图4 状态机图示图5显示了控制定序的状态转换图。
直接控制定序需要一个以状态A到状态B的无条件转移,相似的,条件控制定序显示了根据输入信号I1来决定状态C 到状态D还是状态E的条件转换。
图5 控制定序对于Moore型状态机,输出的产生是用带状态的输出(圆圈)的方法表示,如图6。
类似的,对于Mealy型状态机,输出的产生是用输出赋值到转换(箭头)的方法表示,如图4。
有关Mealy或Moore输出产生的更多细节将在后面给出。
图6 输出的产生对于这种表示法,当有效的输入或输出信号同时出现在同一箭头附近时,输入输出区分不清。
解决的方法通常是在输入个输出之间加一条斜线(图4和图6)。
有时,采用一个附加的引脚列表来说明逻辑极性和输入输出。
如图4所示的状态转换图写出了引起转换的输入值,如果取而代之以转换,用布尔表达式定义输入组合或引起该转换的组合,该状态转换图会更加紧凑。
举个例子,如图7所示,一些转换用带输入START、X1和X2的机制来显示。
在状态1和2的转换中,输入X1和X2被忽略,因而不出现在转换图中。
这样节约了空间,使得其功能更显而易见。
图7 带记忆功能的状态转换图该方法不小心就会出这样的问题。
如图8所示的状态转换,这里有三组输入组合,(I0, I1, I2, I3) ={1011}, {1101} 和 {1111},使得(/I0 * /I2 +I3)和(I0 * I1 + I0 * I2)都为真。
因为转换到两种下一状态是不可能的,所以这里就出现了错误。
因此必须保证这些输入组合不出现,或修改转换条件。
在本例中,修改(I0 * I1+ I0 * I2)为(I0 * I1 + I0 * I2) * / I3就可以解决这个问题。
图8 带冲突分支条件的状态转换图状态转换表格表示第二种状态机表示法是如表1所示的状态转换表格形式。
顶部列出所有可能的输入组合和内部状态。
每行给出下一状态和下一输出,因而,该表格指定了转换函数和输出函数。
然而这种类型的表格不适用于定义实际的状态机,因为实际的状态机有大量的输入,而每个输入组合就占用表格的一行。
举个例子,10个输入的状态机需要1024行。
表1 状态转换表流程图另一种流行的表示法是流程图,状态用矩形框来表示,可选的状态转换用菱形框中的字符串来决定。
该单元可能有多个入口,但通常只有一个出口。
写在矩形状态框内的状态名作为第一个入口。
任何Moore输出表示都写在下面的状态框中,没有寄存的状态前面加一个插入符号(^)。
而状态代码赋值,如果已知的,就写在状态框的右上方。
决策框是菱形或六边形框,其中包含输入信号和逻辑表达式。
分别标识了0和1的两个出口,通向另一个决策框、状态框或Mealy 输出。
卵圆形被用作Mealy型状态机的输出。
插入符号(^)后面跟的状态表示没有寄存。
所有这些框都被用来适应大量的输出信号。
这些符号的使用如图9所示。
每个路径通过决策框后,从一种状态转换到另一种状态,定义输入变量的组合或组合集。
一条路径不必包括所有的输入变量,因此它适应"忽略"。
这些决策树会比表达法更占空间,但是在许多实际情况中,状态机控制器只测试每个状态的输入变量的很小的子集。
并且,决策链通常会反映出设计者所考虑的控制器的行为。
特别需要注意的是,这些测试在FSM 中并不顺序运行,而是被FSM状态转换逻辑并发进行。
转换说明的这种方法,其好处在于可以避免图8中所示的问题。
因为一个路径不可能被分支来定义两个状态路径,所以不会出现这种冲突。
由于可以定义多重的下一状态,因此不存在冲突危险,可以使用更多的复杂决策,使得流程图表示法更加紧凑。
表达式可以被测试,如图10a所示,或多个分支可以从一个译码框引出,如图10b所示。
在第二种情形中,把二进制输入组排列成矢量,对该矢量的不同值进行分支都很方便。
对于状态机的三种表示方法:状态图,状态表和流程图,因为它们都描述相同的硬件结构,所以它们是等价的,可以互换。
每种表示方法都有它特别的优势。
虽然状态转换图最流行,但是因为转换条件被直接记录在转换箭头上,在状态转换要依靠很多输入的情况时,它就会遇到复杂性的问题。