|
|
  |
Проблемы с LVDS приемником., данные постоянно смещены |
|
|
|
Jan 28 2013, 06:38
|

Гуру
     
Группа: Свой
Сообщений: 2 113
Регистрация: 1-11-05
Пользователь №: 10 359

|
Всем привет. Пытаюсь получить данные от АЦП по 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 смотреть?
--------------------
Быть. torizin-liteha@yandex.ru
|
|
|
|
|
Jan 28 2013, 09:24
|

Гуру
     
Группа: Свой
Сообщений: 2 113
Регистрация: 1-11-05
Пользователь №: 10 359

|
Что-то с констрейнами не понимаю опять, помогите разобраться. Переделываю под свою задачу с учетом: - клок для АЦП формируется 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 не порт, на что он и ругается...
--------------------
Быть. torizin-liteha@yandex.ru
|
|
|
|
|
Jan 28 2013, 09:46
|

Гуру
     
Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988

|
Цитата(torik @ Jan 28 2013, 16:41)  Он как его, сам учтет? если derive_pll_clocks -create_base_clocks, то клоковый констрейн сам добавится. надо только добавить констрейн на переход из битового домена во фреймовый. Цитата Диаграмку с таймингами какую нарисовать, как сигналы с АЦП идут что ли? ага, как там чего сфазировано
|
|
|
|
|
Jan 28 2013, 11:39
|

Гуру
     
Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988

|
Цитата(torik @ Jan 28 2013, 17:38)  Но клок на входе пришлось инвертировать (~ADC_TCK). Потому не уверен, насколько правильно написал констейны. если вы на основе моего примера делаете, то обратите внимание на последний параметр в списке Код #(parameter ch_num = 8, ser_factor = 14, invert_input_clock = "OFF") он определяет, какой перепад соответствует первому биту. можно поиграться ON/OFF. детали можно посмотреть в описании мегафункции altddio_in
|
|
|
|
|
Jun 20 2013, 20:01
|
Профессионал
    
Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539

|
Использовал в своём проекте мегафункцию 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 подавался импульс сдвига на один бит, и так до тех пор, пока принимаемое значение не совпадало с образцом. Таким образом синхронизировался каждый из каналов.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|