Александр77 1 15 февраля, 2016 Опубликовано 15 февраля, 2016 · Жалоба ...Теперь облегчили задачу: нужно хотябы для начала принять 16 битный параллельный поток и преобразовать его в последовательность. Скорость параллельного потока 48 МГц, выходной соответственно 769 Mgps. Выходная последовательность нужна lvds. А насколько строго должна быть передача по одной паре? Если требование не жесткое, то можно пустить поток по нескольким парам и снизить требования к скорости в единичном канале. Кристалл Cyclone V 5cgxfc5c6f27c7n. Имея циклон с GXB (со скоростями больше 1Gb/s), несколько странно упираться в lvds. Это имеет смысл лишь при занятых приемо-передатчиках. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Алексей_1990 0 16 февраля, 2016 Опубликовано 16 февраля, 2016 · Жалоба А насколько строго должна быть передача по одной паре? Если требование не жесткое, то можно пустить поток по нескольким парам и снизить требования к скорости в единичном канале. Имея циклон с GXB (со скоростями больше 1Gb/s), несколько странно упираться в lvds. Это имеет смысл лишь при занятых приемо-передатчиках. Дело в том, что эта задача промежуточная. То есть у меня есть ацп с параллельным 16битным выходом, так вот преобразованный последовательный сигнал необходимо подать как раз на тот десириалайзер. Это делается дабы проверить адекватность преобразования параллельного кода в последовательный в плис. Ну и отвечая на вопрос о жёсткости привязки к одному каналу: к сожалению, нужен только один канал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tue 0 17 августа, 2017 Опубликовано 17 августа, 2017 · Жалоба Пытаюсь разработать два независимых (один туда, другой обратно) LVDS-канала передачи данных между двумя ПЛИС Cyclone 5 GX (конкретно 5CGXFC7C6F23I7). "Путаница" в документации, практически полное отсутствие примеров завели меня в тупик и я вынужден обратиться сюда. В обоих ПЛИС делаю одинаковые ALTLVDS_TX, ALTLVDS_RX. Частота входных данных 150МГц, коэффициент сериализации 4, выходной поток 600Мбит/с на один LVDS-канал. Думаю это комфортные условия для данного кристалла. Всего 17 LVDS-каналов. ALTLVDS_TX, ALTLVDS_RX делаю НЕ в режиме "External PLL mode". То есть все частоты для работы блоки делают внутри себя сами. В ALTLVDS_TX задаю параметр "outclock divide factor (B)" равным 4, ставлю галку "Use 'tx_outclock' output port" и "Use 'tx_coreclock' output port". На входной порт ALTLVDS_TX/tx_inclock подаю 150МГц, питаю данными, выдаваемым схемой, которая запитывается от частоты tx_coreclock В ALTLVDS_RX и задавать то особо нечего. Input data rate ставлю 600Мбит/с, input clock rate clock frequency ставлю 150МГц. Выходной порт tx_outclock блока ALTLVDS_TX в одной ПЛИС соединяю с входным портом rx_inclock блока ALTLVDS_RX в другой ПЛИС. В моделировании tx_outclock выдает частоту 150МГц, в железе пока непонятно. В ModelSim все работает замечательно. В железе не работает, возникает много вопросов. 1. В документе "LVDS SERDES Transmitter/Receiver IP Cores User Guide" 2017.06.19 в таблице 2 для ALTLVDS Transmitter указаны частоты для моего (четного) коэффициента сериализации: Fast Clock = Data Rate/2 Slow Clock (outclock)= Data Rate/2*B Core Clock = Data Rate/J То есть для моего случая должы быть такие значения: Fast Clock = 300МГц. Slow Clock = 1200МГц (если буквально понимать формулу). Если понимать ее как Slow Clock = Data Rate/(2*B), то должно быть 75МГЦ. Core clock = 150МГц. В TimeQuest'е я вижу Fast Clock = 600МГц, Slow Clock = 150МГц, Core Clock (который имеет скважность 100/J = 25% в моем случае) равен 150МГц. Это первая неопределенность (фундаментальная), которая у меня возникает в разработке LVDS-канала. Возможно документация (достаточно новая) для Cyclone-семейства исходит из того, что Cyclone до 5-го используют DDIO, а в 5-ом уже используется аппаратный блок сериализации, без DDIO. Отсюда возникает эта путаница, но от осознания этого легче не становится. 2. Из-за того, что в документации я вижу одно, в ModelSim другое, а в TimeQuest третье решил вывести в SignalTAP счетчики, запитать их разными частотами и посмотреть что же получается в железе. На картинке фрагмент из SignalTAP'a. Частота SignalTAP равна 150МГц (назовем ее avl_clk). Счетчик здесь немного необычный. Считает не каждый первый такт, а каждый второй такт. Так лучше видно. 2.1 Из диаграмы видно, что первый счетчик (запитанный tx_coreclock) и второй счетчик (запитанный частотой SignalTAP avl_clk) идут одним темпом. Из этого становится понятно, что частота tx_coreclock равна avl_clk и обе равны 150МГц. 2.2 Дальше идет счетчик с частотой rx_coreclock (частота приемных десериализированных данных). Видно что он изменяется каждый первый такт. Это, как я понимаю, означает, что она в два раза выше частот avl_clk, tx_coreclock и равна 300МГц. Почему ? Непонятно 2.3 Дальше идет lvds_rx_inclk. Это tx_outclock (Slow Clock) от блока ALTLVDS_TX из соседней ПЛИС. Судя по тому, ка к меняются значения каждый такт (090h, 092h, 094h, 096h, 098h, ...) у меня складывается ощущение, что она в 4 раза выше частоты SignalTAP, то есть 600МГц. Почему ? Непонятно. Еще непонятны замирания счетчика (например на значении 0B6h на картинке) 2.4 Из-за такого поведения счетчика lvds_rx_inclk у меня нет уверенности в том, что tx_outclock равен 150МГц. Когда писал эти вопросы провел эксперимент. Подал на tx_outclock частоту не с ALTVDS_TX/tx_outclock, а частоту с PLL с гарантированно известной частотой 150МГц. Эта частота поступает с другой ПЛИС на lvds_rx_inclk в ПЛИС, с которой снимаю SignalTAP. 4-й счетчик стал считать аналогично 3-ему, то есть каждый такт менять значение. Как такое может быть, если эта частота и частота SignalTAP номинально равны (могут и быть незначительные отклонения в несколько десятков ppm) ? 3. Может быть я как-то неправильно настраиваю ALTLVDS_TX, ALTLVDS_RX ? Может кто-нибудь подсказать, как будет правильно их настроить? Что с чем соединять, чтобы получить LVDS-канал. Где какие должны быть частоты ? Поняв как правильно настроить передатчики и приемники буду двигать дальше. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 17 августа, 2017 Опубликовано 17 августа, 2017 · Жалоба LVDS у Вас запускается на DDR регистрах. Соответственно частота дессерелизации не 600 МГц а 300. Крайне желательно после включения "обучить" приёмник. Т.е по какой-либо тестовой последовательности найти правильный порядок бит. Например приёмник и передатчик включились не одновременно. Передатчик отдает биты в таком порядке 3-2-1-0 3-2-1-0 3-2-1-0 А приёмник ловит данные неправильно: 2-1-0-3 2-1-0-3 2-1-0-3. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tue 0 17 августа, 2017 Опубликовано 17 августа, 2017 · Жалоба Да, обучения я предусмотрел и сделал (в модели). Но пока до этого не дошло. Мне бы с частотами разобраться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tue 0 23 августа, 2017 Опубликовано 23 августа, 2017 · Жалоба Еще остались непонятными следующие вопросы: 1. Если говорим о передаче (ALTLVDS_TX) нужно ли вместе с tx_out выдавать tx_outclock ? 1.1 Если да, то что за частоту нужно выдавать, откуда ее брать ? Частоту параллельных данных (slow_clock) ? 1.2 Выдавать как I/O Standard LVDS ? Или как обычный, не диф. парой, однополярный ? 1.3 Как вообще констрейнится через sdc такой интерфейс ? 2. По приему (ALTLVDS_RX) тоже подобные вопросы. Нужно ли заводить rx_inclock ? 2.1 Он нужен просто для получения частоты fast_clock (скажем 600Мбит/с -> 600МГц) ? Могу ли для получения такой частоты (а также rx_enable, rx_coreclock) использовать обычную PLL и любую частоту для разгона PLL ? 2.2 Непонятно про сигнал rx_channel_data_align. Дергаю его, но никакого изменения. Если речь идет о многоразрядном LVDS-канале, то каждый разряд rx_channel_data_align отвечает за свою LVDS линию и их можно дергать независимо ли это не так ? 2.3 Тот же вопрос про констрейны через sdc ? Если у кого-то есть рабочий проект с LVDS-приемником/передатчиком для Cyclone 5, можно выложить тут архив проекта, касающийся только приема-передачи. Вместе с назначениями пинов и их I/O Standard ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 24 августа, 2017 Опубликовано 24 августа, 2017 (изменено) · Жалоба Еще остались непонятными следующие вопросы: 1. Если говорим о передаче (ALTLVDS_TX) нужно ли вместе с tx_out выдавать tx_outclock ? 1.1 Если да, то что за частоту нужно выдавать, откуда ее брать ? Частоту параллельных данных (slow_clock) ? 1.2 Выдавать как I/O Standard LVDS ? Или как обычный, не диф. парой, однополярный ? 1.3 Как вообще констрейнится через sdc такой интерфейс ? 2. По приему (ALTLVDS_RX) тоже подобные вопросы. Нужно ли заводить rx_inclock ? 2.1 Он нужен просто для получения частоты fast_clock (скажем 600Мбит/с -> 600МГц) ? Могу ли для получения такой частоты (а также rx_enable, rx_coreclock) использовать обычную PLL и любую частоту для разгона PLL ? 2.2 Непонятно про сигнал rx_channel_data_align. Дергаю его, но никакого изменения. Если речь идет о многоразрядном LVDS-канале, то каждый разряд rx_channel_data_align отвечает за свою LVDS линию и их можно дергать независимо ли это не так ? 2.3 Тот же вопрос про констрейны через sdc ? Если у кого-то есть рабочий проект с LVDS-приемником/передатчиком для Cyclone 5, можно выложить тут архив проекта, касающийся только приема-передачи. Вместе с назначениями пинов и их I/O Standard ? В модуле ALT_LVDS_RX в режиме с внутренним PLL, порт rx_inclock - это опорная частота PLL. В режиме внешнего PLL (external PLL) порт rx_inclock - частота дессерилизации (учитывайте в каком режиме работает ALT_LVDS_RX. В режиме DDR или SDR. Если в режиме DDR - то частота дессерилизации соответственно в 2 раза ниже). Сигнал rx_channel_data_align нужен для "обучения" приёмника, подали одиночный сигнал, и приём сдвинулся на 1 бит. Таким образом вы настраиваетесь на правильный порядок приёма бит. При многоканальном приёме каждый rx_channel_data_align отвечает за свой канал. Как я понял их можно дергать независимо друг от друга. Но лучше посмотрите при моделировании. Изменено 24 августа, 2017 пользователем Flip-fl0p Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bogaev_roman 0 24 августа, 2017 Опубликовано 24 августа, 2017 · Жалоба В модуле ALT_LVDS_RX в режиме с внутренним PLL, порт rx_inclock - это опорная частота PLL. В режиме внешнего PLL (external PLL) порт rx_inclock - частота дессерилизации (учитывайте в каком режиме работает ALT_LVDS_RX. В режиме DDR или SDR. Если в режиме DDR - то частота дессерилизации соответственно в 2 раза ниже). Есть проект, в котором используется именно внешняя pll и data_alignment, работоспособность зависит от компиляции к компиляции, т. е. вроде проблемы с таймингами. При попытке посмотреть временные пути столкнулся с проблемой - физика реализована на жестких блоках, анализ закрыт. Как там вообще физика реализована, нужно что-то прописывать во временных ограничениях кроме мультицикла на выходе и частоты на входе pll и ее производных? Временных ошибок нет, анализ unconstraint_patch говорит, что необконстрейненых путей тоже нет. ЗЫ. Кстати, каким образом принудительно задать режим работы DDR - там настройки такой нет, только с помощью настроек pll? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 24 августа, 2017 Опубликовано 24 августа, 2017 (изменено) · Жалоба Есть проект, в котором используется именно внешняя pll и data_alignment, работоспособность зависит от компиляции к компиляции, т. е. вроде проблемы с таймингами. При попытке посмотреть временные пути столкнулся с проблемой - физика реализована на жестких блоках, анализ закрыт. Как там вообще физика реализована, нужно что-то прописывать во временных ограничениях кроме мультицикла на выходе и частоты на входе pll и ее производных? Временных ошибок нет, анализ unconstraint_patch говорит, что необконстрейненых путей тоже нет. Скажу так: В LVDS SERDES Transmitter/Receiver IP Cores User Guide явного указания что-либо констрейнить кроме входного клока и данных я не увидел, хотя если честно я совсем плохой советчик по констрейнам. Изучать боле-менее осмысленно я их стал относительно недавно, для меня они ещё темный лес Интересно, а можно ли как-то получить доступ к жестким блокам ALT_LVDS_RX ? Уж jочень заманчива мысль получить доступ к IR_FIFO_SERDES, который , как я понял, является "железным" высокоскоростным FIFO. А в режиме extrenal PLL вы так-же ставили клоковый буфер между PLL и LVDS_RX ? Изменено 24 августа, 2017 пользователем Flip-fl0p Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bogaev_roman 0 24 августа, 2017 Опубликовано 24 августа, 2017 · Жалоба А в режиме extrenal PLL вы так-же ставили клоковый буфер между PLL и LVDS_RX ? Проект не мой, я пока не ковырял подробно, но на сколько я понял там буфер стоит. Тут еще момент появился - все работает со скоростью 600Mb/s в режиме SDR для циклон5, в документации вроде максимальная частота отталкивается от максимально возможной частоты с выход pll, т.е. 550МГц, что меньше требуемой. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 24 августа, 2017 Опубликовано 24 августа, 2017 · Жалоба Проект не мой, я пока не ковырял подробно, но на сколько я понял там буфер стоит. Тут еще момент появился - все работает со скоростью 600Mb/s в режиме SDR для циклон5, в документации вроде максимальная частота отталкивается от максимально возможной частоты с выход pll, т.е. 550МГц, что меньше требуемой. А каков коэффициент дессерелизации ? Может смысл имеет запустить в режиме DDR ? Тогда и частоту можно в 2 раза понизить... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bogaev_roman 0 24 августа, 2017 Опубликовано 24 августа, 2017 · Жалоба А каков коэффициент дессерелизации ? Может смысл имеет запустить в режиме DDR ? Тогда и частоту можно в 2 раза понизить... Я об этом и думаю коэффициент - 10, просто все расчеты велись изначально по этому документу https://www.altera.com/support/support-reso...142011_962.html Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 24 августа, 2017 Опубликовано 24 августа, 2017 · Жалоба Я об этом и думаю коэффициент - 10, просто все расчеты велись изначально по этому документу https://www.altera.com/support/support-reso...142011_962.html В каком режиме работает PLL ? А если вручную фазу частоты приёма крутить, получается стабильный приём ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bogaev_roman 0 24 августа, 2017 Опубликовано 24 августа, 2017 · Жалоба В каком режиме работает PLL ? Direct mode, есть возможность подключить lvds mode. Что это даст? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 24 августа, 2017 Опубликовано 24 августа, 2017 (изменено) · Жалоба Direct mode, есть возможность подключить lvds mode. Что это даст? На сколько я понял там по-разному компенсируется задержка. Точно сказать не могу в чем принципиально отличаются. Где-то я видел хорошее объяснение режимов работы PLL, постараюсь найти и выложить. На сколько я понял правильнее всего применять source-synchronous compensator mode. Но тут я могу ошибаться. Изменено 24 августа, 2017 пользователем Flip-fl0p Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться