|
Реконфигурация трансивера, Cyclone V |
|
|
|
Feb 10 2017, 10:19
|

Местный
  
Группа: Свой
Сообщений: 285
Регистрация: 10-12-04
Из: Earth
Пользователь №: 1 437

|
Уважаемые друзья. Не могу никак понять несколько вещей, которые не дают двигаться дальше. Хочу сделать реконфигурацию трансивера. Для этого собрал QSyS-системку по аналогии с an676 и вот этим товарищем. Вкратце: - Clock Source 75MHz - это понятно; - JTAG to Avalon Master - чтобы был доступ из System Console; - Transceiver Reconfiguration Controller - настроен на 2 интерфейса, включена возможность реконфигурации через MIF; - Cyclone V Transceiver Native PHY - настроен на 2 скорости; - Transceiver PLL - дает опору для одной скорости; - Fractional PLL - дает опору для второй скорости; - Transceiver PHY Reset Controller - понятно; - PIO - для выбора таблички MIF с настройками той или иной скорости; Всё собирается, из System Console всё видно. Пытаюсь, по аналогии с an676, an664, an645 и конечно же xcvr_user_guide, читать-писать регистры реконфигуратора и получаю затык. Вопросы следующие: 1. В настройках Transceiver Reconfiguration Controller-а есть параметр Optional Interface Groupong. Никак не могу понять что он означает. Вот у меня два интерфейса используются - один для трансивера, второй - для PLL. Что в моем случае надо здесь вписать? Почему? 2. Чтобы заставить Reset Controller выполнить сброс - достаточно разок дернуть его самомо за ногу reset? 3. Вот мы сбросились, подключились к реконфигуратору (через System console), читаем все его регистры, получаем следующую картину: Код % dump_all 0 PMA Analog control registers dump (channel 0): feature status: busy = 0, error = 0, read = 0, write = 0 VOD (0x00) = 10 Pre-emphasis pre-tap (0x01) = 0 Pre-emphasis first post-tap (0x02) = 0 Pre-emphasis second post-tap (0x03) = 0 RX equalization DC gain (0x10) = 0 RX equalization control (0x11) = 0
AEQ registers dump (channel 0): feature status: busy = 0, error = 0, read = 0, write = 0 ADAPT_DONE (0x00) = 0 MODE (0x00) = 0 Equalization results (0x01) = 0
ATX PLL calibration registers dump (channel 0): feature status: busy = 0, error = 0, read = 0, write = 0 Control (0x00) = 0 Run calibration (0x01) = 0
PLL reconfiguration registers dump (channel 0): feature status: busy = 0, error = 0, read = 0, write = 0 Logical refclk selection (0x00) = 0 Logical PLL selection (0x01) = 0 refclk physical mapping (0x02) = 33554400 PLL physical mapping (0x03) = 16163
DCD registers dump (channel 0): Control (0x00) = 0
Streamer registers dump (channel 0): feature status: busy = 0, error = 0, read = 0, write = 0 MIF base address (0x00) = 0 Clear error (0x01) = 0 MIF address mode (0x01) = 0 Start MIF stream (0x01) = 0 MIF or channel mismatch (0x02) = 0 PLL reconfiguration IP error (0x02) = 0 MIF opcode error (0x02) = 0 Invalid register access (0x02) = 0 Это, получается, как бы значения по умолчанию. Окей, но при попытке записать что-то в те или иные поля - мои значения либо не пишутся, либо пишутся как-то странно (по сигналтапу я вижу что на авалоновскую шину реконфигуратора все выставляется корректно). Например, несмотря на то, что VOD согласно документации может быть от 0 до 63, некоторые значения записываются неверно или не записываются вообще. Получаются как бы "дырки". Это нормально? 4. Есть какое-нибудь вменяемое описание того в какой последовательности правильно конфигурировать трансивер? А то везде все ограничиваются примером в духе "мы покажем как записать один произвольный регистр". Может там нужна особая последовательность записи?! В итоге я хочу порегистрово его сконфигурировать и сделать скрипт для управления режимами его работы, что-то похожее на Transceiver Toolkit, только сильно проще и под свои нужды. Спасибо.
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 14)
|
Feb 13 2017, 09:57
|

Местный
  
Группа: Свой
Сообщений: 285
Регистрация: 10-12-04
Из: Earth
Пользователь №: 1 437

