Posted in: Číselné systémy

Grayův kód

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í pozemní 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 byl vyloučen výskyt chybné hodnoty při přechodu mezi dvěma sousedními polohami. Grayův kód využívají také odpovídače sekundárního radaru v letadlech.

Důvod vzniku

Použití tohoto kódu má význam v elektrických obvodech při čtení hodnoty nesynchronizovaných čítačů (sem spadá i výše zmiňované čidlo polohy). Obecně se problém zajištění „současnosti“ v digitálních systémech řeší pomocí synchronizačního (nebo také hodinového) signálu, avšak v některých případech může být použití synchronizačního signálu nevýhodné.

Při zvýšení hodnoty klasického binárního čítače o jedničku se v mnoha případech mění současně více pozic čítače. Např. při přechodu tříbitového čístače z čísla 3 (binárně 011) na číslo 4 (binárně 100) se současně změní všechny tři pozice. V reálném systému není nikdy možné zaručit, aby se změnilo více logických hodnot naprosto současně, není možné zajistit ani jejich naprosto současné přečtení a vyhodnocení. To znamená, že v případě výše zmíněného tříbitového binárního čítače se může v nepříznivém případě při čtení „na hraně“ stát, že přečteme zcela náhodnou hodnotu od 0 (000) do 7 (111).
Následující příklad znázorňuje graficky čtení 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.

Převod na binární kód a naopak

Velmi snadno lze převod do grayova kódu naprogramovat v jazyku C.

unsigned int gray_encode(unsigned int b) { 
   return b ^ (b >> 1);
} 

Převod z grayova do binárního kódu vyjde v C-jazyku o něco složitěji:

unsigned int gray_decode( unsigned int g ) {
 unsigned int i, b; b = 0; for( i=0; i<8sizeof(g); i++ ) { 
   b <<= 1; b |= ((b>>1)&0x1) ^ (g>>(8sizeof(g)-1)); g <<= 1;
 } 
 return b;
}

Binární zápis kódu

Dvoubitový Grayův kód: 00 01 11 10
Tříbitový Grayův kód: 000 001 011 010 110 111 101 100
Čtyřbitový Grayův kód:
0000 0001 0011 0010 0110 0111 0101 0100 1100 1101 1111 1110 1010 1011 1001 1000

Back to Top