新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 如何在FPGA中实现状态机

如何在FPGA中实现状态机

作者:时间:2014-12-13来源:网络收藏

  实现

本文引用地址:http://www.eepw.com.cn/article/266770.htm

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

  TYPE state IS (idle, led_on, led_off) ;

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

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

  一般来说,大多数工程师都倾向于实现单进程状态机。与传统上讲授的双进程法相比,这种方法具有以下优势:

  可以避免组合过程中信号覆盖不完全造成的闭锁风险。

  状态机的输出与时钟保持同步。

  通常比双进程实现方案更容易调试。

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

  

使用VHDL语言的Moore状态机(左)和Mealy状态机

 

  图4,使用VHDL语言的Moore状态机(左)和Mealy状态机。

  状态机编码

  状态变量存储在触发器中,使用下一时钟边缘上的下一状态进行更新(即使没有状态变化也是如此)。如何使用触发器来表示状态值具体取决于状态的数量和是否选择用某种特定的方法来管理综合工具。状态编码最常见的三种类型是:

  顺序码--状态编码遵循传统的状态二进制序列。

  格雷码--除了状态编码使用格雷码,且状态编码串之间只有一个位变化外,其它基本与顺序编码方法类似。

  独热码--这种方法在状态机中为每一种状态分配一个触发器。只有一个触发器当前设置为高位,其余均设置为低位。故称为“独热”.

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

  

 

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

  状态编码的自动分配取决于状态机所包含的状态数量。同时还需要考虑您选择使用的综合工具。您可以根据下列经验法则来选取编码方法:

  顺序:少于5种状态。

  独热:5-50种状态。

  格雷:多于50种状态。

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

  TYPE state IS (idle, led_on, led_off) ;

  SIGNAL current_state : state := idle;

  ATTRIBUTE syn_encoding STRING;

  ATTRIBUTE syn_encoding OF current_state :

  SIGNAL IS “sequential”;

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

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

  TYPE state IS (idle, led_on, led_off) ;

  SIGNAL current_state : state := idle;

  ATTRIBUTE syn_encoding STRING;

  ATTRIBUTE syn_encoding OF current_state :

  SIGNAL IS ”sequential“;

  工程师负责在综合工具中使用正确的设置,以确保该工具不会忽略任何属性。例如,赛灵思XST工具要求将FSM选项设置为USER,而Synopsys的Synplify则要求关闭FSM编译器。

  前面给出的等式可确定状态机实现方案所需的触发器数量。由于不是所有的状态机都是2的幂次方,因此某些状态在设计中将不会用到。实现状态机的工程师 必须负责确保未使用的状态在设计中得到妥善处理。可以采用几种适用于多种设计的基本技巧来实现这一目标。对于高度可靠的安全关键型设计,则需要采用其它更 高级的技巧。

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

  TYPE state IS (idle, led_on, led_off) ;

  SIGNAL current_state : state := idle;

  ATTRIBUTE syn_keep BOOLEAN;

  ATTRIBUTE syn_keep OF current_state :

  SIGNAL IS TRUE”;

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

fpga相关文章:fpga是什么


尘埃粒子计数器相关文章:尘埃粒子计数器原理

上一页 1 2 下一页

关键词: FPGA 状态机

评论


相关推荐

技术专区

关闭