Я что-то не понимаю в процессах VHDL, заканчивающихся безусловным оператором wait
.Чтобы проиллюстрировать мою проблему, мне нужно сравнить 2 следующих фрагмента:
фрагмент 1:
library ieee;
use ieee.std_logic_1164.all;
entity foo is
end entity;
architecture sim of foo is
signal clk : std_logic := '0';
signal s : std_logic;
begin
clk <= not clk after 10 ns;
-- driver1
s <= '0';
-- driver2
process (clk) is
begin
s <= clk;
end process;
end architecture;
Для сигнала s есть двойное назначение: Driver1 переводит сигнал s в '0'в то время как driver2 альтернативно выводит его на «0» и «1».Как мы можем видеть на графике формы сигнала, когда clk равен '0', результирующее s равно '0' (зеленые сегменты), но когда clk равно '1', результирующее s равно 'X' (красные сегменты). => Я понимаю это поведение, с этим проблем нет.
Если я немного изменю этот код, изменив driver1 в процесс, завершившийся безусловной wait
инструкцией:
snipet2:
library ieee;
use ieee.std_logic_1164.all;
entity foo is
end entity;
architecture sim of foo is
signal clk : std_logic := '0';
signal s : std_logic;
begin
clk <= not clk after 10 ns;
-- driver1
-- s <= '0';
process
begin
s <= '0';
wait;
end process;
-- driver2
process (clk) is
begin
s <= clk;
end process;
end architecture;
Удивительно, но для меня snipet 2 генерирует тот же сигнал, что и фрагмент 1. Я понимаю, что инструкции внутри процесса с окончательным «безусловным» wait
оператор остановится навсегда, означая, что их код будет неактивен после первого запуска выполнения.Но если это действительно так, я ожидал бы, что driver1 во фрагменте 2 неактивен после первого запуска, и что с этого момента driver2 остается единственным активным драйвером сигнала s, всегда назначая ему альтернативные '1' и '0' clk.
Почему это не так?