Если вы назначили новое значение для сигнала в VHDL с <=
без явной задержки (с after <time>
), то новое значение сигнала будет доступно в следующем дельта-цикле. Новый дельта-цикл начинается, когда симулятор приостановил все процессы, которые были запланированы для текущего дельта-цикла. И процесс приостанавливается в заявлении wait
. В конце процесса у вас есть неявный оператор wait on S;
, потому что вы описали процесс со списком чувствительности, содержащим S
. Вы назначили порты inout
a
и b
, которые ведут себя так же, как и сигнал.
Поскольку обновление сигнала отображается только до следующего цикла дельта, все ваши операторы отчетов распечатывают одинаковое значение для a
и b
соответственно. То есть, они печатают значения a
и b
, когда процесс был запущен/возобновлен.
Назначение сигнала отличается от назначения переменной, например. var
в вашем коде, который немедленно обновляется.
Ваш процесс выполняется только один раз, потому что сигнал S
не изменяется. Каждый процесс выполняется один раз после запуска моделирования, а затем приостанавливается в операторе wait
(неявный в коде, как описано выше).
Вы сказали, что a
и b
имеют начальное значение 10 и 20 соответственно, но я не смог воспроизвести это с помощью ModelSim или GHDL. Я попытался с помощью следующей тестбенча, которую я считаю единственно возможным способом:
library ieee;
use ieee.std_logic_1164.all;
entity vhdl_swap_tb is
end entity vhdl_swap_tb;
architecture sim of vhdl_swap_tb is
-- component ports
signal a : integer := 10;
signal b : integer := 20;
begin -- architecture sim
-- component instantiation
DUT: entity work.vhdl_swap
port map (
a => a,
b => b);
end architecture sim;
Я должен был использовать начальные значения для a
и b
здесь, так как порты режима inout
и неразрешенного типа. Таким образом, я не могу добавить второй драйвер, назначив a
и b
в другом тестовом банке.
Так, обновление сигнала с задержкой (по крайней мере) до следующего цикла дельты, вам не нужно дополнительные переменного. Вот очень короткий пример кода демонстрирует замену двух сигналов:
library ieee;
use ieee.std_logic_1164.all;
entity swap is
end entity swap;
architecture sim of swap is
signal a : integer := 10;
signal b : integer := 20;
signal clock : std_logic := '1';
begin
-- clock generation
clock <= not clock after 10 ns;
-- swapping
process(clock)
begin
if rising_edge(clock) then
a <= b;
b <= a;
end if;
end process;
end sim;
подкачка делается на каждом нарастающем фронте тактового сигнала, как можно видеть в следующей форме волны:
Спасибо u для ур подробный ans..ur код в процентах работает. У меня есть некоторые вопросы. 1) все порты являются сигналами по умолчанию, поэтому почему модификации ur не работали в моем коде при изменении.2) Я хочу поменять значения, данные пользователями во время симуляции, когда я сделал это в программе ур, это не замена, почему так? – george
@george Вам нужны разные порты для входов и выходов. Вы не можете переключаться с помощью 'inout'. (Мой код на самом деле демонстрирует обмен значениями регистров.) –
поэтому, когда мы можем использовать inout и buffer? – george