WebElektronika

Véges állapotú gép (FSM) megvalósítása VHDL nyelven

person access_time 2014.05.05.
Bemutatásra kerül most egy Moore típusú véges állapotú gép (FSM) VHDL nyelven történő megvalósítása, illetve szimuláció segítségével megnézzük ennek a működését is.


Nézzük meg a következő állapotgépet (1. ábra). Van ennek CLK, CLR, C és K bemenete, illetve F kimenete.


1. ábra   A szimulálandó állapotgép
 

A következő táblázat bal oldalán látjuk az első ábrán lévő állapotgép VHDL kódját. Látható, hogy két process található a VHDL file-ban. Az első process az FSM működéséért felel, a következő pedig a kimeneti logikáért (F).

Szimuláljuk le ezt a VHDL kódot! Igen ám, de azt szeretnénk, ha látnánk az aktuális állapotot (state) is. Ezért nem használunk komponenst (nem helyezzük be komponenséként a szimulálandó VHDL kódot egy másik VHDL file-ba, azaz egy tesztkörnyezetbe), hanem a szimulálandó kódot alakítjuk át.
Ez úgy történik, hogy az entitásból kitöröljük a bemenetei portok deklarációját, és ezeket betesszük jelként az "architecture" és a "begin" közé. Ezen kívül készítünk még két processt is, az egyik az órajel előállításáért felel (orajel), a másik pedig a tesztvektorokat (szimulacio) állítja elő.
 

Moore FSM kódja Moore FSM szimulációs vektorral

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
entity moorefsm is
    port (CLK, CLR, C, K : in std_logic;
        F: out std_logic);
end moorefsm;

architecture viselk of moorefsm is
     type state_type is (s0, s1, s2, s3, s4); 
     signal state: state_type;

begin
logika : process(CLK, CLR) 
    begin
        if (CLR = '1') then
            state <= s0; 
        elsif CLK'event and CLK = '1' then
            case state IS 
            when s0 => 
                if C = '1' then
                    state <= s1;
                else
                    state <= s0;
                end if;
            when s1 =>
                if K = '0' then
                    state <= s4;
                else
                    state <= s2;
                end if;
            when s2=>
                if C = '1' then
                    state <= s3;
                else
                    state <= s2;
                 end if;
            when s3=>
                if K = '1' then
                    state <= s0;
                else
                    state <= s1;
                end if;
            when s4=>
                if C = '1' then
                       state <= s4;
                else
                       state <= s2;
                end if;
            end case;
        end if;
    end process;

kimenet : process (state)
    begin
        case state is 
            when s0 => F <= '0';
            when s1 => F <= '1';
            when s2 => F <= '1';
            when s3 => F <= '1';
            when s4 => F <= '0';
        end case;
    end process;

end viselk;

 

 

 

 

 

 

 

 

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
entity moorefsmsim is
    port (F: out std_logic);
end moorefsmsim;

architecture viselk of moorefsmsim is
type state_type is (s0, s1, s2, s3, s4); 
signal state: state_type;
signal    CLK, CLR, C, K : std_logic;

begin
logika : process(CLK, CLR) 
    begin
        if (CLR = '1') then
            state <= s0; 
        elsif CLK'event and CLK ='1' then
            case state IS 
            when s0 => 
                if C = '1' then
                    state <= s1;
                else
                    state <= s0;
                end if;
            when s1 =>
                if K = '0' then
                    state <= s4;
                else
                    state <= s2;
                end if;
            when s2=>
                if C = '1' then
                    state <= s3;
                else
                    state <= s2;
                 end if;
            when s3=>
                if K = '1' then
                    state <= s0;
                else
                    state <= s1;
                end if;
            when s4=>
                if C = '1' then
                    state <= s4;
                else
                    state <= s2;
                end if;
            end case;
        end if;
    end process;

kimenet : process (state)
    begin
        case state is 
            when s0 => F <= '0';
            when s1 => F <= '1';
            when s2 => F <= '1';
            when s3 => F <= '1';
            when s4 => F <= '0';
        end case;
    end process;

orajel : process
    begin
        CLK <= '0';
        wait for 10 ns;
        CLK <= '1';
        wait for 10 ns;
    end process;

szimulacio : process
    begin
        CLR <= '0';
        C <= '1';
        K <= '0';
        wait for 10 ns;
        CLR <= '1';
        wait for 10 ns;
        CLR <= '0';
        wait for 40 ns;
        C <= '0';
        wait for 30 ns;
        C <= '1';
        wait for 40 ns;
    end process;
end viselk
;

A táblázat jobb oldalán látható, átalakított VHDL kódot szimuláljuk le a VHDL Simili használatával. A szimulációs eredményt a második ábrán találjuk. Itt látjuk az állapotokat (pl.: s1), illetve az ahhoz tartozó kimeneti értékeket.


2. ábra   A szimulációs eredmény