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

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

Реализация 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-а с трансформаторной связью или через оптические приёмники с автоматической регулировкой усиления.

Таблицы кодировки и байтовая кодировка Заметьте, что в следующих таблицах для каждого входного байта (представленного как ), 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. Эта разность известна как текущий дисбаланс (, RD).

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

Для каждого 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 Код 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, следующие:

CoaXPress CPRI DVB Асинхронный последовательный интерфейс ASI Digital Visual Interface и HDMI (TMDS) DisplayPort 1.x ESCON (связь в корпоративной сети) Fibre Channel Gigabit Ethernet (за исключением витой пары–based 1000BASE-T) IEEE 1394b (FireWire и другие) InfiniBand JESD204B OBSAI RP3 интерфейс PCI Express 1.x и 2.x RapidIO SD UHS-II Serial ATA SAS 1.x, 2.x b 3.x

(начиная с ServerNet2)

USB 3.0 Thunderbolt 1.x and 2.x

SLVS-EC

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

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