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

Quartus на хочет размещать гигабитные трансиверы

Использую контроллер реконфигурации один на все линии в логическом канале - в настройке interface bundles задается кол-во линий, остальное не выделено, т.е. без всякой реконфигурации PLL.

Я так понял из описания, что MIF можно игнорировать, если не используется реконфигурация. Контроллер кроме неё отвечает за калибровку, но для неё эта хрень тоже не требуется.

 

В общем, раскидал я 24 трансивера, чтобы было 16 каналов на одной скорости и 8 - на другой. Получилась такая картина:

- на одной стороне ПЛИС 12 одинаковых трансиверов на 1 Гбит/c, связанные через xN по 6. Вместе с 2 fPLL и 2 REFCLK. Тут всё хорошо.

- на другой стороне 4 по 1 Гбит/с, связанные через xN, свой fFPLL и REFCLK

- потом 2 по 3,1 Гбит/с, не связанные (x1), от отделньго fPLL

- и завершает всё 6 шт по 3,1 Гбит/с по xN, от отдельного fPLL, REFCLK общий с предыдущей парой.

Короче, внутри тройки квартус вполне себе разводит трансиверы на разной скорости - один связан с соседней тройкой по x6/xN, а 2 других имеют отдельный fPLL по линиям x1.

 

Засада ещё осталась в этом самом контроллере конфигурации. Если контроллер один на всех, то всё ОК. Но у меня 8 каналов включены обязательно (местный XAUI), а 16 - к ним может даже REFCLK не прийти. Но связь по XAUI должна быть, чтобы это диагностировать. Соответственно восьмёрка должна калиброваться сразу при включении, а остальные 16 - когда REFCLK появится. И фигня получилась в том, что 2 контроллера реконфигурации по описанию не могут расшарить между собой тройку.

Пока остановился на том, что они точно не могут работать от разных клоков. Потому что внутри всей этой трансиверной кухни есть некий, скрытый от пользователя, но передаваемый от контроллера калибровочный такт cal_clk, и он один на каждую сторону ПЛИС. И вроде бы калибровка скважности, которая мешает расшарить тройку, не обязательна на моих скоростях, но не отключается в визарде.

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


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

Так удалось кому-нибудь в итоге сделать двухскоростные трансиверы? Да так чтобы все задействовались.

 

Я много чего попробовал, но - безрезультатно. А как-то сообщество молчит. То ли никто этого не делал, то все шифруются ))

https://electronix.ru/forum/index.php?showt...=140385&hl=

https://www.alteraforum.com/forum/showthrea...&highlight=

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


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

Так удалось кому-нибудь в итоге сделать двухскоростные трансиверы? Да так чтобы все задействовались.

 

Я много чего попробовал, но - безрезультатно. А как-то сообщество молчит. То ли никто этого не делал, то все шифруются ))

https://electronix.ru/forum/index.php?showt...=140385&hl=

https://www.alteraforum.com/forum/showthrea...&highlight=

По идее всё задействуются за счёт использования fPLL в качестве TX PLL. А для переключения скорости надо реконфигурировать (сменить делители) в RX PLL и TX PLL или в Central Clock Divider.

 

fPLL - конфигурится отдельно, через её собственный реконфигуратор. RX PLL и делитель конфигурятся через общий реконфигуратор трансиверов, который работает с тройками. В арии 5 нельзя к тройке подключить 2 реконфигуратора - отдельные для трансиверов и PLL/CDR. В циклоне 5 скорее всего также.

 

Частота fPLL должна быть равна половине скорости передачи. У fPLL есть выход DPA - к трансиверам подключается именно он.

 

А протокол обмена какой? Если скорость меняется в 4 раза, то её можно и не переключать. На низкой скорости можно ставить приёмник в режим LTR и обрабатывать в режиме оверсэмплинга программно. Но, если нужно 8B/10B - это тоже придётся программно делать.

 

Ну и заглядывай в Chip Planner, когда хоть что-то удаётся собрать. Увидишь, сколько и каких блоков задействовано.

Изменено пользователем DeadMazay

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


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

DeadMazay, спасибо за советы. Пробую потихонечку различные варианты, пока глухо.

Протокол STM-4/16 (622.08/2488.32), соответственно мне нужен режим LTD (LTR и оверсемплинг, получается, что не подходит). От трансивера нужно только принять/передать байты - вся протокольная логика делается дальше за его пределами.

 

Вот такой эксперимент сделал. Один инстанс трансивера, один ресет контроллер, внешняя fpll, реконфигуратор:

