Jump to content

    

Tue

Свой
  • Content Count

    166
  • Joined

  • Last visited

Community Reputation

0 Обычный

About Tue

  • Rank
    Частый гость

Контакты

  • Сайт
    http://
  • ICQ
    0

Информация

  • Город
    Москва

Recent Profile Visitors

1932 profile views
  1. Вот ссылка на описание этого интерфейса в документе: https://www.intel.com/content/altera-www/gl...ik1410564885345 hip_reconfig_rst_n reset signal и npor reset signal это два разных сигнала. Вот они пишут "Release the npor reset signal". Простите, а когда сделать его assert ? Документация составлена странно. Да, после рестарта компьютера действительно происходит сброс на PCIe разъеме. Но после перезагрузки компьютера через hip_reconfig интерфейс я считываю обновленное значение RevisionID. Оно не стерлось. Однако через конфигурационные чтения выдает старое, как-будто вообще ничего не изменял.
  2. Пробовал ctrl-alt-delete после прописывания, пробовал без него - результата нет. Со стороны PCIe значение не видно, хотя если читать через hip_reconfig интерфейс оно там есть. Бред. Сразу прописываешь и заниматься не надо - это всех семействах ПЛИС Altera/Intel с Hard PCIe. Мне же нужно некоторые поля, которые изначально read-only изменять в зависимости от управляющих сигналов.
  3. Здравствуйте. Использую PCIe Hard IP на Cyclone 5 GX. Понадобилось изменить read-only значения в конфигурационном пространстве корки. Документация говорит следующее: "The Cyclone V Hard IP for PCI Express reconfiguration block allows you to dynamically change the value of configuration registers that are read-only ... You must enable this optional functionality by turning on Enable Hard IP Reconfiguration in the parameter editor". Активировал его, появились сигналы вида hip_reconfig... + ser_shift_load + interface_sel. Даже приведена времянка как подавать сигналы, чтобы все было ок. Делаю все в точности как на времянке. Значения читаются-пишутся. То есть я записал, потом прочитал и вижу что читается то, что записывал. Довольно странно, что в документации нет таблицы с адресами регистров, к которым получаешь доступ выставляя адрес на hip_reconfig_address[9:0]. Опытным путем установил что адрес 0x8 это VendorID, 0x9 это DeviceID, 0xA это RevisionID. Мне вот нужен RevisionID. Пишу по этому адресу нужное мне значение, проверяю что записалось. Перезагружаю комп, читаю конфигурацию со стороны PCIe - а значение не изменилось. В связи с этим вопрос. Кто-нибудь делал такое ? У Вас получилось ? Что я сделал не так ? Делал подобное на Cyclone 4GX и все получилось. Там немного по-другому, хотя похоже. И даже в документации есть табличка с адресами регистров. Там еще есть адрес 0, по которому надо записать 0, чтобы разрешить эту Dynamic Reconfiguration
  4. Цитата(syoma @ Nov 25 2017, 15:57) Общался. Да, с HDL у них пока есть проблемы, но генерация Си кода для DSP и простых процов пользуется значительной популярностью. Позвольте спросить, какие проблемы с HDL ?
  5. Даже Cyclone 5 уже имеет поддержку многофункциональности PCIe.
  6. Я говорил об установлении стандарта ввода-вывода пина в Assignment Editor. Там можно для пина задать LVDS - тогда он будет дифференциальным, а можно задать 2.5V - тогда он будет однополярным. Понятно что питание банков этих выводов будет 2.5В в обоих случаях.
  7. Цитата(Flip-fl0p @ Aug 24 2017, 16:36) Да действительно DDR нигде не применяется. ... Частотой tx_outclock я бы запускал PLL приёмника ALTLVDS_RX. Я так и делал вначале. И почему-то rx_inclock приемной ПЛИС, на который заведен tx_outclock передающей ПЛИС оказывается в два раза выше, чем ожидаю (показывал на картинке на третьей странице в данной теме). Для rx_inclock и tx_outclock I/O Standard в назначении пинов задаю как LVDS. Если для rx_inclock меняю I/O Standard на 2.5V (хоть это и неправильно), то частота становится нормальной, ожидаемой, не в два раза выше. Для tx_outclock (который выдается из ALTLVDS_TX, если выбрана конфигурация без внешней PLL) поменять I/O Standard на 2.5V не могу, почему-то Квартус 15.0 на этапе Ассемблера крашится (возникает какая-то ошибка) Цитата(Magnum @ Aug 25 2017, 08:56) А на какое расстояние надо передавать данные? Расстояние небольшое, около 2см. Тут дело не в расстоянии, а в необходимой высокой скорости передачи. GXB-трансиверы исчерпались для другого. Вчера попробовал не 600Мбит/с, а 300. Та же самая история.
  8. Цитата(Flip-fl0p @ Aug 24 2017, 10:26) В модуле ALT_LVDS_RX в режиме с внутренним PLL, порт rx_inclock - это опорная частота PLL. В режиме внешнего PLL (external PLL) порт rx_inclock - частота дессерилизации Это понятно :) Цитата(Flip-fl0p @ Aug 24 2017, 10:26) (учитывайте в каком режиме работает ALT_LVDS_RX. В режиме DDR или SDR. Если в режиме DDR - то частота дессерилизации соответственно в 2 раза ниже). Как это учитывать ? Из документации и каких-то разрозненных источников я понял, что до Cyclone 5 DDR использовался, начиная с Cyclone 5 там аппаратный SERDES, без DDR. Так ли это ? Вот если бы у вас стояла задача соединить два Cyclone 5 по LVDS, вы бы делали это через ALTLVDS_TX/RX ? tx_outclock выдавать вообще надо ? Или если на приемном конце разгоняем PLL в ALTLVDS_RX (в режиме External PLL или нет, неважно) от какой-то своей частоты (не tx_outclock от передатчика), то можно и не выдавать tx_outclock ? Тогда получается что принимаемые данные не привязаны ни к какой частоте, ничто не разграничивает байты. Как приемник будет понимать когда защелкивать сериализированные данные, чтобы это было надежно ? Про rx_channel_data_align да, понятно что он делает bit-slip, сдвигает биты в байте. А как добиваться в приемнике верного защелкивания самого бита (это все без DPA ибо Cyclone5) ? Ну вот есть у PLL (если делаем ALTLVDS_RX в режиме External PLL) возможность (pll_phase_en, pll_updn, pll_cntsel сигналы) динамического изменения фазы любых выходящих с нее клоков . Как понять в какую сторону и на сколько двигать, какие критерии ?
  9. Еще остались непонятными следующие вопросы: 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 ?
  10. Цитата(el.d @ Aug 7 2017, 15:51) И он умеет, например, блоки matlab function преобразовывать в HDL? Конечно умеет. Наберите в командной строке MATLAB'a eml_hdl_design_patterns и увидите огромное кол-во блоков (как пример), реализованных на m-языке, которые можно спокойно выводить в HDL. Так и свои собственные блоки пишутся любые.
  11. Да, обучения я предусмотрел и сделал (в модели). Но пока до этого не дошло. Мне бы с частотами разобраться.
  12. Пытаюсь разработать два независимых (один туда, другой обратно) 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 (" равным 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*, то должно быть 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-канал. Где какие должны быть частоты ? Поняв как правильно настроить передатчики и приемники буду двигать дальше.
  13. Тоже обнаружил что "Pre-emphasis pre-tap" и "Pre-emphasis second post-tap" в Cyclone5 не работают. Пользуюсь 14-м Квартусом, думал что дальше лучше, но не тут то было. Как говорится "ну а что вы хотели за эти деньги"
  14. Цитата(Bad0512 @ May 17 2016, 07:57) Второй вариант - данные перекладывать в промежуточные буфера, и отдавать их далее только по наполнению этих промежуточных буферов полностью. Промежуточные буфера не нужны, если ваш локальный в ПЛИС буфер, в который вы принимаете данные работает в режиме памяти (то есть по адресам). В этом случае в каком бы порядке ни приходили данные - они положатся в буфер по своим адресам и перемешивания не будет.
  15. PCIe в оптику

    ЦитатаВ общем попробовал я кабельный PCIe. С клоком от материнки - работает. Если использовать генератор на плате 125 МГц - то нет Цитата(dsmv @ Jul 15 2014, 16:40) Это так и есть, причём дело не в кабеле. На современных компьютерах платы PCIe от собственного генератора не работают. Кто-нибудь может объяснить почему такое происходит ? Похоже у меня такой случай. Делаю ALTERA Root port. К нему подключаю через кабель/плату-удлинитель с редрайверами Endpoint устройства. При этом REFCLK на Endpoint подается не с кабеля, а с отдельного генератора на плате-удлинителе, в которую воткнут этот Endpoint. Почему такая схема не имеет права на жизнь ? Ведь REFCLK это просто частота, от которой раскручиваются трансиверы в PCIe-устройствах до своих гигагерц.