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

 
 
 
Reply to this topicStart new topic
> Реконфигурация трансивера, Cyclone V
spectr
сообщение Feb 10 2017, 10:19
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 243
Регистрация: 10-12-04
Из: Moscow
Пользователь №: 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, только сильно проще и под свои нужды.
Спасибо.
Go to the top of the page
 
+Quote Post
DuHast
сообщение Feb 12 2017, 15:27
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 294
Регистрация: 13-07-06
Из: Москва
Пользователь №: 18 797



Добрый день
Делал реконфигуратор трансиверов через SystemConsol но в схематике, на что можно обратить внимание:
1 Клок чтения/записи должен лежать в определённом диапазоне
2 Пауза между запросами на чтение/запись должна быть достаточно длинной. С сигналом busy была какая-то проблема, его не использовал.
3 В SystemConsol я использовал команды master_write_32 и master_read_32. При этом в скрипте адрес умножал на 4, а в Quartus’е два младших разряда шины адреса модуля JTAG_2_Avalon не использовал.
Go to the top of the page
 
+Quote Post
spectr
сообщение Feb 13 2017, 09:57
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 243
Регистрация: 10-12-04
Из: Moscow
Пользователь №: 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'е и он, по идее, сам это разрулить должен. Кроме того, я по сигналтапу вижу что адреса на входе реконфигуратора выставляются верно.


Вообще, у меня есть подозрение что всё на самом деле работает, просто я пока не до конца понимаю как этот паровоз запустить. wacko.gif
Go to the top of the page
 
+Quote Post
DuHast
сообщение Feb 13 2017, 19:06
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 294
Регистрация: 13-07-06
Из: Москва
Пользователь №: 18 797



Может команды не те шлёте? Там ,сначала пишешь по одному адресу, чтобы выбрать регистр, потом по другому пишешь желаемое значение этого регистра, а потом по третьему адресу шлёшь команду, чтобы это значение записалась куда надо.
Go to the top of the page
 
+Quote Post
spectr
сообщение Feb 14 2017, 08:37
Сообщение #5


Местный
***

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



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

Пример использования:
Код
# пытаемся читать/писать канал 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
Go to the top of the page
 
+Quote Post
dmy
сообщение Feb 14 2017, 13:34
Сообщение #6





Группа: Участник
Сообщений: 14
Регистрация: 14-07-16
Пользователь №: 92 555



.del.
Извините, ошибся окном.

Сообщение отредактировал dmy - Feb 14 2017, 13:38
Go to the top of the page
 
+Quote Post
spectr
сообщение Feb 14 2017, 14:33
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 243
Регистрация: 10-12-04
Из: Moscow
Пользователь №: 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]Как это обычно бывает, умная мысль приходит после драки sm.gif Покопавшись поглубже в альтеровских исходниках и даташите на камень выяснил, что таки экспериментально выявленные мной диапазоны реальных допустимых значений регистров оказывается прописаны в даташите на конкретное семейство кристалла (CV в моем случае). cool.gif. Т.е. в разных семействах разные фичи могут быть частично или полностью недоступными. [botan mode off] Так что теперь остается проверить все остальные блоки реконфигурации, сопоставить их с даташитом - и пробовать запускать обмен данными.
Go to the top of the page
 
+Quote Post
Tue
сообщение Feb 27 2017, 15:37
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 154
Регистрация: 7-09-05
Из: Москва
Пользователь №: 8 340



Тоже обнаружил что "Pre-emphasis pre-tap" и "Pre-emphasis second post-tap" в Cyclone5 не работают. Пользуюсь 14-м Квартусом, думал что дальше лучше, но не тут то было. Как говорится "ну а что вы хотели за эти деньги" sm.gif
Go to the top of the page
 
+Quote Post
DuHast
сообщение Feb 27 2017, 20:06
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 294
Регистрация: 13-07-06
Из: Москва
Пользователь №: 18 797



Цитата(Tue @ Feb 27 2017, 18:37) *
Тоже обнаружил что "Pre-emphasis pre-tap" и "Pre-emphasis second post-tap" в Cyclone5 не работают. Пользуюсь 14-м Квартусом, думал что дальше лучше, но не тут то было. Как говорится "ну а что вы хотели за эти деньги" sm.gif

А при чём здесь версия Квартуса? Трансивер - это "железный" блок, как его на заводе "собрали" так и работает.
Go to the top of the page
 
+Quote Post
spectr
сообщение Mar 1 2017, 07:07
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 243
Регистрация: 10-12-04
Из: Moscow
Пользователь №: 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.
Go to the top of the page
 
+Quote Post
MrAlex
сообщение Mar 1 2017, 13:27
Сообщение #11


Частый гость
**

Группа: Свой
Сообщений: 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. Если не весь блок занят оставшиеся можно использовать для тактирования передатчиков.
Прикрепленное изображение
Go to the top of the page
 
+Quote Post
spectr
сообщение Mar 14 2017, 15:40
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 243
Регистрация: 10-12-04
Из: Moscow
Пользователь №: 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 я вижу что прием идет ну совсем некорректно (как будто бы на другой частоте). Судя по всему, так делать нельзя.

Как его сбрасывать-то правильно?
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 28th April 2017 - 02:28
Рейтинг@Mail.ru


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