Попытка 1:
  - 1..7 каналов
  - 1 скорость 622.08
  - Bonding xN
  - TX FPLL (311.04)
  - реконфигуратор (1 интерфейс)
Результат: ОК

Попытка 2:
  - 8-9 каналов
  - 1 скорость 622.08
  - Bonding xN
  - TX FPLL (311.04)
  - реконфигуратор (1 интерфейс)
Результат: ошибка на фиттере
Error (14996): The Fitter failed to find a legal placement for all periphery components
    Info (14987): The following components had the most difficulty being legally placed:
        Info (175029): auto-promoted clock driver xcvr:xcvr|altera_xcvr_native_av:xcvr_inst|av_xcvr_native:gen_native_inst.av_xcvr_native_insts[0].gen_bonded_group_native.av_xcvr_native_inst|av_pcs:inst_av_pcs|av_pcs_ch:ch[6].inst_av_pcs_ch|av_hssi_tx_pld_pcs_interface_rbc:inst_av_hssi_tx_pld_pcs_interface|pld8gtxclkout~CLKENA0 (13%)
        Info (175029): auto-promoted clock driver xcvr:xcvr|altera_xcvr_native_av:xcvr_inst|av_xcvr_native:gen_native_inst.av_xcvr_native_insts[0].gen_bonded_group_native.av_xcvr_native_inst|av_pcs:inst_av_pcs|av_pcs_ch:ch[6].inst_av_pcs_ch|av_hssi_rx_pld_pcs_interface_rbc:inst_av_hssi_rx_pld_pcs_interface|pld8grxclkout~CLKENA0 (13%)
        Info (175029): auto-promoted clock driver xcvr:xcvr|altera_xcvr_native_av:xcvr_inst|av_xcvr_native:gen_native_inst.av_xcvr_native_insts[0].gen_bonded_group_native.av_xcvr_native_inst|av_pcs:inst_av_pcs|av_pcs_ch:ch[5].inst_av_pcs_ch|av_hssi_tx_pld_pcs_interface_rbc:inst_av_hssi_tx_pld_pcs_interface|pld8gtxclkout~CLKENA0 (13%)
        Info (175029): auto-promoted clock driver xcvr:xcvr|altera_xcvr_native_av:xcvr_inst|av_xcvr_native:gen_native_inst.av_xcvr_native_insts[0].gen_bonded_group_native.av_xcvr_native_inst|av_pcs:inst_av_pcs|av_pcs_ch:ch[5].inst_av_pcs_ch|av_hssi_rx_pld_pcs_interface_rbc:inst_av_hssi_rx_pld_pcs_interface|pld8grxclkout~CLKENA0 (13%)
        Info (175029): Transmitter channel for I/O xcvr_tx[6] (13%)
        Info (175029): Transmitter channel for I/O xcvr_tx[5] (9%)
        Info (175029): Transmitter channel for I/O xcvr_tx[7] (7%)
        Info (175029): auto-promoted clock driver xcvr:xcvr|altera_xcvr_native_av:xcvr_inst|av_xcvr_native:gen_native_inst.av_xcvr_native_insts[0].gen_bonded_group_native.av_xcvr_native_inst|av_pcs:inst_av_pcs|av_pcs_ch:ch[4].inst_av_pcs_ch|av_hssi_tx_pld_pcs_interface_rbc:inst_av_hssi_tx_pld_pcs_interface|pld8gtxclkout~CLKENA0 (5%)
        Info (175029): auto-promoted clock driver xcvr:xcvr|altera_xcvr_native_av:xcvr_inst|av_xcvr_native:gen_native_inst.av_xcvr_native_insts[0].gen_bonded_group_native.av_xcvr_native_inst|av_pcs:inst_av_pcs|av_pcs_ch:ch[4].inst_av_pcs_ch|av_hssi_rx_pld_pcs_interface_rbc:inst_av_hssi_rx_pld_pcs_interface|pld8grxclkout~CLKENA0 (5%)
        Info (175029): Transmitter channel for I/O xcvr_tx[4] (3%)
    Error (14986): After placing as many components as possible, the following errors remain:
        Error (175001): Could not place 1 HSSI AVMM Interface, which is within Cyclone V Transceiver Native PHY xcvr
            Info (14596): Information about the failing component(s):
                Info (175028): The HSSI AVMM Interface name(s): xcvr:xcvr|altera_xcvr_native_av:xcvr_inst|av_xcvr_native:gen_native_inst.av_xcvr_native_insts[0].gen_bonded_group_native.av_xcvr_native_inst|av_xcvr_avmm:inst_av_xcvr_avmm|avmm_interface_insts[7].av_hssi_avmm_interface_inst
            Error (16234): No legal location could be found out of 3 considered location(s).  Reasons why each location could not be used are summarized below:
                Error (178013): Node is not compatible with other nodes placed at the same location either because there are too few available HSSI AVMM Interface locations, or the nodes belong to different transceiver reconfiguration groups, or both. (1 location affected)
                    Info (175029): HSSIAVMMINTERFACE_X0_Y35_N86. Already placed at this location: HSSI AVMM Interface xcvr:xcvr|altera_xcvr_native_av:xcvr_inst|av_xcvr_native:gen_native_inst.av_xcvr_native_insts[0].gen_bonded_group_native.av_xcvr_native_inst|av_xcvr_avmm:inst_av_xcvr_avmm|avmm_interface_insts[0].av_hssi_avmm_interface_inst
                Error (175006): Could not find path between the HSSI AVMM Interface and destination HSSI PMA TX Buffer
                    Info (175027): Destination: HSSI PMA TX Buffer xcvr:xcvr|altera_xcvr_native_av:xcvr_inst|av_xcvr_native:gen_native_inst.av_xcvr_native_insts[0].gen_bonded_group_native.av_xcvr_native_inst|av_pma:inst_av_pma|av_tx_pma:av_tx_pma|av_tx_pma_ch:tx_pma_insts[7].av_tx_pma_ch_inst|tx_pma_ch.tx_pma_buf.tx_pma_buf
                    Error (175022): The HSSI AVMM Interface could not be placed in any location to satisfy its connectivity requirements
                    Info (175021): The HSSI PMA TX Buffer was placed in location HSSIPMATXBUF_X0_Y43_N34
                    Info (175029): 2 locations affected
                        Info (175029): HSSIAVMMINTERFACE_X0_Y11_N86. 3 other HSSI AVMM Interfaces are being routed to this region.
                        Info (175029): HSSIAVMMINTERFACE_X0_Y23_N86. 3 other HSSI AVMM Interfaces are being routed to this region.

 

