热门标签 | HotTags
当前位置:  开发笔记 > 程序员 > 正文

FPGA之道(52)状态机的概念

文章目录前言状态机的概念状态机简介状态机的组成六要素状态集合初态终态输入符号集输出符号集状态转移函数状态机的工作四要素现态输入输出次态前言本文摘选自《FPGA之道》,


文章目录

  • 前言
  • 状态机的概念
    • 状态机简介
    • 状态机的组成六要素
      • 状态集合
      • 初态
      • 终态
      • 输入符号集
      • 输出符号集
      • 状态转移函数
    • 状态机的工作四要素
      • 现态
      • 输入
      • 输出
      • 次态


前言

本文摘选自《FPGA之道》,对于状态机,作者花了大篇幅来叙述,对于状态机的深刻理解,让人佩服,以至于平日里认识到的状态机,以为就是真理,可见真理还需要不断的认识。这里为了不让博文篇幅过长,选择多篇博客来记录状态机这一大知识点。


状态机的概念


状态机简介

简单的说,状态机就是一幅描绘着状态变迁的状态转移图,它体现着系统对外界事件的反应和行为。
假设现在是周五的晚上,经过一周的劳累,你此刻正躺在床上思考着周六的假日安排:好久没运动了,也许明天可以叫上小明一起去踢足球,听说足球场附近新开了家冷饮店,运动后再喝杯冷饮那感觉肯定不错。糟糕!天气预报好像说明天有雨,虽说天气预报的准确性为50%,但是万一真下雨就没法踢球了,这样吧,最近好像刚刚上映了一部大片,如果下雨的话就约上小强去附近的电影院看电影吧,顺便吃一顿馋了很久的涮火锅。可是不知道他们两个明天有没有空呢?现在时间已经不早了,恐怕他们都睡了,还是不要打电话过去打扰比较好,这样吧,如果下雨或小明没空我就联系小强看电影,如果他们都没空的话我就自己在家打游戏好了。
至此,在你的脑海中其实已经完成了一个状态机的设计,而你在周六一天的行为则可以用如下状态转移图来预见和描述:
在这里插入图片描述
上述便是一个关于状态机的简单例子,由此可见状态机几乎存在于科研与生活中的各个方面,而FPGA中的状态机其实跟你脑海中的状态机是很类似的,因此完全可以主动的采用状态机的思想来帮助我们进行FPGA设计,以及明确FPGA的行为。
上例中的状态机其实更为准确的称谓应该是有限状态机。事实上,为了使状态机的实现成为可能,状态转移图中的内容不可能为无限多,例如自然数序列——1、2、3、4、5、……,如果将每一个自然数看做一个状态节点的话,那么其状态转移图是没有尽头的,由于状态数目无限,也就无法被存储,从而无法被实现。也许你会说,自然数序列可以看做一个只有两个状态的状态机:初始状态——输出n=1、自增状态——输出n=n+1,这样状态便可以存储,状态机也就可以实现了。很遗憾,这样的状态机仍然是不可能实现的,因为此时输出的n值是没有上限的,我们都知道,数值越大,需要占用的存储位宽就越大,如果n的值没有界限,那么其最终也是无法被存储的,从而整个状态机也是无法被实现的。同理可得,如果状态机的输入没有界限的话,状态机也是无法被实现的。
综上所述,有限状态机——Finite State Machine,简称FSM,是指状态节点数和输入、输出范围皆有限的状态机,在本书的其余部分,如无特别说明,提到的状态机皆为有限状态机。
最后,需要明确的一点是,虽然有限状态机的状态节点和输入、输出皆为有限的,但这并不意味着它仅能进行有限次的处理,这是因为有限状态机可以形成闭环系统,所以可以用有限个状态处理无限的事件,从而达到化有限为无穷的境界。例如,宇宙中物质的三个最基本状态——固态、液态、气态——的状态转移图如下:
在这里插入图片描述
从上例可以看出,虽然该状态机仅有三个状态,输入(六个触发条件)、输出(状态本身即为输出)也是有限的,但是它却永远不会结束,因为宇宙中的物质状态转换永远也不会停止……好吧,至少几十亿年不会停止。


状态机的组成六要素

简单的了解了状态机之后,我们来介绍一下组成状态机的六大要素:


状态集合

状态集合是组成状态机的必备要素,该集合里包含了状态机所能达到的所有状态。状态集合不能为空,必须包含至少一个状态节点,不过通常我们所讨论的状态机都具有至少两个状态节点,因为如果仅有一个状态节点的话,状态机便不存在状态跳转现象,因此它的性质和特点也就得不到体现。例如,【状态机简介】小节中两个示例的状态集合分别为:
{起床、找小明、找小强、踢足球、喝冷饮、看电影、吃火锅、打游戏、睡觉};
{气态、液态、固态}。


初态

初态是状态机的第二个必备要素,它是整个状态机开始工作的起点。虽然“先有蛋还是先有鸡”的问题一直没有得到很好的解决,但是现实中的状态机,一定要有一个固定的初始状态,否则你根本无法确定状态机后续的一系列行为。因此,初态是相对的、而不是绝对的,它为状态机的其他状态提供了参考坐标,从而让整个状态机的行为变得可预测、可表述,这就好比我们平时讨论日期、温度、海拔等等概念一样,如果没有公元纪元、绝对零度、海平面,上述所有的一切都变得没有任何意义。
例如,我们很容易看出【状态机简介】小节中第一个示例的初始状态为——起床。不过对于第二个示例,初态似乎很难确定,这时,请谨记——初态是一个相对的参考态,因此,第二个示例中的任何一个状态都可能是初态,那么到底应该选哪个做为初态呢?就从你开始观察的那一刻算起吧,如果你观测的那一刻是固态,那么初态就是固态。


