Когда сигнал должен быть вставлен в список чувствительности процесса - PullRequest
22 голосов
/ 24 января 2012

Меня смущает, когда объявленный в архитектуре сигнал должен быть вставлен в список чувствительности процесса.

Существует ли общий закон, которым можно следовать в любой ситуации?

Мне трудно понять, когда мне нужно включить сигнал в список чувствительности процесса.

Ответы [ 4 ]

23 голосов
/ 25 января 2012

«Общий закон» состоит в том, что

все, что ваш процесс должен знать об изменениях , должно быть в списке чувствительности.


Для типичного синтезируемого регистра с синхронным сбросом:

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).


Если вам нужен асинхронный сброс:

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, но я все еще не хотел писать длинную сложную комбинаторную логику так, чтобы процесс помог.

14 голосов
/ 24 января 2012

Если сигнал находится в списке чувствительности процесса, процесс «проснется» и будет оцениваться при изменении значения этого сигнала. Если его нет в списке чувствительности, сигнал может измениться, но процесс не будет переоцениваться для определения того, какими должны быть новые выходы.

Для комбинаторной логики: Вероятно, вы хотите, чтобы все ваши входные сигналы были включены в список чувствительности. Если они не включены в список чувствительности, это приведет к тому, что ваш выходной сигнал не изменится даже при изменении этого входного сигнала. Это распространенная ошибка (из-за небрежности). Обратите внимание, что в VHDL 2008 вы можете использовать ключевое слово «all», чтобы автоматически включать все необходимые сигналы в ваш процесс и избегать создания защелок.

Для синхронной логики: Вероятно, вам нужен только ваш сигнал часов (и, возможно, ваш сброс) в списке чувствительности. Это потому, что вас интересует только значение ваших сигналов (кроме часов), когда ваши системные часы изменились. Это потому, что вы обычно описываете регистры (составленные из триггеров), которые позволяют изменять только их выходные значения по фронту тактовой частоты.

Все это может сбивать с толку в случае использования HDL для синтеза, потому что только подмножество схем, которые вы описываете в VHDL, может быть фактически реализовано в FPGA. Например, у вас не может быть примитивного элемента памяти, чувствительного к двум независимым фронту тактового сигнала, даже если вы могли бы описать такую ​​схему, включив два тактовых сигнала в список чувствительности.

1 голос
/ 24 января 2012

Кроме того, инструменты синтеза (в данном случае речь идет о Xilinx XST) не всегда соответствуют списку чувствительности процесса. Если вам не удастся перечислить все процессы, значения которых оцениваются в теле процесса, XST выдаст предупреждение о том, что предполагается, что сигналы, значения которых оцениваются, находятся в списке чувствительности. Это может привести к различиям между поведенческим моделированием и фактическим оборудованием. Имейте это в виду.

0 голосов
/ 24 января 2012

... также, будьте осторожны, список чувствительности не будет влиять на поведение вашего проекта после его синтеза. Используется только во время симуляции. Следовательно, довольно просто ввести разницу в поведении между RTL и синтезированным кодом путем изменения списка чувствительности.

Правила, которые дает Джош, хороши, но, прежде всего, прочитайте предупреждения, которые дают вам ваши инструменты, и действуйте в соответствии с ними. Обычно они проверяют правильность списка чувствительности и отмечают любые проблемы В режиме Emacs VHDL также есть команда для обновления списка чувствительности, и обычно она довольно хороша.


Хмммм, ниндзя

...