Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Каким методом лучше захватывать данные АЦП в Spartan 6?
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
BlackOps
Есть проект в разработке, где планируется использовать АЦП, брать с него данные, ну и алгоритм над ними работает и выдает результат. Пока различные компоненты проекта гоняю в Behavioral симуляции. Но по мере завершения планирую уже проводить Post-Route симуляцию с более подробным тайминг анализом и констрейнами.

В зависимости от выбора функционала финального изделия планируется использовать различные АЦП, поэтому какой именно пока незнаю.

Но предположим будет использоватся некий АЦП скажем в 400MSPS размером в 14бит, и передающий данные дифф. парой. Я думаю реализовать симуляцию этого проекта в тестбенче в режиме post-route, а данные считывать с жесткого диска (сейчас я почти тоже самое делаю, тока в Behavioral режиме и без всякой эмуляции дифф. пары).

Смотрю сейчас книжку предложенную Boris_TS в предыдущем посте, а также читаю документ харр1064 Source-Synchronous Serialization and
Deserialization (up to 1050 Mb/s)
от Хилых, где рассказывается как получать данные в режиме DDR используя PLL, DCM итд.

Но потом наткнулся вот на этот пост в онлайне:
http://e2e.ti.com/support/data_converters/...68/t/47555.aspx

где работник Texas Instruments рассказывает мол то что написано в документе хилых харр1064 это слишком комплексно и сложно синхронизуемо, и что он реализовал принятие данных в режиме DDR по другому, ниже он приводит блок диаграмму как это сделал он, в его случае все вроде как проще, и используются IDDR2 и различные элементы задержки.

кто что может по этому поводу сказать? По какому пути лучше пойти? И как лучше реализовать чтение данных от АЦП (различной скорости) в режиме DDR?

Если есть еще какие документы которые следует почитать по теме?
disel
Цитата(BlackOps @ Dec 23 2011, 08:50) *
Есть проект в разработке, где планируется использовать АЦП, брать с него данные, ну и алгоритм над ними работает и выдает результат. Пока различные компоненты проекта гоняю в Behavioral симуляции. Но


А зачем пост-роут симуляция то? Задает правильно констрейн и не паритесь. Про констрейны написано в wp237. К тому же ацп на 400 мгц и 14 разрядов наверняка умеет двигать данные относительно клоков лучше чем плис. Так что в плис даже ПЛЛ может не понадобиться.
Разные АЦП - разные констрейны.
Костян
Достаточно след.
1. Входной триггер DDR для данных в лапу (жеталельно использовать свойство same egde)
2. Входной триггер frame (если последовальный интерфейс) в лапу, триггер тактировать от АЦП синхронизации
3. сигнал синхронизации на спец. лапу, позволяющую хватать клок.

Контрейн на сигнал синхронизации. DCM не требуется, если дорожки на PCB равной длины.

disel
Положение данных относительно клока у разных ацп может быть самым разным. Я бы не стал утверждать что констрейн оффсет ин и дсм в плисе никогда не нужны.
Костян
QUOTE (disel @ Dec 23 2011, 06:42) *
Положение данных относительно клока у разных ацп может быть самым разным. Я бы не стал утверждать что констрейн оффсет ин и дсм в плисе никогда не нужны.

как правило фронт клока смешен на 90 или 180 гр. Если клок заходит на gbuf пины, то задержки порядка 0.2..0.3нс. dcm не нужен.
BlackOps
Я думаю об АЦП ADS5474, вот его даташит: http://www.ti.com/lit/ds/symlink/ads4149.pdf на странице 7 показана диаграмма как данные на выход посылаются, как видите начало клока совпадает с началом данных, поэтому для лучшего захвата мне нужно задержать клок примерно на 90 градусов.

Я прикрепляю картинку где я набросал компоненты присущие Спартан 6, ну и вот по такой схеме я думаю захватывать данные. Данную конфигурацию я просимулировал в Behavioral режиме, работает нормально.

У меня вопрос такой: Как теперь правильно определить входные констрейны на клок и данные для данной конфигурации?

Я просмотрел документацию там приводится пример:
OFFSET = IN value VALID value BEFORE clock RISING;
OFFSET = IN value VALID value BEFORE clock FALLING;


