8b/10b кодирование

8b/10b — это линейное кодирование, отображающее 8-битные слова в 10-битные символы, чтобы получить баланс по постоянному току и ограниченную разбалансировку и, в то же время, обеспечить достаточное количество изменений состояния для надёжного восстановления тактового сигнала. Это означает, что разница между числом единиц и нулей в строке по меньшей мере 20 бит не превосходит двух и не имеется более пяти единиц или нулей подряд. Это помогает снизить требования к нижней границе полосы пропускания канала, необходимой для передачи сигнала[1].

Кодировка 8b/10b может быть реализована различными путями с акцентом на разные параметры производительности. Одну из реализаций разработал К. Одака для DAT цифрового аудиомагнитофона[2]. Кеес Схаухамер Имминк разработал 8b/10b кодировку для DCC аудиомагнитофона[3]. Реализация IBM была описана в 1983 году Элом Видмером и Питером Франашеком[4][5].

Реализация IBM

Как следует из названия схемы, восемь бит данных передаются как 10-битную единицу, называемую символом. Младшие пять бит данных кодируются в 6-битную группу (5b/6b порция), а старшие три бита кодируются в 4-битную группу (3b/4b порция). Эти кодовые группы объединяются вместе с образованием 10-битного символа, который передаётся по линии. Символы данных часто обозначаются как D.x.y, где x принимает значения 0–31, а y принимает значения 0–7. Стандарты, использующие кодировку 8b/10b, определяют также до 12 специальных символов (или управляющих символов), которые могут быть посланы вместо символов данных. Они часто используются для обозначения начала кадра, конца кадра, состояния простоя канала, пропуска и других подобных условий на канальном уровне. По крайней мере один из них (например, символ «запятая») необходим для определения выравнивания десятибитных символов. Они обозначаются как K.x.y и имеют кодировки, отличные от любых других символов D.x.y.

Поскольку 8b/10b кодировка использует 10-битные символы для кодировки 8-битных слов, некоторые из возможных 1024 (10 бит, 210) символов могут быть исключены для гарантирования предела в 5 одинаковых последовательных бит и обеспечить разницу числа нулей и единиц не более двух. Некоторые из 256 возможных 8-битных слов могут быть закодированы двумя различными способами. Используя эти альтернативные кодировки схема способна достичь долговременного баланса по постоянному току в потоке последовательных данных. Это позволяет передавать поток данных через канал с высокочастотной характеристикой, например, через неэкранированную витую пару Ethernet-а с трансформаторной связью или через оптические приёмники с автоматической регулировкой усиления.

Таблицы кодировки и байтовая кодировка

Заметьте, что в следующих таблицах для каждого входного байта (представленного как HGF EDCBA), A означает младший значащий разряд (МЗР), а H означает старший значащий разряд (СЗР). Выходные данные содержат два дополнительных бита i и j. Биты посылаются в последовательности от младших (МЗР) к старшим (СЗР): a, b, c, d, e, i, f, g, h, j. То есть, сначала 5b/6b код, за ним следует 3b/4b код. Это обеспечивает уникальность специальной битовой последовательности в символах запятой.

Остаточное влияние на поток количества переданных нулевых и единичных битов поддерживается как накопленный дисбаланс, а нарастание дисбаланса компенсируется выбором кодирования последующих символов.

5b/6b код является попарно-сбалансированным кодом, и таким же является 3b/4b код. Каждое 6- или 4-битное слово имеет либо равное число нулей и единиц (разбалансировка равна нулю), либо имеет пару, в которой одно слово имеет на два нуля больше, чем другое (четыре нуля и две единицы или три нуля и одну единицу), а второе слово − наоборот. Когда употребляется 6- или 4-битное слово, которое имеет ненулевой дисбаланс (число единиц минус число нулей, то есть, −2 или +2), выбор кодировок с положительным или отрицательным дисбалансом должен быть таким, чтобы изменить накопленный дисбаланс. Другими словами, коды с ненулевым дисбалансом чередуются.

Текущий дисбаланс

8b/10b кодирование является кодом без постоянной составляющей, что означает, что передаваемое долгосрочное количество единиц и нулей составляет ровно по 50%. Для достижения этого разница между количеством переданных единиц и нулей всегда ограничена ±2, и в конце каждого символа она равна либо +1 либо −1. Эта разность известна как текущий дисбаланс (англ. running disparity, RD).

Эта схема требует всего двух состояний для накопленного дисбаланса — +1 или −1. Она начинается с −1[6].

