Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Десериализатор 600 MHz на Stratix II
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
boulon
Добрый день.

Столкнулся с проблемой следующего характера.
Реализовываю десериализатор, который принимает 8 LVDS 12-битных потоков с АЦП ADC5271 (50MSPS, 12 bits) на частоте 600 MHz, которые синхронизируются частотой 50 MHz тоже от этой микросхемы.
Из приходящей частоты 50 MHz сделал 2 клока 300MHz (сдвиг 180 град) для фиксации четных и нечетных бит и 50MHz для конечной фиксации 12-бит слова. Настроил фазы всех этих частот по паттернам из микросхемы (микросхема может генерировать 2 паттерна "101010101010" и "111111000000") для настройки. Все работает хорошо, но...
При добавлении новых модулей в стратикс и новой компиляции происходит рассинхронизация - меняется расскладка и приходится каждый раз подбирать фазы клоков. А так как на плате стоит 8 микросхем АЦП, то работа достаточно долгая и нудная.
Зафиксировал десериализатор при помощи FloorPlan. Помогло, но не надолго. Сейчас, как я понимаю, могут меняться пути от ног микросхемы, куда приходят данные, до модуля десериализатора на кристале.
Нужно как то все зафиксировать чтобы при добавлении новых модулей и компиляции не было нужды каждый раз снова корректировать фазы клоков.
Уверен есть людт которые решали такую проблему.
Как грамотно разрешить ситуацию? Возможно можно зафиксировать раз и навсегда пути до модуля.

Спасибо.
DmitryR
Цитата(boulon @ Aug 11 2009, 12:34) *
Уверен есть людт которые решали такую проблему.

Вы правильно уверены, только зря не поискали по форуму: эта тема раз в пару месяцев обсуждается стабильно. Меняются только ADC, но все они на самом деле работают одинаково. Краткий пересказ:
- ловить данные надо по двум фронтам LCLK
- определять нулевой бит и записывать в FIFO надо по ADCLK
- если внутренности FPGA работают на ADCLK то без FIFO можно обойтись, если на синхронной, но другой частоте (например от PLL, которая раздает по плате частоты) - то FIFO можно заменить на эластичный буфер
boulon
Цитата(DmitryR @ Aug 11 2009, 11:54) *
Вы правильно уверены, только зря не поискали по форуму: эта тема раз в пару месяцев обсуждается стабильно. Меняются только ADC, но все они на самом деле работают одинаково. Краткий пересказ:
- ловить данные надо по двум фронтам LCLK
- определять нулевой бит и записывать в FIFO надо по ADCLK
- если внутренности FPGA работают на ADCLK то без FIFO можно обойтись, если на синхронной, но другой частоте (например от PLL, которая раздает по плате частоты) - то FIFO можно заменить на эластичный буфер


я все так и делаю. Проблема в том, что при добавлении модуля и компиляции все расстраивается и надо снова подбирать фазы клоков.
Можно ли как то зафиксировать пути сигналов от ног и до модуля дессериализации?
SM
Цитата(boulon @ Aug 11 2009, 14:22) *
Можно ли как то зафиксировать пути сигналов от ног и до модуля дессериализации?

Можно, использовав входные триггеры в IO-целлах. Они никуда переехать не могут smile.gif
boulon
Цитата(SM @ Aug 11 2009, 13:36) *
Можно, использовав входные триггеры в IO-целлах. Они никуда переехать не могут smile.gif


нет я имел ввиду другое. Данные заходят в кристал через IO селл и потом идут через кристал в модуль десериализатора. Так вот эти пути, от IO селл до модуля. Потому что получается что от одной компиляции к другой они могут быть разные и набег фаз разный. А у меня 8 каналов данных параллельно.
SM
Цитата(boulon @ Aug 11 2009, 14:53) *
нет я имел ввиду другое. Данные заходят в кристал через IO селл и потом идут через кристал в модуль десериализатора. Так вот эти пути, от IO селл до модуля. Потому что получается что от одной компиляции к другой они могут быть разные и набег фаз разный. А у меня 8 каналов данных параллельно.

Если триггер в модуле и триггер в IO-целле тактируются одним клоком, и правильно указаны констрейны, то квартус автоматически выдержит правильную времянку при разводке от IO-целла до модуля.
DmitryR
Цитата(boulon @ Aug 11 2009, 14:22) *
я все так и делаю.

Цитата(boulon @ Aug 11 2009, 12:34) *
Из приходящей частоты 50 MHz сделал 2 клока 300MHz (сдвиг 180 град) для фиксации четных и нечетных бит и 50MHz для конечной фиксации 12-бит слова.

Еще раз: вы делаете АБСОЛЮТНО не так, как я сказал. Или очень плохо описываете свои мысли. Не надо ничего делать из приходящей 50, LCLK - это 300 МГц. Надо прямо на ней хлопать по двум фронтам.
boulon
Цитата(SM @ Aug 11 2009, 14:00) *
Если триггер в модуле и триггер в IO-целле тактируются одним клоком, и правильно указаны констрейны, то квартус автоматически выдержит правильную времянку при разводке от IO-целла до модуля.

