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

 
 
> LVDS преобразователь, Проектирование приемника LVDS в Циклоне
EpLeon
сообщение Mar 2 2016, 05:32
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 25
Регистрация: 10-07-12
Пользователь №: 72 683



Добрый день.

Подскажите, пожалуйста. Задача заключается в следующем: есть 10-битный АЦП AD9212 - он посылает данные в формате LVDS с частотой 400Mbps или 40МГц на событие. Необходимо рсшифровать эти данные в Циклоне - EP4CE55F23C6. Пробую использовать встроенную мегафункцию altlvds_rx со следующими параметрами:
SUBDESIGN LVDS_In
(
rx_in[0..0] : INPUT;
rx_inclock : INPUT = GND;
rx_locked : OUTPUT;
rx_out[9..0] : OUTPUT;
rx_outclock : OUTPUT;
)
VARIABLE
altlvds_rx_component : altlvds_rx WITH (
COMMON_RX_TX_PLL = "ON",
DESERIALIZATION_FACTOR = 10,
IMPLEMENT_IN_LES = "ON",
INCLOCK_DATA_ALIGNMENT = "UNUSED",
INCLOCK_PERIOD = 25000,
INCLOCK_PHASE_SHIFT = 0,
INPUT_DATA_RATE = 400,
INTENDED_DEVICE_FAMILY = "Cyclone IV E",
LPM_HINT = "CBX_MODULE_PREFIX=LVDS_In",
LPM_TYPE = "altlvds_rx",
NUMBER_OF_CHANNELS = 1,
PLL_SELF_RESET_ON_LOSS_LOCK = "OFF",
PORT_RX_CHANNEL_DATA_ALIGN = "PORT_UNUSED",
PORT_RX_DATA_ALIGN = "PORT_UNUSED",
REGISTERED_DATA_ALIGN_INPUT = "OFF",
REGISTERED_OUTPUT = "ON",
USE_EXTERNAL_PLL = "OFF"
);
BEGIN

rx_locked = altlvds_rx_component.rx_locked;
rx_out[9..0] = altlvds_rx_component.rx_out[9..0];
rx_outclock = altlvds_rx_component.rx_outclock;
altlvds_rx_component.rx_inclock = rx_inclock;
altlvds_rx_component.rx_in[0..0] = rx_in[0..0];
END;

Пишу на языке AHDL в силу пока незнания остальных. Данные, которые потом вывожу на ножки циклона в виде параллельного кода как-то не соответствуют сигналу. Подскажите, все ли правильно в настройка функции. Клок на функцию использую тот же, что и в самой альтере для других вещей через pll функцию. Сама же частота задается извне генератором 40МГц.
Go to the top of the page
 
+Quote Post
3 страниц V  < 1 2 3  
Start new topic
Ответов (30 - 40)
_Anatoliy
сообщение Mar 5 2016, 10:25
Сообщение #31


Утомлённый солнцем
******

Группа: Свой
Сообщений: 2 646
Регистрация: 15-07-06
Из: г.Донецк ДНР
Пользователь №: 18 832



Цитата(EpLeon @ Mar 5 2016, 12:58) *
Имеется ввиду импульс любой длительности? Или туда что-то конкретное нужно подавать? Просто я сейчас туда подсоединил один из выходов PLL со сдвигом по фазе относительно основной частоты... То есть, я правильно понимаю, что сигнал поданный на align запускает подстройку фазы?
и еще вопрос - нужно ли такую подстройку проводить каждый раз при включении платы? Или же синхронизацию как-то можно запомнить?

Вам же выше doom13 привёл требования к этому сигналу.
Цитата
The minimum pulse width is one period of the parallel clock in the logic array (rx_outclock).

Вот и подавайте импульс длительностью один такт указанной частоты. А для подстройки я использовал автомат т.к. во входном потоке у меня присутствовал байт-маркер,вставляемый через одинаковое количество байт.
Go to the top of the page
 
+Quote Post
EpLeon
сообщение Mar 5 2016, 11:16
Сообщение #32