Картинка с фиттера с удачной компиляции 7 каналов:

post-1437-1514450363_thumb.png

Как видите, есть полностью свободные два блока. Почему он их не хочет задействовать? Насколько я понимаю из ошибок, он не может подцепить реконфигуратор. Но тогда как? Я вот сейчас попробовал сделать два отдельных 3-канальных инстанса с отдельными реконфигураторами (ну чтобы всё по-честному - один реконфигуратор на один триплет) - так он и их не хочет собирать.

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


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

Итак, чего удалось добиться. Проект состоит из:

- Ресет-контроллер.

- Отдельная FPLL со своим реконфигуратором.

- Трансивер в режиме внешней PLL (для двух скоростей использую две TXPLL).

- Базовая скорость трансивера 622.08 (и 322.04 у FPLL соответственно).

- Реконфигуратор трансивера (количество его каналов тоже меняется в соответствии с трансивером, включен режим MIF).

 

Что получается:

При количестве каналов от 1 до 6 - всё собирается отлично.

При количестве каналов от 7 до 8 получаю ошибку фиттера:

Info (170193): Fitter routing operations beginning
Error (170084): Can't route signal "xcvr:inst3|altera_xcvr_native_av:xcvr_inst|av_xcvr_native:gen_native_inst.av_xcvr_native_insts[0].gen_bonded_group_native.av_xcvr_native_inst|av_pma:inst_av_pma|av_tx_pma:av_tx_pma|av_tx_pma_ch:tx_pma_insts[0].av_tx_pma_ch_inst|tx_pma_ch.int_wire_clk[0]" to atom "xcvr:inst3|altera_xcvr_native_av:xcvr_inst|av_xcvr_native:gen_native_inst.av_xcvr_native_insts[6].gen_bonded_group_native.av_xcvr_native_inst|av_pma:inst_av_pma|av_tx_pma:av_tx_pma|av_tx_pma_ch:tx_pma_insts[0].av_tx_pma_ch_inst|tx_pma_ch.tx_cgb"
Error (170084): Can't route signal "xcvr:inst3|altera_xcvr_native_av:xcvr_inst|av_xcvr_native:gen_native_inst.av_xcvr_native_insts[0].gen_bonded_group_native.av_xcvr_native_inst|av_pma:inst_av_pma|av_tx_pma:av_tx_pma|av_tx_pma_ch:tx_pma_insts[0].av_tx_pma_ch_inst|tx_pma_ch.int_wire_clk[0]" to atom "xcvr:inst3|altera_xcvr_native_av:xcvr_inst|av_xcvr_native:gen_native_inst.av_xcvr_native_insts[6].gen_bonded_group_native.av_xcvr_native_inst|av_pma:inst_av_pma|av_tx_pma:av_tx_pma|av_tx_pma_ch:tx_pma_insts[0].av_tx_pma_ch_inst|tx_pma_ch.tx_cgb"
Info (170194): Fitter routing operations ending: elapsed time is 00:00:01

 

