Перейти к содержанию
    

Реконфигурация трансивера

Уважаемые друзья. Не могу никак понять несколько вещей, которые не дают двигаться дальше.

 

Хочу сделать реконфигурацию трансивера. Для этого собрал 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, только сильно проще и под свои нужды.

Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добрый день

Делал реконфигуратор трансиверов через SystemConsol но в схематике, на что можно обратить внимание:

1 Клок чтения/записи должен лежать в определённом диапазоне

2 Пауза между запросами на чтение/запись должна быть достаточно длинной. С сигналом busy была какая-то проблема, его не использовал.

3 В SystemConsol я использовал команды master_write_32 и master_read_32. При этом в скрипте адрес умножал на 4, а в Quartus’е два младших разряда шины адреса модуля JTAG_2_Avalon не использовал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

DuHast, спасибо за отклик!

 

 

Добрый день

Делал реконфигуратор трансиверов через 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'е и он, по идее, сам это разрулить должен. Кроме того, я по сигналтапу вижу что адреса на входе реконфигуратора выставляются верно.

 

 

Вообще, у меня есть подозрение что всё на самом деле работает, просто я пока не до конца понимаю как этот паровоз запустить. :wacko:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может команды не те шлёте? Там ,сначала пишешь по одному адресу, чтобы выбрать регистр, потом по другому пишешь желаемое значение этого регистра, а потом по третьему адресу шлёшь команду, чтобы это значение записалась куда надо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я делаю в точности так же.

Давайте я выложу сюда скрипт, которым пишу/читаю, а вы посмотрите на своем проекте - работает ли он? Переименуйте его в .tcl, а то форум не дает загружать с таким расширением :)

main.txt

Пример использования:

# пытаемся читать/писать канал 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Продолжаю изучение. Залез сигналтапом в блок настройки регистров 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 в моем случае). B). Т.е. в разных семействах разные фичи могут быть частично или полностью недоступными. [botan mode off] Так что теперь остается проверить все остальные блоки реконфигурации, сопоставить их с даташитом - и пробовать запускать обмен данными.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тоже обнаружил что "Pre-emphasis pre-tap" и "Pre-emphasis second post-tap" в Cyclone5 не работают. Пользуюсь 14-м Квартусом, думал что дальше лучше, но не тут то было. Как говорится "ну а что вы хотели за эти деньги" :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тоже обнаружил что "Pre-emphasis pre-tap" и "Pre-emphasis second post-tap" в Cyclone5 не работают. Пользуюсь 14-м Квартусом, думал что дальше лучше, но не тут то было. Как говорится "ну а что вы хотели за эти деньги" :)

А при чём здесь версия Квартуса? Трансивер - это "железный" блок, как его на заводе "собрали" так и работает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Продолжаю разбиралово. Если трансивер использует, например, две скорости, то ему в опору ставят разные 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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Продолжаю разбиралово. Если трансивер использует, например, две скорости, то ему в опору ставят разные 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. Если не весь блок занят оставшиеся можно использовать для тактирования передатчиков.

post-60179-1488378703_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

С 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 я вижу что прием идет ну совсем некорректно (как будто бы на другой частоте). Судя по всему, так делать нельзя.

 

Как его сбрасывать-то правильно?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Подниму тему, т.к. не всё получается.

 

Как работать с одним трансивером - разобрался, тут вопросов нет: все отлично реконфигурируется и работает.

Если я задействую все 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

 

Друзья, кто-нибудь с подобным сталкивался? Куда дальше копать? Оно вообще возможно - реконфигурация всех 9 ядер?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Смотрите что обнаружилось:

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

 

С учетом этих рекомендаций проект собрался.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В-общем, не получается никак это дело запустить. Возникает ощущение что это невозможно в принципе, потому что мой запас идей иссяк полностью.

Друзья, кто-то делал подобное?

 

xcvr.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...