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

Описание глобального резета

Ребят, подскажите по поводу грамотного описания асинхронного резета для ПЛИС.

Интересует случай, когда не требуется сбрасывать ВСЕ регистры

 

Во всех примерах вижу стандартную конструкцию:

    process (clk,rst) begin
        if (rst = '1') then
            s1 <= '0';
        elsif rising_edge(clk) then
            s1 <= x1;
            s2 <= x2;
        end if;
    end process;

 

А недавно услышала, что правильней использовать конструкцию вида:

process (clk, rst) begin
  if rising_edge(clk) then
    s1 <= x1;
    s2 <= x2;
  end if;
  if (rst = '1') then
    s1 <= '0';
  end if;
end process;

В этом случае создается меньше связей. Насколько это оправданно?

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


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

Чтоб не было сомнений, можно так:

process (clk, rst) begin
    if (rst = '1') then
        s1 <= '0';
    elsif rising_edge(clk) then
        s1 <= x1;
    end if;
end process;

process (clk) begin
    if rising_edge(clk) then
        s2 <= x2;
    end if;
end process;

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


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

Во всех примерах вижу стандартную конструкцию:

    process (clk,rst) begin
        if (rst = '1') then
            s1 <= '0';
        elsif rising_edge(clk) then
            s1 <= x1;
            s2 <= x2;
        end if;
    end process;

А недавно услышала, что правильней использовать конструкцию вида:

...

В этом случае создается меньше связей. Насколько это оправданно?

Дело тут уже не в связях. Процитированный фрагмент кода -- не стандартная конструкция. Возможно, не оттуда скопировали, либо сами доработали неверно. Здесь получается следующее: для регистра s1 всё ОК -- триггер с асинхронным сбросом. Но с s2 проблема — при поднятом сигнале сброса для s1, ветка rising_edge не выполнится из-за конструкции elsif. Т.е, сигнал сброса для s1 также является и сигналом запрещения записи в s2.

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

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

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


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

Ребят, подскажите по поводу грамотного описания асинхронного резета для ПЛИС.

Интересует случай, когда не требуется сбрасывать ВСЕ регистры

 

 

В этом случае создается меньше связей. Насколько это оправданно?

Есть "асинхронный" сброс, а есть "синхронный" сброс.

Асинхронный работает всегда, но в его применении есть некоторые особенности.

Синхронный - не работает, когда пропадает клок, например при срыве синхрочастоты.

И действительно, если сброс для каких-то регистров не нужен, то его и задействовать не надо...

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

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


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

Дело тут уже не в связях. Процитированный фрагмент кода -- не стандартная конструкция. Возможно, не оттуда скопировали, либо сами доработали неверно.
Так пишут те, кому лень разбить на два процесса. Я пишу явно: процессы со сбросом и процессы без сброса.

Ещё тут зависит от синтезатора. Если подходить строго, то на x2 надо заводить инвертированный сброс на CE. И некоторые синтезаторы так и делают. Это, разумеется, влияет на времянку. Другие синтезаторы, шибко умные, на x2 сброс не заводят. Смотрите, что получается в вашем случае.

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


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

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

Ещё тут зависит от синтезатора. Если подходить строго, то на x2 надо заводить инвертированный сброс на CE. И некоторые синтезаторы так и делают. Это, разумеется, влияет на времянку. Другие синтезаторы, шибко умные, на x2 сброс не заводят. Смотрите, что получается в вашем случае.

Да, мой квартус в этом случае так и поступает - заводит сигнал сброса в на вход CE (со всеми вытекающими в виде времянки).

 

По поводу двух процессов - тут дело даже не в лени (хотя куда уж без нее?), а в общей читаемости и краткости кода.

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


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

Ребят, подскажите по поводу грамотного описания асинхронного резета для ПЛИС.

Некоторые замечания по теме.

В английском есть Set - "установить" и ReSet - "действие обратное к Установить"... Почему Вы пишите "реЗет"?

Ну и еще. Тут, на форуме "пасутся" такие "ребята", которым от 20 до 70 лет... Ну это так, для справки... Потому как меня так уже давно никто не называл.. :)

 

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

Кстати, заодно там же есть глава о написании файлов, об их оформлении и пр..

Удачи!

 

 

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


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

Спасибо всем ответившим. Извиняюсь, если кого-то оскорбила обращением "ребята".

 

Вообщем-то итого темы таков.

Некорректная конструкция (реСет для сигнала s2 может быть подключен к CE триггера):

process (clk,rst) begin
        if (rst = '1') then
            s1 <= '0';
        elsif rising_edge(clk) then
            s1 <= x1;
            s2 <= x2;
        end if;
    end process;

 

Корректная конструкция в 2-х процессах:

process (clk, rst) begin
    if (rst = '1') then
        s1 <= '0';
    elsif rising_edge(clk) then
        s1 <= x1;
    end if;
end process;

process (clk) begin
    if rising_edge(clk) then
        s2 <= x2;
    end if;
end process;

 

Корректная конструкция в 1-м процессе:

process (clk, rst) begin
  if rising_edge(clk) then
    s1 <= x1;
    s2 <= x2;
  end if;
  if (rst = '1') then
    s1 <= '0';
  end if;
end process;

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


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

Спасибо всем ответившим. Извиняюсь, если кого-то оскорбила обращением "ребята".

 

Вообщем-то итого темы таков.

 

 

Корректная конструкция в 1-м процессе:

process (clk, rst) begin
  if rising_edge(clk) then
    s1 <= x1;
    s2 <= x2;
  end if;
  if (rst = '1') then
    s1 <= '0';
  end if;
end process;

 

Вот только теперь найдите пример кода, который называется "приоритетный шифратор" и посмотрите как там дела с приоритетами. И если приоритеты описаны "сверху вниз", то это значит, что и в Вашей "Корректная конструкция в 1-м процессе" сигнал сброса не будет иметь приоритета над клоком. А это НЕ ВЕРНО...

Потому как "сброс" - всегда самый главный!

 

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


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

И если приоритеты описаны "сверху вниз", то это значит, что и в Вашей "Корректная конструкция в 1-м процессе" сигнал сброса не будет иметь приоритета над клоком. А это НЕ ВЕРНО...
Формально с точки зрения языка при таком описании сброс будет иметь приоритет надо клоком.

Но опять-таки надо смотреть на то, что сделает синтезатор.

 

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

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


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

если приоритеты описаны "сверху вниз", то это значит, что сигнал сброса не будет иметь приоритета над клоком. А это НЕ ВЕРНО...

Нет, всё верно. Если и клок придёт, и ресет будет в активном состоянии, то в s1, по спецификации vhdl, останется последнее присвоенное значение. Возможно, вы перепутали с конструкцией if..elsif..end_if, там -- да, приоритет у первой ветки.

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


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

имхо.

 

пока не поймёте, когда и зачем нужно использовать асинхронный сброс - не используйте его. Вместо этого используйте только синхронный.

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


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

Нет, всё верно. Если и клок придёт, и ресет будет в активном состоянии, то в s1, по спецификации vhdl, останется последнее присвоенное значение. Возможно, вы перепутали с конструкцией if..elsif..end_if, там -- да, приоритет у первой ветки.

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

 

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


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

Но нормальный компилятор тогда должен сказать что у сигнала есть два драйвера и начать на это ругаться...

Для vhdl вообще штатная ситуация, если внутри одного процесса.

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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