|
DuHast, спасибо за отклик! Цитата(DuHast @ Feb 12 2017, 18:27)  Добрый день Делал реконфигуратор трансиверов через SystemConsol но в схематике, на что можно обратить внимание: 1 Клок чтения/записи должен лежать в определённом диапазоне 2 Пауза между запросами на чтение/запись должна быть достаточно длинной. С сигналом busy была какая-то проблема, его не использовал. 3 В SystemConsol я использовал команды master_write_32 и master_read_32. При этом в скрипте адрес умножал на 4, а в Quartus’е два младших разряда шины адреса модуля JTAG_2_Avalon не использовал. 1. По поводу клока - да, знаю - держу его внутри нужного диапазона (в моем случае, 75-125МГц, у меня 75МГц). 2. Даже если делаю паузу в 1 секунду (куда уж больше-то), все равно либо не сохраняются значения, либо некорректно. Busy не использую. 3. Пишу/читаю теми же командами, адрес умножаю на 4. В шину не лазил, т.к. собрано в QSyS'е и он, по идее, сам это разрулить должен. Кроме того, я по сигналтапу вижу что адреса на входе реконфигуратора выставляются верно. Вообще, у меня есть подозрение что всё на самом деле работает, просто я пока не до конца понимаю как этот паровоз запустить.
|
|
|
|
|
Feb 14 2017, 08:37
|

Местный
  
Группа: Свой
Сообщений: 285
Регистрация: 10-12-04
Из: Earth
Пользователь №: 1 437

|
Я делаю в точности так же. Давайте я выложу сюда скрипт, которым пишу/читаю, а вы посмотрите на своем проекте - работает ли он? Переименуйте его в .tcl, а то форум не дает загружать с таким расширением 
main.txt ( 11.34 килобайт )
Кол-во скачиваний: 60Пример использования: Код # пытаемся читать/писать канал 0 (через обертки): reconfig_get $::reconfig_regs::PMA 0 0x00 reconfig_set $::reconfig_regs::PMA 0 0x00 28
# либо так (вручную): reconfig_read [expr ($::reconfig_features::STREAMER+$::reconfig_regs::CONTROL)*4] reconfig_write [expr ($::reconfig_features::STREAMER+$::reconfig_regs::CONTROL)*4] 0x00 reconfig_write [expr ($::reconfig_features::STREAMER+$::reconfig_regs::OFFSET)*4] 0x00 reconfig_write [expr ($::reconfig_features::STREAMER+$::reconfig_regs::DATA)*4] 0x00 reconfig_write [expr ($::reconfig_features::STREAMER+$::reconfig_regs::CONTROL)*4] 0x01 reconfig_write [expr ($::reconfig_features::STREAMER+$::reconfig_regs::CONTROL)*4] 0x00 reconfig_write [expr ($::reconfig_features::STREAMER+$::reconfig_regs::OFFSET)*4] 0x01 reconfig_write [expr ($::reconfig_features::STREAMER+$::reconfig_regs::DATA)*4] 0x03 reconfig_write [expr ($::reconfig_features::STREAMER+$::reconfig_regs::CONTROL)*4] 0x01 reconfig_write [expr ($::reconfig_features::STREAMER+$::reconfig_regs::CONTROL)*4] 0x00 reconfig_read [expr ($::reconfig_features::STREAMER+$::reconfig_regs::CONTROL)*4]
# выводим все регистры канала 0 dump_all 0
|
|
|
|
|
Feb 14 2017, 13:34
|
Группа: Участник
Сообщений: 14
Регистрация: 14-07-16
Пользователь №: 92 555

|
.del. Извините, ошибся окном.
Сообщение отредактировал dmy - Feb 14 2017, 13:38
|
|
|
|
|
Feb 14 2017, 14:33
|

Местный
  
Группа: Свой
Сообщений: 285
Регистрация: 10-12-04
Из: Earth
Пользователь №: 1 437

