Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Две MAX II CPLD
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
zombi
В изделии две cpld EPM570 с одинаковой прошивкой.
На тактовые входы обоих поступает общая частота 120 MHz от кварцевого генератора.
Сигнал синхронного сброса счётчика (reset) формируется внешней микросхемой и поступает на обычный I/O pin альтер.
Длительность фронта нарастания сигнала сброса ~ 20 нс.
Длина проводника клока и сброса между альтерами ~ 3 см шириной 0.25 мм.
Могут ли при таких условиях альтеры работать не синхронно?
Если да, то что посоветуете сделать чтобы при каждом сбросе добиться 100% синхронного запуска счетчиков?
Александр77
Время пробега 3 см в "стандартном" FR4 получается около 215 пс (эпсилон 4,6). Это меньше периода импульсов частоты 120МГц (8,3 нс) и длительности фронта, так что на синхронизации дорожка сказаться не должна.
zombi
Цитата(Александр77 @ Jun 23 2015, 21:11) *
так что на синхронизации дорожка сказаться не должна.

Спасибо. Я так и предполагал.

А вот, длительность фронта сигнала сброса (20 нс) беспокоит.

Изделие реальное. Пока единичное.
Раз сто включал-выключал и просто пинцетом сброс формировал, всегда синхронно стартуют счётчики.
Но всё же что то беспокоит а не начнутся ли проблемы в партии из за разброса параметров мс или еще чего.
dvladim
А почему фронт сброса такой медленный?
Как вариант сброс одной ПЛИС сделать от другой.
zombi
Цитата(dvladim @ Jun 23 2015, 22:22) *
А почему фронт сброса такой медленный?

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

Цитата(dvladim @ Jun 23 2015, 22:22) *
Как вариант сброс одной ПЛИС сделать от другой.

Не хочется "лезть" в альтеру.
И прошивку хочется иметь одинаковую для обоих.
EvgenyNik
Детально не вдавался никогда, но вот вопрос - а что из себя представляет процесс начального конфигурирования логической структуры MAXII при включении? Там же flash конфигурационная на борту. И генератор тактовый встроенный с разбросом от 3.3МГц до 5.6МГц. Сдаётся мне, что при включении некий автомат начинает читать конфигурационную флеш и распихивать битики по элементам управления ячейками. С учётом огромного допустимого разброса тактовой частоты, время готовности у двух одинаковых микросхем с одинаковой прошивкой, в таком случае, будет существенно разное. Уверены, что сброс заканчивается не раньше, чем сконфигурируются максы?
Думаю, что при любых раскладах надо выделять хотя бы 1 проводник под синхронизацию старта уже загруженной и запустившейся прошивки. Как минимум, просто enable какой. Ну или вплоть то передачи номера состояния цифрового автомата в соседний корпус.
Даже идеально одновременно загруженные устройства, при приведённой схеме тактирования и сброса, не гарантируют синхронной смены состояния счётчика, если фронт сброса совпадёт с фронтом тактовой частоты. Один запустится, допустим, сразу, а второй "дождётся" следующего такта.
zombi
Цитата(EvgenyNik @ Jun 24 2015, 09:30) *
Уверены, что сброс заканчивается не раньше, чем сконфигурируются максы?

Уверен. Минимальная длительность ноля сигнала сброса 1 сек. Reset формирует мк.

Цитата(EvgenyNik @ Jun 24 2015, 09:30) *
Даже идеально одновременно загруженные устройства, при приведённой схеме тактирования и сброса, не гарантируют синхронной смены состояния счётчика, если фронт сброса совпадёт с фронтом тактовой частоты. Один запуститься, допустим, сразу, а второй "дождётся" следующего такта.

Т.е. при любой длительности фронта нарастания сигнала сброса возможен не синхронный старт счётчиков.
Но чем этот фронт меньше тем меньше вероятность совпадения его фронта (уровня при котором максы считают его единицей) с фронтом тактового сигнала.
Я правильно мыслю?

