Books | Robot_Books | Fig_16

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use work.components.all;

entity Structm is
    port (
        anglecnt_count     : out std_logic;
        anglecnt_reset     : out std_logic;
        anglediff_en       : out std_logic;
        clk                : in std_logic;
        comp12_4_dout      : in std_logic;
        comp12_9_dout      : in std_logic;
        comp16_7_dout      : in std_logic;
        comp16_8_dout      : in std_logic;
        comp20_1_dout      : in std_logic;
        comp20_2_dout      : in std_logic;
        comp20_3_dout      : in std_logic;
        comp20_5_dout      : in std_logic;
        comp20_6_dout      : in std_logic;
        compecho           : in std_logic;
        comprg1_en         : out std_logic;
        comprg2_en         : out std_logic;
        comptrig_cnt_count : out std_logic;
        comptrig_cnt_reset : out std_logic;
        comptrig_reset     : out std_logic;
        comptrig_set       : out std_logic;
        ctr_mux0_0         : out std_logic;
        ctr_mux0_1         : out std_logic;
        distrg_en          : out std_logic;
        ds_cnt_count       : out std_logic;
        ds_cnt_reset       : out std_logic;
        ds_echo            : in std_logic;
        dstrig_cnt_count   : out std_logic;
        dstrig_cnt_reset   : out std_logic;
        dstrig_reset       : out std_logic;
        dstrig_set         : out std_logic;
        idle               : out std_logic;
        lengctrl1_reset    : out std_logic;
        lengctrl1_set      : out std_logic;
        lengctrl2_reset    : out std_logic;
        lengctrl2_set      : out std_logic;
        pwm_cnt_count      : out std_logic;
        pwm_cnt_reset      : out std_logic;
        pwm_reset          : out std_logic;
        pwm_set            : out std_logic;
        rengctrl1_reset    : out std_logic;
        rengctrl1_set      : out std_logic;
        rengctrl2_reset    : out std_logic;
        rengctrl2_set      : out std_logic;
        rst                : in std_logic;
        speedrg_en         : out std_logic;
        start              : in std_logic;
        stopflag           : in std_logic;
        stopflag_reset     : out std_logic;
        stopflag_set       : out std_logic
    );
end Structm;

architecture ARC_Structm of Structm is

    type FSMStates is (
        a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, 
        a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, 
        a31, a32, a33, a34
    );

    signal currentState : FSMStates;

