Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Плавает задержка то ли клоков то ли данных
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
alexadmin
Имеется FPGA (Arria 2), которая принимает данные от АЦП (по lvds) на относительно небольших частотах 150-200МГц DDR (то есть клок 200, данные 400). Клок приходит от того же АЦП с некоторым фазовым сдвигом относительно данных.
Изначально пытался принимать данные этим же клоком варьируя задержку по данным во входных пинах. Качественно не вышло - списал все на собственную тупость и недостаточное знакомство с таймквестом.
Теперь добавил по входу клока PLL, кручу фазу тактового сигнала, им и сэмплирую входные данные. Все хорошо, нашел допустимое окно по сдвигу фазы клока, при котором сигналы не ломаются, выбрал среднее значение, сижу радуюсь. Запускаю тот же проект на другой плате - не работает, оптимальная фаза сильно уехала, так что окна вообще не перекрываются.
У меня есть несколько вариантов кто виноват:
1) изменение задержек между клоком и данными по выходу АЦП - вполне может быть, но макимально возможное изменение прописанное в даташите на АЦП в потора раза меньше, чем получилось у меня. Попробую проверить осциллом.
2) Ошибки при фазовой подстройке PLL - в даташите было что-то про 50 пс. Несущественно.
Что еще?
Считаем, что внешние условия одинаковые, 300 по Кельвину, ветер умеренный, погода на Марсе стабильна.

И главный вопрос - что делать?
У меня идей пока только две и обе мне не нравятся своей бесперспективностью для общего случая:
1) откалибровать каждую плату под свои задержки.
2) реализовать динамическую подстройку
crono
Цитата(alexadmin @ Mar 20 2013, 18:02) *
2) реализовать динамическую подстройку

Чем не нравится этот вариант? Мы применяли данный вариант, работает вполне себе хорошо. Даже отслеживает изменения температуры при нагреве платы.
TRILLER
Ваш PLL запускается в то время, когда от АЦП идёт устойчивый клок? Если нет, то он может подхватить неонятно что и непонятно в какой фазе.
Bad0512
Цитата(crono @ Mar 20 2013, 22:33) *
Чем не нравится этот вариант? Мы применяли данный вариант, работает вполне себе хорошо. Даже отслеживает изменения температуры при нагреве платы.

На 200 МГц DDR и без этих танцев с бубном всё должно летать. Динамическая подстройка - для предельных частот.

Автору : а вы померяйте задержку между приходящим клоком от АЦП и вашим, сдвинутым по фазе на разных платах чтобы понять где рождается проблема - в альтере или в АЦП.
crono
Цитата(Bad0512 @ Mar 20 2013, 19:39) *
На 200 МГц DDR и без этих танцев с бубном всё должно летать. Динамическая подстройка - для предельных частот.

Да там и танцев то особых нет. Просто компенсируется задержка клока от входной ножки ПЛИС до попадания на глобальный клок. Задержка эта впринципе может от разводки к разводке поменяться. А на счет предельных частот, то 200 МГц DDR это точность установки клока плюс минус 1.25 нс. Достаточно короткий интервал.
alexadmin
Цитата(crono @ Mar 20 2013, 19:33) *
Чем не нравится этот вариант? Мы применяли данный вариант, работает вполне себе хорошо. Даже отслеживает изменения температуры при нагреве платы.


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

Цитата(TRILLER @ Mar 20 2013, 19:36) *
Ваш PLL запускается в то время, когда от АЦП идёт устойчивый клок? Если нет, то он может подхватить неонятно что и непонятно в какой фазе.


Хороший вопрос. С уверенностью в 99% думаю что да. Сам АЦП клока фактически не трогает, просто пропускает через себя. Системный синтезатор порождающий для него клок проверяется на lock. Плюс саму PLL фпга я сбрасывал (и тоже ждал lock) перед подстройкой фазы. Но в эту сторону я тоже подумаю, спасибо.
crono
Цитата(alexadmin @ Mar 21 2013, 08:30) *
Ну и подспудно меня мучает, что для данного конкретного АЦП я могу калиброваться по встроенным паттернам, а вот что мне делать, если для какого-то другого АЦП (или просто высокоскоростного входного интерфейса) паттернов не окажется? В общем доберусь до осцилла, померяю реально возникающие задержки, буду думать. Похоже действительно придется калиброваться динамически...

