Таким образом, Altera предоставляет пример конечного автомата с двумя процессами по этой ссылке а>.
Мне нравится этот стиль, но я не понимаю, что если «вход» остается равным «0», второй процесс никогда не запускается, поскольку состояние никогда не меняется, и поэтому «выход» никогда не назначается и не инициализируется... Или это ?
Насколько я понимаю, должен быть переход на один из сигналов списка чувствительности (в данном примере «состояние»), который здесь никогда не может произойти.
Может кто-нибудь прояснить, в чем здесь дело?
Вот код:
ENTITY state_machine IS
PORT(
clk : IN STD_LOGIC;
input : IN STD_LOGIC;
reset : IN STD_LOGIC;
output : OUT STD_LOGIC_VECTOR(1 downto 0));
END state_machine;
ARCHITECTURE a OF state_machine IS
TYPE STATE_TYPE IS (s0, s1, s2);
SIGNAL state : STATE_TYPE;
BEGIN
PROCESS (clk, reset)
BEGIN
IF reset = '1' THEN
state <= s0;
ELSIF (clk'EVENT AND clk = '1') THEN
CASE state IS
WHEN s0=>
IF input = '1' THEN
state <= s1;
ELSE
state <= s0;
END IF;
WHEN s1=>
IF input = '1' THEN
state <= s2;
ELSE
state <= s1;
END IF;
WHEN s2=>
IF input = '1' THEN
state <= s0;
ELSE
state <= s2;
END IF;
END CASE;
END IF;
END PROCESS;
PROCESS (state)
BEGIN
CASE state IS
WHEN s0 =>
output <= "00";
WHEN s1 =>
output <= "01";
WHEN s2 =>
output <= "10";
END CASE;
END PROCESS;
END a;
EDIT: Просто чтобы уточнить, мой вопрос: мне кажется, что «выход» будет в неопределенном состоянии, пока «вход» не перейдет в «1». Разве это не плохая практика, учитывая, что это официальный пример от Altera? И, кстати, как здесь правильно инициализировать «выход»? С асинхронным сбросом?
state
будет равно s0 независимо от сброса (14.4 Разработка декларативной части, 14.4.2.5 Объявления объектов, 6.4.2.3 Объявления сигналов). Во время инициализации присвоениеoutput
запланирует обновление значения на 00 в момент времени 0. В первом цикле моделирования изменение действующего значения с UU на 00 вызовет событие наoutput
. (14.7.3.2 Управляющие значения, 14.7.3.3 Действующие значения, 14.7.3.4 Обновление сигнала, 14.7.5.3 Цикл моделирования). - person   schedule 20.06.2017SIGNAL state : STATE_TYPE := s0;
- person JHBonarius   schedule 20.06.2017