V sobotu 2. listopadu proběhla mohutná oslava naší plnoletosti !!
Multimediaexpo.cz je již 18 let na českém internetu !!
V tiskové zprávě k 18. narozeninám brzy najdete nové a zásadní informace.

Grayův kód

Z Multimediaexpo.cz

Verze z 14. 4. 2014, 11:36; Sysop (diskuse | příspěvky)
(rozdíl) ← Starší verze | zobrazit aktuální verzi (rozdíl) | Novější verze → (rozdíl)

Šablona:Grayův kód podle počtu bitů

Soubor:Logical connectives Hasse diagram.png
Stavový diagram čtyř bitového systému, grayův kód přechází právě po jeho hranách: mění vždy hodnotu právě jednoho bitu.

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čů (hazardy 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.

Obsah

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.

Teoretický a skutečný binární signál

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.

Teoretický a skutečný signál Grayova kódu

Další využití

Pro svou robustnost se běžne používá pro inkrementální (relativní) senzor polohy na principu jedné rotující clonky se dvěma úhlově posunutými optickými sensory. Používá se nejen u CNC strojů, ale i u obyčejné myši: Umožňuje totiž nejen načítání vzdálenosti, ale i směr pohybu.

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 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<8*sizeof(g); i++ )  {
    b <<= 1;
    b |= ((b>>1)&0x1) ^ (g>>(8*sizeof(g)-1));
    g <<= 1;
  }
  return b;
}

Převod do grayova kódu v Pascalu:

function GrayEncode(b: Longint): Longint;
begin
 GrayEncode := b xor (b shr 1);
end;

Související články