Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Синхронизер
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
alexPec
Добрый день. Мельком как то упоминал, но решил отдельную тему создать, чтоб была ясность.Такая задача: есть источник данных (АЦП, 16 бит), есть автомат, который их обрабатывает. Частоты АЦП и автомата отличаются на 0,06 Гц (примерно) при частоте 5 МГц. Надо как то данные синхронизировать. Что-то типа фифо на 1 слово, без сигналов "пусто" и "полно". В теме "фифо на 1 слово" посоветовали взять готовое фифо альтеры, но там на 4 слова минимум (в визарде). Может как то просто можно его изобразить, синхронизер этот. Логика такая: если новый отсчет не пришел, то автоматом читается старый. Если новый отсчет пришел, а старый не прочитан - старый пропадает. Т.е. если отсчет пропал или два раза прочитался (все равно такая ситуация случится) - не страшно, лишь бы ошибок в самом отсчете не было, типа половина бит - со старого отсчета, половина - с нового.
Пока не представляю даже как это синхронизировать, хоть бы образчик какой...
Shtirlits
Я бы сделал как в некоторых синхронных АЦП, перекодировал в код Грея, потом поставил пару-тройку регистров с минимальной длиной соединения и перекодировал обратно.
Александр77
Цитата(alexPec @ Feb 12 2011, 02:21) *
Надо как то данные синхронизировать. Что-то типа фифо на 1 слово, без сигналов "пусто" и "полно"... Логика такая: если новый отсчет не пришел, то автоматом читается старый. Если новый отсчет пришел, а старый не прочитан - старый пропадает. Т.е. если отсчет пропал или два раза прочитался (все равно такая ситуация случится) - не страшно, лишь бы ошибок в самом отсчете не было, типа половина бит - со старого отсчета, половина - с нового.
Пока не представляю даже как это синхронизировать, хоть бы образчик какой...

Судя по всему, нужен простой регистр на N разрядов. Записывать в него будете по сигналам синхронизации АЦП, а читать - когда захотите.
des00
при таком соотношении тактовых и символьных частот, рекомендую сделать одинаковую частоту работы АЦП и вашего блока, или поставить фифо на 16 слов
dvladim
Цитата(alexPec @ Feb 12 2011, 02:21) *
Т.е. если отсчет пропал или два раза прочитался (все равно такая ситуация случится) - не страшно, лишь бы ошибок в самом отсчете не было, типа половина бит - со старого отсчета, половина - с нового.

Не мучайтесь, ставьте FIFO на 4 слова. Не нужны full и empty - игнорируйте.
des00
Цитата(dvladim @ Feb 12 2011, 01:40) *
Не мучайтесь, ставьте FIFO на 4 слова. Не нужны full и empty - игнорируйте.

при его тактовых частотах(тактовая == символьной) 4 слова мало, там только цепь ресинхронизации указателей займет 3 такта. 16 в самый раз.
ViKo
Вот не понимаю я подобных задач, уже не впервые поднимавшихся здесь. Частоты АЦП и автомата разные. Если АЦП быстрее работает, значит, время от времени, код с АЦП будет теряться. Если автомат быстрее работает, значит, иногда один и тот же код будет обрабатываться дважды. И никакие ФИФО не спасут, так будет всегда.
Если это не важно, и задача только избавиться от неправильно прочитанного кода из-за перекосов в момент метастабильного состояния, не нужно читать в это время. Создать сигнал, гарантирующий, что код с АЦП установился (всё, кроме времени в окрестности тактов АЦП), и читать, когда этот сигнал разрешает.
alexPec
Спасибо ВСЕМ за ответы

Цитата(des00 @ Feb 12 2011, 10:28) *
при таком соотношении тактовых и символьных частот, рекомендую сделать одинаковую частоту работы АЦП и вашего блока, или поставить фифо на 16 слов


А нельзя одинаковую. Я бы рад. Я тут тему поднимал, нельзя потому что ацп тактируется DDS-ом, а от этого тактового нельзя синхронизировать pll. У меня 2 ацп на 3 с лишним и на 5 МГц. Максимально близко подстроить частоты можно с точностью установки dds-а, около 0,06 гц (ой блин, щас дошло, можно ведь и точнее, если умножение в ддсе сделать меньше, но не суть, все равно не ровно). Что соотношение частот автомата (в плисе) и АЦП именно такое уверенность есть, т.к. и ДДС и плис тактируются одним стабильным генератором на 16 мгц.

Цитата
Я бы сделал как в некоторых синхронных АЦП, перекодировал в код Грея, потом поставил пару-тройку регистров с минимальной длиной соединения и перекодировал обратно.

А как код грея тут помочь может? Если будут ошибки - так они и в коде грея будут.

Цитата
Судя по всему, нужен простой регистр на N разрядов. Записывать в него будете по сигналам синхронизации АЦП, а читать - когда захотите

