当前位置:首页 > 嵌入式 > 嵌入式教程
[导读]如何设计一个稳定可靠的状态机

随着大规模和超大规模FPGA/CPLD器件的诞生和发展,以HDL(硬件描述语言)为工具、FPGA/CPLD器件为载体的EDA技术的应用越来越广泛.从小型电子系统到大规模SOC(Systemonachip)设计,已经无处不在.在FPGA/CPLD设计中,状态机是最典型、应用最广泛的时序电路模块,如何设计一个稳定可靠的状态机是我们必须面对的问题.

  1、状态机的特点和常见问题

  标准状态机分为摩尔(Moore)状态机和米立(Mealy)状态机两类.Moore状态机的输出仅与当前状态值有关,且只在时钟边沿到来时才会有状态变化.Mealy状态机的输出不仅与当前状态值有关,而且与当前输入值有关,这一特点使其控制和输出更加灵活,但同时也增加了设计复杂程度.其原理如图1所示.

  

<center>


 

  根据图1所示,很容易理解状态机的结构.但是为什么要使用状态机而不使用一般时序电路呢?这是因为它具有一些一般时序电路无法比拟的优点.

  用VHDL描述的状态机结构分明,易读,易懂,易排错;

  相对其它时序电路而言,状态机更加稳定,运行模式类似于CPU,易于实现顺序控制等.

  用VHDL语言描述状态机属于一种高层次建模,结果经常出现一些出乎设计者意外的情况:

  在两个状态转换时,出现过渡状态.

  在运行过程中,进入非法状态.

  在一种器件上综合出理想结果,移植到另一器件上时,不能得到与之相符的结果.

  状态机能够稳定工作,但占用逻辑资源过多.

  在针对FPGA器件综合时,这种情况出现的可能性更大.我们必须慎重设计状态机,分析状态机内在结构,在Moore状态机中输出信号是当前状态值的译码,当状态寄存器的状态值稳定时,输出也随之稳定了.经综合器综合后一般生成以触发器为核心的状态寄存电路,其稳定性由此决定.如果CLOCK信号的上升沿到达各触发器的时间严格一致的话,状态值也会严格按照设计要求在规定的状态值之间转换.然而这只是一种理想情况,实际CPLD/FPGA器件一般无法满足这种苛刻的时序要求,特别是在布线后这些触发器相距较远时,CLOCK到达各触发器的延时往往有一些差异.这种差异将直接导致状态机在状态转换时产生过渡状态,当这种延时进一步加大时,将有可能导致状态机进入非法状态.这就是Moore状态机的失效机理.对于Mealy状态机而言,由于其任何时刻的输出与输入有关,这种情况就更常见了.

  2 状态机设计方案比较

  2.1 采用枚举数据类型定义状态值

  在设计中定义状态机的状态值为枚举数据类型,综合器一般把它表示为二进制数的序列,综合后生成以触发器为核心的状态寄存电路,寄存器用量会减少,其综合效率和电路速度将会在一定程度上得到提高.

  例1 定义状态值为枚举类型的状态机VHDL程序.

  library ieee;

  use ieee.std_logic_1164 all;

  entity example is

  port(clk:in std_logic;

  mach_input:in std_logic;

  mach_outputs:out std_logic_vector(0 to 1));

  end example;

  architecture behave of example is

  type states is(st0,st1,st2,st3); --定义states为枚举类型

  signal current_state,next_state:states;

  begin

  state_change:process(clk) --状态改变进程

  begin[!--empirenews.page--]wait until clk‘event and clk=‘1‘;

  current_state<=next_state;

  end process state_change;

  combination:process(current_state,mach_input)

  …… --输出状态值译码,给"next_state"赋新值.省略

  end behave;

  

 

  图2 枚举类型的状态机综合后的波形

  例1是一个四状态全编码状态机,综合后的仿真波形如图2所示.从放大后的局部可以看出输出状态值从“01”到“10”转换过程中出现了过渡状态“11”.从微观上分析中间信号“Current_state”状态转换过程,状态寄存器的高位翻转和低位翻转时间是不一致的,当高位翻转速度快时,会产生过渡状态“11”,当低位翻转速度快时会产生过渡状态“00”.若状态机的状态值更多的话,则产生过渡状态的概率更大.如果在非全编码状态机中,由于这种过渡状态的反馈作用,将直接导致电路进入非法状态,若此时电路不具备自启动功能,那么电路将无法返回正常工作状态.

  因为状态机的输出信号常用作重要的控制,如:三态使能,寄存器清零等.所以这种结果是不允许的,如何消除此类过渡状态呢?方法之一是采用格雷码表示状态值.

  2.2 用格雷码表示状态值

  格雷码的特点是任意相邻两个数据之间只有一位不同,这一特点使得采用格雷码表示状态值的状态机,可以在很大程度上消除由延时引起的过渡状态.将例1改进之后的程序如例2.

  例2 采用格雷码表示状态值的状态机.

  library ieee;

  use ieee.std_logic_1164 all;

  entity example is

  port(clk:in std_logic;

  mach_input:in std_logic;

  mach_outputs:out std_logic_vector(0 to 1));

  end example;

  architecture behave of example is

  constant st0:std_logic_vector(0 to 1):="00";

  constant st1 :std_logic_vector(0 to 1):="01";

  constant st2:std_logic_vector(0 to 1):="11";

  constant st3:std_logic_vector(0 to 1):="10";

  signal current_state,next_state:std_logic

  vector(0to1);

  begin

  ……

  endbebave;

  采用该方法,寄存器的状态在相邻状态之间跳转时,只有一位变化,产生过渡状态的概率大大降低.但是当一个状态到下一个状态有多种转换路径时,就不能保证状态跳转时只有一位变化,这样将无法发挥格雷码的特点.

  2.3 定义“ONEHOT”风格的状态值编码

  虽然VHDL语言的目标之一是远离硬件,但是到目前为止并没有完全实现,所以VHDL程序在针对不同的器件综合时,仍然会有很大差异.特别是FPGA器件,当我们采用格雷表示状态值,描述一个简单的状态机时,就可能出现不稳定结果.在针对FPGA器件写程序时,我们可以将状态值定义为“ONEHOT”风格的状态码,将上例稍作修改,见例3.

  例3 采用“ONEHOT”编码的状态机

  library ieee;

  use ieee std_logic_1164.all;

  entity example is

  port(clk:in std_logic;[!--empirenews.page--]
 mach_input:in std_logic;

  mach_outputs:out std_logic_vector(0 to 1));

  endexample;

  architecture behave of example is

  constant st0:std_logic_vector(0 to 3):="0001";

  constant st1:std_logic_vector(0 to 3):="0010";

  constant st2:std_logic_vector(0 to 3):="0100";

  constant st3:std_logic_vector(0 to 3):="1000";

  signal current_state,next_state:std_logic vector(0 to 3);

  begin

  ……

  对FLEX10K系列器件综合后的仿真结果如图3所示.

  

 

  图3 采用“ONEHOT”编码的状态机综合后的波形

  如图3所示,在输入信号稳定以后,状态机的输出信号也稳定下来,定义这种风格的状态码来设计基于FPGA的状态机是一种不错的选择.

  然而在输入信号跳变时,电路还是会出现不稳定现象.此时我们已不能只从状态值编码方式寻找解决方法.回头看看状态机的原理框图不难发现:状态寄存器的输出值是必须符合建立保持时间约束关系的.在上述状态机中虽然采用了各种不同的编码方式但都不能彻底消除这种过渡状态,我们将电路结构稍作改进,一种更好的结构如图4所示.这种结构的状态机可有效抑制过渡状态的出现.这是因为输出寄存器只要求状态值在时钟的边沿稳定.将上述程序改进之后的程序如图4.

  ……

  architecture behave of example1is

  type states is(st0,st1,st2,st3); 定义states为枚举类型

  signal current_state,next_state:states;

  signal temp:std_logic_vector(0 to 1); 定义一个信号用于引入输出寄存器

  begin

  state_change:process(clk) --状态改变进程

  begin

  wait until clk‘eventandclk=‘1‘;

  current_state<=next_state;

  mach_outputs<=temp;

  end process state_change;

  ……

  

 

  

center>

 

  图5 改进后的状态机综合后的波形

  显然这种结构的状态机稳定性优于一般结构的状态机,但是它占用的逻辑资源更多,电路的速度可能下降,在设计时应综合考虑.

  另外,为防止电路进入非法状态,可以设计成自启动结构,在VHDL描述的状态机中添加一个“when others”语句是行之有效的.

  3 选择不同编码方式、不同结构的状态机的技巧

  3.1 针对不同结构器件选择不同编码风格

  基于乘积项结构的CPLD器件适合于设计全编码状态机,在全编码状态机中采用格雷码表示状态值.这对于逻辑资源较少的器件是一种不错的优化方法.

  基于查找表结构的FPGA器件适合于设计成“ONEHOT”方式编码的状态机,这种结构状态机只用一位二进制数表示一个状态,可提高稳定性,但要占用更多的逻辑资源.

  3.2 根据逻辑资源大小选择状态机结构

  当设计的状态机状态转换次序出现多路径时,采用格雷码表示状态值不会有任何作用,因为此时有些相邻状态不只是一位不同.在逻辑资源允许的情况下,可以考虑在状态机后级增加一级输出寄存器,可确保输出不产生毛刺,使状态机输出稳定可靠的信号.

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