ФСМ в VHDL - это Мур или Мили? - PullRequest
       8

ФСМ в VHDL - это Мур или Мили?

0 голосов
/ 12 декабря 2018

Я кодирую FSM в VHDL.В частности, это детектор синхронизированной последовательности, который имеет на входе 8-разрядное число и «первое», которое должно быть «1» только во время первого номера последовательности.Выход состоит из разблокировки и предупреждения: unlock = '1', если последовательность (36, ...) была правильной, или предупреждение = '1', если последовательность была неправильной или first = '1' не во время первого числапоследовательности.

В VHDL я использую два процесса, один синхронизированный, а другой нет.Упрощенная версия второй:

state_register_p : process(clk)
    begin 
        if (clk'EVENT and clk = '1') then
            if(rst = '0') then
                current_state <= S0;

                errors_num <= "00";
                five_cycles <= "000";
                first_error <= '1';
            else
                current_state <= next_state;

                if correct = '0' then
                    errors_num <= errors_num + "01";
                else
                    errors_num <= "00";
                end if;

            end if;

        end if;

end process state_register_p;

combinatorial_logic_p : process(current_state, num_in, first)

    begin       
        unlock <= '0';
        warning <= '0';

        case (current_state) is             
            when S0 =>
                if (to_integer(unsigned(num_in)) = 36) and (first = '1') then
                    next_state <= S1;
                else
                    next_state <= S0;
           when S1 =>
                correct <= '0';
                if (to_integer(unsigned(num_in)) = 19) and (first = '0') and errors_num /= "11" then
                    next_state <= S2;
                elsif first = '1' or errors_num = "11" then
                    next_state <= S6;
                else
                    next_state <= S0;
                end if;

            when S2 =>
                correct <= '0';
                if (to_integer(unsigned(num_in)) = 56)  and (first = '0') then
                    next_state <= S3;
                elsif first = '1' then
                    next_state <= S6;
                else
                    next_state <= S0;
                end if;

            when S3 =>
                correct <= '0';
                if (to_integer(unsigned(num_in)) = 101) and (first = '0') then
                    next_state <= S4;
                elsif first = '1' then
                    next_state <= S6;
                else
                    next_state <= S0;
                end if;

            when S4 =>
                correct <= '0';
                if (to_integer(unsigned(num_in)) = 73) and (first = '0') and (to_integer(unsigned(five_cycles)) = 5) then
                    next_state <= S5;
                    correct <= '1';
                elsif first = '1' then
                    next_state <= S6;
                else
                    next_state <= S0;
                end if;

            when S5 =>
                correct <= '1';
                if to_integer(unsigned(num_in)) = 36 and (first = '1') then
                    next_state <= S1;
                else
                    next_state <= S0;
                end if;

                unlock <= '1';

            when S6 =>
                correct <= '0';
                next_state <= S6; -- default, hold in current state
                warning <= '1';

        end case;               
end process combinatorial_logic_p;

Читая онлайн, я знаю, что в машине Мура следующее состояние зависит только от текущего состояния, поэтому выходы меняются только по краям тактового сигнала, в то время как в Мили это зависиттакже на входе, поэтому его выходы могут изменяться при изменении входа (т. е. не обязательно по фронту тактового сигнала)..

В своем списке чувствительности я использую current_state и 2 входа (num_in и first), поэтому можно сказать, что я описываю машину Мили или это все еще машина Мура, потому что я жду следующего повышениякрай, чтобы обновить вывод?

Я все еще думаю, что это Мур, но я не уверен.Спасибо

1 Ответ

0 голосов
/ 12 декабря 2018

Это конечный автомат Мура, поскольку выходы unlock и warning зависят только от current_state в процессе combinatorial_logic_p.

Обратите внимание, что сигналы errors_num и five_cyclesиспользуются в процессе combinatorial_logic_p, но забыты в списке чувствительности.Поэтому добавьте их или измените на (all), если используете VHDL-2008.

...