Я кодирую 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), поэтому можно сказать, что я описываю машину Мили или это все еще машина Мура, потому что я жду следующего повышениякрай, чтобы обновить вывод?
Я все еще думаю, что это Мур, но я не уверен.Спасибо