Участник
*

Группа: Участник
Сообщений: 25
Регистрация: 10-07-12
Пользователь №: 72 683



Цитата(_Anatoliy @ Mar 5 2016, 16:25) *
Вам же выше doom13 привёл требования к этому сигналу.

Вот и подавайте импульс длительностью один такт указанной частоты. А для подстройки я использовал автомат т.к. во входном потоке у меня присутствовал байт-маркер,вставляемый через одинаковое количество байт.

Извините, но до меня немного долго доходит... Чтобы окончательно понять, я правильно понимаю, что в моем случае:
1) Каждый канал настраивается отдельно каждый раз при включении питания;
2) На ножку align[n-1..0] для каждого канала подается импульс длительностью в 1 такт клока. И подавать их нужно по принципу: подал импульс - посмотрел на данные -> совпали, значит настроилось, не совпали повторяем процедуру.
Go to the top of the page
 
+Quote Post
_Anatoliy
сообщение Mar 5 2016, 11:40
Сообщение #33


Утомлённый солнцем
******

Группа: Свой
Сообщений: 2 646
Регистрация: 15-07-06
Из: г.Донецк ДНР
Пользователь №: 18 832



Цитата(EpLeon @ Mar 5 2016, 14:16) *

Насчёт каналов ничего не могу сказать,я с этим АЦП не работал.
Бегло глянул DS, так у вас же сигнал FCO есть,почему по нему не хотите синхронизироваться?
Go to the top of the page
 
+Quote Post
EpLeon
сообщение Mar 5 2016, 13:43
Сообщение #34


Участник
*

Группа: Участник
Сообщений: 25
Регистрация: 10-07-12
Пользователь №: 72 683



Цитата(_Anatoliy @ Mar 5 2016, 17:40) *
Насчёт каналов ничего не могу сказать,я с этим АЦП не работал.
Бегло глянул DS, так у вас же сигнал FCO есть,почему по нему не хотите синхронизироваться?

То есть по нему??? Имеете в виду подавать FCO на клок мегафункции (rx_inclock)?
Go to the top of the page
 
+Quote Post
doom13
сообщение Mar 5 2016, 14:18
Сообщение #35


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

Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



Цитата(EpLeon @ Mar 5 2016, 14:16) *
Извините, но до меня немного долго доходит... Чтобы окончательно понять, я правильно понимаю, что в моем случае:
1) Каждый канал настраивается отдельно каждый раз при включении питания;
2) На ножку align[n-1..0] для каждого канала подается импульс длительностью в 1 такт клока. И подавать их нужно по принципу: подал импульс - посмотрел на данные -> совпали, значит настроилось, не совпали повторяем процедуру.

Всё так, только длительность импульса может быть и больше (выше приводил цитату из даташита, там указаны требования к сигналу align).

Цитата(EpLeon @ Mar 5 2016, 16:43) *
То есть по нему??? Имеете в виду подавать FCO на клок мегафункции (rx_inclock)?

Подача FCO на вход rx_inclock ядра не гарантирует правильного приёма фреймам (всё зависит от длины линий данных и клока), поэтому всё равно необходима синхронизация каналов.
Go to the top of the page
 
+Quote Post
_Anatoliy
сообщение Mar 6 2016, 07:22
Сообщение #36


Утомлённый солнцем
******

Группа: Свой
Сообщений: 2 646
Регистрация: 15-07-06
Из: г.Донецк ДНР
Пользователь №: 18 832



Цитата(EpLeon @ Mar 5 2016, 16:43) *
То есть по нему??? Имеете в виду подавать FCO на клок мегафункции (rx_inclock)?

Ни в коем случае. Глянул ещё раз DS, рекомендую вам посмотреть в сторону регистра test_io, конкретно команда one-/zero-word toggle. Тогда после подачи питания включаете нужный режим test_io, калибруетесь подачей импульса align до тех пор пока не отловите пару слов 0х0000000000 и 0х1111111111, затем переходите в рабочий режим. Для формирования align напишите небольшой автомат, а FS можно не использовать.
Go to the top of the page
 
