Перейти к содержанию
    

Про Quartus и списки чувствительности процессов в VHDL

Многие утверждают, что, мол, на списки чувствительности процесса в VHDLсинтезатор не смотрит. Был немало удивлен, когда своими глазами увидел, что Квартусовский синтезатор (как минимум, 5.1sp2) на списки чувствительности смотрит не так, как смотрю я. Взгляните на такойпроцесс:

process(r, c)
begin
        if (r = '1') then
           o0 <= '0';
        elsif (rising_edge(c)) then
               o0 <= i0;
               o1 <= i1;
        end if;
end process;

Я по наивности рассчитывал на то, что для o1 будет синтезирован D-триггер, которому на вход D приходит i0, а на вход C -- тактовый сигнал. И все. Ан не тут-то было. Квартус еще на вход ENA заводит проинвертированный сигнал сброса r. В общем-то не смертельно, но неаккуратненько как-то... Мне эта лишняя веревка сршенно не нужна. В итоге сделал два процесса: один с асинхронным сбросом для o0, второй -- чисто синхронный без сброса для o1.

 

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

 

Как там в Verilog, не знаю. Другие синтезаторы не пробовал.

Изменено пользователем andrew_b

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

забавно )) а может дело в том,что все в одном if'е запихано? мол если клок общий,то и ресет?

а если два if в одном процессе?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Многие утверждают, что, мол, на списки чувствительности процесса в VHDLсинтезатор не смотрит. Был немало удивлен, когда своими глазами увидел, что Квартусовский синтезатор (как минимум, 5.1sp2) на списки чувствительности смотрит не так, как смотрю я. Взгляните на такойпроцесс:

process(r, c)
begin
        if (r = '1') then
           o0 <= '0';
        elsif (rising_edge(c)) then
               o0 <= i0;
               o1 <= i1;
        end if;
end process;

Я по наивности рассчитывал на то, что для o1 будет синтезирован D-триггер, которому на вход D приходит i0, а на вход C -- тактовый сигнал. И все. Ан не тут-то было. Квартус еще на вход ENA заводит проинвертированный сигнал сброса r. В общем-то не смертельно, но неаккуратненько как-то... Мне эта лишняя веревка сршенно не нужна. В итоге сделал два процесса: один с асинхронным сбросом для o0, второй -- чисто синхронный без сброса для o1.

 

В данном случае синтезатор абсолютно прав. Он синтезировал то, что Вы описали. Причина кстати не в списке чувствительности процесса, а в том, что присвоение сигнала "o1" производиться не во всех ветвях условия. Получается, что при высоком "r", вне зависимости от фронта "c", требуется сохранить прежнее значение "о1". Синтезатор честно создает схему для выполнения этой функции. Большинство синтезаторов сообщает о такого рода ситуации предупреждением.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В общем-то не смертельно, но неаккуратненько как-то... Мне эта лишняя веревка сршенно не нужна.

 

 

Просинтезировалось так, как и описывалось. ( Не описано поведение o1 при r='1' )

 

 

 

P.S. Очень долго отвечал. oval опередил.

Изменено пользователем Jools

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как то было такое:

 

 

signal ctrl_reg : std_logic_vector(7 downto 0);

 

xxx:process(nrst,clk)

begin

if(nrst='0') then

ctrl_reg <= (others => '0');

elsif(clk='1' and clk'event) then

ctrl_reg(ctrl_reg'high downto 1) <= ctrl_in;

end if;

end process;

 

Так вот sinplify привязывал ctrl_reg(0) к нулю и все. А вот Synopsys создавал для этого бита latch(что кстати в принципе правильно) и сильно на это ругался.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...