终态

终态是状态机的结束状态,即若状态机到达终态,它的使命也将完成,从此不再工作。终态与初态不同,因为它并不是组成状态机的一个必备要素,事实上,大部分运行在FPGA上的状态机是没有终态的,因为它们都需要用有限的状态来处理无限的事件。
例如,我们很容易看出【状态机简介】小节中的第一个示例的结束状态为——睡觉。不第二个示例中并没有终态,……好吧,状态机将会运行至“山无棱、天地合”的那一刻!


输入符号集

输入符号集是驱动状态机进行状态转换的主要因素,不过状态机的状态转换其实并不一定需要外界的事件触发,因此输入符号集也不是组成状态机的必备要素,但是大部分运行在FPGA上的状态机还是需要输入符号集的,至少大多数情况下,它们都需要一个复位信号来让状态机进入初态。
例如,【状态机简介】小节中的两个示例的输入符号集分别为:
{天气情况、小明空闲情况、小强空闲情况};
{气化、液化、凝固、融化、升华、凝华}。


输出符号集

输出符号集是状态机传递给外界的反馈,不过与输入符号集不同,输出符号集是组成状态机的一个必备要素,因为一个对外界毫无影响、或者在外界看来毫无变化的状态机,其本身就是一件没有任何意义的事情,因此没有必要存在。
例如,【状态机简介】小节中两个示例的输出符号集其实非常丰富,分别概括为:
{吃了什么?、喝了什么?、玩了什么?……};
{温度变化、体积变化、状态变化……}。


状态转移函数

状态转移函数决定了状态机的行为,它是状态机的必备因素之一,也是状态机中最重要一个组成因素。状态转移函数的表现形式可以有很多种,例如带有说明的有向箭头、状态转移表格等等。
例如,【状态机简介】小节中两个示例的状态转移图形中的有向箭头及附在箭头上的说明。


状态机的工作四要素

状态机在工作的时候,出于对状态机内在因果关系的考虑,将状态机的工作状态划分为四个要素——现态、输入、输出、次态。其中,“现态”和“输入”是因,“输出”和“次态”是果,分别介绍如下:


现态

现态,是指状态机当前所处的状态。


输入

输入,一般指外部事件,当一个外部事件发生后,状态机便会根据状态转移函数发生相应的状态跳转,或者状态机将会更新自己的输出情况。通常在FPGA中,根据输入信号是异步的还是同步的又可将状态机分为异步状态机和同步状态机,不过鉴于稳定性的考虑,以后提到和FPGA相关的状态机全部为同步状态机,而对于异步输入信号,可以参考【本篇->编程思路->时钟及时钟域->跨时钟域问题】章节中的相关处理方法,同步化后再送至状态机。


输出

输出,是由现态或者现态和输入共同决定,如果这两者都没有变化,那么输出也不应该有变化。输出符号集是必须的,但具体到某一状态或者某一输入触发事件,输出并不是必需的,有时候带来的仅仅是状态迁移而已。


次态

次态,是根据现态、输入及状态转移函数所得出的,状态机将要跳转至的新状态。次态是相对于现态而言的,一旦状态迁移完成,次态便成为了新的现态。


推荐阅读
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 作为一名正在读EE专业的研一学生,面临选择一门适合未来职业生涯的编程语言的问题。目前只会使用C++和Matlab,但发现C++的使用率逐渐减少。对于选择哪门语言进行深入学习还没有明确方向,希望选择一门使用广泛且不会被短期淘汰的语言。提到了Phyton的简洁性,但担心从零基础学习起会有困难。同时也担心选择了C++后语言会被淘汰,以及编程效率低的问题。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文是一位90后程序员分享的职业发展经验,从年薪3w到30w的薪资增长过程。文章回顾了自己的青春时光,包括与朋友一起玩DOTA的回忆,并附上了一段纪念DOTA青春的视频链接。作者还提到了一些与程序员相关的名词和团队,如Pis、蛛丝马迹、B神、LGD、EHOME等。通过分享自己的经验,作者希望能够给其他程序员提供一些职业发展的思路和启示。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 解决PR倒放后视频卡顿的方法及操作步骤
    本文介绍了解决PR倒放后视频卡顿问题的方法,通过标记入点和出点,并进行渲染,可以有效解决视频卡顿的情况。详细的操作步骤包括:继续播放视频,标记入点和出点,选择渲染效果,等待渲染完成,清除标记等。通过理论与实践的结合,可以更好地帮助大家解决PR倒放后视频卡顿的问题。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 给定一个二维平面上的一些点,通过计算曼哈顿距离,求连接所有点的最小总费用。只有任意两点之间有且仅有一条简单路径时,才认为所有点都已连接。给出了几个示例并给出了对应的输出。 ... [详细]
  • 测绘程序设计Excel度分秒转换模板附代码超实用版
    本文介绍了测绘程序设计Excel度分秒转换模板附代码超实用版的相关知识,包括准备工作、编写表达式和注意事项。在实际工作中,将GPS实测的经纬度度转换为度分秒是常见需求,本文提供了在Excel中快速进行转换的方法,以提高工作效率。 ... [详细]
author-avatar
mobiledu2502885017
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有