状态机

关注、星标公众号,精彩内容每日送达
来源:网络素材

一、状态机的概述

有限状态机,简称状态机,通俗的说,就是把全部的情况分成几个场景,这些场景的工作方式明显不同。简单来说就是如下所示的状态转移图

1405f292e1c216efeacb6d014fca3ef1.png

二、状态机的结构

1、状态寄存器:记忆当前状态机所处的状态

2、产生下一状态的组合逻辑:根据输入信号和当前状态,决定下一个状态

3、输出逻辑:由当前状态和输入信号,决定当前状态的输出

三、好的状态机的标准

四、三段式、四段式状态机设计方法

常见状态机分为一段,二段,三段,推荐使用三段(包含当前状态,下一状态,和输出,后续分析后推荐四段式

1、第一个进程,同步时序always模块,格式化描述次态寄存器迁移到现态寄存器,即描述状态转移

c98f9cf2e857b89315f550912bf7cdcc.png

2、第二个进程,组合逻辑always模块,描述判断状态转移条件,描述状态转移规律

16fb27b263f04c69b5142df4f84e0147.png

3、第三个进程,同步时序always模块,格式化描述次态寄存器输出,其它always(个数与输出信号个数有关)使用同步时序电路设计每一个状态的输出

b124575da8d7d22d977f690d714bed9f.png

4、代码设计注意事项:

1)三段always中,第一,三个always是同步时序,采用非阻塞赋值,第二个always是组合逻辑,采用阻塞赋值

2)第二个是组合逻辑always块,命案列表采用always@(*),组合逻辑条件一定要完备

3)第二个组合逻辑always块里的判断条件需包含所有情况

4)第二部分case中的条件应为当前态

5)三段式不是三个always,而是三步的意思,与输出信号个数有关

6)三段式的好处,即可用state_c作为条件,也可用state_n作为条件。用state_c作为条件,会比state_n做条件晚一个时钟周期

5、进一步总结,归纳,提出使用四段式状态机(每次只考虑一件事),四段不是四个always,而是四个部分内容

1)第一段:与三段式第一段相同,同步时序的always模块,格式化描述次态迁移到现态寄存器

e84cec3cec1ed23f827063f053e12207.png

2)第二段:组合逻辑的always块,描述状态转移条件

注:第二段里只需要判断信号名即可,名字规范2-->to,如下所示什么到什么的条件,else条件下应为state_n = state_c; 如果是state_n = state_n,那和if-else条件没补全一样(相当于没写else begin,组合逻辑需要补全条件)

        c847342075ae222b0745ccf274101555.png             b36508a862ac58578e6bf0b41959a5af.png

3)第三段,定义状态转移条件

05766225817eff8c55a172b0395358e5.png

4)第四段,设计输出,此处可以规定一个always设计一个信号,因此有多少个输出信号,就有多少个always,如果没有输出就没有第四段

b8283cb0e731f7918724662ad8ebfe72.png

状态机设计规范

1、四段式状态机

2、第二段转移条件

1)判断条件用信号名表示,不需要去做判断,判断是在第三段的时候去做,符合之前所说的一次只做一件事的要求,也不需要来回修改信号名。只需要在第三段修改判断条件即可

3、状态不变处理

第二段使用state_n = state_c表示状态不变

1)避免拷贝时出错

2)避免组合逻辑没补齐情况,要有唯一结果输出

3)避免写出state_n = state_n,本质上还是保持不变,与第二点没补齐一样,会生成锁存器

4、转移条件命名

状态转移条件,用assign的形式写成XX2XX_start的形式,前面XX为当前状态,后面XX为下一状态。如idle2read_start,idle2write_start,方便检查沟通

5、转移条件定义

状态转移的一般格式为

assign xx2yy_start = state_c ==XXXX && zzzz;

XXXX现在状态,zzzz跳转条件

f43cefca1fd1ce5fbaa94d093e140947.png

状态机设计注意事项

1、IDLE只是名字,并不是必须的,不需要专门为复位设置一个状态

2、状态机的划分依据,依据是划分的状态方便产生输出信号

3、状态对齐的对象,状态机与din(输入信号)对齐,来产生dout(输出),即din-->状态机-->dout流程

4、状态机架构八步法(需要用计数器)

1)明确功能

572bddfaf6836c15d9336de5d95f249d.png

ef75c03b7064cb53329982a5babc2e42.png

2)输出分析

         ef0d0ee190c7eef7469e53f62c2a6ec9.png               fcd0c30de23d31cb1e5266f5b994d477.png

3)状态合并

6d09940e1782185c36340a29ebd01b16.png

4)状态转移条件

0a67cea2f089db1f0c75028a349864a3.png

5)转移条件

ad981d1b424dbd4f743ad13fdf34f682.png

d1ae7e7761e68665821b459de7bdc1b1.png

6)完整性检查

181b812a6d97c7abd31a8f56ff0dc50d.png

36da95b008cd76a8fefaf6e834b3f686.png

7)状态机代码(四段式)

ce1aaef253a63bed8d0e6713d290b539.png

9c3fb4817285f9c0c6ae56e839792b8b.png

c418972d55277baea2a7c81c57ea6a05.png

8)功能代码

39ed0da4001b430bdb2872844158f1a2.png

   681f5864c905394d80919807cd390a60.png    102279c226bc4f37b4c6a424e073ad5e.png

e0c7049c803d01de9a5574d597f44e00.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值