Код Грея и биты чётности
← Все статьи

Код Грея и биты чётности

5 мин

Проблема обычного двоичного кода

Переход от 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 — загрузите пример с кодом Грея и сравните двоичный счётчик с его представлением в коде Грея, чтобы увидеть, что на каждом шаге меняется только один бит.

Загрузить пример счётчика с кодом Грея