Для каждого 5b/6b и 3b/4b кода с неравным числом единиц и нулей имеется два битовых выбора для передачи — в одном на две больше единиц, а другой содержит инвертированные биты, а потому на два больше нулей. В зависимости от текущего дисбаланса сигнала кодирующий механизм выбирает одну из двух возможностей шести- или четырёхбитной последовательности для отправки заданных данных. Очевидно, что при равенстве нулей и единиц выбора нет, поскольку дисбаланс не изменится, за исключением блоков D.07 (00111) и D.x.3 (011). В обоих случаях дисбаланс не изменится, но если RD положительный, то при обнаружении D.07 используется 000111, а если отрицательный, используется 111000. Аналогично, если встретился D.x.3 и RD положителен, используется 0011, а если отрицателен, используется1100. Это точно отражено в приведённых ниже таблицах, но стоит упомянуть дополнительно, поскольку это единственные два подблока с равным количеством единиц и нулей, каждый из которых имеет два возможных кодирования.

Правила для текущего дисбаланса
предыдущий
RD
Дисбаланс
кодового
слова
Выбранный
Дисбаланс
следующий
RD
−1 0 0 −1
−1 ±2 +2 +1
+1 0 0 +1
+1 ±2 −2 −1

5b/6b коды (abcdei)

Ввод RD = −1 RD = +1 Ввод RD = −1 RD = +1
Код EDCBA a b c d e i Код EDCBA a b c d e i
D.00 00000 100111 011000 D.16 10000 011011 100100
D.01 00001 011101 100010 D.17 10001 100011
D.02 00010 101101 010010 D.18 10010 010011
D.03 00011 110001 D.19 10011 110010
D.04 00100 110101 001010 D.20 10100 001011
D.05 00101 101001 D.21 10101 101010
D.06 00110 011001 D.22 10110 011010
D.07 00111 111000 000111 D.23 † 10111 111010 000101 используется также для символа K.23.7
D.08 01000 111001 000110 D.24 11000 110011 001100
D.09 01001 100101 D.25 11001 100110
D.10 01010 010101 D.26 11010 010110
D.11 01011 110100 D.27 † 11011 110110 001001 используется также для символа K.27.7
D.12 01100 001101 D.28 11100 001110
D.13 01101 101100 D.29 † 11101 101110 010001 используется также для символа K.29.7
D.14 01110 011100 D.30 † 11110 011110 100001 используется также для символа K.30.7
D.15 01111 010111 101000 D.31 11111 101011 010100
не используется 111100 000011 K.28 ‡ 11100 001111 110000 исключительно используется для символов K.28.x

† используется также для 5b/6b кода K.x.7

‡ исключительно используется для 5b/6b кода K.28.y

3b/4b коды (fghj)

Ввод RD = −1 RD = +1 Ввод RD = −1 RD = +1
Код HGF f g h j Код HGF f g h j
D.x.0 000 1011 0100 K.x.0 000 1011 0100
D.x.1 001 1001 K.x.1 ‡ 001 0110 1001
D.x.2 010 0101 K.x.2 010 1010 0101
D.x.3 011 1100 0011 K.x.3 011 1100 0011
D.x.4 100 1101 0010 K.x.4 100 1101 0010
D.x.5 101 1010 K.x.5 ‡ 101 0101 1010
D.x.6 110 0110 K.x.6 110 1001 0110
D.x.P7 † 111 1110 0001 K.x.7 ‡ 111 0111 1000
D.x.A7 † 0111 1000

† Для D.x.7 должно быть выбрано либо основное кодирование (D.x.P7), либо альтернативное (D.x.A7), чтобы избежать пяти нулей или единиц подряд, когда оно комбинируется с предыдущим 5b/6b кодом.
Последовательности из пяти идентичных бит используются в символах запятой для целей синхронизации.
D.x.A7 используется только

  • если RD = −1: для x = 17, 18 и 20
  • если RD = +1: для x = 11, 13 и 14.

С x = 23, x = 27, x = 29 и x = 30 3b/4b часть кода, используемая для управляющих символов K.x.7, совпадает с частью для D.x.A7.
Любой другой код D.x.A7 не может быть использован, поскольку это приведёт к возможному неправильному выравниванию запятых.

‡ Только K.28.1, K.28.5 и K.28.7 генерируют символы запятых, которые содержат последовательности из пяти 0 или 1.
Символ имеет формат 110000 01xx или 001111 10xx.

Управляющие символы

