Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблемы с LVDS приемником.
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
torik
Всем привет.

Пытаюсь получить данные от АЦП по LVDS. Ква 12.1, Arria GX

Сперва поставил просто altlvds_rx в режиме с внешней PLL. 8 бит данных два канала.

Выходные данные регистрирую по клоку, в 4 раза ниже чем входной клок данных. Ну и кручу фазу этого клока. В сигналтабе наблюдаю постоянно неверные данные - что-нибудь постоянно на 1 бит смещено. Например вместо 0xC1F0 получаю 0x071E, 0xC187 и т.п. Вроде близко, но не то...

Попробовал то что предлагается вот тут:

http://electronix.ru/forum/index.php?showt...p;#entry1130910

Результат точно такой же.




Попробовал в сигналтаб добавить непосредственно входы LVDS и смотреть на высокой частоте. При этом клоки вижу, а на данных всегда 0 висит. В сигналтабе вообще можно LVDS смотреть?

vadimuzzz
тот пример, что я приводил, требует правильных констрейнов на i/o (описанные симптомы наблюдал именно с кривыми/отсутствующими констрейнами). lvds смотреть можно, но если у вас ввод по обоим фронтам идет, то надо цеплять выходы ddr-регистров.
torik
констрейны, признаюсь, пока не прописал. Есть вариант констрейнов для вашего примера?
vadimuzzz
Код
# 120 MHz
#**************************************************************
create_clock -name virtual_source -period 8.333
create_clock -name adc1_lclk -period 8.333 -waveform { 2.083 6.25 } [get_ports {adc1_lclk}]
set_clock_groups -exclusive -group [list adc1_lclk virtual_source]
#**************************************************************
set adc_tCO 0.25
set_input_delay -clock virtual_source -max $adc_tCO [get_ports {adc1_data* adc1_fclk}]
set_input_delay -clock virtual_source -min 0 [get_ports {adc1_data* adc1_fclk}]
set_input_delay -clock virtual_source -clock_fall -max $adc_tCO [get_ports {adc1_data* adc1_fclk}] -add_delay
set_input_delay -clock virtual_source -clock_fall -min 0 [get_ports {adc1_data* adc1_fclk}] -add_delay
#**************************************************************
set_false_path -setup -fall_from [get_clocks virtual_source] -rise_to [get_clocks adc1_lclk]
set_false_path -setup -rise_from [get_clocks virtual_source] -fall_to [get_clocks adc1_lclk]
set_false_path -hold -rise_from [get_clocks virtual_source] -rise_to [get_clocks adc1_lclk]
set_false_path -hold -fall_from [get_clocks virtual_source] -fall_to [get_clocks adc1_lclk]

как-то так. lclk - битовый клок, fclk - фреймовый (выровнен с данными). клок и данные у меня выровнены на плате. но это для конкретных настроек АЦП (на определенную фазировку). в вашем случае м.б. иначе
gosu-art
А LVDS DDR работающие на вход можно заводить только на DQ пин? или на любые дифф ноги? Рисую схему под LTC2144.
vadimuzzz
Цитата(gosu-art @ Jan 28 2013, 15:08) *
А LVDS DDR работающие на вход можно заводить только на DQ пин? или на любые дифф ноги? Рисую схему под LTC2144.

на любые diffio
torik
Что-то с констрейнами не понимаю опять, помогите разобраться.
Переделываю под свою задачу с учетом:
- клок для АЦП формируется PLL, частота 40 МГц
- LVDS клок с АЦП 160 МГц, по фазе совпадает с клоком для АЦП
- данные с выхода LVDS приемника забираю клоком 40 МГц с той же PLL. Фазу кручу/вертю.

Код
create_clock -name virtual_source -period 6.25
create_clock -name adc1_lclk -period 6.25 -waveform { 0 3.125 } [get_ports {ADC1_TCK_A_p}]
set_clock_groups -exclusive -group [list adc1_lclk virtual_source]

set adc1_fclk AD9977_LINE_FORMER_inst|AD9977_LVDS_PLL_inst|altpll_component|pll|clk[0]

