Grayův kód
Z Wikipedie, otevřené encyklopedie
|
Zrcadlový binární kód, známý také jako Grayův kód podle Franka Graye, je binární číselná soustava, ve které se každá dvě po sobě jdoucí čísla liší v jediné číslici.
Zrcadlový binární kód byl původně navržen pro zabránění rušivého výstupu z elektromechanických přepínačů (relé). Dnes je Grayův kód používán pro podporu opravy chyb v digitální komunikaci jako je digitální pozemská televize a některé systémy kabelové televize. Také některé snímače polohy (nebo natočení) udávají polohu v Grayově kódu, aby se eliminoval výskyt naprosto chybné hodnoty při přechodu mezi dvěma sousedními polohami.
[editovat] Důvod vzniku
Použití tohoto kódu má význam v elektrických obvodech, kdy se při změně z jedné hodnoty na sousední může na krátký časový okamžik objevit hodnota výrazně odlišná. (Například díky rozdílné rychlosti různých spínacích prvků.) Viz následující příklad bez Grayova kódu.
Ve výše uvedené ukázce by měl obvod plynule přecházet do následujicích stavů:
0000, 0001, 0010, 0011, 0100, 0101, 0110, ...
Díky různým zpožděním se v časech t1 až t2 a t3 až t4 dostane obvod do vyznačených stavů:
0000, 0001, (0000), 0010, 0011, 0100, 0101, (0111), 0110, ...
Je tak narušen plynulý průběh hodnoty, což může v praxi způsobovat značné nepříjemnosti. Právě tyto přechodové jevy jsou eliminovány použitím Grayova kódu, jak se lze přesvědčit na následujícím obrázku.
[editovat] Převod na binární kód a naopak
Převod z Grayova kódu na klasický binární kód lze snadno realizovat pomocí logických členů XOR zapojených následovně.
g0 ->--------------[ ]
[ XOR ]--> b0
+-[ ]
g1 ->---[ ] |
[ XOR ]--+----------> b1
+-[ ]
|
g2 ->-+---------------------> b2
Pro převod opačným směrem, tedy z binárního kódu na Grayův, lze použít následující zapojení.
b0 ->---[ ]
[ XOR ]--> g0
+-[ ]
|
b1 ->-+-[ ]
[ XOR ]--> g1
+-[ ]
|
b2 ->-+----------> g2
Velmi snadno lze tento převod naprogramovat v jayzku C.
unsigned int grayencode(unsigned int b) {
return b ^ (b >> 1);
}
Analogicky v Pascalu:
function GrayEncode(b: Longint): Longint; begin GrayEncode := b xor (b shr 1); end;

