有关状态机的文章,事实上已经写过很多了,可是即使如此,真的懂了吗?真的能熟练应用吗?未必吧。这篇博文来源是《FPGA之道》,认真下看去收货颇丰!
借这个主题来梳理下状态机:
状态机简介
状态机是FPGA设计中一种非常重要、非常根基的设计思想,堪称FPGA的灵魂,贯穿FPGA设计的始终。
简单地说,状态机就是一副描绘着状态变迁的状态转移图,它体现着系统对外界事件的反应和行为。
FPGA中的状态机是指有限状态机,简称为FSM,是指状态节点数和输入、输出范围皆有限的状态机。需要说明的是,虽然有限状态机的状态节点和输入、输出皆为有限的,但这并不意味着它仅能进行有限次的处理,这是因为有限状态机可以形成闭环系统,所以可以用有限个状态处理无限的事件,从而到达化有限为无穷的境界。
例如,宇宙中物资的三种最基本的状态:固态,液态和气态,它们之间的状态转移图如下:
从上图可以看出,虽然该状态机仅有三个状态,输入(六个触发条件)、输出(状态本身即为输出)也是有限的,但是它却永远不会结束,因为宇宙中的物理转换永远也不会停止。。。至少可预见的未来不会停止。
状态机的组成六要素:
(1)状态集合:
状态集合是组成状态机的必备要素,该集合里包含了状态机所能达到的所有状态,例如上例中的{固态,液态,气态}。
(2)初态:
初态是状态机的第二必备要素,它是整个状态机开始工作的起点。它的功能类似于一个参考系,它为状态机的其他状态提供参考与标准。
例如上例中,任何一个状态都可以作为初态。
(3)终态
终态是状态机的结束状态,即若状态机达到终态,它的使命也将完成,不再工作。
与初态不同,终态不是状态机的必备要素,大部分运行在FPGA上的状态机是没有终态的,因为它们都需要用有限的状态来处理无限的事件。
(4)输入符号集
输入符号集是驱动状态机进行状态转换的主要因素,不过状态机的状态转换其实并不一定需要外界的事件触发,因此,输入符号集也不是组成状态机的必备要素,但是大部分运行在FPGA上的状态机是需要输入符号集的,至少大多数情况下,需要一个复位信号来让FPGA进入初态。
例如,上例中的输入符号集为{气化,液化,凝华,升华,凝固,融化}。
(5)输出符号集
输出符号集是状态机传递给外界的反馈,不过与输入符号集不同,输出符号集是组成状态机的一个必备要素,因为一个对外界毫无影响、或者在外界看来毫无变化的状态机是没有必要存在的。
例如上例中的输出符号集可以是{温度变化,体积变化,状态变化}
(6)状态转移函数
状态转移函数决定了状态机的行为,它是状态机的必备要素之一,也是状态机最重要的一个组成因素。状态转移函数的表现形式可以由很多种,例如带有说明的有向箭头,状态转移表格等。
状态机的工作四要素
状态机在工作的时候,出于对状态机内在因果关系的考虑,将状态机的工作状态划分为四个要素:现态,输入,输出和次态。其中,现态和输入是因,输出和次态是果。
(1)现态
现态指状态机当前所处的状态。
(2)输入
输入一般指外部事件,当一个外部事件发生后,状态机便会根据状态转移函数发生响应的状态跳转,或者状态机将会更新自己的输出情况。
通常在FPGA中,根据输入信号是异步的还是同步的,又可以将状态机分为异步状态机和同步状态机,不过鉴于稳定性的考虑,以后提到和FPGA相关的状态机都是同步状态机。而对于异步信号,要先同步化后再送至状态机。
(3)输出
输出是由现态或者现态和输入共同决定的。输出符号集是必需的,但是具体到某一状态或者某一输入触发事件,输出并不是必需的,有时候带来的仅仅是状态迁移而已。
(4)次态
次态是根据现态,输入以及状态转移函数所得到的,状态机将要跳转至的新状态。次态是相对于现态而言的,一旦状态迁移完成,次态便变成了新的现态。
这篇博文暂时到此,下篇博文,关于状态机的模型介绍。