Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Ошибки передачи GTP Transciever
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
count_enable
Передаю 32-битные слова через трансивер, сконфигурированный в режиме 32бит.
После установки канала, в данные каждые несколько тысяч слов влазит лишний байт или теряется один. Соответственно если передавалось AABBCCDD 00010203 то получается BBCCDD00 010203AA.... И смещение это меняется каждые несколько тысяч слов.
Прикрепил vcd где пойман момент перехода с одного смещения во второе.

Вот на картинке четко виден момент перехода- теряется одна кома ВС.

Перепробовал с Comma Alignment и без -все без толку. Не знаю что дальше делать.
cerg19
Цитата
Сделал "по книге"

а что за книга, если не секрет.

А искажения происходят только в словах Comma или в любом слове передаваемого потока?
Используется ли clock correction?
count_enable
"По книге" - сгенерил корку визардом, взял пример и изменил только генератор данных на передачу и приемник. Т.е. дизайн такой же как описан в GTP Wrapper User Guide. Clock correction не использую, сейчас буду пробовать с ним.
count_enable
Добавил clock correction, только хуже стало. Выравнивание дальше плавает, но значительно больше ошибок передачи стало.
Andrew Su
Цитата(count_enable @ Jun 21 2013, 16:04) *
Добавил clock correction, только хуже стало. Выравнивание дальше плавает, но значительно больше ошибок передачи стало.

Добрый день.
Вы соединяете разные платы или замыкаете петлю на одной?
Для того, чтобы работал clock correction надо на передающей стороне вклинивать в поток символы коррекции синхронизации, а на приемной обеспечить их отслеживание.
А лучше всего сгенерить Avrora интерфейс. Там уже заложены механизмы коррекции синхронизации.
При генерации ядра генерируются все исходники. При желании можно разобраться, как все работает.
При условии, что генераторы на разных сторонах расходятся не более, чем (по моему) на 100ppm, ядро Avrora само вставляет в нужный момент в поток синхросимволы и коммы, обеспечивая нормальную передачу данных, поднятие и отслеживание линка, а также регистрацию ошибок.
Соединял таким образом платы ML505 и SP605, передача велась на скорости 3.125 Гбит, тестировал по 10-11 часов. Работает без ошибок.
Учитывая большее, чем допустимо расхождение генераторов, подкорректировал гнемного исходники, чтобы синхросимволы вклинивались чаще.
Удачи.
count_enable
Да, соединяю платы сата-кабелем 50 см.

Сгенерил авроровскую корку, запускаю готовый тестбенч demo_tb, но передача не начинается! Идут резеты, стабилизируется канал, но channel_up не поднимается в 1. Симулирую в Исиме, моделсима нету. Не менял ни байта в тестбенче. Где я накосячил?
count_enable
Симуляция Авроры 5.2 для Spartan 6: channel_up поднимается в 1 на 7000 ns , но lane_up_1_i не устанавливается ( UU) вообще. Принимаются сами нули. Ничего не менял в корке и тестбенче - все IP Core Gen сделал.

Если можете выложить Вас проект с авророй, который симулируется в исиме, буду очень благодарен.
count_enable
Методом научного тыка определил что проблема в выравнивании клоков. Если получается RX Elastic Buffer underflow, то в том же слове дублируется 1 байт. Если же переполнение, то через 16 слов теряется 1 байт! Кто-нибудь сталкивался с этим? Аврора упорно не хочет симулироваться.
XVR
Цитата(count_enable @ Jun 27 2013, 11:54) *
Если получается RX Elastic Buffer underflow, то в том же слове дублируется 1 байт. Если же переполнение, то через 16 слов теряется 1 байт!
Логично cool.gif
Цитата
Кто-нибудь сталкивался с этим?

Видимо те, кто придумал clock correction и Сomma символы сталкивались
Либо синхронизируйте клок на приемном конце с клоком на передающем, либо разбирайтесь как работает этот самый clock correction, его недостаточно просто включить wink.gif
count_enable
Я так понимаю, что для clock correction мне надо периодически передавать слово коррекции, тогда приемник сам будет его урезать или вставлять больше? В визарде задал слово коррекции 00000000 - по дефолту. Вставляю каждый 6 байт сами нули, каждые 6 байт слово из comma (BCBCBCBC). Но тем не менее никакого эффекта не произвело - режутся и вставляются символы когда им вздумается, а не нули.