Управляющие символы в кодировке 8b/10b представляют собой 10-битные символы, которые являются допустимыми комбинациями битов (не более шести единиц и нулей), но не соответствуют 8-битному байту данных. Они применяются для низкоуровневых управляющих функций. Например, в оптоволоконном канале K28.5 используется в начале четырёхбайтных последовательностей (называемых «упорядоченными наборами»), которые выполняют такие функции, как управляемая петля, Fill Words, Link Resets и т.д.

Исходя из таблиц 5b/6b и 3b/4b разрешено отправлять следующие 12 управляющих символов:

Управляющие символы
Вход RD = −1 RD = +1
Символ DEC HEX HGF EDCBA abcdei fghj abcdei fghj
K.28.0 28 1C 000 11100 001111 0100 110000 1011
K.28.1 † 60 3C 001 11100 001111 1001 110000 0110
K.28.2  92 5C 010 11100 001111 0101 110000 1010
K.28.3  124 7C 011 11100 001111 0011 110000 1100
K.28.4  156 9C 100 11100 001111 0010 110000 1101
K.28.5 † 188 BC 101 11100 001111 1010 110000 0101
K.28.6  220 DC 110 11100 001111 0110 110000 1001
K.28.7 ‡ 252 FC 111 11100 001111 1000 110000 0111
K.23.7  247 F7 111 10111 111010 1000 000101 0111
K.27.7  251 FB 111 11011 110110 1000 001001 0111
K.29.7  253 FD 111 11101 101110 1000 010001 0111
K.30.7  254 FE 111 11110 011110 1000 100001 0111

† Среди управляющих символов символы K.28.1, K.28.5 и K.28.7 являются «запятыми». Символы-запятые используются для синхронизации (определения выравнивания 8b/10b кодов в потоке битов). Если K.28.7 не используется, уникальные последовательности запятых 00111110 или 11000001 не могут случайно появиться в любой битовой позиции в любой комбинации обычных кодов.

‡ Если K.28.7 допускается при фактическом кодировании, необходимо использовать более сложное определение шаблона синхронизации, чем предложено в †, поскольку комбинация K.28.7 с несколькими другими кодами образует ложный символ запятой со смещением, перекрывающий оба кода. Последовательность из нескольких кодов K.28.7 недопустима ни в каком случае, так как это приведёт к необнаруживаемым символам запятой со смещением.

K.28.7 является единственным символом запятой, который не может возникнуть в результате однократной ошибки бита в потоке данных.

Пример кодирования D31.1

D31.1 для обоих случаев текущего дисбаланса
Вход RD = −1 RD = +1
Код DEC HEX HGF EDCBA abcdei fghj abcdei fghj
D31.1 63 3F 001 11111 101011 1001 010100 1001

Технологии, использующие 8b/10b

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

Среди областей, в которых находит применение кодирование 8b/10b, следующие:

Волоконно-оптический канал (только варианты 4GFC и 8GFC)

Стандарт FC-0 определяет, какая схема кодирования в системе волоконно-оптического канала (8b/10b или 64b/66b)[8] Более скоростные варианты обычно используют 64b/66b для оптимизации эффективности использования полосы пропускания, поскольку накладные расходы составляют 20% в 8b/10b по сравнению с 3% (~ 2/66) в системах 64b/66b). Таким образом, кодирование 8b/10b используется для вариантов 4GFC и 8GFC, а для вариантов 10GFC и 16GFC — 64b/66b[9]. Канальный уровень данных FC1 отвечает за реализацию кодирования и декодирования сигналов 8b/10b.

Схема кодирования 8b/10b волоконного канала используется также в других телекоммуникационных системах. Данные расширяются с помощью алгоритма, который для каждого входного 8-битного значения генерирует одно из двух возможных 10-битных выходных значений. Каждое 8-битное входное значение может соответствовать либо 10-битному выходному значению с нечётной дисбалансом, либо с чётным. Такое сопоставление обычно происходит в момент преобразования параллельных входных данных в последовательный выходной поток для передачи по стекловолоконному каналу. Выбор нечётного или чётного дисбаланса осуществляется таким образом, чтобы поддерживался долгосрочный нулевой дисбаланс между единицами и нулями. Это часто называют «DC-балансировкой» (балансировкой по постоянному току).

Схема преобразования 8-битных значений в 10-битные использует только 512 из возможных 1024 выходных значений. Из оставшихся 512 выходных значений большинство содержат слишком много единиц или слишком много нулей, а потому не разрешены. Это по-прежнему оставляет достаточно свободных 10-битных пар кодирования «нечётное+чётное» для размещения как минимум 12 специальных (не являющихся данными) символов.