Интересно, а можно ли посчитать вероятность не синхронного старта счётчиков такой схемы?
EvgenyNik
Цитата(zombi @ Jun 24 2015, 10:50) *
Но чем этот фронт меньше тем меньше вероятность совпадения его фронта (уровня при котором максы считают его единицей) с фронтом тактового сигнала.
Я правильно мыслю?
Чем меньше сигнал находится в зоне неопределённого уровня, тем, разумеется, меньше вероятность.
Цитата(zombi @ Jun 24 2015, 10:50) *
Интересно, а можно ли посчитать вероятность не синхронного старта счётчиков такой схемы?
Посчитать можно что угодно. Но бывает, что математика приближает нас к пониманию процессов, а бывает, что - отдаляет от реальной жизни.
Я бы предложил Вам сделать так:
Нажмите для просмотра прикрепленного файла
Кроме того, для CPLD1 назначить входу захвата сброса опцию триггера Шмидта.
p.s. линию сброса для cpld2 случайно провёл в рамке кристалла - не обращайте внимания, она с выхода slaveresetout до входа slaveresetin полностью - внешний проводник. Не особо длинный, разумеется.
_pv
Цитата(zombi @ Jun 24 2015, 13:50) *
Т.е. при любой длительности фронта нарастания сигнала сброса возможен не синхронный старт счётчиков.
Но чем этот фронт меньше тем меньше вероятность совпадения его фронта (уровня при котором максы считают его единицей) с фронтом тактового сигнала.
Я правильно мыслю?

ресет надо сихнронным с клоками сделать, перед подчаей на вход обоих cpld пропустить через пару Дтриггеров, тактируемых от тех же клоков, лучше инвертированных.
тогда по положительному фронту обе cpld гарантированно увидят одно и то же состояние ресета.
zombi
Цитата(EvgenyNik @ Jun 24 2015, 15:19) *
Я бы предложил Вам сделать так:

Спасибо за разъяснение. Теперь всё ясно.

Придётся и разводку менять и прошивки будут разные для максов crying.gif

Цитата(_pv @ Jun 24 2015, 15:40) *
ресет надо сихнронным с клоками сделать, перед подчаей на вход обоих cpld пропустить через пару Дтриггеров, тактируемых от тех же клоков, лучше инвертированных.
тогда по положительному фронту обе cpld гарантированно увидят одно и то же состояние ресета.

Спасибо. Тоже вариант.
zombi
Цитата(_pv @ Jun 24 2015, 15:40) *
ресет надо сихнронным с клоками сделать, перед подчаей на вход обоих cpld пропустить через пару Дтриггеров, тактируемых от тех же клоков, лучше инвертированных.
тогда по положительному фронту обе cpld гарантированно увидят одно и то же состояние ресета.

А зачем через пару Дтриггеров пропускать? Почему одного не достаточно?
Inanity
Цитата(zombi @ Jun 24 2015, 21:00) *
А зачем через пару Дтриггеров пропускать? Почему одного не достаточно?


Классическая схема синхронизации. На выходе первого триггера возможна метастабильность, которая на выход второго не попадёт (очень низкая вероятность).
Читайте про CDC (Clock Domain Crossing)
zombi
Почитал про метастабильность.
Еще о метастабильности.
цитирую:
Цитата
Говорят, что для типичных цифровых микросхем, выполненных по технологии 0,25um, при частоте событий 1Мгц и тактовой частоте 100Мгц получается MTBF = 20 дней.


У меня клок 120 MHz довольно близко к 100.
Но частота событий 1-2 ну может аж 10 раз в день.
Это количество включений изделия.

Получается : 60*60*24*1000000/10*20/365= > 473 млн лет. biggrin.gif

Стоит ли с этим бороться?

Тем более мк может контролировать работу максов.
Если не запустились, то еще раз ресетом дёрнуть.
Shivers
Правильно вам посоветовали. 20нс - очень медленное нарастание сигнала - может случиться так, что в одной ПЛИС сработает по порогу в этом такте, в а другой ПЛИС в следующем. Получите рассинхронизацию в один такт. Выход один - сброс пропустить через два триггера, и синхронизированный завести в обе ПЛИС. Не забудьте убедиться что синхронный сброс дошел менее чем за один период до обеих ПЛИС (ПЛИС или CPLD, не суть важно).
XVR
Цитата(zombi @ Jun 24 2015, 23:08) *
Тем более мк может контролировать работу максов.
Если не запустились, то еще раз ресетом дёрнуть.
А вот с этого и стоило начинать. Если допускается сброс максов в процессе работы, то вариант с контролем их синхронности и последующим ресинхронизирующим сбросом вполне нормальное решение.
Но триггер шмита на вход и синхронизирующие триггера на ресет очень желательны. И контроль за рассинхронизацией так же желательно сделать внутри одного из максов.