Тоже не очень понимаю эффект Recovered Clock. В мануале сказано, что если выбрать RX_XCLK_SEL_0 = ("RXREC"), то будет использоваться клок, восстановленый с входящего сигнала и тогда clock correction не нужно. Но не заметил эффекта никакого. Дальше регулярно ловлю недополнения и переполнения буфера.
XVR
Цитата(count_enable @ Jun 27 2013, 14:39) *
Я так понимаю, что для clock correction мне надо периодически передавать слово коррекции, тогда приемник сам будет его урезать или вставлять больше?
Теорически да. Практически надо читать DS, как именно корка хочет работать с clock correction
Цитата
В визарде задал слово коррекции 00000000 - по дефолту.
...
Тоже не очень понимаю эффект Recovered Clock.
Что то не так сделали. Что пишут в DS и Errata?
count_enable
Цитата(XVR @ Jun 27 2013, 22:07) *
Теорически да. Практически надо читать DS, как именно корка хочет работать с clock correction
Что то не так сделали. Что пишут в DS и Errata?

Первое что есть: "After an RX buffer overflow or underflow, the RX elastic buffer must be reset using the
RXBUFRESET port to ensure correct behavior."
- но тогда я утрачиваю около 16 слов данных!

Второе это с коррекцией (стр. 147)
Цитата
The RX elastic buffer limits are set using CLK_COR_MIN_LAT (minimum latency) and
CLK_COR_MAX_LAT (maximum latency). When the number of bytes in the RX elastic
buffer drops below CLK_COR_MIN_LAT, the clock correction circuit writes an additional
CLK_COR_ADJ_LEN bytes from the first clock correction sequence it matches to prevent
the buffer from underflowing. Similarly, when the number of bytes in the RX elastic buffer
exceeds CLK_COR_MAX_LAT, the clock correction circuit deletes CLK_COR_ADJ_LEN
bytes from the first clock correction sequence it matches, starting with the first byte of the
sequence.


Все данные с руководства http://www.xilinx.com/support/documentatio...uides/ug386.pdf

Бьюсь с этим уже больше недели, полный ступор. Добился пока что только сигнализации добавления или удаления байта. Если с добавлением коррекция данных тривиальна, то с удалением восстановить данные невозможно. Тестирую на 2 самодельных платах, на одной постоянно overflow, на другой underflow. Никаких сил уж нет...

XVR
А сами патерны установили? CLK_COR_SEQ_*, CLK_COR_SEQ_*_ENABLE, CLK_COR_SEQ_*_USE, CLK_CORRECT_USE_*, RX_DECODE_SEQ_MATCH_*
И вообще, все что написано начиная со страницы 147 руководства по вашей ссылке


Цитата
то с удалением восстановить данные невозможно.
Так удаляться должны как раз ваши специально добавленные на передающей стороне данные. Зачем их восстанавливать?
count_enable
Цитата(XVR @ Jun 28 2013, 13:36) *
А сами патерны установили? CLK_COR_SEQ_*, CLK_COR_SEQ_*_ENABLE, CLK_COR_SEQ_*_USE, CLK_CORRECT_USE_*, RX_DECODE_SEQ_MATCH_*
И вообще, все что написано начиная со страницы 147 руководства по вашей ссылке


Так удаляться должны как раз ваши специально добавленные на передающей стороне данные. Зачем их восстанавливать?

Пробую с CLK_COR_SEQ_1_1_0 => ("0111011100"), и CLK_COR_SEQ_1_1_0=> ("0100000000"), каждые 6 байт передаю или 4 коммы BCBCBCBC или четыре нуля 0000000. Если сделать buffer reset overflow или underflow - удаляется 16 байт.

