控制/MCU
一、状态机的概述
有限状态机,简称状态机,通俗的说,就是把全部的情况分成几个场景,这些场景的工作方式明显不同。简单来说就是如下所示的状态转移图
二、状态机的结构
1、状态寄存器:记忆当前状态机所处的状态
2、产生下一状态的组合逻辑:根据输入信号和当前状态,决定下一个状态
3、输出逻辑:由当前状态和输入信号,决定当前状态的输出
三、好的状态机的标准
四、三段式、四段式状态机设计方法
常见状态机分为一段,二段,三段,推荐使用三段(包含当前状态,下一状态,和输出,后续分析后推荐四段式)
1、第一个进程,同步时序always模块,格式化描述次态寄存器迁移到现态寄存器,即描述状态转移
2、第二个进程,组合逻辑always模块,描述判断状态转移条件,描述状态转移规律
3、第三个进程,同步时序always模块,格式化描述次态寄存器输出,其它always(个数与输出信号个数有关)使用同步时序电路设计每一个状态的输出
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模块,格式化描述次态迁移到现态寄存器
2)第二段:组合逻辑的always块,描述状态转移条件
注:第二段里只需要判断信号名即可,名字规范2-->to,如下所示什么到什么的条件,else条件下应为state_n = state_c; 如果是state_n = state_n,那和if-else条件没补全一样(相当于没写else begin,组合逻辑需要补全条件)
3)第三段,定义状态转移条件
4)第四段,设计输出,此处可以规定一个always设计一个信号,因此有多少个输出信号,就有多少个always,如果没有输出就没有第四段
五、状态机设计规范
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跳转条件
五、状态机设计注意事项
1、IDLE只是名字,并不是必须的,不需要专门为复位设置一个状态
2、状态机的划分依据,依据是划分的状态方便产生输出信号
3、状态对齐的对象,状态机与din(输入信号)对齐,来产生dout(输出),即din-->状态机-->dout流程
4、状态机架构八步法(需要用计数器)
1)明确功能
2)输出分析
3)状态合并
4)状态转移条件
5)转移条件
6)完整性检查
7)状态机代码(四段式)
8)功能代码
编辑:黄飞
全部0条评论
快来发表一下你的评论吧 !