新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 如何设计一个稳定可靠的状态机

如何设计一个稳定可靠的状态机

作者:时间:2012-07-12来源:网络收藏

 mach_input:in std_logic;

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

  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;

  ……

  

  

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

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

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

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

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

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

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

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

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


上一页 1 2 3 下一页

评论


相关推荐

技术专区

关闭