Цитата
Придётся и разводку менять и прошивки будут разные для максов

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

zombi
Цитата(Shivers @ Jun 25 2015, 10:39) *
Правильно вам посоветовали. 20нс - очень медленное нарастание сигнала - может случиться так, что в одной ПЛИС сработает по порогу в этом такте, в а другой ПЛИС в следующем. Получите рассинхронизацию в один такт.

Это я понял. Возражений не имею. Триггер нужен обязательно.
Но мне кажется что достаточно всего одного триггера.
Цитата(Shivers @ Jun 25 2015, 10:39) *
Выход один - сброс пропустить через два триггера, и синхронизированный завести в обе ПЛИС. Не забудьте убедиться что синхронный сброс дошел менее чем за один период до обеих ПЛИС (ПЛИС или CPLD, не суть важно).

Зачем два триггера?
Второй триггер только для борьбы с возможной один раз в 473 млн. лет метастабильностью первого?
Ну даже если триггер войдёт в состояние метастабильности он всёравно из этого состояния "вывалится" либо в ноль либо в единицу.
Какая мне разница запустится альтера на один такт раньше или позже.

Цитата(XVR @ Jun 25 2015, 12:36) *
А вот с этого и стоило начинать. Если допускается сброс максов в процессе работы, то вариант с контролем их синхронности и последующим ресинхронизирующим сбросом вполне нормальное решение.
Но триггер шмита на вход и синхронизирующие триггера на ресет очень желательны. И контроль за рассинхронизацией так же желательно сделать внутри одного из максов.

К сожалению мк не может контролировать синхронность работы плисок.
Мк работает на 32 Mhz. Он может лишь определить работают ли они в принципе.
Я был неправ, повторный сброс ничего не даст.

Цитата(XVR @ Jun 25 2015, 12:36) *
Прошивка у максов может быть одинаковая - просто часть ее (синхронизация и контроль) будут использоваться только в одном их максов (а присутствовать могут в обоих, не помешает). А вот разводку придется менять, увы.

А вот это не могу представить как сделать.
Но в любом случае придётся прошивки менять, а я хочу сохранить текущую.
Поэтому придётся добавлять внешний триггер.
Хочу добавить всего один триггер что-то типа этого 74LVC1G79 и корпус SOT353-1 нравится.(найти бы еще сразу с инверсным входом клока).
А мне говорят что нужно два добавлять.
И я пытаюсь понять зачем два.
dvladim
Цитата(zombi @ Jun 25 2015, 17:42) *
Но в любом случае придётся прошивки менять, а я хочу сохранить текущую.
Поэтому придётся добавлять внешний триггер.
Хочу добавить всего один триггер что-то типа этого 74LVC1G79 и корпус SOT353-1 нравится.(найти бы еще сразу с инверсным входом клока).
А мне говорят что нужно два добавлять.
И я пытаюсь понять зачем два.

Если вы можете себе позволить менять плату, то добавляйте два триггера. Два нужны для подавления метастабильности.
Поверьте, если вы меняете плату из-за одного триггера (и номенклатуру компонентов), то не экономьте на мелочах, ставьте два триггера.
Что касается одинаковой прошивки для обеих ПЛИС, то это возможно, но разводка у них будет разная. Самый простой вариант - это та же пара синхронизирующих триггеров внутри первой ПЛИС, а та же пара внутри второй просто не будет задействована.
zombi
Цитата(dvladim @ Jun 25 2015, 21:10) *
Что касается одинаковой прошивки для обеих ПЛИС, то это возможно, но разводка у них будет разная. Самый простой вариант - это та же пара синхронизирующих триггеров внутри первой ПЛИС, а та же пара внутри второй просто не будет задействована.

Уровнем на пине коммутировать сигнал сброса?
Т.е. или сброс поступает на первый или сразу на третий триггер?
Или ещё как?
EvgenyNik
Цитата(zombi @ Jun 25 2015, 22:02) *
Или ещё как?
У Вас снаружи сигнал для состоянии "сброс" какой уровень вырабатывается: ноль или единица? Я бы сразу накидал схемку...
zombi
Цитата(EvgenyNik @ Jun 26 2015, 10:19) *
У Вас снаружи сигнал для состоянии "сброс" какой уровень вырабатывается: ноль или единица? Я бы сразу накидал схемку...