|
Продолжаю изучение. Залез сигналтапом в блок настройки регистров PMA (кстати, в нем обнаружился баг, причем в моем квартусе 15.0UPD2 исходный код этого модуля не соответствует обновлению по той ссылке, хотя они и написали что обновление типа запланировано в будущих версиях, а там этот баг аж для 13-й версии объявлен). Удалось увидеть что при доступе к некоторым регистрам появляется флаг ошибки uif_illegal_offset_error, который в avalon-шину почему-то не передается. Тогда я написал простейший проверятор (пишем, читаем, сравниваем, инкрементируем значение, повторяем), прогнал им все регистры PMA и вот что увидел: Код регистр: 0x00 (VOD) - работает (читается/пишется нормально во всем диапазоне допустимых значений согласно xcvr_user_guide: table 171010); 0x01 (Pre-emphasis pre-tap) - не работает ни с одним из допустимых значений; 0x02 (Pre-emphasis first post-tap) - работает; 0x03 (Pre-emphasis second post-tap) - не работает ни с одним из допустимых значений; 0x10 (RX equalization DC gain) - работает частично, может принимать только значения 0-1, хотя в руководстве заявлено что может принимать значения 3’b000–3’b011: 0–3 и 3'b100-3'b110: 4; 0x11 (RX equalization control) - работает частично, может принимать только значения 0-2, хотя в руководстве заявлено что может принимать значения 4’b0000–4’b1111: 0–15; UPD: Что интересно, добравшись до исходника (alt_xreconf_analog_datactrl_av.sv), в котором делается отработка доступа к регистру RX equalization control стало видно что действительно там отрабатываются только значения 0-2, а остальные - игнорятся. Как это соотносится с документацией? Блин, засада прям. UPD2: [botan mode on]Как это обычно бывает, умная мысль приходит после драки  Покопавшись поглубже в альтеровских исходниках и даташите на камень выяснил, что таки экспериментально выявленные мной диапазоны реальных допустимых значений регистров оказывается прописаны в даташите на конкретное семейство кристалла (CV в моем случае).  . Т.е. в разных семействах разные фичи могут быть частично или полностью недоступными. [botan mode off] Так что теперь остается проверить все остальные блоки реконфигурации, сопоставить их с даташитом - и пробовать запускать обмен данными.
|
|
|
|
|
Mar 1 2017, 07:07
|

Местный
  
Группа: Свой
Сообщений: 285
Регистрация: 10-12-04
Из: Earth
Пользователь №: 1 437

|
Продолжаю разбиралово. Если трансивер использует, например, две скорости, то ему в опору ставят разные PLL - CMUPLL И FPLL (как, например, в an676). Объясните, почему используют разные типы PLL?
Поясню отчего такой вопрос возник. В проекте заложена ножка для тактирования трансивера - выделенная нога для подачи опорного такта специально на трансиверы - Dedicated Transceiver REFCLK. И когда я пытаюсь тактировать трансивер (приемную и передающую части) от этой ножки, то фиттер отказывается проект собирать.
Были следующие эксперименты: 1. Пробовал настроить трансивер с внутренними PLL (2 режима скорости). У него в такой конфигурации есть два порта - rx_cdr_refclk и tx_pll_refclk. Если завожу REFCLK на эти порты, то фиттер не может развестись. 2. Сейчас настроил трансивер с внешней PLL (2 штуки). Создал 2 CMUPLL на основе Transceiver PLL, подсоединил их к трансиверу. Опору для CMUPLL беру опять же с REFCLK. По идее, я ожидал что он сообразит что надо использовать 2 аппаратные CMUPLL, но фиттер снова останавливается с ошибками. 3. Конечно я могу все сделать тупо как в примерах, но непонимание от этого не уйдет. Поэтому хочется разобраться.
Возникает такое ощущение что ему нельзя с одной входной ножки давать опору для CDR и для TXPLL.
|
|
|
|
|
Mar 1 2017, 13:27
|
Частый гость
 
Группа: Свой
Сообщений: 197
Регистрация: 15-10-10
Из: г. Москва
Пользователь №: 60 179

|
Цитата Продолжаю разбиралово. Если трансивер использует, например, две скорости, то ему в опору ставят разные PLL - CMUPLL И FPLL (как, например, в an676). Объясните, почему используют разные типы PLL? 1. Пробовал настроить трансивер с внутренними PLL (2 режима скорости). У него в такой конфигурации есть два порта - rx_cdr_refclk и tx_pll_refclk. Если завожу REFCLK на эти порты, то фиттер не может развестись. 2. Сейчас настроил трансивер с внешней PLL (2 штуки). Создал 2 CMUPLL на основе Transceiver PLL, подсоединил их к трансиверу. Опору для CMUPLL беру опять же с REFCLK. По идее, я ожидал что он сообразит что надо использовать 2 аппаратные CMUPLL, но фиттер снова останавливается с ошибками. Если используется приемник channel PLL used as clock data recovery (CDR)PLL. Если не весь блок занят оставшиеся можно использовать для тактирования передатчиков.
|
|
|
|
|
Mar 14 2017, 15:40
|

Местный
  
Группа: Свой
Сообщений: 285
Регистрация: 10-12-04
Из: Earth
Пользователь №: 1 437

