De Gray-code, binair maar dan anders
Getallen kunnen op verschillende manieren worden weergegeven. Het decimale stelsel, een tientallig stelsel waarmee we allemaal zijn opgevoed is het bekendst. Er is echter ook een twee-talig en een zestientallig stelsel. Deze zijn vooral belangrijk geworden sinds de uitvinding van de computers. Computers kunnen het best omgaan met een stelsel met nullen en enen. Om technische redenen is er een handig een systeem bedacht waarbij bij opvolgende getallen er slechts één cijfer veranderd, de Gray-code. Deze codering is fouttolerant. De overgangen tussen de verschillende codes kunnen niet zorgen voor onbedoelde pieken en mocht er een bitje omvallen, dan blijft de fout beperkt tot 1 stap.
Het binaire stelsel versus de Gray-code, een tellertje
In dat artikel is te lezen dat de getallen 0 tot en met 15 binair gecodeerd worden volgens de tabel onderaan dit artikel. Deze codering kan echter een nadeel hebben. Stel, u gebruikt de normale binaire codering om bijvoorbeeld een tellertje te maken die van 0 naar 12 telt en dan weer 0 springt. De implementatie is zo gemaakt, dat als de teller groter dan twaalf is, de teller op nul gezet wordt.
Waar gaat het fout?
De teller begin te tellen. Bij de overgang van bijvoorbeeld waarde 7 naar 8 verandert de binaire code van 0111 naar 1000. Omdat iedere 0 of 1 in de electronica een aparte geheugencel is, moeten er dus vier veranderingen plaatsvinden. Alle cellen moeten van waarde veranderen. Theoretisch moet dat allemaal precies tegelijk gebeuren, maar in werkelijkheid lukt dat nooit precies. Stel nu dat de eerste nul in een één verandert, voordat de drie enen in een nul veranderen. In dat geval staat er heel eventjes de code 1111 in het geheugen. Omdat nu aan de voorwaarde voldaan is om de teller op 0 te zetten, zal de teller niet doortellen tot tien.
Daarnaast is het altijd mogelijk dat er een geheugencel defect raakt tijdens de levensduur van een elektronische schakeling. Gebeurd dit bij een reguliere codering,dan zal de grote van van de fout afhangen van de significatie van het bit. Bij de Gray-code zal de fout nooit meer bedragen dan 1 stapgrootte.
Oplossingen
Het bovenstaande probleem is al bekend sinds de invoering van de digitale techniek. In de meeste gevallen wordt het opgelost door de toepassing van synchrone logica. Dat zorgt ervoor dat het resultaat van een verandering niet gebruikt wordt voordat alle uitgangen veranderd zijn. implementatie van synchrone logica gebeurd met behulp van zogenaamde flipflops. Deze nemen in bijvoorbeeld een computerchip extra ruimte in en zijn dus relatief duur. De voordelen van synchrone logica zijn echter zo groot dat hier meestal toch voor gekozen wordt.
In een aantal situaties kan synchrone logica niet gebruikt worden. In dat geval is er een andere codering van de getallen nodig. Hierbij is de codering voor de getallen dusdanig gekozen dat er slechts één element veranderd als het getal met 1 verhoogd of verlaagd wordt. Dit is de zogenaamde Gray-code. Het systeem is ontwikkeld door Frank Gray in 1947.
Decimaal | Binair | Gray-code |
0 | 0000 | 0000 |
1 | 0001 | 0001 |
2 | 0010 | 0011 |
3 | 0011 | 0010 |
4 | 0100 | 0110 |
5 | 0101 | 0111 |
6 | 0110 | 0101 |
7 | 0111 | 0100 |
8 | 1000 | 1100 |
9 | 1001 | 1101 |
10 | 1010 | 1111 |
11 | 1011 | 1110 |
12 | 1100 | 1010 |
13 | 1101 | 1011 |
14 | 1110 | 1001 |
15 | 1111 | 1000 |