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

И снова про Reset

Прошу прощения за тему, обсуждаемую бесчисленное количество раз, но всё-же ответов я на форуме не нашел.

Поскольку я работаю с Altera, то и ПО использую Quartus. Работаю с включенным Design assistant (Settings -> Design assistant). Эта опция помогает отслеживать различные нарушения проекта, такие как: неправильное пересечение данных между клоковыми доменами, неправильно заведённые сигналы сброса, и прочие ошибки. Так вот появилось некоторое непонимание работы схемы:

Допустим у меня есть сигнал глобального сброса. Он сам является асинхронным(подаю я его с кнопки). Далее он синхронизируется для каждого клокового домена, так-же как и в примере Xilinx: http://www.eetimes.com/document.asp?doc_id=1278998 И далее я его использую как синхронный сброс схемы. Вопросов здесь у меня почти не возникает. Ну кроме одного маленького: пример был дан специалистами Xilinx. А вот на сайте Altera несколько другой пример: они рекомендуют применять классику из двух D-триггеров. Допустимо ли применять примеры данные специалистами xilinx к ПЛИС Altera ?

Но вернёмся к основному вопросу: допустим меня есть модули, которые в процессе работы схемы надо сбрасывать. Например произошло какое-то событие, и сигналом одного из модулей я сбрасываю другой.

 

Выглядит это как-то так:

 

COMPONENT1 : ENTITY WORK.MODUL1
    PORT MAP
    (
        ....
        ....
        ....
        CLK          =>  CLK_50MHz,
        SYNC_RESET   =>  GLOBAL_RES,
        RESET_MODUL2 =>  RESET_MODUL2_SIG
    );
    
    COMPONENT2 : ENTITY WORK.MODUL2
    PORT MAP
    (
        ....
        ....
        ....
        CLK          =>  CLK_50MHz,
        SYNC_RESET   =>  GLOBAL_RES OR RESET_MODUL2_SIG,
    );

 

То есть я цепи сброса модуля MODUL2 объединяю через комбинаторную логику. Но вот тут мне Quartus говорит что:

Critical Warning: (High) Rule R101: Combinational logic used as a reset signal should be synchronized. Found 2 node(s) related to this rule.
    Critical Warning (308012): Node  "comb~0"
    Critical Warning (308012): Node  "MATRIX_TX:MATRIX_TX_COMP|DATA_ENABLE:DATAENABLE|VCNT[5]~22"

 

reset.png

Раз Quartus говорит что надо, значит надо. Пересинхронизировал сигнал при помощи двух D-Триггеров и получил нестабильную работу проекта, хотя когда сигнал был не пересинхронизирован проблем не было...

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

 

 

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


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

пример был дан специалистами Xilinx. А вот на сайте Altera несколько другой пример: они рекомендуют применять классику из двух D-триггеров. Допустимо ли применять примеры данные специалистами xilinx к ПЛИС Altera ?

Я не вижу разницы (кроме уровня)

post-87968-1480405026_thumb.jpg

post-87968-1480404974_thumb.jpg

(из an545.pdf)

 

Оформите это как отдельный модуль

и используйте в каждом модуле где требуется пересинхронизация сброса

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


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

Я не вижу разницы (кроме уровня)

post-87968-1480405026_thumb.jpg

post-87968-1480404974_thumb.jpg

(из an545.pdf)

 

Оформите это как отдельный модуль

и используйте в каждом модуле где требуется пересинхронизация сброса

Уже давно в виде отдельного модуля для удобства сделано... И допустимо ли такой сброс применять далее как синхронный ?

Изменено пользователем Flip-fl0p

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


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

допустимо ли такой сброс применять далее как синхронный ?

Да, в пределах клокового домена, как любой другой синхронизированный сигнал

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


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

Да, в пределах клокового домена, как любой другой синхронизированный сигнал

А можно ли сигнал сброса заводить через комбинаторную логику. Собственно основной вопрос в посте...

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


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

... допустимо ли такой сброс применять далее как синхронный ?

Обратите внимание - этот сброс на рисунках Асинхронный! Он обязан синхронизироваться в целевой клоковый домен, но затем используется на Асинхронных входах триггеров. Конечно, его можно использовать и как синхронный сброс, но это бесполезная трата ресурсов ПЛИС.

 

А можно ли сигнал сброса заводить через комбинаторную логику. Собственно основной вопрос в посте...

Можно, но в таком случае Вы теряете в ресурсах ПЛИС, поскольку число трасс для глобальных и региональных сбросов ограничено. Причем, Вы можете сначала синхронизировать сброс, а потом завести в логику, а можете наоборот - сначала смешать с логикой, а затем синхронизировать.

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


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

Обратите внимание - этот сброс на рисунках Асинхронный! Он обязан синхронизироваться в целевой клоковый домен, но затем используется на Асинхронных входах триггеров. Конечно, его можно использовать и как синхронный сброс, но это бесполезная трата ресурсов ПЛИС.

 

 

