Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Прием данных с АЦП AD9681
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
Страницы: 1, 2
Art55555
Есть Artix7 и AD9681.

Приём сделан по схеме DATA_PIN- IBUFDS-IDELAYE2-ISERDESE2.
К выходу ISERDESE2 я подключил калибратор.
Выбранный режим приёма - DDR two-lane, bytewise.

Далее привожу алгоритм.
1) По SPI выбираю режим передачи данных DDR two-lane, bytewise -0x21 значение 30.


2) По SPI выбираю режим передачи тестовой последовательности, состоящей из 2 слов. - 0x0D значение 04.



3) Используя перебор 32 значений IDELAYE2 и 8 bitslip-ов я добиваюсь того, чтобы на выходе ISERDESE2 появились искомые A8 54 на одном лэйне и AA 55 на другом. Автомат проверяет, чтобы стабильный результат на выходе был не менее 8192 раз. Если нет, то либо задержка, либо (если задержка достигает 32 - битслип). В итоге стабильно добиваюсь такого результата:



4) По SPI выбираю режим отключения тестовой последовательности, состоящей из 2 слов. - 0x0D значение 00.

И вижу такой результат при подаче с генератора синуса частоты 1 МГц:




Т.е. явно видно, что какой-то бит явно "врёт", хотя если опять вернуться на тестовую последовательность, то всё по-прежнему ок.

В чём может быть проблема?

AVR
Цитата(Art55555 @ Oct 3 2017, 17:19) *
И вижу такой результат при подаче с генератора синуса частоты 1 МГц:
В чём может быть проблема?

Помочь не смогу, но чисто предположение, исходя из собственных АЦП-страданий:
осциллограф показывает чистый синус с генератора? И с подключенным АЦП и с отключенным?
Amurak
А если скремблер подать?
khach
Так PN9 подайте и все сразу видно будет если цифровая часть врет. Вот только как там задержку в пайплайне подобрать правильную для синхронизации?
А если цифра не врет- то надо бы увеличить емкости фильтра перед входом АЦП, При емкости сравнимой с емкостями УВХ АЦП наблюдались подобные приключения. Можно еще пилу подать, на ней лучше видно в каком бите глюк.
Flip-fl0p
Цитата
3) Используя перебор 32 значений IDELAYE2 и 8 bitslip-ов я добиваюсь того, чтобы на выходе ISERDESE2 появились искомые A8 54 на одном лэйне и AA 55 на другом. Автомат проверяет, чтобы стабильный результат на выходе был не менее 8192 раз. Если нет, то либо задержка, либо (если задержка достигает 32 - битслип).

При таком алгоритме вы попадете не в центр окна данных (sample window),а в его край, где данные боле-менее стабильны. Вроде и не страшно, но всё-же обратите на это внимание.
А схема тактирования какая ?
monty
не стоит городить велосипед - возьмите готовый ад-ый код.
Art55555
Цитата(monty @ Oct 4 2017, 08:15) *
не стоит городить велосипед - возьмите готовый ад-ый код.


В описании микросхемы на AD нет ничего для ПЛИС.

Цитата(Flip-fl0p @ Oct 4 2017, 00:14) *
При таком алгоритме вы попадете не в центр окна данных (sample window),а в его край, где данные боле-менее стабильны. Вроде и не страшно, но всё-же обратите на это внимание.
А схема тактирования какая ?


Согласен. Для проверки после проведения калибрации уже вручную играюсь значением задержки, лучше сигнал не становится. Причём видно, что искажение сигнала происходит на уровне конкретного бита (как в положительной, так и отрицательной области).

Теперь про такт.

От АЦП заходит быстрый DCO. Защёлкиваю его IBUFGDS. Получили сигнал ACLK. Далее из него делаю инверсный через конструкцию
aclk_inv<=not aclk;

Параллельно с помощью BUFR делением на 4 получаю aclk_div.

Все эти дела подаются на ISERDESE2.

Да, подстройку по IDELAYE2 делаю по такту другому - 100 МГц (хотя делал и по делённому aclk_div - разницы не увидел)


sawyer0
Цитата(Art55555 @ Oct 4 2017, 07:32) *
В описании микросхемы на AD нет ничего для ПЛИС.

Посмотрите здесь, может есть что-нибудь: https://github.com/analogdevicesinc/hdl.git
Алга
Посмотрите также Xilinx xapp524, xapp585, xapp1071/866, есть и соответствующие zip файлы с исходниками.
Art55555
Я, конечно же, брал за основу эти документы.

Бросается в глаза то, что я не использую FRAME для детектирование правильности данных.
Просто у меня калибровочная машина подключена к каждой Data-lane и я ожидаю с неё попеременно 2 разных числа, которые мне известны.
Далее, после каждого сердеса идёт фифо, выход которого уже идёт на выход.
Правильно ли это?


Ещё возник вопрос по поводу PN23.
Подумал, что не совсем корректно калиброваться по 2 выходным значениям. Решил попробовать с PN23.

По поводу изобретения велосипеда - на гитхабе этой АЦП нет, а те, что есть - непонятный принцип работы.
Что есть дата и как подавать стартовую последовательность для AD9681 0x7FFC?
Также не понятно, для чего эти входные данные нужны в режиме генератора, к тому же 23 бита в "рабочем векторе", а входные(выходные) данные только 16.
Какие генераторы я нашёл, а также самописный почему-то не дают последоватьельность 0x7F80, 0x8004, 0x7000, указанную в даташите.