Сброс - активный уровень ноль.
Буду признателен за схемку
EvgenyNik
Вход у счётчика инверсным не делал, учёл в И-Не.
Нажмите для просмотра прикрепленного файла
Оба входа reset делаем с триггером Шмитта, обоим назначаем резистивную подтяжку к питанию.
У "ведущей" плиски внешний сброс подводим на пин reset_master, вход reset_slave_in оставляем просто висеть в воздухе (или, по желанию, цепляем к питанию), выход reset_slave_out тащим к "ведомой" дорожкой.
У "ведомой" вход reset_master оставляем висеть в воздухе (или подключаем к питанию), а на вход reset_slave_in подключаем выход от "ведущей", вывод reset_slave_out оставляем висеть в воздухе.
Таким образом, мы, конечно, теряем в ножках, но выигрываем в идентичности прошивки.
p.s. кстати, Вы знаете, что у Вас на выходах lpm_decoder в моменты переключения счётчика возникают "иголки"? Если их использовать далее без синхронизации, то может быть чёрти-что...
Shivers
Мрак какой. Чтобы прошивки были одинаковые, надо взять схему из поста выше, только выкинуть все, кроме двух триггеров.
Сброс с кнопки завести только на одну из ПЛИС, и выход второго триггера вывести наружу - это будет синхронная цепь сброса. И уже эту цепь завести на реальные входы сброса обеих ПЛИС. Прошивки будут одинаковые.
zombi
Цитата(EvgenyNik @ Jun 26 2015, 12:58) *
p.s. кстати, Вы знаете, что у Вас на выходах lpm_decoder в моменты переключения счётчика возникают "иголки"? Если их использовать далее без синхронизации, то может быть чёрти-что...

Конечно знаю, без синхронизации не использую.
Выходы декодера и дальнейшие производные подключены только на разрешающие входы триггеров.
А clk абсолютно всех триггеров подключены исключительно к одной глобальной входной частоте.
Т.о. я думаю что получил синхронный проект. Вроде работает как задумывал.
Чип "забит" на 96%. Но ноги свободные есть.

Цитата(Shivers @ Jun 26 2015, 14:05) *
Сброс с кнопки завести только на одну из ПЛИС, и выход второго триггера вывести наружу - это будет синхронная цепь сброса. И уже эту цепь завести на реальные входы сброса обеих ПЛИС. Прошивки будут одинаковые.

Ага, получится как будто два внешних отдельно стоящих триггера.
Только находиться они будут в максе.
Прикольно.
XVR
Цитата(zombi @ Jun 25 2015, 17:42) *
Но в любом случае придётся прошивки менять, а я хочу сохранить текущую.
Поэтому придётся добавлять внешний триггер.
Т.е. вместо того, что бы добавить пару строк verilog кода в прошивку MAX'а вы хотите поставить 2 физических корпуса снаружи cranky.gif
Почему нельзя изменить прошивку?
Цитата
К сожалению мк не может контролировать синхронность работы плисок.
Мк работает на 32 Mhz. Он может лишь определить работают ли они в принципе.
Я был неправ, повторный сброс ничего не даст.
Это определять должен сам MAX, и сообщать МК, что нужно всех сбросить. Но прошивку в придется конечно дорабатывать
Цитата
А вот это не могу представить как сделать.
У вас есть незадействованные ножки у MAX'ов? И сколько штук. И сколько ресурсов внутри MAX'ов свободно?
Исходя из этого можно прикинуть как реализовать синхронизацию
zombi
Цитата(XVR @ Jun 29 2015, 11:47) *
Т.е. вместо того, что бы добавить пару строк verilog кода в прошивку MAX'а вы хотите поставить 2 физических корпуса снаружи cranky.gif
Почему нельзя изменить прошивку?

Большого опыта работы с альтерой не имею. Языков не знаю. Просто рисую блок-схему.
Любое изменение в проекте приводит к его неработоспособности.
Времени на разбирательство почему так происходит нету.
После очередной компиляции заработало как надо и больше трогать ничего не хочу. biggrin.gif

Проблему решил без изменения прошивки и добавления триггеров. Всем спасибо.

