Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Разработка дискретных систем управления-2011.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
27.38 Mб
Скачать

1.8.Код Грея

Код Грея – система кодирования, в которой два соседних значения различаются только в одном разряде. Наиболее часто на практике применяется рефлексный двоичный код Грея, хотя в общем случае существует бесконечное множество кодов Грея для систем счисления с любым основанием. В большинстве случаев, под термином "код Грея" понимают именно рефлексивный бинарный код Грея.

Изначально предназначался для защиты от ложного срабатывания электромеханических переключателей. Сегодня коды Грея широко используются для упрощения выявления и исправления ошибок в системах связи, а также в формировании сигналов обратной связи в системах управления.

Код получил имя исследователя лабораторий Bell Labs Фрэнка Грея. Франк Грэй (Frank Gray) был физиком и исследователем в Bell Labs (бывшая американская корпорация, крупный исследовательский центр в области телекоммуникаций, электронных и компьютерных систем), который ввёл многочисленные инновации в телевидении при помощи кода Грея.

Кодом Грея порядка n называется любая циклическая последовательность всех наборов из нулей и единиц длины n, в которой два соседних набора отличаются ровно в одной компоненте.

Пример получения кода Грея:

Начнём с первых двух чисел, закодируем их нулём и единицей:

Ноль

0

Один

1

Заметим, что они отличаются только одним битом. Проблема в том, что нам нужно больше чем два числа. Зеркально отразим коды чисел и получим:

Ноль

0

Один

1

Один

1

Ноль

0

Кодов стало больше, и соседи отличаются друг от друга не более чем одним битом. Но есть повторы. Чтобы не было повторов, допишем спереди к первой половине кодов 0, а ко второй 1.

Ноль

00

Один

01

Два

11

Три

10

Точно так же мы можем отразить и получим:

Ноль

00

Один

01

Два

11

Три

10

Три

10

Два

11

Один

01

Ноль

00

И тоже добавим в первую половину 0, а во вторую – 1.

Ноль

000

Один

001

Два

011

Три

010

Четыре

110

Пять

111

Шесть

101

Семь

100

И так далее. Таким способом можно получить код Грея любого порядка. [http://www.rsdn.ru/article/alg/gray.xml].

Младший разряд в последовательности чисел в коде Грея принимает значения 0 и 1, затем следующий старший разряд становится единичным и младший разряд принимает свои значения уже в обратном порядке (1, 0). Этим и объясняется название кода - "отражённый". Соответственно, два младших разряда принимают значения 00, 01, 11, 10, а затем, при единичном следующем старшем разряде, те же значения в обратном порядке (10, 11, 01, 00).

Код Грея предпочтительнее обычного двоичного тем, что обладает свойством непрерывности бинарной комбинации: изменение кодируемого числа на единицу соответствует изменению кодовой комбинации только в одном разряде. Он строится на базе двоичного по следующему правилу: старший разряд остается без изменения; каждый последующий разряд инвертируется, если предыдущий разряд исходного двоичного кода равен единице. Этот алгоритм построения может быть формально представлен как результат сложения по модулю два исходной комбинации двоичного кода с такой же комбинацией, но сдвинутой на один разряд вправо. При этом крайний правый разряд сдвинутой комбинации отбрасывается.

Таким образом, Грей-код является так называемым одношаговым кодом, т.к. при переходе от одного числа к другому всегда меняется лишь какой-то один бит. Погрешность при считывании информации с механического кодового диска при переходе от одного числа к другому приведет лишь к тому, что переход от одного положения к другом будет лишь несколько смещен по времени, однако выдача совершенно неверного значения углового положения при переходе от одного положения к другому полностью исключается. Преимуществом Грей-кода является также его способность зеркального отображения информации.

Преобразование кода Грея в двоичный код и обратно

Коды Грея легко получаются из двоичных чисел путём побитовой операции «Исключающее ИЛИ» с тем же числом, сдвинутым вправо на один бит. Следовательно, i-й бит кода Грея Gi выражается через биты двоичного кода Bi следующим образом:

где – операция «исключающее ИЛИ»; биты нумеруются справа налево, начиная с младшего.

Обратный алгоритм – преобразование кода Грея в двоичный код – можно выразить рекуррентной формулой:

Причём преобразование осуществляется побитно, начиная со старших разрядов, и значение Bi+1, используемое в формуле, вычисляется на предыдущем шаге алгоритма. Действительно, если подставить в эту формулу вышеприведённое выражение для i-го бита кода Грея, получим

Однако приведённый алгоритм, связанный с манипуляцией отдельными битами, неудобен для программной реализации, поэтому на практике используют видоизменённый алгоритм:

где N – число битов в коде Грея (для увеличения быстродействия алгоритма в качестве N можно взять номер старшего ненулевого бита кода Грея); знак означает суммирование при помощи операции «исключающее ИЛИ», то есть

Здесь предполагается, что бит, выходящий за рамки разрядной сетки (BN+1), равен нулю.

Ниже приведена функция на языке С, реализующая данный алгоритм. Она осуществляет последовательный сдвиг вправо и суммирование исходного двоичного числа, до тех пор, пока очередной сдвиг не обнулит слагаемое.

unsigned int graydecode(unsigned int gray)

{

unsigned int bin;

for (bin = 0; gray; gray >>= 1) {

bin ^= gray;

}

return bin;

}

Генерация кодов Грея

Рекурсивная функция построение кода Грея на языке C:

//n - требуемая длина кода,

//m - указатель на массив, способный хранить

// все коды Грея, длиной до n

// (должен быть выделен до вызова функции)

//depth - параметр рекурсии

int gray (int n, int* m, int depth)

{

int i, t = (1 << (depth - 1));

if (depth == 0)

m[0] = 0;

else {

//массив хранит десятичные записи двоичных слов

for (i = 0; i < t; i++)

m[t + i] = m[t - i - 1] + (1 << (depth - 1));

}

if (depth != n)

gray(n, m, depth + 1);

return 0;

}