一、状态机的定义:
状态机由状态寄存器和组合逻辑电路构成,能够根据控制信号按照预先设定的状态进行状态转移,是协调相关信号动作、完成特定操作的控制中心。有限状态机简写为FSM(Finite State Machine)。
二、状态机的四要素:
状态机可归纳为4个要素,即现态、条件、动作、次态。这样的归纳,主要是出于对状态机的内在因果关系的考虑。“现态”和“条件”是因,“动作”和“次态”是果。
(一)现态:
当前所处的状态。
(二)条件:
又称为“事件”,当一个条件被满足,将会触发一个动作,或者执行一次状态的迁移。
(三)动作:
条件满足后执行的动作。动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。动作不是必需的,当条件满足后,也可以不执行任何动作,直接迁移到新状态。
(四)次态:
条件满足后要迁往的新状态。“次态”是相对于“现态”而言的,“次态”一旦被激活,就转变成新的“现态”了。
三、状态转换图:
为了以更形象的方式直观的显示出时序电路的逻辑功能,可以用状态转换图来表示时序电路的各个状态及其转换。在状态转换图中,以圆圈表示电路的各个状态,以箭头表示状态转换的方向。同时,在箭头旁注明了状态转换前的输入变量取值和输出值。通常将输入变量取值写在斜线以上,将输出值写在斜线以下。
![](https://img-blog.csdnimg.cn/e3c69e33ead544e3953bce51bb47b272.png)
四、状态机的分类:
(一)Moore(摩尔)型有限状态机:
下一状态只由当前状态决定,即次态=f(现状,输入),输出=f(现状)。
![](https://img-blog.csdnimg.cn/4f82bcf145e9465bbc3019ef64efab74.png)
(二)Mealy(米利)型有限状态机:
下一状态不但与当前状态有关,还与当前输入值有关,即次态=f(现状,输入),输出=f(现状,输入)。
![](https://img-blog.csdnimg.cn/bc82ecbcbd9841879bb4b9c1bd2012df.png)
五、状态编码。
(一)状态编码的目的:
将每一个状态赋予一个独特的编码,便于区分不同的状态。
(二)状态编码的方式:
(1)二进制码(顺序编码):
将状态依次编码为顺序的二进制数。它的特点是:编码简单,非常符合人们通常的计数规则。例如,状态合集为{S0、S1、S2、S3},用二进制编码结果为:
S0 = 00;
S1 = 01;
S2 = 10;
S3 = 11;
优点: 使用的状态向量位数少(占用位宽少),节约了逻辑资源。
缺点:状态变化是变化的比特位多,易产生毛刺,甚至乱跳码。
(2)独热码:
采用独热码的编码方式来进行状态编码。它的特点是:状态寄存器在任何状态时的取值都仅有一位有效。例如,状态合集为{S0、S1、S2、S3},用独热码编码结果为:
S0 = 0001;
S1 = 0010;
S2 = 0100;
S3 = 1000;
优点: 电路的速度和可靠性高,一定程度上简化了比较逻辑,从而减少了毛刺产生的概率。
缺点:有几个状态就会需要多少位宽,占用更多的寄存器。
(3)格雷(Gray)码:
采用格雷码的方式来进行状态编码。它的特点是:相邻两个状态的寄存器表示仅有一位变化。
编码原则:对二进制自然码,从最右边一位起,依次将每一位与左边一位异或(XOR),作为对应格雷码该位的值,最左边一位不变(相当于左边是0)
例如,状态合集为{S0、S1、S2、S3},用格雷码编码结果为:
S0 = 00;
S1 = 01;
S2 = 11;
S3 = 10;
优点: 状态变化时只有一比特变化,减少了毛刺发生的概率。同时具有独热码与二进制码的优点。
缺点:在状态机很复杂状态跳转的分支很多时,要合理的分配状态编码保证每个状态跳转都仅有 1 位发生变化,这是很困难的事情。
补充:十进制码:
将状态依次编码为顺序的十进制数。它的特点是:编码简单,非常符合人们通常的计数规则。例如,状态合集为{S0、S1、S2、S3},用十进制编码结果为:
S0 = 0;
S1 = 1;
S2 = 2;
S3 = 3;
优点:易于阅读,可供人类使用,并且易于操作。
缺点:浪费空间和时间。
注:在状态数量较少时我们通常使用独热码,其次是二进制码。
六、状态机的写法(形式):
详细解释以及三种写法的代码示例:Verilog状态机常见三种写法。
(一)一段式状态机:
状态转移,状态输出结果全在一起
(二)二段式状态机:
状态转移,状态输出分为两段写
(三)三段式状态机:
状态转移分为两段写,状态输出单独写
注:一般情况下我们都会选择写三段式状态机,因为三段式能够很清晰的展现代码逻辑,后期修改也比较方便。