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