library IEEE;
use IEEE.STD_LOGIC_1164.all;

entity FSM21 is
    port ( Clock, Reset  : in  std_logic;
	   Control       : in  std_logic;
	   Y             : out integer range 0 to 4 );
end entity FSM21;

architecture RTL of FSM21 is
    type StateType is (ST0, ST1, ST2, ST3);
    signal CurrentState, NextState : StateType;
begin
    ----------------------
    -- NEXT STATE LOGIC
    ----------------------
    COMB: process (Control, CurrentState)
    begin
	case CurrentState is
	    when ST0 =>
		NextState <= ST1;
            when ST1 =>
		if (Control = '1') then NextState <= ST2;
		else                    NextState <= ST3;
                end if;
            when ST2 =>
		NextState <= ST3;
            when ST3 =>
		NextState <= ST0;
            when others =>
		NextState <= ST0;
        end case;
    end process COMB;

    ----------------------
    -- CURRENT STATE LOGIC
    ----------------------
    SEQ: process (Clock, Reset)
    begin
	if (Reset ='1') then
	    CurrentState <= ST0;
        elsif rising_edge(Clock) then
	    CurrentState <= NextState;
        end if;
    end process SEQ;

    ----------------------
    -- OUTPUT LOGIC (Moore type)
    ----------------------
    with CurrentState select
	Y <= 1 when ST0,
	     2 when ST1,
	     3 when ST2,
	     4 when ST3,
	     1 when others;

end architecture RTL;
