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, всего восемь символов. По нему приёмник подстраивает свой такт к передатчику.
Пример
| Бит | 0 | 0 | 1 | 1 | 0 | 1 |
|---|---|---|---|---|---|---|
| Линия (начало в J) | K | J | J | J | K | K |
Каждый ноль переворачивает состояние, каждая единица его сохраняет (пример наш).
Свойства
- Значение бита определяется только тем, был ли переход, поэтому при перестановке проводов пары сами биты не меняются (наш вывод из определения). Уровни J и K при этом всё же важны: по ним хост определяет скорость устройства и состояние покоя. Об уровнях пары — в термине «Дифференциальный сигнал».
- Переходы нужны не только для данных, но и для синхронизации: поэтому NRZI в USB всегда идёт вместе со вставкой битов.
Не путать с NRZ: в нём значение бита задаёт сам уровень линии. Так кодирует биты, например, CAN — у него после пяти одинаковых битов вставляется противоположный, а не после шести единиц. Как устройство USB после подключения начинает обмен, рассказано в термине «Перечисление USB».
Частые вопросы
Как закодировать байт в NRZI?
Идти по битам в порядке передачи и для каждого нуля менять состояние линии на противоположное (J на K или K на J), а для каждой единицы оставлять прежнее. Перед этим в поток вставляют ноль после каждых шести единиц подряд. Например, четыре нуля подряд дают четыре смены состояния, четыре единицы — линию без изменений четыре бита.
Зачем в USB вставляют ноль после шести единиц?
Единицы в NRZI не меняют линию, и длинная их серия оставила бы приёмник без переходов, по которым он подстраивает свой такт. Вставленный ноль даёт переход не реже чем раз в семь битов. Приёмник декодирует NRZI и выбрасывает вставленные биты.
Чем NRZI отличается от NRZ?
В NRZ значение бита — это уровень линии: единица — один уровень, ноль — другой. Так кодирует биты, например, CAN. В NRZI значение бита — наличие или отсутствие перехода, а сам уровень ничего не значит. Поэтому для NRZI важны переходы, а не абсолютные уровни.
Источники
- 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, восемь символов
- Robert Bosch GmbH. CAN Specification Version 2.0 (1991) — часть A, разд. 5 Coding: битовый поток кадра кодируется NRZ — уровень бита постоянен всё время бита; после пяти одинаковых битов вставляется противоположный
Нашли ошибку?
Смотрите также
- USBСкорости, распиновка Type-A, Micro-B и Type-C, питание, CC, USB PD
- БитстаффингВставка бита после пяти одинаковых: синхронизация, ошибка заполнения
- Дифференциальная передачаСигнал как разность двух проводов, помеха вычитается
- Перечисление USB (enumeration)Сброс, адрес, дескрипторы, конфигурация
- Код BMCСамосинхронизирующийся код линии в USB Power Delivery
- Код 4B/5BБлочный код линии: 4 бита данных — 5 бит на линии