Кто-нибудь встречался с данными проблемами?
Алга
Кратко процесс калибровки: первый этап- поставить клок в центр (середину)
принимаемых данных (бита) меняя задержку Второй этап- управляя битслипом принять
правильно определенное значение (тестовый код).
Калибровка проводится на определенный тестовый код (например "1xsync", "1/0 bit toggle", "mixed bit frequency")
Те ацп при калибровке должен генерить простой код 12/16бит. Можно посчитать сколько единиц задержки ваше окно
Так если данные 1 Gbit (16 Bit)- период(окно) 1 нс и требуется всего 12-13 ед задержки (по 78 ps) для стабильного приема,
потом 2-3 единицы нестабильный прием (попали на переход-другое значение бита) и опять все снова. Это вы должны наблюдать в ручном режиме.
Окончательно устанавливается середина стабильного участка.
Калибровка выполняется на один тестовый код. Потом можно проверять результат калибровки разными способами.
khach
А информация из http://www.analog.com/media/en/technical-d...otes/AN-877.pdf для AD9681 применима? Там описаны биты сброса псевдослучайной последовательнсти.
Art55555
Цитата(khach @ Oct 6 2017, 20:36) *
А информация из http://www.analog.com/media/en/technical-d...otes/AN-877.pdf для AD9681 применима? Там описаны биты сброса псевдослучайной последовательнсти.


Сброс последовательности мне не требуется, старт я вижу сразу, генератор PN23 будет генерить и сравнивать значения.
Art55555
Я НЕ использую FRAME - калибруюсь по последовательности - это нормально? Для чего-то ведь этот сигнал существует)
Flip-fl0p
Цитата
Кратко процесс калибровки: первый этап- поставить клок в центр (середину)
принимаемых данных (бита) меняя задержку

А можно про этот процесс чуть подробнее ?
Допустим есть некий АЦП который управляется по SPI.
Мы либо запускаем АЦП в "нормальном" режиме - когда он гонит данные.
Либо запускаем АПЦ в режиме калибровки - когда он гонит тестовую последовательность.
Читал доки от xilinx но так и не понял как определяются границы бита, чтобы выставить клок в центр данных.
Алга
FRAME (frame clk) должен использоваться в любом случае.
Есть два варианта структурных схем соединения. Это xapp524 и xapp585.
Какой у вас непонятно. Важна и блок схема клок дистрибьюции.
Как формируются сигналы bitclk и frmclk для сердеса и тд?
Потом режим 12 бит АЦП как делается на сердесах? (xapp585, p.2)
Flip-fl0p
Цитата(Алга @ Oct 10 2017, 08:12) *
FRAME (frame clk) должен использоваться в любом случае.
Есть два варианта структурных схем соединения. Это xapp524 и xapp585.
Какой у вас непонятно. Важна и блок схема клок дистрибьюции.
Как формируются сигналы bitclk и frmclk для сердеса и тд?
Потом режим 12 бит АЦП как делается на сердесах? (xapp585, p.2)

Спасибо за эти Xapp, их я как раз не читал.
Я бегло просмотрел их, и как я понял если частоты bit clock и frame clock никак не связанны временным соотношением с данными (соотношение может быть любым и разным при каждом включении питания) то эти варианты неприменимы.
Алга
У меня за основу принят xapp585. В системе 4 отдельных корпуса АЦП другого типа. Все работает.
Начинал с харр524, Казалось будет проще. Но в итоге отказался и перешел на xapp585.

Не заметил один из вопросов. Как определяются границы бита?
Принимаются данные через сердес и запоминаются Далее меняется задержка.
Но при очередной следующей задержке, если сменимись данные (код данных), то это означает что попали на фронт смены бита.
Так определяются границы задержек стабильного приема данных и вычисляется середина этого участка,
которая и окончательно устанавливается. Все это описано в xapp'ах и даже лучше.
Flip-fl0p
Цитата(Алга @ Oct 10 2017, 09:43) *
У меня за основу принят xapp585. В системе 4 отдельных корпуса АЦП другого типа. Все работает.
Начинал с харр524, Казалось будет проще. Но в итоге отказался и перешел на xapp585.

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

Понятно, я точно-так же и калибруюсь bb-offtopic.gif .
Art55555
Цитата(Алга @ Oct 10 2017, 09:43) *
У меня за основу принят xapp585. В системе 4 отдельных корпуса АЦП другого типа. Все работает.
Начинал с харр524, Казалось будет проще. Но в итоге отказался и перешел на xapp585.

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


Отправил Вам в личку сообщение. Посмотрите, плз. Спасибо!
Tausinov
Цитата(Flip-fl0p @ Oct 9 2017, 23:04) *
А можно про этот процесс чуть подробнее ?
Допустим есть некий АЦП который управляется по SPI.
Мы либо запускаем АЦП в "нормальном" режиме - когда он гонит данные.
Либо запускаем АПЦ в режиме калибровки - когда он гонит тестовую последовательность.
Читал доки от xilinx но так и не понял как определяются границы бита, чтобы выставить клок в центр данных.



Пропускаем данные через блоки IDELAYE2, перебираем все возможные задержки. Засекаем две задержки - минимальную и максимальную, при которых тестовая последовательность или счетчик проходят тест. Берем ту, что по середине - попадаем на центр окна.
Flip-fl0p
Цитата(Tausinov @ Oct 18 2017, 15:18) *
Пропускаем данные через блоки IDELAYE2, перебираем все возможные задержки. Засекаем две задержки - минимальную и максимальную, при которых тестовая последовательность или счетчик проходят тест. Берем ту, что по середине - попадаем на центр окна.

