FPGA基础设计(三):状态机(FSM)

前言

有限状态机表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。

引入

时序电路中可以有输入也可以没有输入,当没有输入时用自身的电路状态作为组合电路的输入–>状态转移图

时序电路包括组合电路(完成运算)和存储电路(完成存储),组合电路的输出状态反馈到组合电路的输入端,与输入信号一起共同决定组合电路的输出。X:输入;Y:输出;Z:存储电路输入;Q:存储电路输出
三个方程说明其逻辑关系:
输出方程:Y=F[X,Q];组合电路
激励方程:Z=G[X,Q];组合电路
状态方程:Q*=H[Z,Q];时序电路
实际电路中可直接得到激励方程(例:J1 K1;J2 K2),带入到特征方程(例:JK触发器),于是得到电路的状态方程,之后激励方程不在使用。
电路的初始态给出,作为状态方程得现态,从而可得到次态,次态又作为下一状态的现态的输入,又得到新的次态,以此规律得到状态转移图。状态个数与触发器个数相关,n个触发器–>2n个状态。
注意:电路的状态要分析完备,若现态缺少哪个状态,电路上电可能直接进入死循环,不能进入有效循环。

时序电路在工作时是在电路的有限个状态间按一定规律转换,所以又将时序电路称为状态机

分类

Mealy型

输出不仅取决于存储电路的状态(当前状态),还取决于输入

Moore型

输出信号仅取决于存储电路的状态(当前状态),但电路中并不是没有输入,只是与输入无关!!!

状态编码

为什么编码

状态机可以根据设定好的状态进行状态转移,case(express): item case语句比较过程中expressitem进行比较,实现某个item的匹配,即实现状态的匹配:由此出现对状态有效的编码能快速的进行匹配,还有考虑编码对FPGA内部,整个实现功能上的影响等问题

常见编码方式
  1. 二进制编码:减少编码时触发器的数量,编码方式较为容易理解,译码复杂。
  2. 独热码:每一个状态均使用一个寄存器,在于状态比较时仅仅需要比较一位,相比其他译码电路简单。
  3. 格雷码:所需寄存器数与二进制码一样,译码复杂,但相邻位只跳动一位,实现状态机时触发器反转次数最少,不仅能消除状态转换时由多条信号线的传输延迟所造成的毛刺,又可以降低功耗
特别说明

对状态进行编码赋予其含义,不一定从00开始编码,只要编码对应的状态能够区分开可以从任意顺序编码!!!

编码方式的选择

状态机转移图

状态机,是协调相关信号动作,完成特定操作的控制中心。对于状态机的设计重点就是状态转移图的设计。FPGA并行执行,若想要按顺序处理事件这时引入状态机;所以我们要做的就是从实际问题中列出所有可能的状态,抽象出状态转移图。

状态转移图说明各状态之间的功能,跳转条件,输入输出,有以下三种要素:

输入

根据输入确定是否要状态的跳转和输出

输出

根据当前时刻和输入,确定状态机所要输出的动作

状态

根据输入和上一状态确定当前状态

这副图可以很好说明各状态之间的功能,跳转条件,输入输出:
三种状态:IDLE ONE TWO ,箭头表示状态跳转
输入/输出:斜杠左边为输入,右边为输出

状态机描述方式

搞清楚状态转移图,输入,输出,状态联系实际问题后开始进行描述状态机,有以下三种方式:

一段式

整个状态机写到一个always块里,描述状态的转移,输入,输出。
就是输出方程,激励方程,状态转移方程都在一个always块里。
好处:更利于对事件思维的理解。

二段式

两个always块描述状态机,一个always块使用同步时序描述状态转移,另一个always使用组合逻辑判断状态转移条件,描述状态转移规律及输出
就是状态转移方程在一个always块里,激励方程和输出方程另一个always块实现。

三段式

在二段式基础上将组合逻辑部分中判断状态转移条件和产生输出分开,就是三段式状态机。
三个always模块描述状态机,一个always模块采用同步时序描述状态转移,一个always采用组合逻辑判断状态转移条件,描述状态转移规律,另一个always模块描述状态输出(可以用组合电路输出,也可以时序电路输出)。
就是状态转移方程,激励方程,输出方程在不同always块中。

三种描述方式比较

1. 一段式和二段式区别:二段式将时序逻辑(状态转移)和组合逻辑(判断状态转移条件和产生输出)分开;这样做的好处不仅仅是便于阅读、理解、维护,更重要的是利于综合器优化代码,利于用户添加合适的时序约束条件,利于布局布线器实现设计。
2.第三种描述方式与第二种相比,关键在于根据状态转移规律,在上一状态根据输入条件判断出当前状态的输出,从而在不插入额外时钟节拍的前提下,实现了寄存器输出。

再谈Mealy型Moore型状态机

1. Moore型比Mealy型多一个状态,进入状态’TWO’,检测到输入信号跳转到状态’THREE’,输出还是为0,等到状态THREE发现已经满足输出状态开始跳转输出为1,输出只由当前状态’THREE’影响而没有输入的作用。
2. Mealy型当跳转到状态’TWO’,检测到输入为1,然后输出,再跳转到IDLE,即输出与当前状态’TWO’和输入都有关。
一般喜欢使用Mealy型,状态最简,状态编码节省寄存器资源。

参考:https://www.cnblogs.com/smallqing/p/9943078.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值