В изделии эти две альтеры грубо говоря осуществляют пересылку данных из общего источника каждая в свою внешнюю RAM.
Есть еще и третья альтера которая получает сигнал окончания пересылки от каждой, работает на той же частоте и сообщает мк о завершении операции.
Вот ее прошивку я и поменял. Добавил еще проверку на синхронное окончание операции с последующим информированием мк.
А мк даёт одновременно одинаковую команду обоим альтерам и в случае не синхронного окончания формирует сброс.
И так до тех пор пока несколько раз подряд не получит синхронного завершения.
Вот так вот всё намутил biggrin.gif
XVR
Цитата(zombi @ Jun 29 2015, 12:46) *
Любое изменение в проекте приводит к его неработоспособности.
А вот это очень и очень не хорошо
Цитата
Времени на разбирательство почему так происходит нету.
После очередной компиляции заработало как надо и больше трогать ничего не хочу. biggrin.gif
Вы уверены, что оно 'работает как надо'? Вы тесты (в системе моделирования) делали? А констрейны при синтезе задавали? Если нет, то ваши MAX'ы сломаются в самый неподходящий момент.

Цитата
А мк даёт одновременно одинаковую команду обоим альтерам и в случае не синхронного окончания формирует сброс.
И так до тех пор пока несколько раз подряд не получит синхронного завершения.
Тоже вариант, вполне рабочий. Проверьте только, с какой попытки происходит успешная запись. В 99.999% случаев должно быть с первой же. Если это не так, то что то все же добавить придется rolleyes.gif
zombi
Цитата(XVR @ Jun 29 2015, 14:05) *
Тоже вариант, вполне рабочий. Проверьте только, с какой попытки происходит успешная запись. В 99.999% случаев должно быть с первой же. Если это не так, то что то все же добавить придется rolleyes.gif

Именно так и получается как правило с первой попытки всё ок.
Для проверки работоспособности сделал наоборот.
Добиваюсь именно не синхронного запуска.
Для увеличения вероятности не синхронного старта подал еще и на вход разрешения внешнего генератора 120MHz тот же сброс.
И считаю количество сбросов.
В 100% случаях в результате наблюдаю не синхронную работу максов.
Количество сбросов как правило 10-20 редко бывает и больше 60.

Цитата(XVR @ Jun 29 2015, 14:05) *
Вы уверены, что оно 'работает как надо'? Вы тесты (в системе моделирования) делали? А констрейны при синтезе задавали? Если нет, то ваши MAX'ы сломаются в самый неподходящий момент.

Результат работы наблюдаю визуально на мониторе.
Пока на двух изделиях всё гуд. Возможно в партии чего и вылезет.
Никакие констрейны при синтезе не задавал.
Не умею этого делать.
Только некоторым группам регистров указал fast output и режим компиляции speed.
EvgenyNik
Цитата(Shivers @ Jun 26 2015, 14:05) *
Мрак какой. Чтобы прошивки были одинаковые, надо взять схему из поста выше, только выкинуть все, кроме двух триггеров.
Сброс с кнопки завести только на одну из ПЛИС, и выход второго триггера вывести наружу - это будет синхронная цепь сброса. И уже эту цепь завести на реальные входы сброса обеих ПЛИС. Прошивки будут одинаковые.
В общем-то, да, согласен. Так будет проще. Я взял за основу реализацию, когда медленная комбинаторика использует сигнал и нельзя часть времени отдавать на распространение между корпусами.
XVR
Цитата(zombi @ Jun 29 2015, 14:43) *
Никакие констрейны при синтезе не задавал.
Не умею этого делать.
Ой. Срочно научитесь - это не сложно. В вашем случае хватит пары строк (не знаю, где это прописывается у Alter'ы, сам работаю с Xiinx)
Цитата
Результат работы наблюдаю визуально на мониторе.
Пока на двух изделиях всё гуд. Возможно в партии чего и вылезет.
То, что онь работает 'на мониторе' на вашем столе совершенно не показатель. В партии обязательно что нибудь вылезет. Тем более, что вы работаете на довольно высоких (для MAX) частотах.
dvladim
Цитата(EvgenyNik @ Jun 29 2015, 15:36) *
В общем-то, да, согласен. Так будет проще. Я взял за основу реализацию, когда медленная комбинаторика использует сигнал и нельзя часть времени отдавать на распространение между корпусами.

Поддерживаю Shivers. Там всей логики - от триггера, до триггера. Но в вашем случае есть еще и 2И-НЕ, которое не позволит разместить триггер в IO элементе.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.