В целом уже лучше ))

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


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

Убрал ресеты, и ресет-контроллер вообще из проекта - ничего не изменилось, ошибки остались те же.

Пробовал ставить ALTCLKCTRL перед FPLL - не помогает. После FPLL - не дает, т.к. хочет чтобы клок в трансивер шел с PLL напрямую.

Попробовал использовать Transceiver PLL - тоже не помогает, ошибки те же.

Есть идеи?

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


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

Что получается:

При количестве каналов от 1 до 6 - всё собирается отлично.

При количестве каналов от 7 до 8 получаю ошибку фиттера

Я детально не разбирался в циклоне 5, но на арии 5 нельзя от одного fPLL запустить больше 6 или 7 передатчиков.

Я задействовал 2 fPLL на 12 трансиверов, по 6 передатчиков на каждый fPLL. Возможно даже, что от единственного REFCLK заработает.

 

Протокол STM-4/16 (622.08/2488.32), соответственно мне нужен режим LTD (LTR и оверсемплинг, получается, что не подходит).

Можно включить трансиверы постоянно на 2488 Мбит в режиме LTD. А на 622 переключать в LTR и получать оверсэмплинг в 4 раза.

Только ресет-контроллеру нужно не забыть об этом сказать, если он работает по сигналу rx_is_lockedtodata.

Изменено пользователем DeadMazay

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


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

Как раз сегодня ночью меня тоже осенило что возможно нужно питать трансиверные триплеты отдельными PLL-ками.

В-общем, после ряда экспериментов оно наконец-то собралось - все 9 трансиверов в дуплексном двухскоростном режиме с поддержкой реконфигурации! То что мне и нужно!

 

Структура проекта получилась следующая:

3 блока, каждый состоящий из:

- FPLL с частотой 311.04

- PLL Reconfiguration controller

- Трансивер в дуплексном режиме (External PLL - 2 штуки, TXPLL0=622.08, TXPLL1=2488.32, у обоих TXPLL - Bonding x1)

1 общий блок Transceiver Reconfiguration Controller (9 каналов, сгруппированные в 3 группы по 3 канала)

 

FPLL питаются двумя клоками - один питает одну, второй клок питает оставшиеся две FPLL (а каждая FPLL в свою очередь питает по 3 канала каждого трансивера (точнее 6 каналов, т.к. 3 канала по 2 скорости)).

Опорный клок для RXCDR - один общий.

Клок/ресет для всех реконфигураторов - один общий.

 

Что стоит отметить отдельно:

1. Я сначала пошел по простому пути и просто скопировал (копипастнул) трансивер с FPLL три раза. И оно не собралось. После тушения жопы и подключения мозгов оказалось что ему необходимо иметь не просто разные инстансы трансиверов, а именно разно созданные ядра, пусть и с одинаковыми в моем случае настройками.

2. FPLL тоже нужны в виде именно отдельно созданных IP-ядер.

3. Реконфигуратор трансивера допускается только одним инстансом (но в настройках можно разбить каналы на группы как нужно). Несколько реконфигураторов (например, 3 по 3 канала) - не собирает.

4. Реконфигуратор для FPLL можно использовать в виде одного ядра, просто скопипащенного 3 несколько раз.

5. Запитать 3 FPLL от одного клока не получилось - пришлось задействовать две клоковые ножки.

 

Хочу отдельной строкой сказать спасибо DeadMazay за помощь!

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


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

3 блока, каждый состоящий из:

- FPLL с частотой 311.04

- Трансивер в дуплексном режиме (External PLL - 2 штуки, TXPLL0=622.08, TXPLL1=2488.32, у обоих TXPLL - Bonding x1)

1 общий блок Transceiver Reconfiguration Controller (9 каналов, сгруппированные в 3 группы по 3 канала)