Но дело в том, что на спартан 6 на компоненте IDDR2 FALLING констрейн игнорируется, и вот здесь: http://www.xilinx.com/support/answers/34634.htm Xilinx приводит пример как поставить констрейны в данном случае.

Однако тот пример уже предполагает что переход клока происходит в середине окна данных, в моем случае это не так. Надо задержать клок, а потом захватить

Так как же правильно в данном случае задать констрейны? кто нибудь чтото аналогичное клепал на спартан 6? (где переход данных и клока одновременно в режиме DDR) может поделитесь отрезком файла .ucf? или подскажите как это осуществить?
BlackOps
Вобщем решил я попробовать так, подать просто данные на флоп с клоком входным, и вписать констрейны, прикрепляю диаграмму.

а вот мои констрейны:
NET "adc1_clk" TNM_NET = "adc1_clk";
TIMESPEC TS_adc1_clk = PERIOD "adc1_clk" 2.5 ns HIGH 50 %;

NET "adc1_data*" TNM = "IN_DDR";

TIMEGRP ddr_in_rising = RISING "adc1_clk";
TIMEGRP ddr_in_falling = FALLING "adc1_clk";

TIMEGRP "IN_DDR" OFFSET = IN -500 ps VALID 250 ps BEFORE "adc1_clk" TIMEGRP "ddr_in_rising";
TIMEGRP "IN_DDR" OFFSET = IN -750 ps VALID 250 ps BEFORE "adc1_clk" TIMEGRP "ddr_in_falling";


Выдает вот что:
Paths for end point IDDR2_inst (ILOGIC_X1Y175.D), 2 paths
--------------------------------------------------------------------------------
Slack (hold path): -1.718ns (requirement - (clock path + clock arrival + uncertainty - data path))
Source: adc1_data (PAD)
Destination: IDDR2_inst (FF)
Destination Clock: C0 rising at 0.000ns
Requirement: 0.750ns
Data Path Delay: 2.031ns (Levels of Logic = 2)(Component delays alone exceeds constraint)
Clock Path Delay: 4.474ns (Levels of Logic = 2)
Clock Uncertainty: 0.025ns


Paths for end point IDDR2_inst (ILOGIC_X1Y175.D), 2 paths
--------------------------------------------------------------------------------
Slack (hold path): -2.714ns (requirement - (clock path + clock arrival + uncertainty - data path))
Source: adc1_data (PAD)
Destination: IDDR2_inst (FF)
Destination Clock: C0 falling at 1.250ns
Requirement: 1.000ns
Data Path Delay: 2.031ns (Levels of Logic = 2)(Component delays alone exceeds constraint)
Clock Path Delay: 4.470ns (Levels of Logic = 2)
Clock Uncertainty: 0.025ns


Ведь вроде как правильно констрейны задаю, период входного клока 2.5 нс, данные каждые 1.25 нс, +/- 0.5 нс... соответственно по этому критерию и задаю констрейны, так в чем же может быть дело?
Timmy
Цитата(BlackOps @ Dec 29 2011, 10:30) *
Ведь вроде как правильно констрейны задаю, период входного клока 2.5 нс, данные каждые 1.25 нс, +/- 0.5 нс... соответственно по этому критерию и задаю констрейны, так в чем же может быть дело?

На 400МГц DDR только Virtex, может быть, сможет принимать данные. А spartan 6 только с автокалибровкой, которая в данном случае работать не будет, так как на некоторых линиях данных сигнал может подолгу не меняться. Правда, если есть возможность периодически переключать АЦП в тестовый режим, то можно и откалиброваться.
Из лоукостеров по-моему только Lattice ECP2/ECP3 могут нормально ловить 400МГц. Зато у них нет внутренних терминаторов.

UPD:Вы меня запутали своими констрейнамиsm.gif. Вам же 200МГц DDR надо, это должно получиться.

Что касается топологии - посмотрите картинку 1-18 в документе "spartan 6 FPGA clocking resources", я думаю, надо сделать всё как на ней, только использовать DLL c выходами CLK90 и CLK270 вместо PLL.
disel
Цитата(Костян @ Dec 26 2011, 14:34) *
как правило фронт клока смешен на 90 или 180 гр. Если клок заходит на gbuf пины, то задержки порядка 0.2..0.3нс. dcm не нужен.