Вообще, я говорил о динамеческой компенсации линии клока от входной ножки до точки, где клок становится глобальным. Так как все остальное при правильной трассировки платы, по идее, компенсации не требует. На входе ПЛИС клок и данные симфазны. Данные АЦП защелкиваются прямо на входе ПЛИС. Значит остается неопределенным только путь клока от входной ножки до буфера глобального клока.
А для компенсации этого пути никакие паттерны не нужны. нужен только сам клок. Идея там очень простая. Входной клок защелкивается во входном буфере глобальным клоком после плл. и вращением фазы плл добиваемся примерно равной вероятности появления 0 и 1. Если мы этого добиваемся, то наш глобальный клок по фазе совпадает с входным клоком АЦП. А данные АЦП защелкиваются клоком сдвинутым на 90 градусов от этого клока.
alexadmin
Цитата(Bad0512 @ Mar 20 2013, 19:39) *
Автору : а вы померяйте задержку между приходящим клоком от АЦП и вашим, сдвинутым по фазе на разных платах чтобы понять где рождается проблема - в альтере или в АЦП.


Померял и несколько удивлен результатом - разбег клок/данные на двух разных платах получился в районе 200пс. В то время как настройку PLL в них приходится крутить на 1000-1200пс. Выходит что дело и правда в FPGA, хоть мне это и странно...
dm.pogrebnoy
Цитата(crono @ Mar 21 2013, 12:44) *
А для компенсации этого пути никакие паттерны не нужны. нужен только сам клок. Идея там очень простая. Входной клок защелкивается во входном буфере глобальным клоком после плл. и вращением фазы плл добиваемся примерно равной вероятности появления 0 и 1. Если мы этого добиваемся, то наш глобальный клок по фазе совпадает с входным клоком АЦП. А данные АЦП защелкиваются клоком сдвинутым на 90 градусов от этого клока.


Где-то на этом форме dsmv выкладывал исходник такого модуля.
alexadmin
Цитата(crono @ Mar 21 2013, 12:44) *
А для компенсации этого пути никакие паттерны не нужны. нужен только сам клок. Идея там очень простая. Входной клок защелкивается во входном буфере глобальным клоком после плл. и вращением фазы плл добиваемся примерно равной вероятности появления 0 и 1. Если мы этого добиваемся, то наш глобальный клок по фазе совпадает с входным клоком АЦП. А данные АЦП защелкиваются клоком сдвинутым на 90 градусов от этого клока.


Спасибо за идею, интересный метод, если действительно говорить о компенсации только этой задержки. Но варьирование этой задержки (для разных временных моделей моего кристалла) составляет примерно около 300 пс (550-850 пс), что вносит вклад, но тоже не самый весомый. Можно попробовать, но в этом методе меня смущает довольно большой шаг подстройки по фазе у PLL, удасться ли хорошо выровнять чиисло 1 и 0. А постоянно дергать фазу туда-сюда тоже не айс...
crono
Цитата(alexadmin @ Mar 21 2013, 14:29) *
А постоянно дергать фазу туда-сюда тоже не айс...

Так это и есть динамическая подстройка. На неком интервале измерить количество нулей и единиц и если счетчики вышли за некие границы, подстроить фазу. А если не нравится постоянно дергать ее, то можно просто провести инициализацию, скорректировать фазу, и в рабочем цикле ее не трогать. На ксайлинксе же прекрасно работает и динамический режим, к тому же на деле дерганье фазы можно настроить так, чтоб происходило оно относительно редко.
Torpeda
Цитата(alexadmin @ Mar 20 2013, 19:02) *
И главный вопрос - что делать?
У меня идей пока только две и обе мне не нравятся своей бесперспективностью для общего случая:
1) откалибровать каждую плату под свои задержки.
2) реализовать динамическую подстройку


1) задать правильные STA констрейны по входах от АЦП
2) привязать входные сигналы (клок от АЦП) к внутреннему осцилятору (хотя 400МГц)
3) розвести данные и клок на плате симметрично
krux
что-то имхо для 200 МГц DDR - делать динамическую подстройку на PLL это как из пушки по воробьям...
Аппнота вроде достаточно толстая, чтобы после неё всё заработало: http://www.altera.com/literature/an/an433.pdf

Единственный вариант, который я себе могу представить, где этот подход не сработает - это если сигналы имеют сильно заваленные фронты, и достаточно малый разбег клока с данными в разных направлениях приведёт к большой разнице фаз на крутых фронтах внутри ПЛИС. И тогда это объясняет почему у вас получается так, что "приходится крутить 1000-1200пс", ведь тогда source-synchronous compensation для PLL получается совсем даже не source-synchronous, и вы вынуждены крутить его так, как будто это режим Normal.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.