Дык получается на каждую тройку 2 ФАПЧа должно быть - если они подключаются как TXPLL0 и TXPLL1? Или всё-таки один ФАПЧ реконфигурируется? Или у ФАПЧа много выходов DPA?

 

FPLL питаются двумя клоками - один питает одну, второй клок питает оставшиеся две FPLL (а каждая FPLL в свою очередь питает по 3 канала каждого трансивера (точнее 6 каналов, т.к. 3 канала по 2 скорости)).

Опорный клок для RXCDR - один общий.

 

5. Запитать 3 FPLL от одного клока не получилось - пришлось задействовать две клоковые ножки.

Я запитывал 2шт. FPLL от того же опорного клока, что и 8шт. RXCDR, то есть с одной выделенной ноги REFCLK

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


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

А у меня эта кухня заработала уже в железе.

То же всем спасибо, с Новым Годом!

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


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

Снова дошли руки до этого проекта. И возникла очередная заминка.

С приёмом данных всё в порядке - поток приходит, разворачивается в байты и всё хорошо.

Проблема с передачей - передатчик вообще ничего не передаёт. Совсем.

 

Если включить pre- и post-CDR завороты, то на передающие пины данные выводятся, что говорит о том что уровень PMA работает нормально и проблема где-то выше - в PCS части. Измерительный прибор данные видит и успешно восстанавливает частоту.

 

Но если завернуть поток на уровне PCS - после десериализации (ну например, соединить rx_parallel_data b tx_parallel_data), то на выходных пинах - тишина.

TX часть не висит в сбросе - все сигналы индицируют что передатчик откалибровался и готов работать.

Я перепробовал, пожалуй, все возможные варианты и ничего пока не помогает:

- передавать биты задом наперед

- двигать биты сигналом tx_bitslip

- инвертировать полярность

- крутить настройки TXPLL, integer, fractional режим

- тактировать tx разными клоками

 

И всё равно на выходе - 0.

У кого это хозяйство работает - что вы делали для передачи?

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


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

Проблема с передачей - передатчик вообще ничего не передаёт. Совсем.

 

Если включить pre- и post-CDR завороты, то на передающие пины данные выводятся, что говорит о том что уровень PMA работает нормально и проблема где-то выше - в PCS части. Измерительный прибор данные видит и успешно восстанавливает частоту.

 

Не понял вопроса. Он всё-таки передаёт, или не передаёт? Заворот post-CDR работает?

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


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

Не понял вопроса. Он всё-таки передаёт, или не передаёт? Заворот post-CDR работает?

Если включить заворот post-CDR, то да, работает. Но в этом случае работает только PMA-часть трансивера, PCS не задействуется.

Если же заворот выключить и руками завернуть параллельные шинки rx на tx (ну или просто подать константу), то не работает - на выходе ничего нет.

 

Кстати, а какой частотой (каким значением) должен тактироваться передающий тракт (tx_coreclkin)? Такой же, которую выдает CDR после восстановления? Как-то не очень ясен этот момент. Есть подозрение что проблема в этом.

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


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

Если включить заворот post-CDR, то да, работает. Но в этом случае работает только PMA-часть трансивера, PCS не задействуется.

Если же заворот выключить и руками завернуть параллельные шинки rx на tx (ну или просто подать константу), то не работает - на выходе ничего нет.

 

Кстати, а какой частотой (каким значением) должен тактироваться передающий тракт (tx_coreclkin)? Такой же, которую выдает CDR после восстановления? Как-то не очень ясен этот момент. Есть подозрение что проблема в этом.

 

Я имею в виду шлейф Serial Loopback из даташита. В этом случае и PCS, и PMA работают.

 

На tx_coreclkin подаётся локальная частота, не из CDR. Это частота интерфейса между логикой и PCS. Её можно взять из передатчика, или прямо от генератора.

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


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

В результате ряда экспериментов на serial loopback'e выяснилось что на tx_std_clkout выходит частота вдвое большая, чем надо. Ожидается 77.76, а выходит 155.52.

 

Скорость передачи 622.08 Мбит/с,

TX FPLL настроена корректно:

- частота 311.04,

параметры трансивера тоже:

- Data rate = 622.08

- TX local clock division factor = 1

- PCS width = 8 bits

 

Что интересно, RX часть трансивера работает отлично - CDR лочится и выдает ожидаемую 77.76 (ширина шины после десереализации - 8 бит). Теперь понятно почему RX не видит TX :))))

Но вот почему частоты приемного и передающего каналов различаются - ума не приложу пока.

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


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

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

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

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

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

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

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

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

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

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