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

NRZI (кодирование без возврата к нулю с инверсией)

В USB нет отдельной линии тактового сигнала: приёмник восстанавливает такт из самих данных. Для этого биты передаются не уровнями, а переходами — кодом NRZI, а длинные серии без переходов разбиваются вставленными нулями.

Обновлено Редакция GAW

NRZI (non-return-to-zero inverted) — способ кодирования битов, при котором значение несёт не уровень линии, а его изменение. Спецификация USB 2.0 (разд. 7.1.8) задаёт его так: ноль передаётся сменой состояния линии, единица — отсутствием смены. Состояния пары D+ и D− в USB называются J и K, и NRZI переключает линию между ними.

Зачем так кодировать

У USB нет отдельной тактовой линии: приёмник выделяет такт из переходов в самом сигнале. Серия нулей в NRZI переключает линию каждый бит — переходов достаточно. А вот серия единиц оставляет линию в одном состоянии. Поэтому USB добавляет к NRZI битстаффинг: после шести единиц подряд передатчик вставляет ноль ещё до кодирования. Так приёмник видит переход не реже чем раз в семь битов, а вставленные биты он сам же и выбрасывает.

Каждый пакет Low и Full Speed начинается полем SYNC — тремя парами KJ и двумя K, всего восемь символов. По нему приёмник подстраивает свой такт к передатчику.

Пример

Бит001101
Линия (начало в J)KJJJKK

Каждый ноль переворачивает состояние, каждая единица его сохраняет (пример наш).

Свойства

  • Значение бита определяется только тем, был ли переход, поэтому при перестановке проводов пары сами биты не меняются (наш вывод из определения). Уровни J и K при этом всё же важны: по ним хост определяет скорость устройства и состояние покоя. Об уровнях пары — в термине «Дифференциальный сигнал».
  • Переходы нужны не только для данных, но и для синхронизации: поэтому NRZI в USB всегда идёт вместе со вставкой битов.

Не путать с NRZ: в нём значение бита задаёт сам уровень линии. Так кодирует биты, например, CAN — у него после пяти одинаковых битов вставляется противоположный, а не после шести единиц. Как устройство USB после подключения начинает обмен, рассказано в термине «Перечисление USB».

Частые вопросы

Как закодировать байт в NRZI?

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

Зачем в USB вставляют ноль после шести единиц?

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

Чем NRZI отличается от NRZ?

В NRZ значение бита — это уровень линии: единица — один уровень, ноль — другой. Так кодирует биты, например, CAN. В NRZI значение бита — наличие или отсутствие перехода, а сам уровень ничего не значит. Поэтому для NRZI важны переходы, а не абсолютные уровни.

Источники

  1. USB-IF. Universal Serial Bus Specification, Revision 2.0 (пакет usb_20_20250603) — разд. 7.1.8: при передаче пакетов используется NRZI — единица без смены уровня, ноль сменой уровня; верхний уровень на рисунках — состояние J; серия нулей переключает линию каждый бит, серия единиц даёт долгие участки без переходов; разд. 7.1.9: после шести единиц подряд до кодирования вставляется ноль, приёмник получает переход не реже чем раз в семь битов; вставка начинается с поля SYNC; приёмник декодирует NRZI и выбрасывает вставленные биты; разд. 7.1.10: SYNC Low/Full Speed — три пары KJ и два K, восемь символов
  2. Robert Bosch GmbH. CAN Specification Version 2.0 (1991) — часть A, разд. 5 Coding: битовый поток кадра кодируется NRZ — уровень бита постоянен всё время бита; после пяти одинаковых битов вставляется противоположный

Нашли ошибку?