реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Проблемы с LVDS приемником., данные постоянно смещены
torik
сообщение Jan 28 2013, 06:38
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Jan 28 2013, 06:57
Сообщение #2


Гуру
******

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



тот пример, что я приводил, требует правильных констрейнов на i/o (описанные симптомы наблюдал именно с кривыми/отсутствующими констрейнами). lvds смотреть можно, но если у вас ввод по обоим фронтам идет, то надо цеплять выходы ddr-регистров.
Go to the top of the page
 
+Quote Post
torik
сообщение Jan 28 2013, 06:58
Сообщение #3


Гуру
******

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



констрейны, признаюсь, пока не прописал. Есть вариант констрейнов для вашего примера?


--------------------
Быть. torizin-liteha@yandex.ru
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Jan 28 2013, 07:03
Сообщение #4


Гуру
******

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



Код
# 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 - фреймовый (выровнен с данными). клок и данные у меня выровнены на плате. но это для конкретных настроек АЦП (на определенную фазировку). в вашем случае м.б. иначе
Go to the top of the page
 
+Quote Post
gosu-art
сообщение Jan 28 2013, 08:08
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 555
Регистрация: 14-10-09
Пользователь №: 52 939



А LVDS DDR работающие на вход можно заводить только на DQ пин? или на любые дифф ноги? Рисую схему под LTC2144.
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Jan 28 2013, 08:09
Сообщение #6


Гуру
******

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



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

на любые diffio
Go to the top of the page
 
+Quote Post
torik
сообщение Jan 28 2013, 09:24
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Jan 28 2013, 09:33
Сообщение #8


Гуру
******

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



так выкиньте этот fclk у себя. у меня он с ноги подавался, а у вас с pll. поэтому из списка в get_ports его исключите. нарисуйте диаграмку с таймингами, проверим
Go to the top of the page
 
+Quote Post
torik
сообщение Jan 28 2013, 09:41
Сообщение #9


Гуру
******

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



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

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

Диаграмку с таймингами какую нарисовать, как сигналы с АЦП идут что ли?


--------------------
Быть. torizin-liteha@yandex.ru
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Jan 28 2013, 09:46
Сообщение #10


Гуру
******

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



Цитата(torik @ Jan 28 2013, 16:41) *
Он как его, сам учтет?

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

ага, как там чего сфазировано
Go to the top of the page
 
+Quote Post
torik
сообщение Jan 28 2013, 10:38
Сообщение #11


Гуру
******

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



derive_pll_clocks -create_base_clocks прописан.
Вот диаграмма из даташите. DOUTPHASEP = 0


К слову, дарнные стали приниматься правильно. Но клок на входе пришлось инвертировать (~ADC_TCK). Потому не уверен, насколько правильно написал констейны. Таймквест не ругается.
Эскизы прикрепленных изображений
Прикрепленное изображение
 


--------------------
Быть. torizin-liteha@yandex.ru
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Jan 28 2013, 11:39
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
torik
сообщение Jan 28 2013, 11:46
Сообщение #13


Гуру
******

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



Я вернулся к altlvds, внутри которой вроде бы таже самая altddio_in. Просто насколько корректно вот так вот обращаться с клоком - взять и инвертировать...


--------------------
Быть. torizin-liteha@yandex.ru
Go to the top of the page
 
+Quote Post
doom13
сообщение Jun 20 2013, 20:01
Сообщение #14


Профессионал
*****

Группа: Свой
Сообщений: 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 подавался импульс сдвига на один бит, и так до тех пор, пока принимаемое значение не совпадало с образцом. Таким образом синхронизировался каждый из каналов.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 03:00
Рейтинг@Mail.ru


Страница сгенерированна за 0.01512 секунд с 7
ELECTRONIX ©2004-2016