begin

    process (clk , rst)


    procedure proc_Structm is 
    begin

    anglecnt_count <= '0';
    anglecnt_reset <= '0';
    anglediff_en <= '0';
    comprg1_en <= '0';
    comprg2_en <= '0';
    comptrig_cnt_count <= '0';
    comptrig_cnt_reset <= '0';
    comptrig_reset <= '0';
    comptrig_set <= '0';
    ctr_mux0_0 <= '0';
    ctr_mux0_1 <= '0';
    distrg_en <= '0';
    ds_cnt_count <= '0';
    ds_cnt_reset <= '0';
    dstrig_cnt_count <= '0';
    dstrig_cnt_reset <= '0';
    dstrig_reset <= '0';
    dstrig_set <= '0';
    idle <= '0';
    lengctrl1_reset <= '0';
    lengctrl1_set <= '0';
    lengctrl2_reset <= '0';
    lengctrl2_set <= '0';
    pwm_cnt_count <= '0';
    pwm_cnt_reset <= '0';
    pwm_reset <= '0';
    pwm_set <= '0';
    rengctrl1_reset <= '0';
    rengctrl1_set <= '0';
    rengctrl2_reset <= '0';
    rengctrl2_set <= '0';
    speedrg_en <= '0';
    stopflag_reset <= '0';
    stopflag_set <= '0';

    case currentState is
    when a1 =>
        if (start) = '1' then
            ds_cnt_reset <= '1';
            dstrig_set <= '1';
            dstrig_cnt_reset <= '1';
            currentState <= a2;

        else
            currentState <= a1;
            idle <= '1';

        end if;

    when a2 =>
        
            dstrig_cnt_count <= '1';
            currentState <= a3;

    when a3 =>
        if (comp12_4_dout) = '1' then
            dstrig_reset <= '1';
            currentState <= a4;

        else
            dstrig_cnt_count <= '1';
            currentState <= a3;

        end if;

    when a4 =>
        if (ds_echo) = '1' then
            ds_cnt_count <= '1';
            currentState <= a5;

        else
            currentState <= a4;

        end if;

    when a5 =>
        if (ds_echo) = '1' then
            ds_cnt_count <= '1';
            currentState <= a5;

        else
            distrg_en <= '1';
            currentState <= a6;

        end if;

    when a6 =>
        if (comp20_6_dout) = '1' then
            ds_cnt_reset <= '1';
            dstrig_set <= '1';
            dstrig_cnt_reset <= '1';
            currentState <= a7;

        else
            anglecnt_reset <= '1';
            comptrig_set <= '1';
            comptrig_cnt_reset <= '1';
            currentState <= a8;

        end if;

    when a7 =>
        
            dstrig_cnt_count <= '1';
            currentState <= a9;

    when a8 =>
        
            comptrig_cnt_count <= '1';
            currentState <= a10;

    when a9 =>
        if (comp12_4_dout) = '1' then
            dstrig_reset <= '1';
            currentState <= a11;

        else
            dstrig_cnt_count <= '1';
            currentState <= a9;

        end if;

    when a10 =>
        if (comp12_9_dout) = '1' then
            comptrig_reset <= '1';
            currentState <= a12;

        else
            comptrig_cnt_count <= '1';
            currentState <= a10;

        end if;

    when a11 =>
        if (ds_echo) = '1' then
            ds_cnt_count <= '1';
            currentState <= a13;

        else
            currentState <= a11;

        end if;

    when a12 =>
        if (compecho) = '1' then
            anglecnt_count <= '1';
            currentState <= a14;

        else
            currentState <= a12;

        end if;

    when a13 =>
        if (ds_echo) = '1' then
            ds_cnt_count <= '1';
            currentState <= a13;

        else
            distrg_en <= '1';
            currentState <= a15;

        end if;

    when a14 =>
        if (compecho) = '1' then
            anglecnt_count <= '1';
            currentState <= a14;

        else
            comprg1_en <= '1';
            currentState <= a16;

        end if;

    when a15 =>
        
            stopflag_reset <= '1';
            currentState <= a17;

    when a16 =>
        
            lengctrl2_set <= '1';
            rengctrl1_set <= '1';
            lengctrl1_reset <= '1';
            rengctrl2_reset <= '1';
            currentState <= a18;

    when a17 =>
        if (comp20_3_dout) = '1' then
            speedrg_en <= '1';
            ctr_mux0_1 <= '1';
            currentState <= a20;

        elsif (not comp20_3_dout and comp20_2_dout) = '1' then
            speedrg_en <= '1';
            ctr_mux0_0 <= '1';
            currentState <= a20;

        elsif (not comp20_3_dout and not comp20_2_dout and comp20_1_dout) = '1' then
            speedrg_en <= '1';
            currentState <= a20;

        else
            stopflag_set <= '1';
            currentState <= a23;

        end if;

    when a18 =>
        
            speedrg_en <= '1';
            currentState <= a19;

    when a19 =>
        
            pwm_set <= '1';
            pwm_cnt_reset <= '1';
            currentState <= a21;

    when a20 =>
        
            pwm_set <= '1';
            pwm_cnt_reset <= '1';
            currentState <= a22;

    when a21 =>
        if (comp16_8_dout) = '1' then
            pwm_cnt_count <= '1';
            currentState <= a24;

        else
            pwm_reset <= '1';
            currentState <= a25;

        end if;

    when a22 =>
        if (comp16_8_dout) = '1' then
            pwm_cnt_count <= '1';
            currentState <= a26;

        else
            pwm_reset <= '1';
            currentState <= a27;

        end if;

    when a23 =>
        if (stopflag) = '1' then
            lengctrl1_set <= '1';
            lengctrl2_set <= '1';
            rengctrl1_set <= '1';
            rengctrl2_set <= '1';
            currentState <= a1;
            idle <= '1';

        else
            ds_cnt_reset <= '1';
            dstrig_set <= '1';
            dstrig_cnt_reset <= '1';
            currentState <= a7;

        end if;

    when a24 =>
        if (comp16_7_dout and comp16_8_dout) = '1' then
            pwm_cnt_count <= '1';
            currentState <= a24;

        elsif (comp16_7_dout and not comp16_8_dout) = '1' then
            pwm_reset <= '1';
            currentState <= a25;

        else
            anglecnt_reset <= '1';
            comptrig_set <= '1';
            comptrig_cnt_reset <= '1';
            currentState <= a28;

        end if;

    when a25 =>
        
            pwm_cnt_count <= '1';
            currentState <= a24;

    when a26 =>
        if (comp16_7_dout and comp16_8_dout) = '1' then
            pwm_cnt_count <= '1';
            currentState <= a26;

        elsif (comp16_7_dout and not comp16_8_dout) = '1' then
            pwm_reset <= '1';
            currentState <= a27;

        elsif (not comp16_7_dout and stopflag) = '1' then
            lengctrl1_set <= '1';
            lengctrl2_set <= '1';
            rengctrl1_set <= '1';
            rengctrl2_set <= '1';
            currentState <= a1;
            idle <= '1';

        else
            ds_cnt_reset <= '1';
            dstrig_set <= '1';
            dstrig_cnt_reset <= '1';
            currentState <= a7;

        end if;

    when a27 =>
        
            pwm_cnt_count <= '1';
            currentState <= a26;

    when a28 =>
        
            comptrig_cnt_count <= '1';
            currentState <= a29;

    when a29 =>
        if (comp12_9_dout) = '1' then
            comptrig_reset <= '1';
            currentState <= a30;

        else
            comptrig_cnt_count <= '1';
            currentState <= a29;

        end if;

    when a30 =>
        if (compecho) = '1' then
            anglecnt_count <= '1';
            currentState <= a31;

        else
            currentState <= a30;

        end if;

    when a31 =>
        if (compecho) = '1' then
            anglecnt_count <= '1';
            currentState <= a31;

        else
            comprg2_en <= '1';
            currentState <= a32;

        end if;

    when a32 =>
        
            anglediff_en <= '1';
            currentState <= a33;

    when a33 =>
        if (comp20_5_dout) = '1' then
            lengctrl1_reset <= '1';
            lengctrl2_reset <= '1';
            rengctrl1_reset <= '1';
            rengctrl2_reset <= '1';
            currentState <= a34;

        else
            lengctrl2_set <= '1';
            rengctrl1_set <= '1';
            lengctrl1_reset <= '1';
            rengctrl2_reset <= '1';
            currentState <= a18;

        end if;

    when a34 =>
        
            ds_cnt_reset <= '1';
            dstrig_set <= '1';
            dstrig_cnt_reset <= '1';
            currentState <= a2;

    end case;
    end proc_Structm;

    begin
        if (rst = '1') then
            anglecnt_count <= '0';
            anglecnt_reset <= '0';
            anglediff_en <= '0';
            comprg1_en <= '0';
            comprg2_en <= '0';
            comptrig_cnt_count <= '0';
            comptrig_cnt_reset <= '0';
            comptrig_reset <= '0';
            comptrig_set <= '0';
            ctr_mux0_0 <= '0';
            ctr_mux0_1 <= '0';
            distrg_en <= '0';
            ds_cnt_count <= '0';
            ds_cnt_reset <= '0';
            dstrig_cnt_count <= '0';
            dstrig_cnt_reset <= '0';
            dstrig_reset <= '0';
            dstrig_set <= '0';
            idle <= '0';
            lengctrl1_reset <= '0';
            lengctrl1_set <= '0';
            lengctrl2_reset <= '0';
            lengctrl2_set <= '0';
            pwm_cnt_count <= '0';
            pwm_cnt_reset <= '0';
            pwm_reset <= '0';
            pwm_set <= '0';
            rengctrl1_reset <= '0';
            rengctrl1_set <= '0';
            rengctrl2_reset <= '0';
            rengctrl2_set <= '0';
            speedrg_en <= '0';
            stopflag_reset <= '0';
            stopflag_set <= '0';

            currentState <= a1;
            idle <= '1';

        elsif (clk'event and clk = '0') then
            idle <= '0';
            proc_Structm;
        end if;
    end process;

end ARC_Structm;