Все параметры установлены как ниже:
Код
  --RX Elastic Buffer and Phase alignment Attributes
        RX_BUFFER_USE_0                         =>     (TRUE),
        RX_EN_IDLE_RESET_BUF_0                  =>     (FALSE),
        RX_IDLE_HI_CNT_0                        =>     ("1000"),
        RX_IDLE_LO_CNT_0                        =>     ("0000"),
        RX_XCLK_SEL_0                           =>     ("RXUSR"),
        RX_BUFFER_USE_1                         =>     (TRUE),
        RX_EN_IDLE_RESET_BUF_1                  =>     (FALSE),
        RX_IDLE_HI_CNT_1                        =>     ("1000"),
        RX_IDLE_LO_CNT_1                        =>     ("0000"),
        RX_XCLK_SEL_1                           =>     ("RXUSR"),

       --Clock Correction Attributes
        CLK_COR_ADJ_LEN_0                       =>     (4),
        CLK_COR_DET_LEN_0                       =>     (4),
        CLK_COR_INSERT_IDLE_FLAG_0              =>     (TRUE),
        CLK_COR_KEEP_IDLE_0                     =>     (FALSE),
        CLK_COR_MAX_LAT_0                       =>     (18),
        CLK_COR_MIN_LAT_0                       =>     (16),
        CLK_COR_PRECEDENCE_0                    =>     (TRUE),
        CLK_COR_REPEAT_WAIT_0                   =>     (5),
        CLK_COR_SEQ_1_1_0                       =>     ("0000000000"),
        CLK_COR_SEQ_1_2_0                       =>     ("0000000000"),
        CLK_COR_SEQ_1_3_0                       =>     ("0000000000"),
        CLK_COR_SEQ_1_4_0                       =>     ("0000000000"),
        CLK_COR_SEQ_1_ENABLE_0                  =>     ("0000"),
        CLK_COR_SEQ_2_1_0                       =>     ("0000000000"),
        CLK_COR_SEQ_2_2_0                       =>     ("0000000000"),
        CLK_COR_SEQ_2_3_0                       =>     ("0000000000"),
        CLK_COR_SEQ_2_4_0                       =>     ("0000000000"),
        CLK_COR_SEQ_2_ENABLE_0                  =>     ("0000"),
        CLK_COR_SEQ_2_USE_0                     =>     (FALSE),
        CLK_CORRECT_USE_0                       =>     (TRUE),
        RX_DECODE_SEQ_MATCH_0                   =>     (TRUE),
        CLK_COR_ADJ_LEN_1                       =>     (4),
        CLK_COR_DET_LEN_1                       =>     (4),
        CLK_COR_INSERT_IDLE_FLAG_1              =>     (TRUE),
        CLK_COR_KEEP_IDLE_1                     =>     (FALSE),
        CLK_COR_MAX_LAT_1                       =>     (18),
        CLK_COR_MIN_LAT_1                       =>     (16),
        CLK_COR_PRECEDENCE_1                    =>     (TRUE),
        CLK_COR_REPEAT_WAIT_1                   =>     (5),
        CLK_COR_SEQ_1_1_1                       =>     ("0100000000"),
        CLK_COR_SEQ_1_2_1                       =>     ("0100000000"),
        CLK_COR_SEQ_1_3_1                       =>     ("0100000000"),
        CLK_COR_SEQ_1_4_1                       =>     ("0100000000"),
        CLK_COR_SEQ_1_ENABLE_1                  =>     ("0000"),
        CLK_COR_SEQ_2_1_1                       =>     ("0100000000"),
        CLK_COR_SEQ_2_2_1                       =>     ("0100000000"),
        CLK_COR_SEQ_2_3_1                       =>     ("0100000000"),
        CLK_COR_SEQ_2_4_1                       =>     ("0100000000"),
        CLK_COR_SEQ_2_ENABLE_1                  =>     ("0000"),
        CLK_COR_SEQ_2_USE_1                     =>     (FALSE),
        CLK_CORRECT_USE_1                       =>     (TRUE),
        RX_DECODE_SEQ_MATCH_1                   =>     (TRUE),
count_enable
Добавил себе порт RXCLKCORCNT0 - коррекции клока не происходит, даже при обнаружении переполнения.
Скорее всего, не детектится clock correction sequence как такая.
XVR
Пока бросилось в глаза
Цитата
CLK_COR_SEQ_1_ENABLE_0 => ("0000"),
CLK_COR_SEQ_1_ENABLE_1 => ("0000"),
CLK_COR_SEQ_2_ENABLE_0 => ("0000"),
CLK_COR_SEQ_2_ENABLE_1 => ("0000"),
Т.е. у вас все символы в clock correction seq замаскированны, и корка будет воспринимать любой входной байт как символ коррекции
count_enable
Поменял на все единицы, но все так же не получаю сигнала RXCLKCORCNT0 - т.е не происходит коррекции вообще sad.gif.
count_enable
При любых параметрах СLK_COR_SEQ не наблюдаю изменения RXCLKCORCNT - коррекции не происходит. Какие могут быть ошибки? Under и Overflow выкрываю регулярно.
toshas
последовательность можно искать как до 8b10b так и после, проверьте, нет ли ошибки в этом.
count_enable
RX_DECODE_SEQ_MATCH_1 => (TRUE), так что верю что ищет после декодирования. Поставил как символ просто 00, не комму - не работаееееетт!!! В общем у меня после пары недель мозговой ступор. Намертво.

toshas
сначала добейтесь работы в симуляторе!
для spartan6 собрал ядро transciever_wizard'ом, СС длиной 1 по K28.5,
поправил тестбенч, установив два ядра с небольшим разбегом частоты.
на интервале 100 мкс проходит 4ре подстройки частоты ,
вот архив:
http://rusfolder.com/37084331 (for_count_enable)

Цитата(count_enable @ Jun 28 2013, 14:04) *
Пробую с CLK_COR_SEQ_1_1_0 => ("0111011100"), и CLK_COR_SEQ_1_1_0=> ("0100000000"), каждые 6 байт передаю или 4 коммы BCBCBCBC или четыре нуля 0000000. Если сделать buffer reset overflow или underflow - удаляется 16 байт.