Спасибо. Главное для себя узнал, поскольку практически во всех вариантах определения границ бита мы анализируем данные и на основании принятых данныех делаем вывод о границах бита.
Я просто думал, может есть какая "хитрая" схема по типу фазового детектора, где мы не данные смотрим, а обнаруживаем сам факт изменения бита. На медленной скорости приема за счет какого-нибудь oversampling - это не проблема совсем. А вот на скоростях приёма, близких к предельным для ПЛИС, этот вариант не подходит.
Art55555
Сделал 2 различных варианта работы.
Пробовал как в XAPP 524, так и и по XAPP585.
В обоих документах калибровка начинается с "выравнивания" такта.
Про данные позже.
Вход защёлкнут IBUFGDS. Далее так идёт на IDELAY2, выходит задержанный сигнал, идёт на вход DDLY ISERDES. Выход, который О, раздваивается на IOBUF (нужен в качестве быстрого такта для ISERDESов) и на BUFR (делит на 4) и используеся в качестве делённой частоты, также идёт на ISERDESы. Выход ISERDES анализируется.
Также отмечаю, что пробовал ещё несколько вариантов деления частоты, использования MMCM и др.
Подстройку провожу с помощью C и CE на IDELAYE2. Совершенно не нравится, что результат не меняется или меняется на 1 отчёт, а потом восстанавливаеся.
Поясню. В режиме защёлкивания такта DDR я всегда получаю значение 55. Если даю задержку (через VIO), то один такт получаю что-то типа 5E, а потом опять 55.
Если ставлю SDR, то итоговое значение FF, которое также не меняется - хоть на СЕ всегда подавай 1.

Один из вариантов кода привожу ниже.

x_dco0 : IBUFGDS
generic map (
DIFF_TERM => TRUE, -- Differential Termination
IBUF_LOW_PWR => TRUE, -- Low power (TRUE) vs. performance (FALSE) setting for referenced I/O standards
IOSTANDARD => "LVDS_25")
port map (
O => aclk, -- Clock buffer output
I => dco1p, -- Diff_p clock buffer input (connect directly to top-level port)
IB => dco1n -- Diff_n clock buffer input (connect directly to top-level port)
);

xIDELAY: IDELAYE2
generic map (
SIGNAL_PATTERN => "CLOCK",
REFCLK_FREQUENCY => 200.0,
HIGH_PERFORMANCE_MODE => "TRUE",
--FINEDELAY => "BYPASS",
DELAY_SRC => "IDATAIN",
CINVCTRL_SEL => "FALSE",
IDELAY_TYPE => "VARIABLE",
IDELAY_VALUE => 0,
PIPE_SEL => "FALSE"
)
port map (
DATAIN => '0',
IDATAIN => aclk,
DATAOUT => d_aclk,

C => aclk_div,
CE => set_idelay_dco,
INC => '1',
LD => '0',
CNTVALUEIN => "00000",
CNTVALUEOUT => open,-

REGRST => reset,
CINVCTRL => '0',
LDPIPEEN => '0'
);



BUFR_ins1 : BUFR
generic map (
BUFR_DIVIDE => "4", -- Values: "BYPASS, 1, 2, 3, 4, 5, 6, 7, 8"
SIM_DEVICE => "7SERIES" -- Must be set to "7SERIES"
)
port map (
O => aclk_div, -- 1-bit output: Clock output port
CE => '1', -- 1-bit input: Active high, clock enable (Divided modes only)
CLR => '0', -- 1-bit input: Active high, asynchronous clear (Divided modes only)
I => IntBitClk -- 1-bit input: Clock buffer input driven by an IBUFG, MMCM or local interconnect
);

xCLK_FB_inv: bufio port map ( i => IntBitClk, o => aclk_int ); --FB
aclk_int_n<=not aclk_int;

xISERDES111: ISERDESE2
generic map (
SERDES_MODE => "MASTER",
INTERFACE_TYPE => "NETWORKING",
IOBDELAY => "IBUF",
DATA_RATE => "DDR",
DATA_WIDTH => 8,
DYN_CLKDIV_INV_EN => "FALSE",
DYN_CLK_INV_EN => "FALSE",
NUM_CE => 1,
OFB_USED => "FALSE",
INIT_Q1 => '0',
INIT_Q2 => '0',
INIT_Q3 => '0',
INIT_Q4 => '0',
SRVAL_Q1 => '0',
SRVAL_Q2 => '0',
SRVAL_Q3 => '0',
SRVAL_Q4 => '0'
)
port map (
-- Registered outputs
Q1 => dco_calib_out(0),
Q2 => dco_calib_out(1),
Q3 => dco_calib_out(2),
Q4 => dco_calib_out(3),
Q5 => dco_calib_out(4),
Q6 => dco_calib_out(5),
Q7 => dco_calib_out(6),
Q8 => dco_calib_out(7),
-- Unregistered output
O => IntBitClk, --ser_dat(ii),
-- Carry out for bit expansion
SHIFTOUT1 => open,
SHIFTOUT2 => open,
-- Serial data in from PAD or IODELAY
D => '0',-- aclk,--'0',
DDLY => d_aclk,--d_aclk,
-- Carry in for bit expansion
SHIFTIN1 => '0',
SHIFTIN2 => '0',
-- Clock signals
CLK => aclk_int,-- high-speed clock
CLKB => aclk_int_n, -- inverted clock
CLKDIV => aclk_div,-- divided clock
-- Clock enable
CE1 => '1',
CE2 => '0',
-- Reset
RST => reset, --rst(i),
--- NOT USED
BITSLIP => '0', -- bitslip operation-------------------
OCLK => '0', -- high-speed clock
OCLKB => '0', -- inverted clock

DYNCLKSEL => '0',
DYNCLKDIVSEL => '0',
CLKDIVP => '0',
OFB => '0' -- feedback path

);