+Quote Post
EpLeon
сообщение Mar 6 2016, 09:24
Сообщение #37


Участник
*

Группа: Участник
Сообщений: 25
Регистрация: 10-07-12
Пользователь №: 72 683



Цитата(_Anatoliy @ Mar 6 2016, 13:22) *
Ни в коем случае. Глянул ещё раз DS, рекомендую вам посмотреть в сторону регистра test_io, конкретно команда one-/zero-word toggle. Тогда после подачи питания включаете нужный режим test_io, калибруетесь подачей импульса align до тех пор пока не отловите пару слов 0х0000000000 и 0х1111111111, затем переходите в рабочий режим. Для формирования align напишите небольшой автомат, а FS можно не использовать.

С этим тоже есть небольшая проблемка. Мне не очень понятно, как именно программировать АЦП. Как говорил раньше, с последовательными данными ни разу не работал. И в DS на оцифровщик мне не понятно, что такое W1/W2 и каким образом подавать последовательность слов. То есть как адрес соотносится с данными, которые я пытаюсь прописать. И если это нужно сделать в разные регистры.
Если вас не затруднит, не могли бы вы мне в этом помочь? И подсказать, как это сделать? Я понимаю, что прописав некоторое конкретное число в АЦП намного проще его потом отследить и можно сделать автомат на подстройку.
Go to the top of the page
 
+Quote Post
_Anatoliy
сообщение Mar 6 2016, 11:20
Сообщение #38


Утомлённый солнцем
******

Группа: Свой
Сообщений: 2 646
Регистрация: 15-07-06
Из: г.Донецк ДНР
Пользователь №: 18 832



Цитата(EpLeon @ Mar 6 2016, 12:24) *

Так на figure 68 показан же формат обращения к АЦП. Слово 24 бита, три старшие из них - нули, биты 20...8 - адрес регистра, биты 7...0 - записываемые данные.
Go to the top of the page
 
+Quote Post
EpLeon
сообщение Mar 6 2016, 11:57
Сообщение #39


Участник
*

Группа: Участник
Сообщений: 25
Регистрация: 10-07-12
Пользователь №: 72 683



Цитата(_Anatoliy @ Mar 6 2016, 17:20) *
Так на figure 68 показан же формат обращения к АЦП. Слово 24 бита, три старшие из них - нули, биты 20...8 - адрес регистра, биты 7...0 - записываемые данные.

То есть я правильно понимаю, что если я хочу записать данные "1010" в регистр "0D" согласно таблице 9, то последовательность по этой линии будет: 000 000000001101 0001010 ?

И еще вопрос, а кто-нибудь пробовал сам делать защелкивание данных через DDR на такой частоте?
Go to the top of the page
 
+Quote Post
_Anatoliy
сообщение Mar 6 2016, 12:13
Сообщение #40


Утомлённый солнцем
******

Группа: Свой
Сообщений: 2 646
Регистрация: 15-07-06
Из: г.Донецк ДНР
Пользователь №: 18 832



Цитата(EpLeon @ Mar 6 2016, 14:57) *
То есть я правильно понимаю, что если я хочу записать данные "1010" в регистр "0D" согласно таблице 9, то последовательность по этой линии будет: 000 000000001101 0001010 ?

И еще вопрос, а кто-нибудь пробовал сам делать защелкивание данных через DDR на такой частоте?

Примерно так, но должно быть 24 бита, а не 22. И обратите внимание на старшие 4 бита данных.
Go to the top of the page
 
+Quote Post
EpLeon
сообщение Mar 6 2016, 12:16
Сообщение #41


Участник
*

Группа: Участник
Сообщений: 25
Регистрация: 10-07-12
Пользователь №: 72 683



Цитата(_Anatoliy @ Mar 6 2016, 18:13) *
Примерно так, но должно быть 24 бита, а не 22. И обратите внимание на старшие 4 бита данных.

Да, заметил. Спасибо.
Go to the top of the page
 
+Quote Post

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

 


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


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