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

8b10b decoder проблема с определением ошибки running disparity

Здравствуйте!

Не могу до конца понять как работает disparity_error в 8b10b декодере во вложении, достался в наследство откуда-то из интернета вроде. Ошибка привязана к выходу out_disperr.

В тестбенче подключено так - jesd204_8b10b_decoder i_dec (.in_char(DATA_10b),.in_disparity(disp),.out_disparity(disp),.out_char(OUT_CHAR));

Энкодер который я туда подсовываю на длинной дистанции выдает 50% нулей и 50% единиц, коды правильные, в энкодер прям таблица зашита с ними, а выход out_disperr дрыгается туда сюда там где 0 и 1 соответственно 6 и 4, или 4 и 6, и total_disparity показывает 1 и 3.

Буду благодарен, если кто-нибудь подскажет, потому что для меня сейчас не совсем понятно как понять наличие ошибки, должно ли в total_disparity всегда быть 0 или 2.

 

jesd204_8b10b_decoder.v

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

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


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

Я в VHDL не умею, но: начальный диспаритет передатчика и приемника установлен на -1?

Running disparity всегда должно быть -1 или +1 в конце каждого символа. Total, в свою очередь, да, будет мотыляться -2, 0, +2 (т.е. по модулю 0 или 2).

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


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

1 hour ago, Arlleex said:

Я в VHDL не умею, но: начальный диспаритет передатчика и приемника установлен на -1?

Running disparity всегда должно быть -1 или +1 в конце каждого символа. Total, в свою очередь, да, будет мотыляться -2, 0, +2 (т.е. по модулю 0 или 2).

Диспаритет -1 да. У меня вот тотал диспаритет мелькает 1,3 где ошибка, тогда видимо что-то там страшное происходит.

Пойду разбираться, спасибо)

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


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

Прежде чем принимать поток по 8b/10b - неплохо было бы сделать битовую синхронизацию. Ошибки могут быть не только из-за неправильной работы декодера, но и из-за неправильного положения фронта клока. Вообще можно скачать готовое ядро 8b/10b от Xilinx. У них есть разные варианты в том числе и на основе блочной памяти. 

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


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

51 minutes ago, Flip-fl0p said:

Прежде чем принимать поток по 8b/10b - неплохо было бы сделать битовую синхронизацию. Ошибки могут быть не только из-за неправильной работы декодера, но и из-за неправильного положения фронта клока. Вообще можно скачать готовое ядро 8b/10b от Xilinx. У них есть разные варианты в том числе и на основе блочной памяти. 

Большое спасибо за замечание!

Вы оказались правы! Декодер в приложении я пересадил на клок (он по умолчанию срабатывал на любое изменение входного сигнала), и завел в него клок который в 2 раза медленнее того которым тактируется энкодер. В итоге фронт стал приходиться на середину каждого слова в потоке, и все ошибки пропали, при том что декодер верно показывает на своем выходе то, что собственно было на входе энкодера.

Спасибо еще раз! Отсюда буду думать, и анализировать, как это по итогу должно будет выглядеть.

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


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

В 28.07.2023 в 14:32, Suicide сказал:

А нет, пардон, кажется я рано радуюсь

Странно все это. Раньше кодер, декодер 8b/10b шли отдельными ip_core (без клока я такое впервый раз вижу).

А сейчас изъяли за ненадобностью. Оно все должно быть уже встроенное. Как и rx_aligner перед декодером.

Может поможет.

mail_out_2023.zip

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


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

В 28.07.2023 в 21:04, sazh сказал:

rx_aligner

А можно поподробнее ? ))) Все время приходилось своими силами выравнивать клок путем динамического сдвига фазы. Неужели можно это не делать теперь ?

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


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

Здравствуйте еще раз!

Если не затруднит, взгляните пожалуйста на временную диаграмму энкодера моего.

CLK - клок;

DATA_8b - входные 8 битные слова;

DATA_10b - кодированные слова;

DISPARITY_OUT - соответственно текущий running disparity;

NULLS/ONES - количество нулей и единиц в текущем 10-битном слове;

RST - ресет.

Есть ощущение что всё правильно, но может running disparity должен быть сдвинут вперед или вроде того?

Screenshot from 2023-07-31 17-42-43.png

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


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

В 31.07.2023 в 11:45, Flip-fl0p сказал:

Все время приходилось своими силами выравнивать клок путем динамического сдвига фазы. 

Я про клок ничего не говорил. Даже не знаю, куда его впихнуть.

