新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 如何設(shè)計(jì)一個(gè)穩(wěn)定可靠的狀態(tài)機(jī)

        如何設(shè)計(jì)一個(gè)穩(wěn)定可靠的狀態(tài)機(jī)

        作者: 時(shí)間:2012-07-12 來(lái)源:網(wǎng)絡(luò) 收藏
        wait until clk'event and clk='1';

        本文引用地址:http://www.104case.com/article/148786.htm

          current_state=next_state;

          end process state_change;

          combination:process(current_state,mach_input)

          …… --輸出值譯碼,給next_state賦新值.省略

          end behave;

          

          圖2 枚舉類型的機(jī)綜合后的波形

          例1是全編碼狀態(tài)機(jī),綜合后的仿真波形如圖2所示.從放大后的局部可以看出輸出狀態(tài)值從“01”到“10”轉(zhuǎn)換過(guò)程中出現(xiàn)了過(guò)渡狀態(tài)“11”.從微觀上分析中間信號(hào)“Current_state”狀態(tài)轉(zhuǎn)換過(guò)程,狀態(tài)寄存器的高位翻轉(zhuǎn)和低位翻轉(zhuǎn)時(shí)間是不一致的,當(dāng)高位翻轉(zhuǎn)速度快時(shí),會(huì)產(chǎn)生過(guò)渡狀態(tài)“11”,當(dāng)?shù)臀环D(zhuǎn)速度快時(shí)會(huì)產(chǎn)生過(guò)渡狀態(tài)“00”.若狀態(tài)機(jī)的狀態(tài)值更多的話,則產(chǎn)生過(guò)渡狀態(tài)的概率更大.如果在非全編碼狀態(tài)機(jī)中,由于這種過(guò)渡狀態(tài)的反饋?zhàn)饔?將直接導(dǎo)致電路進(jìn)入非法狀態(tài),若此時(shí)電路不具備自啟動(dòng)功能,那么電路將無(wú)法返回正常工作狀態(tài).

          因?yàn)闋顟B(tài)機(jī)的輸出信號(hào)常用作重要的控制,如:三態(tài)使能,寄存器清零等.所以這種結(jié)果是不允許的,消除此類過(guò)渡狀態(tài)呢?方法之一是采用格雷碼表示狀態(tài)值.

          2.2 用格雷碼表示狀態(tài)值

          格雷碼的特點(diǎn)是任意相鄰兩個(gè)數(shù)據(jù)之間只有一位不同,這一特點(diǎn)使得采用格雷碼表示狀態(tài)值的狀態(tài)機(jī),可以在很大程度上消除由延時(shí)引起的過(guò)渡狀態(tài).將例1改進(jìn)之后的程序如例2.

          例2 采用格雷碼表示狀態(tài)值的狀態(tài)機(jī).

          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)之間跳轉(zhuǎn)時(shí),只有一位變化,產(chǎn)生過(guò)渡狀態(tài)的概率大大降低.但是當(dāng)狀態(tài)到下狀態(tài)有多種轉(zhuǎn)換路徑時(shí),就不能保證狀態(tài)跳轉(zhuǎn)時(shí)只有一位變化,這樣將無(wú)法發(fā)揮格雷碼的特點(diǎn).

          2.3 定義“ONEHOT”風(fēng)格的狀態(tài)值編碼

          雖然VHDL語(yǔ)言的目標(biāo)之一是遠(yuǎn)離硬件,但是到目前為止并沒(méi)有完全實(shí)現(xiàn),所以VHDL程序在針對(duì)不同的器件綜合時(shí),仍然會(huì)有很大差異.特別是FPGA器件,當(dāng)我們采用格雷表示狀態(tài)值,描述一個(gè)簡(jiǎn)單的狀態(tài)機(jī)時(shí),就可能出現(xiàn)不結(jié)果.在針對(duì)FPGA器件寫程序時(shí),我們可以將狀態(tài)值定義為“ONEHOT”風(fēng)格的狀態(tài)碼,將上例稍作修改,見例3.

          例3 采用“ONEHOT”編碼的狀態(tài)機(jī)

          library ieee;

          use ieee std_logic_1164.all;

          entity example is

          port(clk:in std_logic;



        評(píng)論


        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 军事| 磴口县| 合阳县| 甘泉县| 积石山| 烟台市| 如东县| 肥城市| 金湖县| 菏泽市| 衢州市| 平邑县| 苏尼特右旗| 鄯善县| 华亭县| 鹿邑县| 榆树市| 崇州市| 康保县| 田林县| 满城县| 什邡市| 保定市| 津市市| 景洪市| 娄烦县| 邵阳市| 平昌县| 棋牌| 大连市| 柘荣县| 新丰县| 安龙县| 桃园县| 玉田县| 乌恰县| 酒泉市| 开封市| 黄冈市| 普陀区| 西城区|