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

Вопросы по алгоритму линейного кодирования 8b/10b

Приветствую всех. Не нашел ответов на просторах сети, попробую тут:scratch_one-s_head:

1.1. С какой целью 8-битный код разбивается на 2 группы (5 + 3 бита)? Почему нельзя было просто сразу кодировать 8-битный символ? Почему именно 5 + 3, а не 4 + 4 или 2 + 6?
1.2. Зачем перед кодированием эти группы в 8-битном представлении переставляются местами?
1.3. Почему диспаритет считается отдельно для 5-битной группы и отдельно для 3-битной?

2. Почему именно K28.5 такой популярный? Что не так с другими K-символами? Я к тому, что этим символом практически во всех прикладных реализациях протоколов обрамляются начала последовательностей.

3. У меня, условно, оптика. Втыкаюсь в приемник "на горячую". Соответственно, прием может быть начат с любого бита. Не может ли оказаться, что, пока нет установившейся битовой синхронизации (а символьной и подавно), эти входные биты образуют какой-то управляющий осмысленный символ? Т.е., например, подстыковались в момент, когда "доходили" последние биты данных предыдущего 10-битного символа и начались биты следующего. И эти биты "разных кровей" приемник распознал как какой-нибудь K-символ. Может такое быть?

4.1. Почему расчет диспаритета у передатчика идет с -1? Почему не с 0?
4.2. Приемник вычисляет диспаритет каждого принятого 10-битного символа и сравнивает... с чем? Ведь приемник по-любому обязан обнаруживать ошибки логического кодирования? Ну а дальше - какое значение начального диспаритета должно быть у приемника? Тоже -1?

Вроде, это все, что не понятно.

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


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

На все вопросы ответов не знаю. Предположу, что этим обеспечиваются свойства этого кода. 8b/10b гарантирует, что подряд будет не более 5 бит одного значения. И что при передаче двух комплиментарных символов (каждому значению 8 бит соответствует пара 10 битных, одно из которых есть инверсия другого, и когда на входе идут одинаковые символы, после кодирования в линию передаются комплиментарные коды) на длине 22 бита дисбаланс по постоянной составляющей не превышает 2 бит. Цели того кода:

  1. предотвратить длинные последовательности одинаковых значений, чтобы битовый поток был в достаточной мере насыщен переходами для корректной работы CDR;
  2. обеспечить стабильную постоянную составляющую, чтобы сигнал не имел "паразитных" искажений при прохождении через цепи гальванической развязки.