Ну да, так и хочу, но это ведь в идеале. В реальности, когда (при таком соотношении частот так все равно будет, и не раз) чтение почти совпадает с записью (ну с разницей в сотни пикосекунд), какие-то биты данных успеют поменяться на новые, а какие-то нет, потому как одинаковое время распространения сигнала для всех 16 бит сделать не реально (или я что-то недопонимаю?), да и у регистров есть setup, hold параметры, измеряемые наносекундами. Если я правильно понимаю, когда не выдерживаем эти параметры, переключение регистра не гарантируется. В итоге при чтении получим половину бит старого отсчета, половину - нового. А этого и боюсь.

Цитата
Не мучайтесь, ставьте FIFO на 4 слова. Не нужны full и empty - игнорируйте.

А я вот и хочу у спецов спросить, а поможет ли? При таком раскладе похоже уже все равно - пусть 4, пусть 16 слов, лишь бы работало надежно. Как там в этом двухклоковом фифо синхронизер сделан? В мемори-блоке что-ли? Где-то можно почитать про это? Если бы знал как он там сделан, было бы понимание, будет оно так работать или нет. Потом искать, откуда эти неправильные отсчеты взялись, гораздо сложнее.

Цитата
при его тактовых частотах(тактовая == символьной) 4 слова мало, там только цепь ресинхронизации указателей займет 3 такта. 16 в самый раз.

И кстати до сих пор грубое, жесткое непонимание, как длина фифы влияет на вероятность отсутствия ошибок? Если уж встали фронты чтения и записи в нехорошее положение, то длина фифы по моему пониманию не поможет. Че-то вот туплю здесь. И еще: правильно ли я понимаю: частота записи в фифу должна быть чуть меньше чтения, чтоб фифа не переполнилась? Хотя наверно фиолетово - полная ли пустая она будет... Может частоты наоборот побольше разнести? Хотя лучше не надо, тогда отсчеты будут чаще пропадать.

Цитата
Если это не важно, и задача только избавиться от неправильно прочитанного кода из-за перекосов в момент метастабильного состояния, не нужно читать в это время. Создать сигнал, гарантирующий, что код с АЦП установился (всё, кроме времени в окрестности тактов АЦП), и читать, когда этот сигнал разрешает.


Так нельзя не читать. Автомат-то молотить должен, там фурье, все завязано на расстояние между частотами, на сигнал с передатчика по эфиру и т.д., нельзя тормозить. Именно прочитать надо, но только строго старый или строго новый отсчет, тогда в результате фурье будут небольшие ошибки (на модели это проверено). А если читаем шум (смесь старого и нового отсчета) - в результате фурье ошибки в несколько раз больше.
des00
Цитата(alexPec @ Feb 12 2011, 03:39) *
Я тут тему поднимал, нельзя потому что ацп тактируется DDS-ом, а от этого тактового нельзя синхронизировать pll.

а если без PLL ?sm.gif

Цитата
А я вот и хочу у спецов спросить, а поможет ли? При таком раскладе похоже уже все равно - пусть 4, пусть 16 слов, лишь бы работало надежно. Как там в этом двухклоковом фифо синхронизер сделан? В мемори-блоке что-ли? Где-то можно почитать про это? Если бы знал как он там сделан, было бы понимание, будет оно так работать или нет. Потом искать, откуда эти неправильные отсчеты взялись, гораздо сложнее.

почитайте как фифо делаются, правильно сконструированное асинхронное фифо не дернет сигналом empty пока слово не будет лежать в памяти, а поставит этот флаг, когда вы точно прочитаете последнее слово %) ну и ваш автомат этот флаг обязан будет обрабатывать и работать на более высокой частоте.
Цитата
И кстати до сих пор грубое, жесткое непонимание, как длина фифы влияет на вероятность отсутствия ошибок?

длинна фифо здесь определяется не вероятностью, а банальной логикой здравого смысла, с учетом длинны синхронизирующих цепей фифо и условиями вашей задачи %)
ViKo
Цитата(alexPec @ Feb 12 2011, 11:39) *
Так нельзя не читать. Автомат-то молотить должен, там фурье, все завязано на расстояние между частотами, на сигнал с передатчика по эфиру и т.д., нельзя тормозить. Именно прочитать надо, но только строго старый или строго новый отсчет, тогда в результате фурье будут небольшие ошибки (на модели это проверено). А если читаем шум (смесь старого и нового отсчета) - в результате фурье ошибки в несколько раз больше.

Я ж написал "не нужно читать в это время". Прочитайте чуть позже. Задайте какую-нибудь высокую частоту, и на ней забрасывайте в регистр ПЛИС, постоянно, кроме запрещенного с АЦП времени. А дальше используйте с той частотой, с какой нужно. Эти две частоты будут синхронными, никаких перекосов, гонок, метастабильных состояний sm.gif
alexPec
Цитата(des00 @ Feb 12 2011, 12:53) *
а если без PLL ?sm.gif

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

Цитата
почитайте как фифо делаются, правильно сконструированное асинхронное фифо не дернет сигналом empty пока слово не будет лежать в памяти, а поставит этот флаг, когда вы точно прочитаете последнее слово %) ну и ваш автомат этот флаг обязан будет обрабатывать и работать на более высокой частоте.