Коды, представляющие 256 значений данных, называются кодами данных (D). Коды, представляющие 12 специальных символов, называются управляющими (K) кодами.

Все коды могут быть описаны путём указания трёх восьмеричных цифр. Это делается с использованием соглашения об именовании "Dxx.x" или "Kxx.x. Обратите внимание, что таблицы в предыдущих разделах используют десятичные, а не восьмеричные значения для Dxx.x или Kxx.x).

Пример:

Входные биты данных: ABCDEFGH
Данные делятся: ABC DEFGH
Данные переставляются: DEFGH ABC

Теперь эти биты конвертируются в десятичное число их группировкой.

Входные данные

C3 (HEX) = 11000011
         = 110 00011
         = 00011 110
         =   3    6

E 8B/10B = D03.6

Цифровое аудио

Схемы кодирования 8b/10b нашли широкое применение в приложениях для хранения цифрового аудио, а именно:

Для аудио-CD и CD-ROM используется отличающаяся, но связанная схема:

Альтернативы

Заметим, что 8b/10b является схемой кодирования, а не конкретным кодом. Хотя многие приложения используют один и тот же код, существуют некоторые несовместимые реализации. Например, TMDS, который также расширяет 8 бит до 10 бит, но использует совершенно другой метод[10].

64b/66b кодирование, впервые применённое в интерфейсах физического уровня стандарта 10-гигабитного Ethernet 10GBASE-R представляет собой более эффективную альтернативу кодированию 8b/10b с меньшими накладными расходами. Оно добавляет всего два бита служебной информации на каждые 64 бита закодированных данных, в отличие от восьми бит в 8b/10b. Эта схема значительно отличается по своей структуре от 8b/10b и не гарантирует явным образом постоянство постоянной составляющей, короткую длину серий и плотность переходов (эти характеристики достигаются статистически за счёт скремблирования). Кодирование 64b/66b было расширено до вариантов 128b/130b и 128b/132b для PCI Express 3.0 и USB 3.1 соответственно, заменив кодирование 8b/10b в предыдущих версиях этих стандартов[11].

Примечания

  1. Immink, 1997, с. 293–299.
  2. , "Method and apparatus for encoding binary data", US 4,456,905, published 1984-06-26
  3. , "Method of transmitting information, encoding device for use in the method, and decoding device for use in the method", US 4,620,311, published 1986-10-28
  4. Widmer, Franaszek, 1983, с. 440–451.
  5. , "Byte oriented DC balanced (0,4) 8B/10B partitioned block transmission code", US 4,486,739, published 1984-12-04
  6. Thatcher, Jonathan. Thoughts on Gigabit Ethernet Physical. IBM (1 апреля 1996). Дата обращения: 17 августа 2008.
  7. Physical Layer Specifications. Mipi.org. MIPI Alliance. Дата обращения: 20 апреля 2014.
  8. Fibre Channel Framing and Signaling – 3 (FC-FS-3) Rev 1.1 Sections 5.2.1 and 5.3.1 [1]
  9. FIBRE CHANNEL Physical Interface-5 (FC-PI-5) REV 6.10 Section 5.7 [2]
  10. Залата, 2024, с. 9.
  11. Mahesh Wagh. PCIe 3.0 Encoding & PHY Logical (PDF). pcisig.com (6 августа 2011). Дата обращения: 5 июня 2015.

Литература

  • Kees Schouhamer Immink. Performance Assessment of DC-Free Multimode Codes // IEEE Transactions on Communications. — 1997. — Март (т. 45, вып. 3). — doi:10.1109/26.558690.
    Цитата: «Коды сбалансированные по постоянному току или куоды без постоянной составляющей, как их часто называют, имеют долгую историю, и их применение, безусловно, не ограничивается практикой записи».
  • Al X. Widmer, Peter A. Franaszek. A DC-Balanced, Partitioned-Block, 8B/10B Transmission Code // IBM Journal of Research and Development. — 1983. — Т. 27, вып. 5. — doi:10.1147/rd.275.0440. Архивировано из оригинала 30 мая 2009 года.
  • Залата Р.Н. Разработка цифровой аппаратуры нетрадиционным методом: CGA видеоадаптер на SpinalHDL. — Тюмень: ООО «Фабмикро», 2024.
    Цитата: «Важное замечание! В TMDS используется свой вариант кодирования «8b/10b», существенно отличающийся от широко используемого метода «8b/10b encoding» предложенного фирмой IBM в 1983г., но так как оба они имеют одинаковые названия, то это часто вводит в заблуждение как разработчиков, так и авторов многих публикаций!»

Ссылки