По п.3. Когда происходит соединение на физическом уровне, там начинается весьма непростой процесс синхронизации, начиная с битового, потом символьного и т.д. Т.е. сперва CDR ищет переходы и подстраивает свои блоки ФАПЧ на битовую синхронизацию. Затем ищутся специальные последовательности (ordered sets — они начинаются передаваться при попытке установления линка), начинающиеся с символов группы comma, и ожидается корректный приём известных значений (эти ordered set'ы имеют предопределённые значения). При обнаружении правильного ordered set каждая сторона начинает передавать другой ordered set, сообщая тем самым противоположной стороне, что она поймала символьную синхронизацию. Ну, и так далее. Этим управляет специальный автомат физического уровня. Когда все стадии успешно завершатся, автомат сигнализирует "наверх", что линк поднят. Этот процесс называется Link Training. Только после этого вышележащие (канальный, сетевой и т.д.) уровни начинают свою работу. Т.ч. при физическом подключении никакой огрызок предыдущей последовательности ни какому сбою и приёму некорректной информации не приведёт, т.к. линк в этот момент будет считаться не готовым к работе.

По K28.5 (comma symbol). А почему все Ethernet фреймы начинаются с 0xd5? 🙂

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


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

Спасибо! Кое-что прояснилось.

Оказывается еще, на ютубе вполне достаточно роликов от всяких максимов, аналоговых девиц и техасских парней по данной теме. Я тут открыл для себя голосовой синхронный перевод от Яндекса практических любых забугорных видео, а то моего английского хватает только на прослушивание в замедлении:biggrin: И сразу нашел ответы на бОльшую часть своих вопросов.
 

Цитата

1.1. С какой целью 8-битный код разбивается на 2 группы (5 + 3 бита)?

Все банально просто: таблица энкодера будет, соответственно, на 32 и 8 значений (условно, т.к. двупаритетные коды есть не у всех сопоставляемых исходных кодов), вместо огромной таблицы на 400 с лишним. Комбинационной логике SerDes-а от этого только лучше. А 5 + 3 потому, что 4 + 4 не даст нужного кол-ва символов, подходящих под условия CDR и баланса по DC.

Цитата

2. Почему именно K28.5 такой популярный?

Примерно ни по какой причине. Просто так получилось конкретно для Fibre Channel, (вроде) 802.3 и некоторых других.
Все comma-символы имеют в себе "запрещенную" последовательность из 5 "1" или "0" подряд, так что их легко найти в потоке.

Цитата

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

Нет, не может. При адекватном линке, коды сопоставления в 8b/10b подобраны так, чтобы никакой K-символ не был принят в середине битового потока из набора каких-то данных. О как.

Цитата

4.1. Почему расчет диспаритета у передатчика идет с -1? Почему не с 0?

Тут все тоже достаточно просто. Символов, подходящих под критерий баланса по DC и хорошей "формой" для CDR, не так много. Их настолько не много, что из 1024 10-битных символов только под "баланс по DC" (а это пять "1" и пять "0" в одном символе) подходит только 252. Из этих 252 нужно еще выкинуть те, где подряд идут пять нулей или единиц. А еще надо выкинуть такие, где при склейке с соседним символом получится та же запрещенная последовательность. Остается сотня-полторы чисел. Поэтому решение простое: "занять" символов из числа тех, где кол-во единиц и нулей будет не равным. Ближайшее - это 4 тех и 6 других. Разница всегда будет равна 2. И вот теперь каждому символу из 8-битной таблицы будет соответствовать либо одно 10-битное число (уравновешенное по кол-ву единиц и нулей), либо два 10-битных числа, тоже уравновешенных, но инверсных друг к другу, либо два 10-битных - одно с 4 единицами и 6 нулями, другое - наоборот. Из-за диспаритета равного 2, мы не можем начать с 0, т.к. по логике работы кодера/декодера следующий символ может выбраться с диспаритетом +/- 2 - а это запрещено (на длинной дистанции диспаритет должен быть -1, 0, +1).

Цитата

4.2. Ну а дальше - какое значение начального диспаритета должно быть у приемника? Тоже -1?

Здесь не нашел ответов - но, видимо, да - стейт-машина SerDes-а должна "искать" comma-символ, а после его поимки "принимать" все последующие символы, опираясь на текущий диспаритет -1. Единственное, что не понятно: раз каждый "кадр" передается с начальным диспаритетом -1, то к началу следующего кадра диспаритет должен быть положительным или 0 (для того самого баланса по постоянному току). Но как это обеспечить? Ведь RD нельзя "подогнать" под данные, наоборот - RD зависит от данных и к концу пакета вполне может оказаться... погодите-ка... K-символы ж тоже имеют разную полярность? Кажется, до меня дошло.

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


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

On 1/28/2023 at 8:59 AM, dxp said:

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

Это при "full duplex". А как быть, когда линк только в одну сторону, например Aurora Simplex Rx-only (или Tx-only)  Тоже линк надо как-то настроить, а канала для обратной связи нет.

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


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

На самом деле линки линкам рознь, и в файбере, например, линк - это тупо наличие IDLE-ордер-сетов.

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


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

On 2/3/2023 at 4:27 PM, Arlleex said:

На самом деле линки линкам рознь, и в файбере, например, линк - это тупо наличие IDLE-ордер-сетов

Вопрос по IDLE-сетам. В IEEE802.3-2015 Clause 36 определено два IDLE - Correcting /I1/ и Preserving /I2/. В описании  говорится, что первый /I/ выбирается в зависимости от текущего диспаритета, а все последующие должны быть /I2/.

Но, допустим я реализую некоторую логику на ПЛИС с использованием трансивера. В трансивере как правило есть свой декодер 8/10. При использовании встроенного декодера я ему подаю на вход 8-ми битные данные и ничего о текущем диспаритете не знаю. Я могу только разделить простые и спецсимволы сигналом char_is_k. Как в этом случае выбрать, какой будет первый символ - /I1/ или /I2/ ?  

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


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

Я не знаком с конкретными требованиями IEEE 802.3 (насчет IDLE-ов), однако, бегло прочитав описание I1 / I2, я понял, что это тот же самый механизм выравнивания межкадрового диспаритета (для приведения его в известное состояние). В оптике (Fibre Channel), например, требуется, чтобы любой кадр начинался с отрицательного диспаритета. Для этого передатчик в конце посылки должен выбрать правильную "полярность" EOF: одна из них нейтральная - т.е. сохраняет диспаритетность, а другая - инвертирует на противоположную. В IEEE 802.3 примерно такая же ситуация: стандарт требует, чтобы после передачи первого IDLE после переданного пакета или конфигурационной упорядоченной последовательности текущая диспаритетность была отрицательной. I1 инвертирует текущий диспаритет, а I2 - сохраняет. Соответственно, действия все те же самые, как в оптике: если из трансивера торчит сигнал текущей диспаритетности, то задействуем его для выбора полярности первого IDLE, следующего за кадром. Если не выведен - что ж, строим таблицу 8b/10b внутри ПЛИС-ы, и параллельно с кодером трансивера считаем свой диспаритет. Еще надо внимательно изучить возможности трансивера, ибо бывает так, что в нем предусмотрены все эти хитрые тонкости для соблюдения стандартов Fibre Channel или 802.3, не прибегая к колхозу.

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


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

17 hours ago, Arlleex said:

Если не выведен - что ж, строим таблицу 8b/10b внутри ПЛИС-ы,

К сожалению я тоже прихожу к такому выводу. По крайней мере в трансиверах Xilinx я не нашел сигнала, обозначающего текущий диспаритет на передачу. Но это же получается такой колхоз - при наличии встроенного кодера делать свой, чтобы просто контролировать текущий диспаритет.

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


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

2 часа назад, attaboy сказал:

Но это же получается такой колхоз - при наличии встроенного кодера делать свой, чтобы просто контролировать текущий диспаритет.

Ну, мы так и делаем на Xilinx-ах.

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


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

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

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

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

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

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

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

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

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

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