anya_g 0 1 февраля, 2016 Опубликовано 1 февраля, 2016 · Жалоба Ребят, подскажите по поводу грамотного описания асинхронного резета для ПЛИС. Интересует случай, когда не требуется сбрасывать ВСЕ регистры Во всех примерах вижу стандартную конструкцию: 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; В этом случае создается меньше связей. Насколько это оправданно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 1 февраля, 2016 Опубликовано 1 февраля, 2016 · Жалоба Чтоб не было сомнений, можно так: 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
FakeDevice 0 1 февраля, 2016 Опубликовано 1 февраля, 2016 (изменено) · Жалоба Во всех примерах вижу стандартную конструкцию: 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. Второй вариант технически правильный, но не вижу смысла в один процесс заворачивать два триггера с отличающимися схемами управления -- нечитабельно. Изменено 1 февраля, 2016 пользователем FakeDevice Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 1 февраля, 2016 Опубликовано 1 февраля, 2016 · Жалоба Ребят, подскажите по поводу грамотного описания асинхронного резета для ПЛИС. Интересует случай, когда не требуется сбрасывать ВСЕ регистры В этом случае создается меньше связей. Насколько это оправданно? Есть "асинхронный" сброс, а есть "синхронный" сброс. Асинхронный работает всегда, но в его применении есть некоторые особенности. Синхронный - не работает, когда пропадает клок, например при срыве синхрочастоты. И действительно, если сброс для каких-то регистров не нужен, то его и задействовать не надо... И еще. Если использовать глобальный сброс, то он должен приходить в каждую логическую ячейку. Вы это сможете увидеть в даташите, на схеме ячейки... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 17 2 февраля, 2016 Опубликовано 2 февраля, 2016 · Жалоба Дело тут уже не в связях. Процитированный фрагмент кода -- не стандартная конструкция. Возможно, не оттуда скопировали, либо сами доработали неверно.Так пишут те, кому лень разбить на два процесса. Я пишу явно: процессы со сбросом и процессы без сброса. Ещё тут зависит от синтезатора. Если подходить строго, то на x2 надо заводить инвертированный сброс на CE. И некоторые синтезаторы так и делают. Это, разумеется, влияет на времянку. Другие синтезаторы, шибко умные, на x2 сброс не заводят. Смотрите, что получается в вашем случае. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
anya_g 0 2 февраля, 2016 Опубликовано 2 февраля, 2016 · Жалоба Так пишут те, кому лень разбить на два процесса. Я пишу явно: процессы со сбросом и процессы без сброса. Ещё тут зависит от синтезатора. Если подходить строго, то на x2 надо заводить инвертированный сброс на CE. И некоторые синтезаторы так и делают. Это, разумеется, влияет на времянку. Другие синтезаторы, шибко умные, на x2 сброс не заводят. Смотрите, что получается в вашем случае. Да, мой квартус в этом случае так и поступает - заводит сигнал сброса в на вход CE (со всеми вытекающими в виде времянки). По поводу двух процессов - тут дело даже не в лени (хотя куда уж без нее?), а в общей читаемости и краткости кода. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 2 февраля, 2016 Опубликовано 2 февраля, 2016 · Жалоба Ребят, подскажите по поводу грамотного описания асинхронного резета для ПЛИС. Некоторые замечания по теме. В английском есть Set - "установить" и ReSet - "действие обратное к Установить"... Почему Вы пишите "реЗет"? Ну и еще. Тут, на форуме "пасутся" такие "ребята", которым от 20 до 70 лет... Ну это так, для справки... Потому как меня так уже давно никто не называл.. :) По поводу сбросов, смотрите у меня на сайте "Краткий Курс", глава о сбросах... И учтите, что асинхронный сброс может вызвать метастабильность... Кстати, заодно там же есть глава о написании файлов, об их оформлении и пр.. Удачи! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 2 февраля, 2016 Опубликовано 2 февраля, 2016 · Жалоба anya_g почитайте Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
anya_g 0 2 февраля, 2016 Опубликовано 2 февраля, 2016 · Жалоба Спасибо всем ответившим. Извиняюсь, если кого-то оскорбила обращением "ребята". Вообщем-то итого темы таков. Некорректная конструкция (реСет для сигнала 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 2 февраля, 2016 Опубликовано 2 февраля, 2016 · Жалоба Спасибо всем ответившим. Извиняюсь, если кого-то оскорбила обращением "ребята". Вообщем-то итого темы таков. Корректная конструкция в 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-м процессе" сигнал сброса не будет иметь приоритета над клоком. А это НЕ ВЕРНО... Потому как "сброс" - всегда самый главный! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 17 2 февраля, 2016 Опубликовано 2 февраля, 2016 · Жалоба И если приоритеты описаны "сверху вниз", то это значит, что и в Вашей "Корректная конструкция в 1-м процессе" сигнал сброса не будет иметь приоритета над клоком. А это НЕ ВЕРНО...Формально с точки зрения языка при таком описании сброс будет иметь приоритет надо клоком. Но опять-таки надо смотреть на то, что сделает синтезатор. Так что лучше всего не смешивать в одном процессе триггеры со сбросом и без. Тогда ни у кого никаких вопросов не возникнет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
FakeDevice 0 2 февраля, 2016 Опубликовано 2 февраля, 2016 · Жалоба если приоритеты описаны "сверху вниз", то это значит, что сигнал сброса не будет иметь приоритета над клоком. А это НЕ ВЕРНО... Нет, всё верно. Если и клок придёт, и ресет будет в активном состоянии, то в s1, по спецификации vhdl, останется последнее присвоенное значение. Возможно, вы перепутали с конструкцией if..elsif..end_if, там -- да, приоритет у первой ветки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
krux 8 2 февраля, 2016 Опубликовано 2 февраля, 2016 · Жалоба имхо. пока не поймёте, когда и зачем нужно использовать асинхронный сброс - не используйте его. Вместо этого используйте только синхронный. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 2 февраля, 2016 Опубликовано 2 февраля, 2016 · Жалоба Нет, всё верно. Если и клок придёт, и ресет будет в активном состоянии, то в s1, по спецификации vhdl, останется последнее присвоенное значение. Возможно, вы перепутали с конструкцией if..elsif..end_if, там -- да, приоритет у первой ветки. Перепутал, скорее всего поторопился, это да. Но нормальный компилятор тогда должен сказать что у сигнала есть два драйвера и начать на это ругаться... И это плохо... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
FakeDevice 0 2 февраля, 2016 Опубликовано 2 февраля, 2016 · Жалоба Но нормальный компилятор тогда должен сказать что у сигнала есть два драйвера и начать на это ругаться... Для vhdl вообще штатная ситуация, если внутри одного процесса. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться