|
Synchronized reset и разные тактовые, Каскад для внешнего сброса + разные тактовые |
|
|
|
Jan 12 2015, 07:38
|
Участник

Группа: Участник
Сообщений: 60
Регистрация: 5-12-11
Из: Киев
Пользователь №: 68 692

|
Есть каскад из двух регистров для внешнего сброса (обычная схема, как в справке квартуса здесь). Этот каскад тактируется clk1 и (соответственно со схемой) сбрасывать им можно регистры, которые тактируеются также clk1. Как правильно сбрасывать регистры, которые используют clk2, clk3 и т.д.? Для каждого clkX делать отдельный каскад?
|
|
|
|
|
 |
Ответов
|
Jan 12 2015, 08:39
|
Участник

Группа: Участник
Сообщений: 60
Регистрация: 5-12-11
Из: Киев
Пользователь №: 68 692

|
Цитата(des00 @ Jan 12 2015, 10:49)  да, при этом, если логика на разных тактовых связанная, желателен быть перенос сигнала сброса с каскада на каскад. В порядке возрастания частоты Спасибо. Вот так?
Получается, снятие сброса не будет "одновременным" для разных тактовых? Будет нарастающая задержка, которую надо компенсировать? Цитата на частотах повыше от 3 регистров. Это обязательно? Хотелось бы единообразия.
|
|
|
|
|
Jan 12 2015, 08:58
|
Вечный ламер
     
Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453

|
Цитата(vea @ Jan 12 2015, 15:39)  Получается, снятие сброса не будет "одновременным" для разных тактовых? Будет нарастающая задержка, которую надо компенсировать? В сбросе опасен не момент сброса, а момент его снятия. Сброс всех доменов должен идти одновременно, а вот снятие по цепочке. И не надо там ничего компенсировать. Цепочка на рисунке у вас сделана правильно. Цитата Это обязательно? Хотелось бы единообразия. я обычно ставлю 4 ре регистра. в приложении неплохая статья. изучайте.
--------------------
|
|
|
|
|
Jan 12 2015, 15:27
|
Гуру
     
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881

|
Цитата(des00 @ Jan 12 2015, 11:58)  В сбросе опасен не момент сброса, а момент его снятия. Сброс всех доменов должен идти одновременно, а вот снятие по цепочке. Только цепочка должна быть не тупо с повышением тактовой, а такой, как распространяется сигнал сброса, не привязываясь к частотам, то есть, оттуда, где он генерируется (например в домене "А"), он идет в домены "Б", и "В", а потом, обратно из доменов "Б" и "В", сигнал, говорящий домену "А", что все сбросилось, и можно начинать работать, то есть, снимать сигнал сброса с себя. Вот как-то примерно так. Направление, по большому счету, зависит от того, кто инициирует операцию, и кто на нее откликается - инициатор должен разрешаться только после того, как все остальные домены сбросились, независимо от того, у кого какая тактовая. А в подавляющем большинстве случаев, если в других доменах нет ничего, чтобы происходило без ведома домена-инициатора (каких-нибудь самостоятельных таймеров, и т.п.), достаточно резетнуть все эти домены асинхронным сигналом, и в домене-инициаторе выдержать задержку, гарантирующую, что в других доменах пройдет по два-три клока, и только потом начинать работать.
|
|
|
|
|
Jan 12 2015, 16:05
|
Вечный ламер
     
Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453

|
Цитата(SM @ Jan 12 2015, 22:27)  Только цепочка должна быть не тупо с повышением тактовой, а такой, как распространяется сигнал сброса, не привязываясь к частотам, то есть, оттуда, где он генерируется (например в домене "А"), он идет в домены "Б", и "В", а потом, обратно из доменов "Б" и "В", сигнал, говорящий домену "А", что все сбросилось, и можно начинать работать, то есть, снимать сигнал сброса с себя. Вот как-то примерно так. Направление, по большому счету, зависит от того, кто инициирует операцию, и кто на нее откликается - инициатор должен разрешаться только после того, как все остальные домены сбросились, независимо от того, у кого какая тактовая. Вы правы, но это только в случае реализации "тупого" инициатора и приемника, например, когда сигнал готовности приема данных при сбросе устанавливается в состояние разрешения. Цитата А в подавляющем большинстве случаев, если в других доменах нет ничего, чтобы происходило без ведома домена-инициатора (каких-нибудь самостоятельных таймеров, и т.п.), достаточно резетнуть все эти домены асинхронным сигналом, и в домене-инициаторе выдержать задержку, гарантирующую, что в других доменах пройдет по два-три клока, и только потом начинать работать. Я стараюсь делать модули во время сброса пассивными во всех смыслах, порой это приводит к наличию дополнительной логики, но зато никаких проблем со сбросами. И как сказал проброс сигнала делаю с низкочастотного домена в высокочастотный. Хотя это не обязательно, но люблю порядок
--------------------
|
|
|
|
|
Jan 12 2015, 16:16
|
Гуру
     
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881

|
Цитата(des00 @ Jan 12 2015, 19:05)  Я стараюсь делать модули во время сброса пассивными во всех смыслах, Вот именно. И получаем простую схему: 1) совершенно АСИНХРОННЫЙ сброс, без всякого проброса чего либо и куда либо. Просто, глобальный резет. 2) Этот сброс, в том числе, запрещает работу всех приемников, таймеров, и прочего, что может словить метастабильность. 3) Инициатор (а он всегда есть, и один, который самый первый из всех), через какое-то время после снятия сброса разрешает работу всего, чего надо, и разрешает уже по каналам управления, которые проброшены через домены, как им следует быть проброшенными. И единственное синхронизированное от сброса место - эта первичная разрешалка. Один бит данных. А сброс при этом, совершенно асинхронный... И думать о нем не надо.
|
|
|
|
|
Jan 13 2015, 12:37
|
Участник

Группа: Участник
Сообщений: 60
Регистрация: 5-12-11
Из: Киев
Пользователь №: 68 692

|
Цитата(SM @ Jan 12 2015, 19:16)  Вот именно. И получаем простую схему:
1) совершенно АСИНХРОННЫЙ сброс, без всякого проброса чего либо и куда либо. Просто, глобальный резет. 2) Этот сброс, в том числе, запрещает работу всех приемников, таймеров, и прочего, что может словить метастабильность. 3) Инициатор (а он всегда есть, и один, который самый первый из всех), через какое-то время после снятия сброса разрешает работу всего, чего надо, и разрешает уже по каналам управления, которые проброшены через домены, как им следует быть проброшенными. И единственное синхронизированное от сброса место - эта первичная разрешалка. Один бит данных.
А сброс при этом, совершенно асинхронный... И думать о нем не надо. Я правильно понимаю, что асинхронный сброс используется только для этого первого блока, а остальные включаются синхронным ENABLE (т.е. в них синхронизированный асинхронный сброс просто не заходит)?
Сообщение отредактировал vea - Jan 13 2015, 13:17
|
|
|
|
|
Jan 13 2015, 14:25
|
Гуру
     
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881

|
Цитата(vea @ Jan 13 2015, 15:37)  Я правильно понимаю, что асинхронный сброс используется только для этого первого блока, а остальные включаются синхронным ENABLE (т.е. в них синхронизированный асинхронный сброс просто не заходит)? Не совсем. Во первых, асинхронный сброс (который ни с чем не надо синхронизировать), заходит во все блоки сразу во всех доменах, и их всех асинхронно сбрасывает. Для этого в FPGA придумана единая глобальная линия сброса, и поэтому она там одна (а не пачка, как линий тактовых). И никакого "синхронизированного асинхронного сброса" нет. Он заходит на все сбросы не синхронизированным - прямо Ваш "RESET_n" как он есть. (но! внимание! именно на АСИНХРОННЫЕ входы сбросов всех блоков, которые требуют сброса) Во вторых, этот самый Enable нужен далеко не всем блокам, и не целиком целиком - Enable нужен конкретным отдельно взятым триггерам, которые на момент снятия RESET-а по каким-то причинам могут иметь на входе состояние, отличное от того, во что они были установлены по RESET, и то, не всем. Например: - Если это регистр, который записывается по команде из блока-инициатора, то ему отдельный Enable не нужен. Его и так инициатор разрешает только тогда, когда ему надо, и гарантировано, что не сразу после сброса.. - Eсли это таймер, считающий сам по себе с момента снятия резета, с приращением в 1 - то тоже не нужен. Почему? Потому что, при смене его состояния из 0 в 1 худшее, что может произойти, это что он задержится в состоянии 0 на 1 такт из-за метастабильности. Ну и что? От этого никому не холодно и не горячо. - А вот если это некий сумматор, который прибавляет к значению регистра некий код, не равный 1 (а точнее, не коду с одним разрядом, установленным 1), и этот код может быть таким в момент снятия резета, то вот тут уже нужно разрешение работы, чтобы не было сбоя. Тот есть, это самое разрешение нужно только в нескольких точках, отвечающих за старт работы системы в целом, и только в таких точках, где от метастабильного состояния в момент снятия резета реально может произойти сбой. Таких мест, если подумать, в проекте обычно или нет, или единицы (в основном автоматы, управляемые чем-то синхронным снаружи без доп. синхронизаторов, которые тоже сбрасываются по reset, или таймеры-счетчики, прибавляющие не единичные значения) UPD: А вот Enable этот генерируется синхронизирвоанным, как-то так: reg [2:0] en_ff always @(posedge clk or negedge RESET_n) if (~RESET_n) en_ff <= 3'd0; else en_ff <= {en_ff[1:0], 1'b1}; выход синхронизированного Enable берется с en_ff[2], и подается в необходимые точки, при необходимости, пересинхронизированным на другие клоки и в остальные клок-домены. А цепь асинхронного сброса надо исключить из временнОго анализа через set_false_path, так как Вы сами, схемотехнически устранили все возможности для сбоев.
|
|
|
|
|
Jun 1 2017, 14:23
|
Частый гость
 
Группа: Участник
Сообщений: 90
Регистрация: 16-11-10
Пользователь №: 60 920

|
Цитата(SM @ Jan 13 2015, 17:25)  Не совсем.
Во первых, асинхронный сброс (который ни с чем не надо синхронизировать), заходит во все блоки сразу во всех доменах, и их всех асинхронно сбрасывает. Для этого в FPGA придумана единая глобальная линия сброса, и поэтому она там одна (а не пачка, как линий тактовых). И никакого "синхронизированного асинхронного сброса" нет. Он заходит на все сбросы не синхронизированным - прямо Ваш "RESET_n" как он есть. (но! внимание! именно на АСИНХРОННЫЕ входы сбросов всех блоков, которые требуют сброса)
Во вторых, этот самый Enable нужен далеко не всем блокам, и не целиком целиком - Enable нужен конкретным отдельно взятым триггерам, которые на момент снятия RESET-а по каким-то причинам могут иметь на входе состояние, отличное от того, во что они были установлены по RESET, и то, не всем. Например: - Если это регистр, который записывается по команде из блока-инициатора, то ему отдельный Enable не нужен. Его и так инициатор разрешает только тогда, когда ему надо, и гарантировано, что не сразу после сброса.. - Eсли это таймер, считающий сам по себе с момента снятия резета, с приращением в 1 - то тоже не нужен. Почему? Потому что, при смене его состояния из 0 в 1 худшее, что может произойти, это что он задержится в состоянии 0 на 1 такт из-за метастабильности. Ну и что? От этого никому не холодно и не горячо. - А вот если это некий сумматор, который прибавляет к значению регистра некий код, не равный 1 (а точнее, не коду с одним разрядом, установленным 1), и этот код может быть таким в момент снятия резета, то вот тут уже нужно разрешение работы, чтобы не было сбоя.
Тот есть, это самое разрешение нужно только в нескольких точках, отвечающих за старт работы системы в целом, и только в таких точках, где от метастабильного состояния в момент снятия резета реально может произойти сбой. Таких мест, если подумать, в проекте обычно или нет, или единицы (в основном автоматы, управляемые чем-то синхронным снаружи без доп. синхронизаторов, которые тоже сбрасываются по reset, или таймеры-счетчики, прибавляющие не единичные значения)
UPD: А вот Enable этот генерируется синхронизирвоанным, как-то так:
reg [2:0] en_ff always @(posedge clk or negedge RESET_n) if (~RESET_n) en_ff <= 3'd0; else en_ff <= {en_ff[1:0], 1'b1};
выход синхронизированного Enable берется с en_ff[2], и подается в необходимые точки, при необходимости, пересинхронизированным на другие клоки и в остальные клок-домены. А цепь асинхронного сброса надо исключить из временнОго анализа через set_false_path, так как Вы сами, схемотехнически устранили все возможности для сбоев. Решил поднять старую тему. Как идеологически верно поступить в таком случае: Модуль состоит из нескольких Конечных Автоматов (КА), один из них главный управляющий, следит за результатами остальных. Подчиненные КА следят за внешними (относительно ПЛИС) сигналами, каждый за своим определенным набором. Главный КА дает разрешение на работу global_en и подчиненные КА начинают работу, есть сигнализация типа busy, done, error,.... В штатном режиме все просто, все КА будут в состоянии idle. При обнаружении ошибки в работе нужно сбросить все остальные КА в состояние idle (busy = '0' ). По моему идейно верно было бы установить global_en в '0'. Но такой подход потребует проверку global_en = '0' в каждом стейте, если внешние процессы медленные относительно процессов в ПЛИС и автомат не скоро перейдет в idle. Eсли состояний много то описание КА получается не очень... Другой вариант это главный КА делает локальный внутримодульный синхронный сброс всем подчиненным КА. И это не очень нравится. Какой подход все же лучше?
|
|
|
|
Сообщений в этой теме
vea Synchronized reset и разные тактовые Jan 12 2015, 07:38   Bad0512 Вот ещё полезная статья от Кена Чапмана до кучи. Jan 12 2015, 12:00    vea Цитата(Bad0512 @ Jan 12 2015, 15:00) Вот ... Jan 12 2015, 13:31     andrew_b Цитата(vea @ Jan 12 2015, 16:31) Но основ... Jan 12 2015, 13:42      des00 Цитата(SM @ Jan 13 2015, 00:16) А сброс п... Jan 12 2015, 16:33        Krys Цитата(SM @ Jan 13 2015, 20:25) - Eсли эт... Jan 14 2015, 11:28         SM Цитата(Krys @ Jan 14 2015, 14:28) Это зна... Jan 14 2015, 11:31          Krys Цитата(SM @ Jan 14 2015, 17:31) Иначе бы ... Jan 15 2015, 03:24           SM Цитата(Krys @ Jan 15 2015, 06:24) Хотелос... Jan 15 2015, 09:58            Krys Цитата(SM @ Jan 15 2015, 15:58) А не надо... Jan 15 2015, 11:18             SM Цитата(Krys @ Jan 15 2015, 14:18) Во всё ... Jan 15 2015, 11:25              vea Цитата(SM @ Jan 15 2015, 14:25) Когда дел... Jan 16 2015, 13:13  FakeDevice Цитата(vea @ Jan 12 2015, 11:39) Это обяз... Jan 12 2015, 09:16   des00 Цитата(FakeDevice @ Jan 12 2015, 16:16) Г... Jan 12 2015, 09:22    Krys Цитата(des00 @ Jan 12 2015, 15:22) формул... Jan 12 2015, 10:08     des00 Цитата(Krys @ Jan 12 2015, 18:08) При том... Jan 12 2015, 10:21    toshas Цитата(des00 @ Jan 12 2015, 12:22) формул... Jan 12 2015, 12:36     FakeDevice Цитата(toshas @ Jan 12 2015, 15:36) Приче... Jan 12 2015, 14:59 FakeDevice Еще есть зависимость от частоты. для пущей стабиль... Jan 12 2015, 08:17 vea Цитата(SM @ Jan 14 2015, 15:31) Неа, не м... Jan 20 2015, 12:54 SM Цитата(vea @ Jan 20 2015, 15:54) the circ... Jan 20 2015, 13:21 troiden А вот Xilinx не сответует использовать везде глоба... Jan 20 2015, 13:26 SM Цитата(troiden @ Jan 20 2015, 16:26) Мол ... Jan 20 2015, 13:38 troiden Ситуация, когда надо погасить весь кристалл, значи... Jan 20 2015, 13:44 SM Цитата(troiden @ Jan 20 2015, 16:44) Для ... Jan 20 2015, 13:48 Golikov A. 1. Чем вам не нравится сброс от главного автомата?... Jun 1 2017, 14:41 alxkon Цитата(Golikov A. @ Jun 1 2017, 17:41) 1.... Jun 2 2017, 07:06 Golikov A. ЦитатаНе нравится описание - в каждом стейте нужно... Jun 2 2017, 10:07
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|