Можно, но в таком случае Вы теряете в ресурсах ПЛИС, поскольку число трасс для глобальных и региональных сбросов ограничено. Причем, Вы можете сначала синхронизировать сброс, а потом завести в логику, а можете наоборот - сначала смешать с логикой, а затем синхронизировать.

Меня просто очень смущает то, что Quartuss design assistan ругается:

Critical Warning: (High) Rule R101: Combinational logic used as a reset signal should be synchronized. Found 2 node(s) related to this rule.
    Critical Warning (308012): Node  "comb~0"
    Critical Warning (308012): Node  "MATRIX_TX:MATRIX_TX_COMP|DATA_ENABLE:DATAENABLE|VCNT[5]~22"

Хотя все сигналы сброса которые приходят на комбинаторную логику ( двух входовой ИЛИ) находятся в одном клоковом домене с модулем, который я сбрасываю. Такое ощущение, что я всё делаю правильно, и на этот раз ошибается всё-таки Quartus, поскольку дополнительная синхронизация выхода этого элемента ИЛИ только ломает проект... Хотя может проблема в том, что я ещё констрейны не описывал для проекта. Понадеялся на то, что частоты проекта достаточно низкие....

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


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

Меня просто очень смущает то, что Quartuss design assistan ругается:

Critical Warning: (High) Rule R101: Combinational logic used as a reset signal should be synchronized. Found 2 node(s) related to this rule.

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

 

Я бы все же посоветовал выход логики использовать как синхронный сброс (или просто ввести в код формирования данных на входе триггеров), а цепь асинхронного сброса не трогать. Комбинационная логика в цепи сброса - моветон, хоть и не запрещена.

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


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

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

 

Я бы все же посоветовал выход логики использовать как синхронный сброс (или просто ввести в код формирования данных на входе триггеров), а цепь асинхронного сброса не трогать. Комбинационная логика в цепи сброса - моветон, хоть и не запрещена.

В том то и дело, что в проекте у меня нет асинхронных сбросов триггеров. Все сбросы в проекте синхронные...

 

UPD

Хотя нет. Есть асинхронные сбросы в проекте. Покопавшись в "потрохах" мегафункции Altera FIFO, я обнаружил триггеры, которые сбрасываются асинхронно. При чём часть триггеров сбрасывается асинхронно частоте записи, а часть триггеров асинхронно частоте чтения. Но очень похоже на то, что там есть механизм защиты от метастабильности...

Изменено пользователем Flip-fl0p

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


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

В том то и дело, что в проекте у меня нет асинхронных сбросов триггеров. Все сбросы в проекте синхронные...

В этом случае Вы нерационально используете ресурсы ПЛИС, поскольку обычно все триггеры имеют асинхронный сброс, который заведен на глобальные трассы.

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

 

Классическое описание регистра на верилоге, это

always @(posedge clock or negedge async_reset)
if (~async_reset) Q <= 1'b0;
else Q <= (sync_comb_set | ~sync_comb_reset & Q);
либо
else Q <= ~sync_comb_reset & (sync_comb_set | Q);

Это самый кандовый и потому работающий рецепт для правильного описания синтезируемых D-триггеров на верилоге. Здесь присутствует асинхронный глобальный сброс (сам сигнал сброса должен быть синхронным этому клоковому домену), комбинационная формула установки триггера, и комбинационная формула сброса триггера. Т.е. все разложено по полочкам, надо лишь подставить нужную логику в нужное место формулы триггера. Если появляются дополнительные условия для сброса триггера - они просто замешиваются в формулу sync_comb_reset.

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


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

В этом случае Вы нерационально используете ресурсы ПЛИС, поскольку обычно все триггеры имеют асинхронный сброс, который заведен на глобальные трассы.

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

Хочу добавить - синхронный сброс по И вместе с данными будет поступать на вход D-триггера и, если, таких сбросов много или fan-out небольшой или временные ограничения не заданы, то fitter пихнет этот сигнал на обычную шину и проявится это, скорее всего, в задержках с очень большим разбросом, что может привести к неправильной работе счетчиков и автоматов.

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


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

module Reset_m (
  input    bit        res_ext,    //!< External reset (knob, port)
  input    bit        no_lock,    //!< PLL no locked reset
  input    bit        res_cmd,    //!< MCU command reset
  input    bit        clks,        //!< Slow Clock
output    bit        res_int        //!< Internal wide device reset
);
  bit            rest;        //!< Reset start
  assign rest = res_ext || no_lock || res_cmd;
  
  bit        [1:0]    ress;        //!< Reset sequence
  always_ff @(posedge rest, posedge clks) begin
    if (rest) ress <= '1;
    else ress <= {ress[0], 1'b0};
  end
  assign res_int = ress[1];

endmodule : Reset_m

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


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

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

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

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

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

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

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

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

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

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