dco_calib_out_t<=dco_calib_out;

Алга
Примитив IDELAYCTRL в системе заведен?
Можно проверить работает ли IDELAYE2,
увеличили значение задержки посмотрели на выходах CNTVALUEOUT код задержки. Все коды должны быть стабильны.
Art55555
Цитата(Алга @ Oct 18 2017, 20:39) *
Примитив IDELAYCTRL в системе заведен?
Можно проверить работает ли IDELAYE2,
увеличили значение задержки посмотрели на выходах CNTVALUEOUT код задержки. Все коды должны быть стабильны.


В данной реализации НЕ заведён, но в ряде предыдущих был однозначно. Не могу сказать, что что-то изменилось после этого. Тем не менее, сегодня его вставлю, отпишусь.

По поводу CNTVALUEOUT-вчера заводит длятеста IN (результат такой же, как и с инкрементом задержки на 1/32), OUT же оставил открытым, сегодня проверю.
Спасибо!
Timmy
Цитата(Art55555 @ Oct 19 2017, 01:56) *
В данной реализации НЕ заведён, но в ряде предыдущих был однозначно. Не могу сказать, что что-то изменилось после этого. Тем не менее, сегодня его вставлю, отпишусь.

По поводу CNTVALUEOUT-вчера заводит длятеста IN (результат такой же, как и с инкрементом задержки на 1/32), OUT же оставил открытым, сегодня проверю.
Спасибо!

Дизайн этот странный какой-то. Вы заводите на вход данных SERDES задержанный клок, и на вход клока SERDES тот же самый задержанный клок, естественно, изменение задержки не будет менять значения на выходах SERDES. И ещё непонятно, зачем пропускать клок через IBUFGDS(он же вроде BUFG вставляет) а потом ещё и через SERDES, а не прямо по цепочке IBUFDS -> IDELAY -> (BUFIO, BUFR параллельно)
Алга
Напомню, что к xapp524,585 есть исходники как пример (как и к другим xapp'ам). Можно скачать и посмотреть.
Также история вопроса (идеи) начинается с xapp855,856,860, 774, 1064 по мере появления новых семейств.
В том смысле что примеры более простые.
Art55555
Цитата(Timmy @ Oct 19 2017, 09:34) *
Дизайн этот странный какой-то. Вы заводите на вход данных SERDES задержанный клок, и на вход клока SERDES тот же самый задержанный клок, естественно, изменение задержки не будет менять значения на выходах SERDES. И ещё непонятно, зачем пропускать клок через IBUFGDS(он же вроде BUFG вставляет) а потом ещё и через SERDES, а не прямо по цепочке IBUFDS -> IDELAY -> (BUFIO, BUFR параллельно)



Это скрин от XAPP524, выход SERDES идёт на клоковые буферы, а при выходе из компонента сразу заводится на вход.
Нажмите для просмотра прикрепленного файла

По поводу IBUFGDS. Такт приходит с клоковых ног, и из P и N я делаю общий глобальный клок. Или я что-то не так понимаю? ))

В итоге, как подключать-то?
Алга
Надо пока доверять xapp'у (исходникам) и проверять.
В скрин не попали аттрибуты SERDESE2, важно состояние аттрибута IOBDELAY= (NONE,IBUF,IFD, BOTH),
ug471, p.157. Тогда на выходах SERDESE2 разная ситуация.
На фиг6 xapp'a неточность.
Art55555
Учёл все рекомендации.
Результат такой же.
Сигнал dco_calib_out ВСЕГДА равен AA. Пробовал менять задержку через CNTVALUEIN - ничего не меняется. Если же пытаюсь подстраиваться через CE/INC, то на 1 такт АА превращается в BA. Не фиксируется. Код ниже.

x_dco0 : IBUFDS
generic map (
DIFF_TERM => TRUE, -- Differential Termination
IBUF_LOW_PWR => TRUE, -- Low power (TRUE) vs. performance (FALSE) setting for referenced I/O standards
IOSTANDARD => "LVDS_25")
port map (
O => aclk, -- Clock buffer output
I => dco1p, -- Diff_p clock buffer input (connect directly to top-level port)
IB => dco1n -- Diff_n clock buffer input (connect directly to top-level port)
);


xIDELAY: IDELAYE2
generic map (
SIGNAL_PATTERN => "CLOCK",
REFCLK_FREQUENCY => 200.0,
HIGH_PERFORMANCE_MODE => "TRUE",
--FINEDELAY => "BYPASS",
DELAY_SRC => "IDATAIN",
CINVCTRL_SEL => "FALSE",
IDELAY_TYPE => "VARIABLE",
IDELAY_VALUE => 0,
PIPE_SEL => "FALSE"
)
port map (
DATAIN => '0',--,
IDATAIN => aclk,
DATAOUT => d_aclk,

C => CLK,
CE => set_idelay_dco,
INC => '1',
LD => ld_dco_delay,
CNTVALUEIN => dco_delay,
CNTVALUEOUT => open,

REGRST => reset,
CINVCTRL => '0',
LDPIPEEN => '0'
);

bufio_adc: buf port map ( i => d_aclk, o => aclk_main ); --FB