А не знаете ли Вы, алтеровская фифа правильно сконструирована? По возможности нужно все-таки время экономить. Вот сказал бы кто (со знанием дела кнечноsm.gif ): поставь алтеровскую фифу и не парься, зуб даю, работает! И я бы поверил (пока проблемы не появятся). biggrin.gif
ViKo
Цитата(alexPec @ Feb 12 2011, 11:39) *
Так нельзя не читать. Автомат-то молотить должен, там фурье, все завязано на расстояние между частотами, на сигнал с передатчика по эфиру и т.д., нельзя тормозить. Именно прочитать надо, но только строго старый или строго новый отсчет, тогда в результате фурье будут небольшие ошибки (на модели это проверено).

А если вы не прочитаете - это и будет "строго старый отсчет". Усё!
des00
Цитата(alexPec @ Feb 12 2011, 04:17) *
Нельзя, автомат, как Вы написали, на более высокой частоте работает, умножать надо

да на частоте на 0.06 Гц больше lol.gif Вам самому то не смешно ? Какая разница где делать асинхронный переход? сразу после АЦП, или после предварительной обработки ? Придумываете себе проблемы на ровном месте.
Цитата
А не знаете ли Вы, алтеровская фифа правильно сконструирована?

если бы не знал, не писал бы про 3 такта синхронизации. Кстати конструкция этого фифо вытаскивается на раз, два, три %)

судя вот по этому
Цитата
Так нельзя не читать. Автомат-то молотить должен, там фурье, все завязано на расстояние между частотами, на сигнал с передатчика по эфиру и т.д., нельзя тормозить.

на лицо проблемы с построением системы, что мешает взять double buffer ram (сорцы кста есть на этом форуме) размером с ваше фурье, накопить и по бырому обработать.
alexPec
Цитата
да на частоте на 0.06 Гц больше lol.gif Вам самому то не смешно ? Какая разница где делать асинхронный переход? сразу после АЦП, или после предварительной обработки ? Придумываете себе проблемы на ровном месте.

Не-е-ет. Тут у нас непонимание. Отсчеты с ацп идут с чатотой на 0,06 гц меньше, чем автомат их считывает, а автомат должен после каждого отсчета прокрутить 37 тактов обработки. Поэтому и частота автомата намного выше (собсно ровно в 37 раз).

Цитата
если бы не знал, не писал бы про 3 такта синхронизации. Кстати конструкция этого фифо вытаскивается на раз, два, три %)

Вот за это отдельное спасибо! Поставлю альтеровскую фифу на 16 слов.

Цитата
на лицо проблемы с построением системы, что мешает взять double buffer ram (сорцы кста есть на этом форуме) размером с ваше фурье, накопить и по бырому обработать.


да не с построением, по быстрому обработать не получится. сейчас в реальном времени автомат работает на частоте около 120 мгц, по быстрому это я так понимаю должно быть 500-1000МГц - не реально. Сейчас итак два блока сделано: один копит, другой - обрабатывает и копит, потом местами меняются
Shtirlits
Если дальше Фурье, то делать как я насоветовал нельзя, будут искажения.

В таком случае я бы сделал автомат на стороне медленного АЦП-шного клока, который укладывает данные в память (управляет адресом памяти) и передает сигнал о том, что данные записаны (пишет его в FIFO, через синхронизаторы, да как угодно).
В быстром домене автомат управляет обработкой, а его выход должен иметь сигнал готовности, который позволит компенсировать разницу в частотах.
Синхронизаторы надо бы рассчитать, так как при столь небольшой разнице в частотах период, когда соотношения фаз будут неудачными, будет длительным и вероятность залипания регистров в метастабильном состоянии увеличится и частота 5MHz довольно низкая. Я бы поставил синхронизатор с голосованием по трем путям, чего в реализациях стандартных fifo не встречал, но наблюдал их "глюки" в похожем приложении.
_Anatoliy
Цитата(alexPec @ Feb 12 2011, 12:56) *

А что вы делаете с отчётами пока выполняется Фурье?
alexPec
Цитата(_Anatoliy @ Feb 12 2011, 14:45) *
А что вы делаете с отчётами пока выполняется Фурье?

демодулирую, декодирую результаты предыдущего фурье
slawikg
Поставте 2 фифо, после заполнения одного, начинаете записывать в другое. А по сигналу переполнения( который надо привязать к частоте автомата, считываете из первого. После заполнения второго фифо соответственно переключаетесь.
Krys
Цитата(Shtirlits @ Feb 12 2011, 06:54) *
Я бы сделал как в некоторых синхронных АЦП, перекодировал в код Грея, потом поставил пару-тройку регистров с минимальной длиной соединения и перекодировал обратно.
Коды Грея годятся только для последовательно изменяющихся величин. Для случайных они не дадут изменение в одном бите. Т.е. это подходит только для счётчиков.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.