Когда должен быть вставлен сигнал в список чувствительности процесса
Я смущен, когда сигнал, объявленный в архитектуре, должен быть вставлен в список чувствительности процесса.
Существует ли общий закон, который может соблюдаться в любой ситуации?
У меня возникают реальные трудности с пониманием, когда я должен включить сигнал в список чувствительности процесса.
Ответы
Ответ 1
"Общий закон" состоит в том, что
все, что ваш процесс должен знать об изменениях потребностей в списке чувствительности.
Для типичного синтезируемого регистра с синхронным reset:
process (clk) is
begin
if rising_edge(clk) then
if reset = '1' then
-- do reset things
else
-- read some signals, assign some outputs
end if;
end if;
end process;
В списке должны присутствовать только часы, так как все остальное просматривается только при изменении часов (из-за инструкции if rising_edge(clk)
.
Если вам нужен асинхронный reset:
process (clk, reset) is
begin
if reset = '1' then
-- do reset things
elsif rising_edge(clk) then
-- read some signals, assign some outputs
end if;
end process;
тогда сигнал reset
также должен быть в списке чувствительности, так как ваш дизайн должен проверять его значение каждый раз, когда он изменяется, независимо от того, что делают часы.
Для комбинаторной логики я полностью избегаю использования процессов из-за проблем, связанных с обновлением списка чувствительности, и потенциал для моделирования затем ведет себя по-разному с синтезированным кодом. Это облегчилось с помощью ключевого слова all
в VHDL-2008, но я все еще не обнаружил, что хочу написать длинную сложную комбинаторную логику, чтобы помочь этот процесс.
Ответ 2
Если сигнал находится в списке чувствительности процесса, процесс будет "просыпаться" и оцениваться всякий раз, когда изменяется значение этого сигнала. Если он не находится в списке чувствительности, сигнал может измениться, но процесс не будет переоцениваться, чтобы определить, какие новые выходы должны быть.
Для комбинаторной логики: Вероятно, вы хотите, чтобы все ваши входные сигналы были включены в список чувствительности. Если они не включены в список чувствительности, то это приведет к тому, что ваш выход не изменится, даже когда этот входной сигнал изменится. Это обычная ошибка (из-за небрежности). Обратите внимание, что в VHDL 2008 вы можете использовать ключевое слово "все", чтобы автоматически включать все необходимые сигналы в ваш процесс и не создавать защелки.
Для синхронной логики: Вероятно, вам нужен только ваш сигнал часов (и, возможно, ваш reset) в списке чувствительности. Это связано с тем, что вы беспокоитесь только о стоимости ваших сигналов (кроме часов), когда ваши системные часы изменились. Это связано с тем, что вы обычно описываете регистры (состоящие из флип-флопов), которые позволяют изменять их выходное значение на фронте тактового сигнала.
Все это может сбивать с толку в случае использования HDL для синтеза, потому что в FPGA фактически может быть реализовано только подмножество схем, которые вы описываете в VHDL. Например, вы не можете иметь примитивный элемент памяти, который чувствителен к двум независимым краям тактовой частоты, даже если вы могли бы описать такую схему, включив в список чувствительности два часа.
Ответ 3
Кроме того, инструменты синтеза (в данном случае речь идет о Xilinx XST) не обязательно всегда учитывают список чувствительности процесса. Если вы не можете перечислить все процессы, значения которых оцениваются в теле процесса, XST выдает предупреждение, согласно которому предполагается, что сигналы, значения которых оцениваются, находятся в списке чувствительности. Это может привести к различиям между поведенческими симуляторами и фактическим оборудованием. Имейте это в виду.
Ответ 4
... также следует предупредить, что список чувствительности не влияет на поведение вашего дизайна после его синтеза. Он используется только во время моделирования. Поэтому довольно легко ввести разницу в поведении между RTL и синтезированным кодом с помощью изменений в списке чувствительности.
Правила, которые дает Джош, хороши, но, прежде всего, читайте предупреждения, которые ваши инструменты дают вам и действуют на них. Обычно они проверяют правильность списка чувствительности и будут отмечать любые проблемы. Режим Emacs VHDL также имеет команду для обновления списка чувствительности, и обычно это нормально.
Хмммм, ниндзя