BUFR_ins1 : BUFR
generic map (
BUFR_DIVIDE => "4", -- Values: "BYPASS, 1, 2, 3, 4, 5, 6, 7, 8"
SIM_DEVICE => "7SERIES" -- Must be set to "7SERIES"
)
port map (
O => aclk_div, -- 1-bit output: Clock output port
CE => '1', -- 1-bit input: Active high, clock enable (Divided modes only)
CLR => '0', -- 1-bit input: Active high, asynchronous clear (Divided modes only)
I => d_aclk -- 1-bit input: Clock buffer input driven by an IBUFG, MMCM or local interconnect
);

-- x_IDELAYCTRL : IDELAYCTRL
-- port map (REFCLK => clk, RST => reset, RDY => AdcIdlyCtrlRdy);


xISERDES111: ISERDESE2
generic map (
SERDES_MODE => "MASTER",
INTERFACE_TYPE => "NETWORKING",
IOBDELAY => "Both",
DATA_RATE => "DDR",
DATA_WIDTH => 8,
DYN_CLKDIV_INV_EN => "FALSE",
DYN_CLK_INV_EN => "FALSE",
NUM_CE => 1,
OFB_USED => "FALSE",
INIT_Q1 => '0',
INIT_Q2 => '0',
INIT_Q3 => '0',
INIT_Q4 => '0',
SRVAL_Q1 => '0',
SRVAL_Q2 => '0',
SRVAL_Q3 => '0',
SRVAL_Q4 => '0'
)
port map (
-- Registered outputs
Q1 => dco_calib_out(0),
Q2 => dco_calib_out(1),
Q3 => dco_calib_out(2),
Q4 => dco_calib_out(3),
Q5 => dco_calib_out(4),
Q6 => dco_calib_out(5),
Q7 => dco_calib_out(6),
Q8 => dco_calib_out(7),
-- Unregistered output
O => open,--IntBitClk, --ser_dat(ii),
-- Carry out for bit expansion
SHIFTOUT1 => open,
SHIFTOUT2 => open,
-- Serial data in from PAD or IODELAY
D => aclk,--'0',
DDLY => '0', --d_aclk,--d_aclk,
-- Carry in for bit expansion
SHIFTIN1 => '0',
SHIFTIN2 => '0',
-- Clock signals
CLK => aclk_main,-- high-speed clock
CLKB => not aclk_main, -- inverted clock
CLKDIV => aclk_div,-- divided clock
-- Clock enable
CE1 => '1',
CE2 => '0',
-- Reset
RST => reset, --rst(i),
--- NOT USED
BITSLIP => '0', -- bitslip operation-------------------
OCLK => '0', -- high-speed clock
OCLKB => '0', -- inverted clock

DYNCLKSEL => '0',
DYNCLKDIVSEL => '0',
CLKDIVP => '0',
OFB => '0' -- feedback path

);

dco_calib_out_t<=dco_calib_out;
Алга
В ручном режиме нужно добиться, что у вас работает установка задержки IDELAYE2
путем ее проверки на выходе.
На входе С, Клок на этом примитиве CLK(???-что за сигнал )- должен aclk_div.
Все другие управлениющие сигналы (для idelaye2 iserdese2) производЯтся синхронно с этим сигналом.
Он становится основным клоковым сигналом.
Потом проверить наличие этого сигнала. Какова его частота.
Также нужно следить за установкой аттрибута IDELAY_TYPE (fixed, variable, var_load and etc) IDELAYE2.
Art55555
Цитата(Алга @ Oct 20 2017, 09:38) *
В ручном режиме нужно добиться, что у вас работает установка задержки IDELAYE2
путем ее проверки на выходе.
На входе С, Клок на этом примитиве CLK(???-что за сигнал )- должен aclk_div.
Все другие управлениющие сигналы (для idelaye2 iserdese2) производЯтся синхронно с этим сигналом.
Он становится основным клоковым сигналом.
Потом проверить наличие этого сигнала. Какова его частота.
Также нужно следить за установкой аттрибута IDELAY_TYPE (fixed, variable, var_load and etc) IDELAYE2.


С - это основной клоковый сигнал (100 МГц), в данной реализации просто стоит здесь. Заменил на aclk_div. В прошлых реализациях пробовал его. Работает также. Сейчас проверим. А по настройке IDELAY_TYPE variable подойдёт?
Алга
Подходит для INC/DEC режима. Если прямая загрузка кода задержки со входов, то режим VAR_LOAD.
Далее С- это clk у вас 100 МГЦ, надо 200 Мгц поскольку нужен для управления IDELAYCTRL.
Art55555
Цитата(Алга @ Oct 20 2017, 11:29) *
Подходит для INC/DEC режима. Если прямая загрузка кода задержки со входов, то режим VAR_LOAD.
Далее С- это clk у вас 100 МГЦ, надо 200 Мгц поскольку нужен для управления IDELAYCTRL.


Поправил, ещё такой вопрос. Я првильнопонимаю, что BUFR должны делить на 8 в моём случае?



Алга
Не совсем.
BUFR делит на 4. Поскольку ISERDESE2 в данном случае принимает только 8 бит и в DDR режиме.
Если АЦП в DDR режиме также.
Art55555
Цитата(Алга @ Oct 23 2017, 14:30) *
Не совсем.
BUFR делит на 4. Поскольку ISERDESE2 в данном случае принимает только 8 бит и в DDR режиме.
Если АЦП в DDR режиме также.


