Die Motivation für die Kodierung von Bits im Gray-Code war, im Binärformat zu zählen, aber nur einen Bitwechsel bei jeder +1-Zählung zu haben. Dies ist hilfreich bei mechanischen Schaltern, bei denen wir nicht wollen, dass während des Schaltens Zwischenzustände am Ausgang vorhanden sind, was aufgrund von Imperfektionen passieren kann. Gray-Codes sind auch für die grundlegende Fehlerkorrektur nützlich: zwei geänderte Bits bei einem einzigen Zustandswechsel? Irgendetwas muss falsch sein.

Einige Gray-Codes, die "zyklisch" sind, haben den zusätzlichen Vorteil, dass beim "Rollen" - also beim Übergang von der "Endzählung" zum Anfangszustand - ebenfalls nur ein Bitwechsel stattfindet (d.h. die erste und die letzte Zahl unterscheiden sich durch einen einzigen Bitwechsel). Die Wikipedia-Seite für Grauen Code ist faszinierend und lesenswert. Auf dieser Seite habe ich einen Code gefunden, mit dem man Gray-Code in Binärcode umwandeln kann. Etwa so:

num_gray = num_bin ^ (num_bin >> 1)

Dabei steht ^ für XOR und >> für 'um eins nach rechts schieben'. Ziemlich ordentlich, und leicht zu merken für das nächste Mal, wenn Sie auf einer Party nach dem Gray von 10010110 gefragt werden. Sie könnten schnell 11011101 antworten, nachdem Sie eine Kritzelei auf einer Serviette zu Rate gezogen haben. Großer Applaus für Sie!

Ich habe mir überlegt, wie die logische Schaltung aussehen könnte. Ich war nicht schlau genug, den obigen Code direkt in Gatter umzuwandeln, also habe ich mir die Bits angesehen.

Wir sehen, dass im Falle eines einzelnen Bits - in Gelb - das Binär und Gray gleich sind. In der Hardware ist das nur eine Leitung. Bei zwei Bits - in Blau - sehen wir, dass das höchstwertige Bit (MSB) G1 = B1 ist und das niedrigstwertige Bit (LSB) G0 = NICHT B0 ist. Betrachtet man drei Bits - in lila - so ist G2 = B2 wie zuvor, aber die Negationsregel funktioniert nicht mehr. Wir brauchen eine neue Strategie. Auf der Suche nach aufwendigeren Mustern können wir feststellen, dass Gn = Bn XOR Bn+1 für GN-1 zu G0 und GN = BN!
Das Ersatzschaltbild der Software-Implementierung. Gate D kann durch einen Draht für G3 = B3 entfernt werden.
Wenn wir auf den Pseudo-Code zurückblicken, sehen wir, dass die Operation die gleiche ist: Wir XORieren Bn und Bn+1, indem wir den Eingang zuerst verschieben und an der MSB-Position eine 0 einfügen. (Das ist als zusätzliches überflüssiges XOR-Gatter mit einem 0-Eingang dargestellt.) Als Designer ist es immer schön, wenn die Lösung eine einzige Logikstufe ist!

Vielleicht bin ich bei der Lösung dieses Problems zu naiv vorgegangen. Wie würden Sie es besser oder anders machen?

Mehr zu Schaltungsentwurf, Gray Code und mehr

Interessieren Sie sich für Schaltungsdesign und verwandte Themen?
 
Benötigen Sie eine Lösung für das Rapid Prototyping? Schauen Sie sich ElektorPCB4Makers an. Sie können zwei PCB-Prototypen in drei Arbeitstagen erhalten!