то есть из моего модуля вынести первый тригер "захвата" входящих данных в IO селл? Каким констрейнтом это можно сделать?
SM
Цитата(boulon @ Aug 11 2009, 15:26) *
то есть из моего модуля вынести первый тригер "захвата" входящих данных в IO селл? Каким констрейнтом это можно сделать?

Fast Input Register = ON (для пина), причем Вам надо смотреть в сторону DDR-регистров, коих в IO-целле как раз пара, и потом еще проверить по отчетам, вынесся ли он туда. А то не каждый триггер можно туда засунуть, он должен соответствовать неким требованиям, в основном в части сигналов сброса, предустановки. Читайте апноты.
boulon
Цитата(DmitryR @ Aug 11 2009, 14:19) *
Еще раз: вы делаете АБСОЛЮТНО не так, как я сказал. Или очень плохо описываете свои мысли. Не надо ничего делать из приходящей 50, LCLK - это 300 МГц. Надо прямо на ней хлопать по двум фронтам.

у меня нету на альтере такого клока, все что заведено на плате это 50 MHz для синхронизации нулевого бита (начало слова) и данные (8 последовательных потоков). Теперь для фиксации каждого бита мне надо 50 мегагерц умножать в 6 раз и получать нужные клоки - 300 мегагерц. Вобщем, у меня модуль делает из входного клока 50MHz 3 частоты: 300MHz, 300MHz(180 град) и 50 MHz уже для фиксации всех 12 бит после их накопления в сдвиговых регистрах.
Да, действительно, я это не описал раньше.

Цитата(SM @ Aug 11 2009, 14:29) *
Fast Input Register = ON

спасибо, если это поможет
SM
Цитата(boulon @ Aug 11 2009, 15:30) *
спасибо, если это поможет


Смотрите картинку 2-52 вот там http://www.altera.com/literature/hb/stx2/stx2_sii51002.pdf
Там есть 2 input-регистра, один работает по фронту, второй по спаду, так вот Вам лучше их задействовать, да и клока одного хватит, не надо делать два разных двинутых 300-МГцовых.
boulon
Цитата(SM @ Aug 11 2009, 14:36) *
Смотрите картинку 2-52 вот там http://www.altera.com/literature/hb/stx2/stx2_sii51002.pdf
Там есть 2 input-регистра, один работает по фронту, второй по спаду, так вот Вам лучше их задействовать, да и клока одного хватит, не надо делать два разных двинутых 300-МГцовых.

не хватит,
пишут что их всего 6 на микросхеме, у меня же всего 64 канала с АЦП (8 восьмиканальных АЦП на плате)
SM
Цитата(boulon @ Aug 11 2009, 15:57) *
пишут что их всего 6 на микросхеме, у меня же всего 64 канала с АЦП (8 восьмиканальных АЦП на плате)

Что-то не то пишут... Вы знаете, какой ширины бывает шина DDR-памяти? Ну никак не 6 бит. 64 уж точно. А то и 128.
DmitryR
Цитата(boulon @ Aug 11 2009, 15:30) *
у меня нету на альтере такого клока, все что заведено на плате это 50 MHz для синхронизации нулевого бита (начало слова) и данные (8 последовательных потоков).

То есть человек, который делал плату даже не поинтересовался, что же это за выход такой у АЦП, LCLK. Поэтому у вас теперь будет гемморой, если вообще что-то выйдет. И вот почему:
1. Фронт ADCLK может гулять +-350ps, то есть 700 ps p-p (стр. 7), и вместе с ним будет гулять фаза умноженного клока, а у вас все окно данных 1666 ps, минус фронт еще 180 ps минимум (на той же странице).
2. Из документации непонятно, какой у этого ADCLK джиттер и соответственно непонятно, какой он будет у вас на выходе PLL.
Вобщем я думаю, что тут без периодической перекалибровки не получится. И в любом случае я бы не отдал такую плату заказчику: надо переделать, разведя LCLK, и все станет легко.
boulon
Цитата(DmitryR @ Aug 11 2009, 15:04) *
То есть человек, который делал плату даже не поинтересовался, что же это за выход такой у АЦП, LCLK. Поэтому у вас теперь будет гемморой, если вообще что-то выйдет. И вот почему:
1. Фронт ADCLK может гулять +-350ps, то есть 700 ps p-p (стр. 7), и вместе с ним будет гулять фаза умноженного клока, а у вас все окно данных 1666 ps, минус фронт еще 180 ps минимум (на той же странице).
2. Из документации непонятно, какой у этого ADCLK джиттер и соответственно непонятно, какой он будет у вас на выходе PLL.
Вобщем я думаю, что тут без периодической перекалибровки не получится. И в любом случае я бы не отдал такую плату заказчику: надо переделать, разведя LCLK, и все станет легко.

