0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何在FPGA中实现状态机

FPGA设计论坛 来源:未知 2023-07-18 16:05 次阅读

状态机往往是FPGA 开发的主力。选择合适的架构和实现方法将确保您获得一款最佳解决方案。

FPGA 常常用于执行基于序列和控制的行动, 比如实现一个简单的通信协议。对于设计人员来说,满足这些行动和序列要求的最佳方法则是使用状态机。状态机是在数量有限的状态之间进行转换的逻辑结构。一个状态机在某个特定的时间点只处于一种状态。但在一系列触发器的触发下,将在不同状态间进行转换。理论上讲,状态机可以分为Moore 状态机和Mealy 状态机两大类。它们之间的差异仅在于如何生成状态机的输出。Moore 状态机的输出仅为当前状态的函数。典型的例子就是计数器。而Mealy 状态机的输出是当前状态和输入的函数。典型的例子就是Richards 控制器.

定义状态机
当需要定义一个状态机时,首先要绘制一张状态图。状态图可用来显示状态、状态间的转换和状态机的输出。图1 显示了Moore 状态机的状态图(左)和Mealy 状态机的状态图(右)。

wKgZomToDwqAPwQ0AABPk6bb5_g765.jpg

如果您要在物理组件中实现这些状态图(工程师在FPGA问世之前就是这么做的),首先就得生成当前状态和后续状态表,然后生成实现状态机所需的逻辑。不过由于我们将使用FPGA来实现设计,因此我们可以直接从状态转换图开始工作。

算法状态图
虽然有许多状态机是使用图1 所示的状态图方法进行设计的,但另外还有一种描述状态机行为的方法,这就是算法状态图法。ASM 图(图2)在外观上更加接近软件工程流程图。它由三个基本部分构成:
1. 状态框。它与状态名称有关,并包含Moore 状态输出列表。
2. 决策框。如果检验某条件为真,则进行下一状态的判断。
3. 条件输出框。让状态机根据当前状态和输入描述Mealy输出。

一些工程师认为,如果使用VHDL 等硬件描述语言,则采用ASM 格式进行描述的状态机更易于映射到实现方案中。

wKgZomToDwqALcL6AACv6iaOBNg611.jpg

MOORE 和MEALY:应该选择哪个?
实现Moore 状态机还是Mealy 状态机,取决于状态机需要实现的功能,以及特定的反应次数要求。两种状态机之间的最大差别在于状态机如何对输入做出反应。在输入和设置的适当输出之间,Moore 状态机一般有一个时钟周期的延迟。这就意味着Moore 状态机无法对输入变化立即做出反应,这点在图3中可以清楚地看到。而Mealy 状态机则能够立即对输入做出反应,这通常意味着:实现相同的函数,Mealy 状态机比Moore状态机需要更少的状态。Mealy 状态机的不足之处就是在与另一个状态机进行通信时,如果输出出乎意料地严重依赖于其它事件的序列或时序,就可能会发生紊乱情况。

wKgZomToDwqADNpDAACW_hidFhM360.jpg

当然,并非只能使用单纯的Moore状态机或Mealy 状态机,也可以将这两种状态机混合使用,从而更有效地实现所需的函数。比如说,用于接收RS232 串行数据的状态机就可以是混合机。

实现状态机
使用VHDL 这样的高级语言,可以轻松地直接从状态图实现状态机。VHDL 支持多种枚举类型,方便您定义实际的状态名称。举例如下:

wKgZomToDwqAAog_AAAK-wQ9T_k852.jpg

上面的类型定义对应的是图1 中所示的状态图,即用于在按下按钮时切换发光二极管开/ 关的状态机。

实现状态机有许多种方法,可分为两类基本方法。第一类基本方法就是一次性将所有内容集成到单个进程中。第二类基本方法是双进程法,将组合逻辑和顺序逻辑分开。

一般来说,大多数工程师都倾向于实现单进程状态机。与传统上讲授的双进程法相比,这种方法具有以下优势:
• 可以避免组合过程中信号覆盖不完全造成的闭锁风险。
• 状态机的输出与时钟保持同步。
• 通常比双进程实现方案更容易调试。

无论您决定采用哪一种方法来实现状态机,都需要使用CASE 语句来评估下一状态的判定和任何输出,如图4 所示。该图并行比较了使用单进程法的Moore 状态机( 左) 和Mealy 状态机(右)。

wKgZomToDwqAdOcAAACCLiB89Yc881.jpg

状态机编码
状态变量存储在触发器中,使用下一时钟边缘上的下一状态进行更新(即使没有状态变化也是如此)。如何使用触发器来表示状态值具体取决于状态的数量和是否选择用某种特定的方法来管理综合工具。状态编码最常见的三种类型是:
• 顺序码——状态编码遵循传统的状态二进制序列。
• 格雷码——除了状态编码使用格雷码,且状态编码串
之间只有一个位变化外,其它基本与顺序编码方法类似。
• 独热码——这种方法在状态机中为每一种状态分配一个触发器。只有一个触发器当前设置为高位,其余均设置为低位。故称为“独热”。