#**************************************************************
set adc_tCO 0.25
set_input_delay -clock virtual_source -max $adc_tCO [get_ports {ADC1_DOUT0_A_p* $adc1_fclk}]
set_input_delay -clock virtual_source -min 0 [get_ports {ADC1_DOUT0_A_p* $adc1_fclk}]
set_input_delay -clock virtual_source -clock_fall -max $adc_tCO [get_ports {ADC1_DOUT0_A_p* $adc1_fclk}] -add_delay
set_input_delay -clock virtual_source -clock_fall -min 0 [get_ports {ADC1_DOUT0_A_p* $adc1_fclk}] -add_delay
set_input_delay -clock virtual_source -max $adc_tCO [get_ports {ADC1_DOUT1_A_p* $adc1_fclk}]
set_input_delay -clock virtual_source -min 0 [get_ports {ADC1_DOUT1_A_p* $adc1_fclk}]
set_input_delay -clock virtual_source -clock_fall -max $adc_tCO [get_ports {ADC1_DOUT1_A_p* $adc1_fclk}] -add_delay
set_input_delay -clock virtual_source -clock_fall -min 0 [get_ports {ADC1_DOUT1_A_p* $adc1_fclk}] -add_delay
#**************************************************************
set_false_path -setup -fall_from [get_clocks virtual_source] -rise_to [get_clocks adc1_lclk]
set_false_path -setup -rise_from [get_clocks virtual_source] -fall_to [get_clocks adc1_lclk]
set_false_path -hold -rise_from [get_clocks virtual_source] -rise_to [get_clocks adc1_lclk]
set_false_path -hold -fall_from [get_clocks virtual_source] -fall_to [get_clocks adc1_lclk]


Получаю варнинги
Код
Warning (332174): Ignored filter at KAI02050_SYNC.sdc(33): $adc1_fclk could not be matched with a port
Warning (332060): Node: ADC2_TCK_B_p was determined to be a clock but was found without an associated clock assignment.


Как правильно прописать? adc1_fclk не порт, на что он и ругается...
vadimuzzz
так выкиньте этот fclk у себя. у меня он с ноги подавался, а у вас с pll. поэтому из списка в get_ports его исключите. нарисуйте диаграмку с таймингами, проверим
torik
Цитата
так выкиньте этот fclk у себя. у меня он с ноги подавался, а у вас с pll. поэтому из списка в get_ports его исключите.

Он как его, сам учтет?

Диаграмку с таймингами какую нарисовать, как сигналы с АЦП идут что ли?
vadimuzzz
Цитата(torik @ Jan 28 2013, 16:41) *
Он как его, сам учтет?

если derive_pll_clocks -create_base_clocks, то клоковый констрейн сам добавится. надо только добавить констрейн на переход из битового домена во фреймовый.
Цитата
Диаграмку с таймингами какую нарисовать, как сигналы с АЦП идут что ли?

ага, как там чего сфазировано
torik
derive_pll_clocks -create_base_clocks прописан.
Вот диаграмма из даташите. DOUTPHASEP = 0


К слову, дарнные стали приниматься правильно. Но клок на входе пришлось инвертировать (~ADC_TCK). Потому не уверен, насколько правильно написал констейны. Таймквест не ругается.
vadimuzzz
Цитата(torik @ Jan 28 2013, 17:38) *
Но клок на входе пришлось инвертировать (~ADC_TCK). Потому не уверен, насколько правильно написал констейны.

если вы на основе моего примера делаете, то обратите внимание на последний параметр в списке
Код
#(parameter ch_num = 8, ser_factor = 14, invert_input_clock = "OFF")

он определяет, какой перепад соответствует первому биту. можно поиграться ON/OFF. детали можно посмотреть в описании мегафункции altddio_in
torik
Я вернулся к altlvds, внутри которой вроде бы таже самая altddio_in. Просто насколько корректно вот так вот обращаться с клоком - взять и инвертировать...
doom13
Использовал в своём проекте мегафункцию alt_lvds для приёма данных с АЦП ADS6445 (4 канала, 2 дифпары на канал, frame-clock, bit-clock). Плата была косячно разведена: для данных попутана полярность, после приёма приходилось инвертировать линию, FCLK и DCLK заведены на обычные пины FPGA, не было возможности использовать alt_lvds. Сначала пробовал написать свой десериалайзер, но всё работало криво, данные принимались правильно при частоте DCLK порядка 100 МГц. Поэтому, чтобы чтобы заюзать alt_lvds линии FCLK и DCLK были перепаяны на тактовые входы (благо тактовые входы FPGA были выведены на светодиоды, не предполагалось их использование по-назначению). Всё стало нормально работать даже с использованием инвертирования линий данных, и без использования временных констрейнов (потом уже прописывал). Частота АЦП использовалась 61,44 МГц, т.е. DCLK 61.44 МГц * 8 = 491,52 МГц. Для правильного захвата данных (последовательности бит) использовался Nios, который по SPI управлял АЦП. Подавалась команда на синхронизацию, АЦП выставляла на каждом канале эталонную последовательность, после приёма, принятое значение сравнивалось с образцом, при несовпадении на alt_lvds подавался импульс сдвига на один бит, и так до тех пор, пока принимаемое значение не совпадало с образцом. Таким образом синхронизировался каждый из каналов.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.