Просто интересно, реализую ли я конечный автомат на VHDL, нужно ли мне указывать, какие все выходные данные находятся в каждом возможном состоянии? Даже если я знаю, что некоторые выходы не будут меняться от одного состояния к другому, и я знаю, что порядок состояний будет таким же?
Например, в этом (принудительном) примере:
entity test is
port (
clk : in std_logic;
a : in std_logic;
b: out std_logic;
c: out std_logic;
);
end test;
architecture Behavioral of test is
type executionStage is (s1,s2,s3);
signal currentstate, nextstate: executionStage;
begin
process (clk)
begin
if(rising_edge(clk)) then
currentstate <= nextstate;
else
currentstate <= currentstate;
end if;
end process;
process(currentstate)
begin
case currentstate is
when s1 =>
if (a = '1') then
b <= '1';
c <= '0';
else
b <= '1';
c <= '1';
end if;
nextstate <= s2;
when s2 =>
-- b doesnt change state from s1 to here, do I need to define what it is here?
if (a = '1') then
b <= '1';
c <= '1';
else
b <= '1';
c <= '0';
end if;
nextstate <= s3;
when s3 =>
if (a = '1') then
b <= '0';
c <= '0';
else
b <= '1';
c <= '1';
end if;
nextstate <= s1;
end case;
end process;
end Behavioral;
Насколько я понимаю, если я этого не сделаю, тогда будут созданы защелки?
Это не имеет большого значения в чем-то вроде этого примера, но если у меня есть машина с более чем 10 выходами и более чем 10 состояниями, то мои файлы VHDL начинают выглядеть невероятно беспорядочно, и я уверен, что копирование и вставка должно быть плохой практикой. одно и то же снова и снова. Есть ли лучший способ сделать это?
edit: Могу ли я определить состояние «по умолчанию» для вывода? IE устанавливает b равным 1 вне всех процессов, а затем определяет, что это такое, только в операторах case, где оно равно 0? Будет ли это работать?