Перейти к содержанию
    

Прием данных с АЦП AD9681

Что сделано.

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);

Изменено пользователем Art55555

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Clk_200 подается только на IDELAYCTRL.

На IDELAYE2 на вход С надо подавать aclk_div.

Все Управляющие сигналы формируются синхронно с эим сигналом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для Chipscope может быть пробовать aclk_div пропустить через bufg.

 

Какая частота дискретизации АЦП?

Как сделана трассировка платы Выравнены ли по длине диф. сигналы клоков и данных?

 

Можно пробовать еще ISERDESE2 перевести в режим SDR. Тогда на выходе будем иметь "0..0" или "1..1"

взависимости от кода задержки.

В этом xapp'e производится подстройка к переднему фронту клока,

что означает установка клока в центр (середину) принимаемых данных.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Наблюдения следующие.

 

Если ставим 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.

 

 

Какая частота дискретизации АЦП?

Как сделана трассировка платы Выравнены ли по длине диф. сигналы клоков и данных?

 

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

Нужно указать полные условия.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А мне интересно, вы результаты DRC в Вивадо смотрите? Все ваши варианты кода должны были вызывать предупреждения DRC, в последнем варианте тоже есть серьёзная ошибка.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А мне интересно, вы результаты DRC в Вивадо смотрите? Все ваши варианты кода должны были вызывать предупреждения DRC, в последнем варианте тоже есть серьёзная ошибка.

 

Unsupported clocking topology used for ISERDESE2

<xISERDES111>. This can result in corrupted data. The CLK / CLKDIV pins

should be driven by the same source through the same buffer type or by a

BUFIO / BUFR combination in order to have a proper phase relationship. Please

refer to the Select I/O User Guide for supported clocking topologies of the

chosen INTERFACE_TYPE mode.

 

 

Вы про это?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, именно про это.

 

Не понятно как это исправить только, ведь сейчас выход задержанного клока подключён и к BUFR и к BUFG. Как быть - то тогда?

 

 

Изменено пользователем Art55555

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не понятно как это исправить только, ведь сейчас выход задержанного клока подключён и к BUFR и к BUFG. Как быть - то тогда?

 

Это исправил. Но данные по-прежнему некрасивые(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нужно вернуться к проверке частоты 200Мнц. Подозрения, что она правильно формируется на PLL.

Понять и проверить частоты (клоки) АЦП и др входные, поскольку их надо будет точно описать в констрейн файле.

Все должно стыковаться.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всем добрый день!

Всё работает, но есть одна проблема. 

При включении на "холодную" (плата долго не работала) калибруется ОЧЕНЬ долго (минуту и более), но всегда в итоге всё хорошо, сигнал выдаётся такой, какой и должен быть. 

Если же включать уже нагретую плату, то калибруется менее секунды.

Кто-нибудь встречал такой эффект?

Есть идеи в чём может быть проблема?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как удалось решить все проблемы? Мне предстоит сопрягаться с AD9253, хотелось бы обозначить решение проблем для себя 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...