человек, который делал плату уволился и поэтому...
а меня этот постоянная настройка уже выводит и очень сильно, я решил глобально решить эту проблему, поэтому и обратился сюда.
После каждой компиляции корректировать фазы на PLL и компилировать снова очень расточительно.Одна компиляция занимает 15 минут.
DmitryR
Увы, я абсолютно уверен, что глобально решить эту проблему можно только переделкой платы. А так я думаю у вас и без перекомпиляции фаза будет периодически съезжать. В дополнении ко всему еще возникает конечно ощущение, что у вас сам дизайн сделан как-то неверно. Параллельно с переделкой платы (надеюсь, ваш уволившийся не унес схематику с собой) сделайте timesim модель десериализатора (по-правильному, с LCLK) и добейтесь того, чтобы она работала идеально.

P.S. А что вы FPGA-то такие древние взяли?
boulon
Цитата(DmitryR @ Aug 11 2009, 15:42) *
Увы, я абсолютно уверен, что глобально решить эту проблему можно только переделкой платы. А так я думаю у вас и без перекомпиляции фаза будет периодически съезжать. В дополнении ко всему еще возникает конечно ощущение, что у вас сам дизайн сделан как-то неверно. Параллельно с переделкой платы (надеюсь, ваш уволившийся не унес схематику с собой) сделайте timesim модель десериализатора (по-правильному, с LCLK) и добейтесь того, чтобы она работала идеально.

P.S. А что вы FPGA-то такие древние взяли?

да, вы правы, при изменении температуры платы/чипа (например при начальном запуске) видно как фаза уезжает.
Кристалл сейчас занят на треть и я боюсь что если еще пихать модули так я не смогу настроить в принципе.
По выбору микросхем и платы - это было еще до меня, моя задача теперь запрограммировать с таким железом как есть.
А чип выбран EP2S60 1020 ног.
Я бы взял специальные для этого дела Arria
SM
Задействуйте DDR-регистры, и фаза должна перестать уезжать вообще. Они придуманы специально для этого.
DmitryR
Не смешивайте две проблемы. Сначала сделайте работоспособный дизайн с помощью модели (тайминговой). На модели у вас будет для начала идеальная частота, все должно заработать. Потом на модели же испортите входную частоту (введите вандер например +-150 ps), посмотрите в каких пределах ее качества дизайн сохраняет работоспособность. Если будут подозрения, что запаса прочности дизайна окажется недостаточно - стройте динамическую перекалибровку (АЦП периодически переводится в тестовый режим и фаза PLL гоняется до тех пор, пока не встанет в нужное место). Но опять же IMHO, это все можно делать чтобы удовлетворить начальство, типа смотрите я из мертвой платы сделал что-то. Клиенту такое монстрячество отдавать нельзя. Да еще там 64 канала, устройство серьезное видно.
boulon
Цитата(DmitryR @ Aug 11 2009, 16:13) *
Не смешивайте две проблемы. Сначала сделайте работоспособный дизайн с помощью модели (тайминговой). На модели у вас будет для начала идеальная частота, все должно заработать. Потом на модели же испортите входную частоту (введите вандер например +-150 ps), посмотрите в каких пределах ее качества дизайн сохраняет работоспособность. Если будут подозрения, что запаса прочности дизайна окажется недостаточно - стройте динамическую перекалибровку (АЦП периодически переводится в тестовый режим и фаза PLL гоняется до тех пор, пока не встанет в нужное место). Но опять же IMHO, это все можно делать чтобы удовлетворить начальство, типа смотрите я из мертвой платы сделал что-то. Клиенту такое монстрячество отдавать нельзя. Да еще там 64 канала, устройство серьезное видно.

фазы на выходе PLL разве можно менять динамически, не перекомпилируя проект?
DmitryR
AN367 читайте.

Цитата(boulon @ Aug 11 2009, 16:54) *
Я бы взял специальные для этого дела Arria

Arria бы вам тут ничем не помогла - ее трансиверы с такими сигналами не работают.
boulon
Цитата(SM @ Aug 11 2009, 16:08) *
Задействуйте DDR-регистры, и фаза должна перестать уезжать вообще. Они придуманы специально для этого.

подскажите как это проще сделать?
SM
Цитата(boulon @ Aug 11 2009, 18:18) *
подскажите как это проще сделать?


мегафункция altddio_in.
ArMouReR
Цитата(boulon @ Aug 11 2009, 16:19) *
фазы на выходе PLL разве можно менять динамически, не перекомпилируя проект?

Да.
Для етого в MegaWizarde выберите функцию ALTPLL_RECONFIG.

У Вас появятся входы для динамической реконфигурации.
boulon
Даю отчет.

Сделал как советовали, используя входные регистры в IO селлах. И это действительно помогло. Уже добавил много новых модулей в проект, фазы никуда не уехали. Плату пока не переделываем.

Спасибо всем за содействие.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.