[FPAG学习]第四部分:状态机(有限状态机)

一、状态机的定义:

        状态机由状态寄存器和组合逻辑电路构成,能够根据控制信号按照预先设定的状态进行状态转移,是协调相关信号动作、完成特定操作的控制中心。有限状态机简写为FSM(Finite State Machine)。

二、状态机的四要素:

        状态机可归纳为4个要素,即现态、条件、动作、次态。这样的归纳,主要是出于对状态机的内在因果关系的考虑。“现态”和“条件”是因,“动作”和“次态”是果。

(一)现态:

        当前所处的状态。

(二)条件:

        又称为“事件”,当一个条件被满足,将会触发一个动作,或者执行一次状态的迁移。

(三)动作:

        条件满足后执行的动作。动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。动作不是必需的,当条件满足后,也可以不执行任何动作,直接迁移到新状态。

(四)次态:

        条件满足后要迁往的新状态。“次态”是相对于“现态”而言的,“次态”一旦被激活,就转变成新的“现态”了。

三、状态转换图:

        为了以更形象的方式直观的显示出时序电路的逻辑功能,可以用状态转换图来表示时序电路的各个状态及其转换。在状态转换图中,以圆圈表示电路的各个状态,以箭头表示状态转换的方向。同时,在箭头旁注明了状态转换前的输入变量取值和输出值。通常将输入变量取值写在斜线以上,将输出值写在斜线以下。

状态转换图

四、状态机的分类:

(一)Moore(摩尔)型有限状态机:

        下一状态只由当前状态决定,即次态=f(现状,输入),输出=f(现状)。

Moore(摩尔)型有限状态机

(二)Mealy(米利)型有限状态机:

        下一状态不但与当前状态有关,还与当前输入值有关,即次态=f(现状,输入),输出=f(现状,输入)。

Mealay(米利)型有限状态机

五、状态编码。 

(一)状态编码的目的:

        将每一个状态赋予一个独特的编码,便于区分不同的状态。

(二)状态编码的方式:

(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状态机常见三种写法

(一)一段式状态机:

        状态转移,状态输出结果全在一起

(二)二段式状态机:

        状态转移,状态输出分为两段写

(三)三段式状态机:

        状态转移分为两段写,状态输出单独写

注:一般情况下我们都会选择写三段式状态机,因为三段式能够很清晰的展现代码逻辑,后期修改也比较方便。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值