В итоге получается вот что.
Результат - всё тот же АА на выходе.. какое бы значение я бы не задавал.
Сигнал dco_calib_out_t должен отправляться на вход калибровочной машины. И там всегда АА.


x_dco0 : IBUFDS
generic map (
DIFF_TERM => TRUE, -- Differential Termination
IBUF_LOW_PWR => TRUE, -- Low power (TRUE) vs. performance (FALSE) setting for referenced I/O standards
IOSTANDARD => "LVDS_25")
port map (
O => aclk, -- Clock buffer output
I => dco1p, -- Diff_p clock buffer input (connect directly to top-level port)
IB => dco1n -- Diff_n clock buffer input (connect directly to top-level port)
);


xIDELAY: IDELAYE2
generic map (
SIGNAL_PATTERN => "CLOCK",
REFCLK_FREQUENCY => 200.0,
HIGH_PERFORMANCE_MODE => "TRUE",
--FINEDELAY => "BYPASS",
DELAY_SRC => "IDATAIN",
CINVCTRL_SEL => "FALSE",
IDELAY_TYPE => "VAR_LOAD",--"VARIABLE",
IDELAY_VALUE => 0,
PIPE_SEL => "FALSE"
)
port map (
DATAIN => '0',--,
IDATAIN => aclk,
DATAOUT => d_aclk,

C => aclk_div,
CE => set_idelay_dco,
INC => '1',
LD => ld_dco_delay,
CNTVALUEIN => dco_delay,
CNTVALUEOUT => open,

REGRST => not AdcIdlyCtrlRdy,
CINVCTRL => '0',
LDPIPEEN => '0'
);

bufio_adc: buf port map ( i => d_aclk, o => aclk_main ); --FB

BUFR_ins1 : BUFR
generic map (
BUFR_DIVIDE => "4", -- Values: "BYPASS, 1, 2, 3, 4, 5, 6, 7, 8"
SIM_DEVICE => "7SERIES" -- Must be set to "7SERIES"
)
port map (
O => aclk_div, -- 1-bit output: Clock output port
CE => '1', -- 1-bit input: Active high, clock enable (Divided modes only)
CLR => '0', -- 1-bit input: Active high, asynchronous clear (Divided modes only)
I => d_aclk -- 1-bit input: Clock buffer input driven by an IBUFG, MMCM or local interconnect
);

x_IDELAYCTRL : IDELAYCTRL
port map (REFCLK => clk, RST => reset, RDY => AdcIdlyCtrlRdy);


xISERDES111: ISERDESE2
generic map (
SERDES_MODE => "MASTER",
INTERFACE_TYPE => "NETWORKING",
IOBDELAY => "Both",
DATA_RATE => "DDR",
DATA_WIDTH => 8,
DYN_CLKDIV_INV_EN => "FALSE",
DYN_CLK_INV_EN => "FALSE",
NUM_CE => 1,
OFB_USED => "FALSE",
INIT_Q1 => '0',
INIT_Q2 => '0',
INIT_Q3 => '0',
INIT_Q4 => '0',
SRVAL_Q1 => '0',
SRVAL_Q2 => '0',
SRVAL_Q3 => '0',
SRVAL_Q4 => '0'
)
port map (
-- Registered outputs
Q1 => dco_calib_out(0),
Q2 => dco_calib_out(1),
Q3 => dco_calib_out(2),
Q4 => dco_calib_out(3),
Q5 => dco_calib_out(4),
Q6 => dco_calib_out(5),
Q7 => dco_calib_out(6),
Q8 => dco_calib_out(7),
-- Unregistered output
O => open,--IntBitClk, --ser_dat(ii),
-- Carry out for bit expansion
SHIFTOUT1 => open,
SHIFTOUT2 => open,
-- Serial data in from PAD or IODELAY
D => aclk,--'0',
DDLY => '0', --d_aclk,--d_aclk,
-- Carry in for bit expansion
SHIFTIN1 => '0',
SHIFTIN2 => '0',
-- Clock signals
CLK => aclk_main,-- high-speed clock
CLKB => not aclk_main, -- inverted clock
CLKDIV => aclk_div,-- divided clock
-- Clock enable
CE1 => '1',
CE2 => '0',
-- Reset
RST => reset, --rst(i),
--- NOT USED
BITSLIP => '0', -- bitslip operation-------------------
OCLK => '0', -- high-speed clock
OCLKB => '0', -- inverted clock

DYNCLKSEL => '0',
DYNCLKDIVSEL => '0',
CLKDIVP => '0',
OFB => '0' -- feedback path

);

dco_calib_out_t<=dco_calib_out;
Алга
АЦП при этом какую частоту на выходе DCO выдает? FCO?

Пробуем IBUFDS аттрибут IBUF_LOW_PWR => FALSE,
Art55555

AD9681 работает в режиме 011 = DDR two-lane, bytewise. Впрочем, смена режимов ничего не даёт.

Пробуем IBUFDS аттрибут IBUF_LOW_PWR => FALSE,[/quote]

Пробую. Результат через 15 минут.

Цитата(Art55555 @ Oct 23 2017, 17:33) *
Пробую. Результат через 15 минут.