1. На передающей стороне канала каждая 10-битная кодовая последовательность трансформируется с помощью операции сериализации в последовательный поток битов.

2. На принимающей стороне канала последовательный поток битов трансформируется с помощью операции десериализации в поток 10-битных кодовых последовательностей.

3. Поток данных  выровнен с помощью операции символьного выравнивания, проводимой на символьном уровне путем установления границ между принимаемыми из канала кодовыми последовательностями длиной 10 битов.

Ну а теперь есть ip_core.  И его описание. 

rx_aligner.v

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


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

On 7/29/2023 at 12:04 AM, sazh said:

Странно все это. Раньше кодер, декодер 8b/10b шли отдельными ip_core (без клока я такое впервый раз вижу).

А сейчас изъяли за ненадобностью. Оно все должно быть уже встроенное. Как и rx_aligner перед декодером.

Может поможет.

mail_out_2023.zip 9.5 kB · 7 downloads

Что-то я походу конкретно не так делаю, а у вас случайно нет тестбенча где вот эти энкодер и декодер друг друга вкручены? Я подключаю напрямую, а у меня чушь какая-то, как будто что-то отрабатывать не успевает.

Буду благодарен за тб или подсказку.

Screenshot from 2023-08-01 14-58-58.png

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


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

В 01.08.2023 в 11:53, Suicide сказал:

Что-то

Скачайте описание этого Альтеровского ip_core. Оно свободно висит в сети.

 

test.zip

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


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

On 8/1/2023 at 11:49 PM, sazh said:

Большое спасибо! Я подключил свой энкодер в этом тестбенче, и всё стало почти хорошо.

На представленных изображениях, сигналы моего энкодера обозначены красным цветом, энкодера из тестбенча желтым цветом, а декодера зеленым цветом.

Running disparity (далее RD) у моего энкодера и энкодера из тестбенча совпадают, НО! есть нюанс. Когда в тестбенче подряд передаются символы 1,2,3 и т.д., декодер выплёвывает ошибки Frderr. После изучения временных диаграм, я заметил что после символов 2A8. 297, энкодер из тестбенча начинает выдавать символы противоположного RD, нежели у моего энкодера (при этом RD по сути совпадает).

Вероятно это происходит здесь -

Spoiler

case (invert)
                2'b00:
                    _Sdat10b_pos = {dat10b[9], (dat10b[8] ^ speciald), (dat10b[7] ^ speciald), dat10b[6],
                    dat10b[5:0]};
                2'b01:
                    _Sdat10b_pos = {dat10b[9:6], ~ dat10b[5:0]};
                2'b10:
                    _Sdat10b_pos = {~ dat10b[9:6], dat10b[5:0]};
                2'b11:
                    _Sdat10b_pos = {~ dat10b[9:6], ~ dat10b[5:0]};
            endcase

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

Ознакомление вот с этим документом - https://www.intel.com/programmable/technical-pdfs/654488.pdf - ничего к сожалению не дало(

Screenshot from 2023-08-07 16-11-59.png

Screenshot from 2023-08-07 16-12-37.png

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


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

В 07.08.2023 в 13:21, Suicide сказал:

 

  Показать контент

case (invert)
                2'b00:
                    _Sdat10b_pos = {dat10b[9], (dat10b[8] ^ speciald), (dat10b[7] ^ speciald), dat10b[6],
                    dat10b[5:0]};
                2'b01:
                    _Sdat10b_pos = {dat10b[9:6], ~ dat10b[5:0]};
                2'b10:
                    _Sdat10b_pos = {~ dat10b[9:6], dat10b[5:0]};
                2'b11:
                    _Sdat10b_pos = {~ dat10b[9:6], ~ dat10b[5:0]};
            endcase

Почему

Не знаю. Поэтому и пользуюсь ip ( в сети много вариантов и все они хорошо работают, когда сами на себя). Вы сами для себя определитесь, чей энкодер правильно работает.

Вот еще вариант Вам для сравнения. Больше ничем помочь не могу.

 

endec8b10b_rev1.0.tar.gz

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


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

Почитайте вот это еще, мне в свое время весьма пригодилось.

В конечно счете, просматривайте начальные состояния RD (должен быть -1 на первом SOF).

Либо берите в руки калькулятор и вручную посчитайте, какой должен быть на выходе энкодера 10-битный символ и смотрите, чей правильный.

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


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

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

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

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

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

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

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

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

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

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