Проблема обычного двоичного кода
Переход от 3 (011) к 4 (100) в обычном двоичном коде переключает все три бита одновременно. В реальном железе эти биты никогда не переключаются в один и тот же момент — на короткое мгновение быстрый считыватель может увидеть недопустимое промежуточное значение, например 111 или 000. Для счётчика, управляющего физическим датчиком положения (например, поворотным энкодером), этот короткий сбой — реальная, наблюдаемая ошибка, а не только теоретическая проблема.
Что делает код «грейевским»
Код Грея — это альтернативное двоичное кодирование, в котором каждое следующее значение отличается от предыдущего ровно на один бит. Счёт от 0 до 7 в коде Грея идёт так: 000, 001, 011, 010, 110, 111, 101, 100 — каждый шаг меняет ровно один бит, поэтому между любыми двумя соседними состояниями невозможно недопустимое промежуточное значение.
Перевод из двоичного в код Грея и обратно
Перевод из двоичного кода в код Грея — это один проход через XOR: каждый бит Грея равен XOR соответствующего двоичного бита с двоичным битом на позицию выше (старший бит копируется без изменений).
- G[n] = B[n] (старший бит, без изменений)
- G[i] = B[i] ⊕ B[i+1] для каждого остального бита
- Обратный перевод выполняет ту же идею в обратном порядке, накапливая XOR от старшего бита вниз.
Биты чётности: обнаружение однобитных ошибок
Бит чётности — это один дополнительный бит, добавляемый к слову данных так, чтобы общее количество единиц (включая сам бит чётности) всегда было чётным (чётная чётность) или всегда нечётным (нечётная чётность). Если ровно один бит переключится при передаче или хранении — из-за помехи, космической частицы, плохого контакта — чётность больше не совпадёт, и принимающая схема может зафиксировать ошибку.
Чётность надёжно обнаруживает один перевёрнутый бит, но не два одновременно (два переключения компенсируют друг друга, и чётность всё равно совпадёт) — поэтому более критичные системы используют более сильные корректирующие коды, построенные на этой же базовой идее.
Где они применяются
Код Грея встречается в поворотных и линейных датчиках положения, в счётчиках, пересекающих границы тактовых доменов, и в порядке осей карты Карно (статья «Карты Карно» использует ровно это свойство). Биты чётности защищают RAM, последовательные линии связи и простые шины памяти. В Boolflow есть готовые блоки Binary→Gray, Gray→Binary и Parity — загрузите пример с кодом Грея и сравните двоичный счётчик с его представлением в коде Грея, чтобы увидеть, что на каждом шаге меняется только один бит.