De reden voor het coderen van bits in gray-code was niet alleen om in binair te tellen, maar om slechts één bit te veranderen bij elke volgende stap in de telling. Laten we eens kijken naar binair en gray.
De reden voor het coderen van bits in gray-code was niet alleen om in binair te tellen, maar om slechts één bit te veranderen bij elke volgende stap in de telling. Dit is handig bij mechanische schakelaars waarbij we niet willen dat er tussenliggende toestanden ontstaan aan de uitgang tijdens het schakelen, iets dat kan gebeuren als gevolg van onvolkomenheden. Gray coderingen zijn ook handig voor basisfoutcorrectie: twee bits gewijzigd in een enkele statuswijziging? Dan moet er iets mis zijn.
Sommige gray-coderingen, die 'cyclisch' zijn, hebben het extra voordeel dat wanneer ze 'rond gaan' - van de eind naar de begintoestand - er ook slechts één bitverandering is. Dat wil zeggen, het eerste en laatste nummer verschillen door een enkele bitwisseling. De Wikipedia-pagina voor gray code is fascinerend en het lezen waard. Op deze pagina vond ik code voor het converteren van gray-code naar binair. Iets zoals dit:
num_gray = num_bin ^ (num_bin >> 1)
Waar ^ XOR is en >> is 'één keer naar rechts verschuiven'. Best handig, en gemakkelijk te onthouden voor de volgende keer dat je op een feestje wordt gevraagd om de gray-code van 10010110. Je zou snel 11011101 kunnen beantwoorden na het raadplegen van een krabbel op een servetje. Hulde voor jou!
Ik heb me afgevraagd hoe het logische circuit eruit zou kunnen zien. Ik ben er niet zo goed in om de bovenstaande code rechtstreeks naar poorten te converteren, dus keek ik naar de bits.
We zien dat in het geval van een enkele bit - in het geel - het binaire en gray getal hetzelfde zijn. In hardware is dat maar een draad. Voor twee bits - in blauw - zien we dat de meest significante bit (MSB) G1 = B1 is, en de minst significante bit (LSB) is G0 = NOT B0. Kijkend naar drie bits - in paars - G2 = B2 zoals voorheen, maar de ontkenningsregel werkt niet meer. We hebben een nieuwe strategie nodig. Als we naar meer uitgebreide patronen zoeken, kunnen we opmerken dat Gn = Bn XOR Bn + 1 voor GN-1 tot G0 en GN = BN!
Het equivalente circuit van de software-implementatie. Gate D kan worden verwijderd door een draad voor G3 = B3.
Als we terugkijken naar de pseudo-code, kunnen we zien dat de uitvoering hetzelfde is: we XOR-en Bn en Bn + 1 door eerst de invoer te verschuiven en een 0 in te voeren op de MSB-positie. (Dat wordt weergegeven als de extra overbodige XOR-poort met een 0-ingang.) Als ontwerper is het altijd fijn als de oplossing één logisch niveau is!
Ik heb misschien de naïeve benadering gekozen om dit probleem op te lossen. Zou jij het beter of anders doen?
Meer over circuitontwerp, gray code en meer
Geïnteresseerd in circuitontwerp en aanverwante onderwerpen?