Видимо мы разные ацп пользуем.

2 BlackOps:
даташит на который вы дали ссылку на 250 мгц ацп. т..е. 4 нс. и tsu и th совсем другие, не совпадают с тем что в ваших констрейнах. и на 7 странице электрические параметры. вы уж определитесь чего хотите.
про то как ддр констрейны писать в wp237 на стр.13
BlackOps
Прошу прощения, с линком на даташит перепутал.

частоту тоже спутал, да 200МГц, это и есть 400MSPS. Просто в доке TI на разных страницах по разному говорилось, опечатка видимо.

Констрейны надо было поставить вот так:
NET "adc1_clk_p" TNM_NET = "adc1_clk_p";
TIMESPEC TS_adc1_clk_p = PERIOD "adc1_clk_p" 5 ns HIGH 50 %;

NET "adc1_data*" TNM = "IN_DDR";

NET "C0" TNM_NET = "clk0_grp";
NET "C1" TNM_NET = "clk180_grp";
TIMEGRP "IN_DDR" OFFSET = IN -500 ps VALID 1500 ps BEFORE "adc1_clk_p" TIMEGRP "clk0_grp";
TIMEGRP "IN_DDR" OFFSET = IN -3000 ps VALID 1500 ps BEFORE "adc1_clk_p" TIMEGRP "clk180_grp";



Это из-за того что ISE 13.3 игнорирует FALLING констрейн, обещано было исправить в версии 12.4, но даже в 13.3 этот баг еще присутствует.

А насчет того как входные данные принимать, я сделал вот так как на рисунке прикрепленном показано.
т.е. генерирую смещенные клоки, так setup/hold параметры намного лучще, меньше задержки клока.

Вобщем весь дизайн запустил, нормально без предупреждений, и тайминг нормальный. В Behavioral режиме тоже работает.



Алга
Есть проекты (design package) с полной документацией (исходники и тд) от National Semiconductor для высокоскоростных АЦП (gsps adc). Реализация на Virtex-4.
http://www.national.com/en/adc/evalboard_u..._speed_adc.html
Алга
"..Смотрю сейчас книжку предложенную Boris_TS в предыдущем посте.."

Не нашел, помогите ссылкой. Спасибо.
Timmy
Цитата(BlackOps @ Jan 4 2012, 08:02) *
TIMEGRP "IN_DDR" OFFSET = IN -500 ps VALID 1500 ps BEFORE "adc1_clk_p" TIMEGRP "clk0_grp";
TIMEGRP "IN_DDR" OFFSET = IN -3000 ps VALID 1500 ps BEFORE "adc1_clk_p" TIMEGRP "clk180_grp";


Это из-за того что ISE 13.3 игнорирует FALLING констрейн, обещано было исправить в версии 12.4, но даже в 13.3 этот баг еще присутствует.

Мне кажется, в Вашем случае такое задание констрейнов без FALLING правильнее, так как клок пропускается через фазовый детектор PLL/DLL, который всё равно реагирует только на rising фронт клока. Окно ещё надо бы уменьшить на skew в PCB.
MishaN
Цитата(Timmy @ Dec 30 2011, 10:49) *
На 400МГц DDR только Virtex, может быть, сможет принимать данные. А spartan 6 только с автокалибровкой, которая в данном случае работать не будет, так как на некоторых линиях данных сигнал может подолгу не меняться. Правда, если есть возможность периодически переключать АЦП в тестовый режим, то можно и откалиброваться.
Из лоукостеров по-моему только Lattice ECP2/ECP3 могут нормально ловить 400МГц. Зато у них нет внутренних терминаторов.

UPD:Вы меня запутали своими констрейнамиsm.gif. Вам же 200МГц DDR надо, это должно получиться.

Что касается топологии - посмотрите картинку 1-18 в документе "spartan 6 FPGA clocking resources", я думаю, надо сделать всё как на ней, только использовать DLL c выходами CLK90 и CLK270 вместо PLL.


Сейчас еще ECP4.
Внутренние терминаторы LVDS? если да - то есть
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.