顺序编码和格雷编码都需要一定数量的触发器,可以通过下列等式来确定:

wKgZomToDwuABxOnAAARFGQ_GUw364.jpg

相比之下,独热编码法所需的触发器数量和状态数量一样多。

状态编码的自动分配取决于状态机所包含的状态数量。同时还需要考虑您选择使用的综合工具。您可以根据下列经验法则来选取编码方法:
• 顺序:少于5 种状态。
• 独热:5-50 种状态。
• 格雷:多于50 种状态。

一般情况下您不必去考虑使用哪一种状态编码方法,而是让综合引擎工具确定合适的实现方案,只在选择的方法出现问题时进行考虑。但是,如果您要全盘自行掌控,并定义状态编码方法,也没必要手动操作,只需使用状态编码为每一种状态设定常数即可。相反地,可以使用代码中的一个属性来驱动综合工具,从而选择特定的编码方法。具体如下所示:

wKgZomToDwuAW8oiAAA64RouyEA374.jpg

其中“sequential”也可以是“gray”和“onehot”。您还可以通过结合使用“safe”属性来确保在状态机进入非法状态时能够恢复到有效状态。

另外,您也可以使用syn_encoding 属性直接定义状态编码的值。例如,假设您想要使用下列状态编码法来对三态状态机进行编码:Idle = “11,” led_on = “10,” led_off = “01(与较传统的顺序“00”、“01”和“10”不同):

wKgZomToDwuASNbwAAA4TkPhX84039.jpg

前面给出的等式可确定状态机实现方案所需的触发器数量。由于不是所有的状态机都是2 的幂次方,因此某些状态在设计中将不会用到。实现状态机的工程师必须负责确保未使用的状态在设计中得到妥善处理。可以采用几种适用于多种设计的基本技巧来实现这一目标。对于高度可靠的安全关键型设计,则需要采用其它更高级的技巧。(参见Xcell 杂志第73 期刊登的深度文章《在关键任务系统中使用FPGA》。该文章着重阐述状态机保护问题。)

不过对于大多数应用来说,只需要确保状态机能够妥善地处理未使用的状态并在进入非法状态时能够正确地恢复。要做到这一点有两种主要的方法。第一种方法是使用综合工具实现一个安全的状态机。综合工具通常会插入额外的逻辑,用于检测非法状态并将状态机返回到有效状态。第二种方法是加强对实现逻辑的控制,声明所有2 的幂次方状态机的状态,并使用另一属性来确保即便是在没有入口条件下,2 的幂次方状态机的状态也不会被优化掉。这意味着除非出错(单粒子翻转等),状态机内部的任何条件都不会进入状态。下面的代码显示了通过使用属性以防止清除未使用的状态。

wKgZomToDwuAIR0QAAArEANyBi0199.jpg

简而言之,安全高效的状态机设计对于任何使用FPGA的工程师而言都是一项重要技能。选择Moore 状态机、Mealy
状态机还是混合机取决于整个系统的需求。无论选择哪种类型的状态机,充分掌握实现方案所需的工具和技巧,将确保您实现最佳解决方案。

wKgZomToDwuAfSyyAAAJM7aZU1A696.png

有你想看的精彩 至芯科技-FPGA就业培训来袭!你的选择开启你的高薪之路!7月12号北京中心开课、欢迎咨询! 至芯科技奋斗的小孩之verilog 基础语法 基于matlab FPGA verilog的FIR滤波器设计

wKgZomToDwuAFZTPAABUdafP6GM512.jpg

扫码加微信邀请您加入FPGA学习交流群

wKgZomToDwuAaCsXAAACXWrmhKE084.png

欢迎加入至芯科技FPGA微信学习交流群,这里有一群优秀的FPGA工程师、学生、老师、这里FPGA技术交流学习氛围浓厚、互分享、相互帮助、叫上小伙伴一起加入吧

点个在看你最好看


原文标题:如何在FPGA中实现状态机

文章出处:【微信公众号:FPGA设计论坛】欢迎添加关注!文章转载请注明出处。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1603

    文章

    21326

    浏览量

    593245

原文标题:如何在FPGA中实现状态机