и 11011100 это не K28.5, а K28.6, т.е. DC

dsmv
Небольшой offtop;

Если нет внешних требований, то рекомендую отказаться от 8/10 и использовать 64/67; На приёмной стороне надо использовать восстановленную частоту для фиксации данных.


Если интересно, могу дать пример.

cerg19
Вижу вам много чего дельного насоветовали, внесу и свои 5 копеек.

Как я понял платы сделаны самостоятельно. Я бы проверил каждую плату по отдельности. В приёмопередатчиках есть генераторы и анализаторы псевдослучайных последовательностей с внутренними петлями на разных уровнях. Попробуйте их и посмотрите всё ли работает с внутренними петлями.

Только не сдавайтесь, эти GTP тот ещё квест)
count_enable
Огромное спасибо всем, особенно товарищу toshas, убедившему меня, что коррекция клока существует!

В версии 1.10 у меня так и не заработало, перешел на версию корки 1.11, и после долгих мучений и перебора параметров я имел возможность наблюдать коррекцию в железе.

Общий баланс:
- Потрачено около месяца на внешне нетрудное задание.
- Навсегда загублена репутация человека, могущего создать прототип чего-угодно за неделю (репутация была создана на обычных микроконтроллерах, так что цена ее невелика, но все же...)
- Несколько недель стресса и отвратительного настроения.
- Навсегда потеряна вера в высокоуровневые инструменты Xilinx. Использование мастера при генерации корки не помогло обойтись без ручной правки и копания в сотнях параметров. Сгенерированые wrappers плохи, неочевидны и документованы по-индусски.
- Навсегда потеряна вера в документацию и технические форумы Xilinx.

+ Возникло уважение к electronix.ru, наверно единственному техническому форуму, где дают советы по делу вместо троллинга и флуда.
+ Узнал много нового о Gigabit Transceiver, Chipscope.


Надеюсь когда-то отплатить своими знаниями другому новичку в этом ужасном и удивительном мире ПЛИС.

Тему пока закрывать не буду, ибо трансивер и глюки неисчерпаемы, как атом.

Lutovid
Цитата(count_enable @ Jun 28 2013, 15:08) *
Добавил себе порт RXCLKCORCNT0 - коррекции клока не происходит, даже при обнаружении переполнения.
Скорее всего, не детектится clock correction sequence как такая.


Та же проблема 1в1. Автор, решил как-нибудь?
Я могу добавиль лишь то, что если ты выберешь последовательность в визарде "don't care" то клок коррекшн начнет отрабатывать< но что толку, если он все равно делает непредсказуемые вещи и трет нужные данные
(прошу прощения, не заметил второй страницы)))))

Цитата(count_enable @ Jul 7 2013, 23:04) *
Огромное спасибо всем, особенно товарищу toshas, убедившему меня, что коррекция клока существует!

В версии 1.10 у меня так и не заработало, перешел на версию корки 1.11, и после долгих мучений и перебора параметров я имел возможность наблюдать коррекцию в железе.

Общий баланс:
- Потрачено около месяца на внешне нетрудное задание.
- Навсегда загублена репутация человека, могущего создать прототип чего-угодно за неделю (репутация была создана на обычных микроконтроллерах, так что цена ее невелика, но все же...)
- Несколько недель стресса и отвратительного настроения.
- Навсегда потеряна вера в высокоуровневые инструменты Xilinx. Использование мастера при генерации корки не помогло обойтись без ручной правки и копания в сотнях параметров. Сгенерированые wrappers плохи, неочевидны и документованы по-индусски.
- Навсегда потеряна вера в документацию и технические форумы Xilinx.

+ Возникло уважение к electronix.ru, наверно единственному техническому форуму, где дают советы по делу вместо троллинга и флуда.
+ Узнал много нового о Gigabit Transceiver, Chipscope.


Надеюсь когда-то отплатить своими знаниями другому новичку в этом ужасном и удивительном мире ПЛИС.

Тему пока закрывать не буду, ибо трансивер и глюки неисчерпаемы, как атом.


так как решилась проблема? просто перешел на другую версию?("после долгих мучений и перебора параметров" каких параметров?)
я уже неделю бъюсь с этой коррекцией. причем с 8b/10b работает, а мне без нее надо - не работает
Lutovid
Опираясь на вышеизложенное у меня все заработало, спасибо предшественникам) Вопрос остался один - есля я не пользуюсь 8b10b в интерфесе 16 бит, как задать CC последовательность в 8 бит(если доступно 10)??
У меня свой алигмент написан через RXSLIDE, но выравнивание будет постоянно теряться если CC последовательность 10 бит. Не хотелось бы писать свой CC поэтому хочу отделаться малой кровью.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.