状态机是一种抽象的逻辑模型。我们先从一个问题入手谈谈状态机的抽象过程。
例:串行输入一个二进制bit序列,先输入的为高位,实时检测其表示的二进制数是否能被三整除。
我们可以用一个表格来分析一下这个问题:
现在状态 | 输入1后的下一个状态 | 输入0后的下一个状态 |
状态s0 数据a,能被3整除 | 2*a+1,被3除余1 | 2*a,被3整除 |
状态s1 数据a,被3除余1 | 2*a+1,被3整除 | 2*a,被3除余2 |
状态s2 数据a,被3除余2 | 2*a+1,被3除余2 | 2*a,被3除余1 |
进一步,我们把它写成简介的状态转换表:
| input 1 | input 0 | |
| S0 | S1 | S0 |
| S1 | S0 | S2 |
| S2 | S2 | S1 |
对应的,绘制状态转换图:
有了这样一个状态转换图,该问题也就迎刃而解。
状态机抽象建模,有三个要素需要分析,一是状态的定义,二是状态跳转条件,三是输入与输出。
状态的定义是最为关键的,状态是控制流程中的节点,问题的复杂度决定了状态的多少。状态间具有互斥性,既同一时刻,状态机仅可能具有一个状态。
状态跳转往往由输入决定,这反映状态机响应外部事件。当然,也会有自动跳转的不稳定太,描述时序上的自动控制。
根据输出的决定因素,状态机可分为两类,
第一类,若输出只和状态有关而与输入无关,则称为Moore状态机
第二类,输出不仅和状态有关而且和输入有关系,则称为Mealy状态机
上例中,输出指示序列数据是否能被3整除,仅由状态决定,因此是Moore机。
从上例中,我们可以看出,使用状态机模型抽象问题,首先需要用状态的语言描述问题,定义出有限个不同的状态,这是抽象解决问题最关键的一步;其次,需要分析出状态的转换关系,既状态跳转条件;最后,将输出与状态及输入关联起来。
在数字逻辑中,状态机模型应用的最为广泛,从简单的跑马灯,到复杂的CPU,核心部分都是状态机电路。数字电路实现状态机由组合电路和时序电路两部分构成。一般来讲,时序电路里的寄存器结构锁存状态信息,组合电路实现状态转换的逻辑判定。