|
С PLL вроде понятно. Спасибо.
Теперь появился вопрос со сбросом - не получается сбросить трансивер. Reset Controller не выходит из сброса.
У Reset Controller-a есть вход rx_is_lockedtodata, на который заводится соответствующий сигнал с трансивера. Нюанс в следующем - я пока хочу использовать восстановление частоты не из данных, а из опорного клока (т.е. трансивер работает в режиме LTR). Но в этом режиме никогда не будет поднят сигнал rx_is_lockedtodata, а ведь времянка сброса трансивера зависит и от него тоже. В итоге получается, что Reset Controller начинает формировать нужную времянку, а потом затыкается, не завершая ее (остается навечно висеть в единице сигнал rx_digitalreset), т.к. ждет сигнал rx_is_lockedtodata, который никогда не появляется.
Попробовал внаглую подсунуть Reset Controller-у вместо rx_is_lockedtodata сигнал rx_is_lockedtoref с трансивера - времянку сброса он, конечно, отрабатывать стал. Но при попытке погонять байты через внутренний serial loopback я вижу что прием идет ну совсем некорректно (как будто бы на другой частоте). Судя по всему, так делать нельзя.
Как его сбрасывать-то правильно?
|
|
|
|
|
Jul 13 2017, 12:11
|

Местный
  
Группа: Свой
Сообщений: 285
Регистрация: 10-12-04
Из: Earth
Пользователь №: 1 437

|
Подниму тему, т.к. не всё получается. Как работать с одним трансивером - разобрался, тут вопросов нет: все отлично реконфигурируется и работает. Если я задействую все 9 каналов трансивера с фиксированными настройками скорости - всё тоже отлично работает. Но как только я пытаюсь задействовать все трансиверы в режиме реконфигурации, то получаю затык на этапе фиттера. Какие варианты я перепробовал (ни один их них не собрался): // во всех случаях используется от 8 до 9 каналов трансивера (меньше 8 нельзя), одна базовая скорость (2.5G), одна опорная частота для TXPLL, режим Bonded (xN). 1. Трансивер, контроллер сброса, реконфигуратор, FPLL - не собирается. 2. Трансивер, контроллер сброса, реконфигуратор, FPLL, реконфигуратор FPLL (самый правильный вариант, как мне кажется) - не собирается. 3. Трансивер, контроллер сброса, реконфигуратор, Transceiver PLL - не собирается. 4. Трансивер, контроллер сброса, реконфигуратор, TXPLL внутри трансивера - не собирается. Все затыки так или иначе связаны с TXPLL (пример ошибки для варианта 2): Код Error: Clock Divider node 'trans:trans|altera_xcvr_native_av:trans_inst|av_xcvr_plls:gen_native_inst.av_xcvr_native_insts[0].gen_bonded_group_plls.gen_tx_plls.tx_plls|master_cgb.tx_cgb' is not properly connected on the 'CLKCDRLOC' port. It must be connected to one of the valid ports listed below. Info: Can be connected to OUTCLK port of generic_pll WYSIWYG Info: Can be connected to CLKCDR port of arriav_channel_pll WYSIWYG Info: Can be connected to PHOUT port of arriav_pll_dpa_output WYSIWYG Info: Can be connected to PHOUT port of cyclonev_pll_dpa_output WYSIWYG Info: Can be connected to HFCLKPOUT port of arriav_hssi_pma_tx_cgb WYSIWYG Таких ошибок 16 штук. Как только убираю реконфигуратор - все ок. Если кому-то будет интересно, прикладываю проект на всякий случай (переименовать в .qar).
xcvr.zip ( 2.87 мегабайт )
Кол-во скачиваний: 102Друзья, кто-нибудь с подобным сталкивался? Куда дальше копать? Оно вообще возможно - реконфигурация всех 9 ядер?
|
|
|
|
|
Jul 13 2017, 13:16
|

Местный
  
Группа: Свой
Сообщений: 285
Регистрация: 10-12-04
Из: Earth
Пользователь №: 1 437

|
Смотрите что обнаружилось: When dynamic reconfiguration of the fPLL is not enabled, you must connect the fPLL 'outclk_0' port to the Native PHY 'ext_pll_clk' port. When dynamic reconfiguration of the fPLL is enabled, you must connect to fPLL 'phout[0]' port to the Native PHY 'ext_pll_clk' port. The 'phout' port is enabled by selecting the "Enable access to PLL DPA output port" option of the Altera PLL MegaWizard "Settings" tab.источник: https://www.altera.com/support/support-reso...172013_635.htmlС учетом этих рекомендаций проект собрался.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|