FPGA/CPLD狀態(tài)機的穩定性設計
wait until clk'event and clk='1';
current_state=next_state;
end process state_change;
combination:process(current_state,mach_input)
…… --輸出狀態(tài)值譯碼,給next_state賦新值.省略
end behave;

圖2 枚舉類(lèi)型的狀態(tài)機綜合后的波形
例1是一個(gè)四狀態(tài)全編碼狀態(tài)機,綜合后的仿真波形如圖2所示.從放大后的局部可以看出輸出狀態(tài)值從“01”到“10”轉換過(guò)程中出現了過(guò)渡狀態(tài)“11”.從微觀(guān)上分析中間信號“Current_state”狀態(tài)轉換過(guò)程,狀態(tài)寄存器的高位翻轉和低位翻轉時(shí)間是不一致的,當高位翻轉速度快時(shí),會(huì )產(chǎn)生過(guò)渡狀態(tài)“11”,當低位翻轉速度快時(shí)會(huì )產(chǎn)生過(guò)渡狀態(tài)“00”.若狀態(tài)機的狀態(tài)值更多的話(huà),則產(chǎn)生過(guò)渡狀態(tài)的概率更大.如果在非全編碼狀態(tài)機中,由于這種過(guò)渡狀態(tài)的反饋作用,將直接導致電路進(jìn)入非法狀態(tài),若此時(shí)電路不具備自啟動(dòng)功能,那么電路將無(wú)法返回正常工作狀態(tài).
因為狀態(tài)機的輸出信號常用作重要的控制,如:三態(tài)使能,寄存器清零等.所以這種結果是不允許的,如何消除此類(lèi)過(guò)渡狀態(tài)呢?方法之一是采用格雷碼表示狀態(tài)值.
2.2 用格雷碼表示狀態(tài)值
格雷碼的特點(diǎn)是任意相鄰兩個(gè)數據之間只有一位不同,這一特點(diǎn)使得采用格雷碼表示狀態(tài)值的狀態(tài)機,可以在很大程度上消除由延時(shí)引起的過(guò)渡狀態(tài).將例1改進(jìn)之后的程序如例2.
例2 采用格雷碼表示狀態(tài)值的狀態(tài)機.
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;
采用該方法,寄存器的狀態(tài)在相鄰狀態(tài)之間跳轉時(shí),只有一位變化,產(chǎn)生過(guò)渡狀態(tài)的概率大大降低.但是當一個(gè)狀態(tài)到下一個(gè)狀態(tài)有多種轉換路徑時(shí),就不能保證狀態(tài)跳轉時(shí)只有一位變化,這樣將無(wú)法發(fā)揮格雷碼的特點(diǎn).
2.3 定義“ONEHOT”風(fēng)格的狀態(tài)值編碼
雖然VHDL語(yǔ)言的目標之一是遠離硬件,但是到目前為止并沒(méi)有完全實(shí)現,所以VHDL程序在針對不同的器件綜合時(shí),仍然會(huì )有很大差異.特別是FPGA器件,當我們采用格雷表示狀態(tài)值,描述一個(gè)簡(jiǎn)單的狀態(tài)機時(shí),就可能出現不穩定結果.在針對FPGA器件寫(xiě)程序時(shí),我們可以將狀態(tài)值定義為“ONEHOT”風(fēng)格的狀態(tài)碼,將上例稍作修改,見(jiàn)例3.
例3 采用“ONEHOT”編碼的狀態(tài)機
library ieee;
use ieee std_logic_1164.all;
entity example is
port(clk:in std_logic;
評論