не помогло((

[quote name='Алга' date='Oct 23 2017, 16:36' post='1525596']
АЦП при этом какую частоту на выходе DCO выдает? FCO?

Нажмите для просмотра прикрепленного файла
Алга
Атрибут оставьте в этом состоянии.
Проверяем частоту aclk_div. Какая она? Реальная ...на вашем железе.
Art55555
Цитата(Алга @ Oct 23 2017, 17:46) *
Атрибут оставьте в этом состоянии.
Проверяем частоту aclk_div. Какая она? Реальная ...на вашем железе.


Атрибут оставил.
А как его проверишь - то? Я сделал по нему счётчик - бежит, всё в порядке.
Алга
Вывести его на вывод и
Промерить частоту, допустим осциллографом. Потом пронаблюдать этот сигнал стабилен или нет.
Art55555
Цитата(Алга @ Oct 23 2017, 18:02) *
Вывести его на вывод и
Промерить частоту, допустим осциллографом. Потом пронаблюдать этот сигнал стабилен или нет.


Ладно это я посмотрю.
А настройки DDR/SDR 8 бит выход правильно заданы?


Цитата(Art55555 @ Oct 23 2017, 18:19) *
Ладно это я посмотрю.
А настройки DDR/SDR 8 бит выход правильно заданы?


1. Мне не нравится вообще число АА. Ведь мы должны получать все 1 или все 0?
2. Сейчас мы делаем так. Принятый сигнал отправляем на IDELAYE2 для формирования. Из задержанного делаем aclk_main и aclk_div. А на вход D ISERDESE2 подаём "чистый" принятый сигнал aclk, после. Правильно ли это? Может, из "чистого" (несдвинутого) делать aclk_main и aclk_div, ими защёлкивать, а сдвинутый подавать на ISERDESE2 ?
Art55555
Ещё одно наблюдение.
Если вывести режим ацп с 2-кратной скоростью в 21 регистр подать значение 40 (100 = DDR one-lane, wordwise), то значение выходного ISERDES2 помучается FF. На сигналы LD и CNTVALUEIN по-прежнему реакции нет, а вот, если подать '1' на СЕ, то измение есть, только 1 такт, такое ощущение, что реально не задерживается ничего. Если подать на СЕ единицы на постоянную, то видим, что FF часто сменяются FE, но если единицу убрать, то опять всё возвращается на FF.
Ситуация на том же месте в итоге((
Tausinov
Цитата(Art55555 @ Oct 23 2017, 16:55) *
Атрибут оставил.
А как его проверишь - то? Я сделал по нему счётчик - бежит, всё в порядке.


Способ ненадежный - сделать делитель на этой частоте, формирующий моргание диодиком раз в секунду. Оцениваем глазами. При относительно большой погрешности все сразу станет видно.
Способ надежный, но чуть более трудоемкий - параллельно запускаем пару счетчиков. Один на частоте, которую заведомо знаем и уверены в ней, второй - на частоте, которая нас интересует. Зная значения счетчиков и одной из частот, легко находим вторую.
Алга
Цитата
Мне не нравится вообще число АА. Ведь мы должны получать все 1 или все 0?

Должно быть стабильные АА и 55 и нестабильные переходы.

Примитив IDELAYE2 работает в нескольких режимах. Если меняется управление, то надо менять и аттрибут IDELAY_TYPE.
Пока он нормально и стабильно не заработает- результата не будет.
И поэтому устанавливаем IDELAYE2 только в режим загрузки
(Сигналы INC и СЕ занулить) и шаг за шагом, устанавливается код задержки, проверяем его на выходе,
смотрим код что есть на выходе ISERDESE2.
Еще внимательно с сигналами сброса. Их также надо проверять и видеть.
Art55555
Что сделано.
1. Заменил тип на VAR_LOAD
2. Подал такт clk_200 с PLL, образованный из начальной 100 МГц путём умножения.
3. Занулил СЕ, INC.

Чего добились:
1. Наконец-то начал реагировать выход ISERDESE2.

Чего не добились:
"ЧИстых" 55 и АА, которые были раньше.

НАблюдения:
После старта платы перевожу в режим 21 регистр значение 30.
После этого видим "грязный" выход - 55. Теперь чистым он никогда не бывает. Дальше я играюсь сигналом CNTVALUEIN=> dco_delay (подаю с VIO) от 00 до 1F. От 55 мы потихоньку переходим к FF-F7 и уже к значению 1D получаем стабильный FF на выходе. Причём, если я прибаляю 1, т.е. на 1E - выход портится (FF-F7 вперемешку), прибавляю ещё 1 (1F) и опять вижу стабильный FF на выходе.
Т.е явного окна (плохо - умеренно- хорошо-умеренно-плохо) я ни вижу.
Также бывает, что при определённых значениях задержки вообще перестаёт работать Chipscope, который тактируется по aclk_div.
И ещё явный косяк с частотами, мне кажется. Сейчас проверяю зависимость между aclk_div и clk_200.
Текущий код ниже.









x_dco0 : IBUFDS
generic map (
DIFF_TERM => TRUE, -- Differential Termination
IBUF_LOW_PWR => FALSE, -- Low power (TRUE) vs. performance (FALSE) setting for referenced I/O standards
IOSTANDARD => "LVDS_25")
port map (
O => aclk, -- Clock buffer output
I => dco1p, -- Diff_p clock buffer input (connect directly to top-level port)
IB => dco1n -- Diff_n clock buffer input (connect directly to top-level port)
);


xIDELAY: IDELAYE2
generic map (
SIGNAL_PATTERN => "CLOCK",
REFCLK_FREQUENCY => 200.0,
HIGH_PERFORMANCE_MODE => "TRUE",
--FINEDELAY => "BYPASS",
DELAY_SRC => "IDATAIN",
CINVCTRL_SEL => "FALSE",
IDELAY_TYPE => "var_load",--"VARIABLE",
IDELAY_VALUE => 0,
PIPE_SEL => "FALSE"
)
port map (
DATAIN => '0',--,
IDATAIN => aclk,
DATAOUT => d_aclk,

C => clk_200, --200 MHz
CE => '0',
INC => '0',
LD => ld_dco_delay, --идет с VIO
CNTVALUEIN => dco_delay, --идет с VIO
CNTVALUEOUT => open,

REGRST => not AdcIdlyCtrlRdy,--'0',--
CINVCTRL => '0',
LDPIPEEN => '0'
);

bufio_adc: bufg port map ( i => d_aclk, o => aclk_main ); --FB
bufio_adc200: bufg port map ( i => clk_200i, o => clk_200 ); --FB

BUFR_ins1 : BUFR
generic map (
BUFR_DIVIDE => "4", -- Values: "BYPASS, 1, 2, 3, 4, 5, 6, 7, 8"
SIM_DEVICE => "7SERIES" -- Must be set to "7SERIES"
)
port map (
O => aclk_div, -- 1-bit output: Clock output port
CE => '1', -- 1-bit input: Active high, clock enable (Divided modes only)
CLR => '0', -- 1-bit input: Active high, asynchronous clear (Divided modes only)
I => d_aclk -- 1-bit input: Clock buffer input driven by an IBUFG, MMCM or local interconnect
);



x_IDELAYCTRL : IDELAYCTRL
port map (REFCLK => clk, RST => reset, RDY => AdcIdlyCtrlRdy);


xISERDES111: ISERDESE2
generic map (
SERDES_MODE => "MASTER",
INTERFACE_TYPE => "NETWORKING",
IOBDELAY => "Both",
DATA_RATE => "DDR",
DATA_WIDTH => 8,
DYN_CLKDIV_INV_EN => "FALSE",
DYN_CLK_INV_EN => "FALSE",
NUM_CE => 1,
OFB_USED => "FALSE",
INIT_Q1 => '0',
INIT_Q2 => '0',
INIT_Q3 => '0',
INIT_Q4 => '0',
SRVAL_Q1 => '0',
SRVAL_Q2 => '0',
SRVAL_Q3 => '0',
SRVAL_Q4 => '0'
)
port map (
-- Registered outputs
Q1 => dco_calib_out(0),
Q2 => dco_calib_out(1),
Q3 => dco_calib_out(2),
Q4 => dco_calib_out(3),
Q5 => dco_calib_out(4),
Q6 => dco_calib_out(5),
Q7 => dco_calib_out(6),
Q8 => dco_calib_out(7),
-- Unregistered output
O => open,--IntBitClk, --ser_dat(ii),
-- Carry out for bit expansion
SHIFTOUT1 => open,
SHIFTOUT2 => open,
-- Serial data in from PAD or IODELAY
D => aclk,--'0',
DDLY => '0', --d_aclk,--d_aclk,
-- Carry in for bit expansion
SHIFTIN1 => '0',
SHIFTIN2 => '0',
-- Clock signals
CLK => aclk_main,-- high-speed clock
CLKB => not aclk_main, -- inverted clock
CLKDIV => aclk_div,-- divided clock
-- Clock enable
CE1 => '1',
CE2 => '0',
-- Reset
RST => reset, --rst(i),
--- NOT USED
BITSLIP => '0', -- bitslip operation-------------------
OCLK => '0', -- high-speed clock
OCLKB => '0', -- inverted clock

DYNCLKSEL => '0',
DYNCLKDIVSEL => '0',
CLKDIVP => '0',
OFB => '0' -- feedback path

);

dco_calib_out_t<=dco_calib_out when rising_edge(aclk_div);
Алга
Clk_200 подается только на IDELAYCTRL.
На IDELAYE2 на вход С надо подавать aclk_div.
Все Управляющие сигналы формируются синхронно с эим сигналом.
Алга
Для Chipscope может быть пробовать aclk_div пропустить через bufg.

Какая частота дискретизации АЦП?
Как сделана трассировка платы Выравнены ли по длине диф. сигналы клоков и данных?

Можно пробовать еще ISERDESE2 перевести в режим SDR. Тогда на выходе будем иметь "0..0" или "1..1"
взависимости от кода задержки.
В этом xapp'e производится подстройка к переднему фронту клока,
что означает установка клока в центр (середину) принимаемых данных.
Art55555
Наблюдения следующие.

Если ставим BUFR divide=4, то работает корректно только в режиме 21-40
0x40 16-bit 1× DDR one-lane, wordwise 8 × fS Figure 7 (р.38 из datasheet на АЦП). Калибруется, выхожу на стабильные значения FF или АА.

если же в стандартном режиме 21-30 (0x30 16-bit 1× DDR two-lane, bytewise 4 × fS Figure 3 (default setting)) , то никаких 55 мы не видим. То 00, то 80, то каша.
Что-то явно с тактированием или пониманием тактирования.

Да, я сделал 2 счётчика. Один через PLL подал 100 на вход, получил 200 на выоде, счётчик по нему.
Второй по aclk_div.

Так вот, счётчик по aclk_div (при BUFR divide=4 идёт в 2 раза быстрее цлк-шного)...
В режиме 21-40 -одинаковая скорость.
Алга

Можно пробовать еще ISERDESE2 перевести в режим SDR.


Цитата
Какая частота дискретизации АЦП?
Как сделана трассировка платы Выравнены ли по длине диф. сигналы клоков и данных?


Если частота дискретизации относительно низкая может способ не работает. Просто не хватать величины задержки.
Нужно указать полные условия.

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