新闻中心

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

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

作者: 时间:2012-07-12 来源:网络 收藏
wait until clk'event and clk='1';

本文引用地址://m.amcfsurvey.com/article/148786.htm

  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;



评论


相关推荐

技术专区

关闭