Подтвердить что ты не робот

Когда должен быть вставлен сигнал в список чувствительности процесса

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

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

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

4b9b3361

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


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