Projektujemy maszynę stanową 2


Naszym kolejnym projektem będzie budowa maszyny stanowej. Jej zadaniem będzie poszukiwanie ciągu „1101”.

Maszynę stanową utworzymy jako narzędzie synchroniczne zależne od zegara CLK. Próbkowanie sygnału wejściowego DATA_IN będzie odbywać się na narastające zbocze sygnału zegarowego i to właśnie ten sygnał będzie sterował przejściami maszyny stanowej. Kiedy odbierzemy paczkę „1101” na wyjściu pojawi się jedynka.

Proste przedstawienie w postaci diagramu FSM naszej maszyny stanowej.

Budowa w VHDL

library ieee;
use ieee.std_logic_1164.all;
 
entity FSM is
    port(
        CLK : IN std_logic;
        RST_N : IN std_logic;
        DATA_IN : IN std_logic;
        DATA_OUT : OUT std_logic );
end FSM;
 
architecture Behavioral of FSM is
    type STATES is (START, STATE1, STATE2, STATE3, STATE4);
    signal STATE : STATES := START;
begin
    FSM_DRIVER : process(CLK,RST_N,DATA_IN)
    begin
        if RST_N = '0' then
            STATE <= START;
        elsif rising_edge(CLK) then
            case STATE is
                when START =>
                    if DATA_IN = '0' then
                        STATE <= START;
                    else
                        STATE <= STATE1;
                    end if;
                when STATE1 =>
                    if DATA_IN = '0' then
                        STATE <= START ;
                    else
                        STATE <= STATE2;
                    end if;                    
                when STATE2 =>
                    if DATA_IN = '0' then
                        STATE <= STATE3;
                    else
                        STATE <= STATE2;
                    end if;                    
                when STATE3 =>
                    if DATA_IN = '0' then
                        STATE <= START;
                    else
                        STATE <= STATE4;
                    end if;               
                when STATE4 =>
                    if DATA_IN = '0' then
                        STATE <= START;
                    else
                        STATE <= STATE2;
                    end if;
            end case;
        end if;
    end process;
 
    DATA_OUT_DRIVER : process(STATE)
    begin
        if STATE = STATE4 then
            DATA_OUT <= '1';
        else
            DATA_OUT <= '0';
        end if;
    end process;
 
end Behavioral;

2 thoughts on “Projektujemy maszynę stanową”

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

Rating*