文章出处:【微信号:gh_9d70b445f494,微信公众号:FPGA设计论坛】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    嵌入式编程,如何用 C 语言实现状态机设计?

    状态机模式是一种行为模式,通过多态实现不同状态的调转行为的确是一种很好的方法,只可惜在嵌入式环境下,有时只能写纯C代码,并且还需要考虑代码的重入和多任务请求跳转等情形,因此实现起来着实
    发表于 04-23 11:00

    Verilog状态机+设计实例

    在verilog中状态机的一种很常用的逻辑结构,学习和理解状态机的运行规律能够帮助我们更好地书写代码,同时作为一种思想方法,在别的代码设计中也会有所帮助。 一、简介 在使用过程中我们常说
    的头像 发表于 02-12 19:07 2012次阅读
    Verilog<b class='flag-5'>状态机</b>+设计实例

    Spring状态机实现原理和使用方法

    说起 Spring 状态机,大家很容易联想到这个状态机和设计模式中状态模式的区别是啥呢?没错,Spring 状态机就是状态模式的一种
    的头像 发表于 12-26 09:39 977次阅读
    Spring<b class='flag-5'>状态机</b>的<b class='flag-5'>实现</b>原理和使用方法

    SaberRD状态机建模工具介绍(一)什么是状态机建模

    状态机建模是使用状态图和方程式的手段,创建基于混合信号的有限状态机模型的一种建模工具。
    的头像 发表于 12-05 09:51 539次阅读
    SaberRD<b class='flag-5'>状态机</b>建模工具介绍(一)什么是<b class='flag-5'>状态机</b>建模

    什么是状态机状态机的种类与实现

    状态机,又称有限状态机(Finite State Machine,FSM)或米利状态机(Mealy Machine),是一种描述系统状态变化的模型。在芯片设计中,
    的头像 发表于 10-19 10:27 5049次阅读

    有限状态机分割设计

    有限状态机分割设计,其实质就是一个状态机分割成多个状态机
    的头像 发表于 10-09 10:47 359次阅读

    如何使用FSME来定制状态机

    定制状态机 目前得到的状态机已经能够响应来自外部的各种事件,并适当地调整自己当前所处的状态,也就是说已经实现状态机引擎的功能,接下来要做的
    的头像 发表于 09-13 16:57 883次阅读
    如何使用FSME来定制<b class='flag-5'>状态机</b>

    如何生成状态机框架

    生成状态机框架 使用FSME不仅能够进行可视化的状态机建模,更重要的是它还可以根据得到的模型自动生成用C++或者Python实现状态机框架。首先在FSME界面左边的树形列表中选择"R
    的头像 发表于 09-13 16:54 653次阅读
    如何生成<b class='flag-5'>状态机</b>框架

    基于C语言的状态机实现方案

    关于状态机,基础的知识点可以自行理解。本文主要讲解的是一个有限状态机FSM通用的写法,目的在于更好理解,移植,节省代码阅读与调试时间,体现出编程之美。
    发表于 09-13 09:28 303次阅读
    基于C语言的<b class='flag-5'>状态机</b><b class='flag-5'>实现</b>方案

    基于FPGA状态机设计

    状态机的基础知识依然强烈推荐mooc上华科的数字电路与逻辑设计,yyds!但是数电基础一定要和实际应用结合起来,理论才能发挥真正的价值。我们知道FPGA是并行执行的,如果我们想要处理具有前后顺序的事件就需要引入状态机
    的头像 发表于 07-28 10:02 500次阅读
    基于<b class='flag-5'>FPGA</b>的<b class='flag-5'>状态机</b>设计

    状态机的三种实现模式(C语言实现状态机的三种方法)

    压缩表格驱动法的实质就是一个整数值(状态机的一个状态)到一个函数地址(动作封装函数)的一对一映射, 压缩表格驱动法的驱动表格就是全部映射关系的直接载体。在驱动表格中通过状态值就能找到函数地址,通过函数地址同样能反向找到
    发表于 07-25 10:27 1655次阅读
    <b class='flag-5'>状态机</b>的三种<b class='flag-5'>实现</b>模式(C语言<b class='flag-5'>实现状态机</b>的三种方法)

    状态机编程实例-面向对象的状态设计模式

    本编介绍了状态机编程的第3种方法——面向对象的状态设计模式,通过C++的继承特性,以及类指针,实现炸弹拆除小游戏中的状态机功能。
    的头像 发表于 06-28 09:04 923次阅读
    <b class='flag-5'>状态机</b>编程实例-面向对象的<b class='flag-5'>状态</b>设计模式

    状态机实现哪些内容

    状态机模式是一种行为模式,通过多态实现不同状态的调转行为的确是一种很好的方法,只可惜在嵌入式环境下,有时只能写纯C代码,并且还需要考虑代码的重入和多任务请求跳转等情形,因此实现起来着实
    的头像 发表于 06-22 14:26 455次阅读
    <b class='flag-5'>状态机</b>要<b class='flag-5'>实现</b>哪些内容

    状态机编程实例-状态表法

    上篇文章,使用嵌套switch-case法的状态机编程,实现了一个炸弹拆除小游戏。本篇,继续介绍状态机编程的第二种方法:状态表法,来实现炸弹
    的头像 发表于 06-20 09:05 1262次阅读
    <b class='flag-5'>状态机</b>编程实例-<b class='flag-5'>状态</b>表法

    详细介绍FPGA状态机的设计和应用

    FPGA的特点是并行执行,但如果需要处理一些具有前后顺序的事件,就需要使用状态机
    发表于 05-22 14:24 712次阅读
    详细介绍<b class='flag-5'>FPGA</b><b class='flag-5'>状态机</b>的设计和应用