Circuit Court : du binaire au code de Gray
15 juin 2021
sur
sur
La raison pour coder les bits en code Gray est de compter en binaire, mais de faire en sorte qu'un seul bit change à chaque incrémentation. C’est utile dans les commutateurs mécaniques où nous ne voulons pas que des états intermédiaires soient présents à la sortie pendant la commutation, ce qui peut se produire en raison d'imperfections. Les codes Gray sont également utiles pour la correction basique des erreurs : par exemple deux bits changés dans un seul changement d'état ? Il doit y avoir une erreur.
Certains codes de Gray, ceux qu’on dit "cycliques", présentent l'avantage que lorsqu'ils "debordent", c'est-à-dire lorsqu'ils passent de la valeur maximale à l'état initial, il n'y a qu'un seul changement de bit (c'est-à-dire que le premier et le dernier chiffre sont différents d'un seul bit). La page Wikipedia du code de Gray est intéressante et mérite d'être lue. Là, j'ai trouvé un algorithme pour convertir une valeur binaire en code de Gray :
num_gray = num_bin ^ (num_bin >> 1)
Où ^ est la fonction OU exclusif et >> correspond à un décalage vers la droite d’un bit. Pas mal, et facile à retenir pour la prochaine fois que l'on vous demandera pendant un dîner mondain le code de Gray de 10010110. Vous pourriez répondre rapidement 11011101 après un gribouillage sur une serviette en papier. À vous, l'admiration de tous !
Je me suis demandé à quoi pouvait ressembler le circuit logique équivalent. Comme je n'étais pas assez malin pour convertir directement l'algorithme ci-dessus en portes logiques, j'ai regardé les bits.
On voit que dans le cas d'un seul bit (en jaune) les codes binaire et Gray sont les mêmes. En matériel, c'est juste un fil. Pour deux bits (en bleu), nous voyons que le bit de poids fort est G1 = B1, et le bit de poids faible est G0 = NON B0. Pour trois bits (en violet) c’est G2 = B2 comme précédemment, mais sans la négation. Nous avons donc besoin d'une nouvelle stratégie. En cherchant un peu plus, nous remarquons que Gn = Bn XOR Bn+1 pour GN-1 à G0 et GN = BN.
Si nous revenons au pseudo-code, nous pouvons voir que l'opération est la même : nous faisons un OU exclusif entre Bn et Bn+1 en décalant d'abord l'entrée et en insérant un 0 à la position du bit de poids fort. En tant que concepteur, c'est toujours agréable quand la solution est simplement un niveau logique !
J'ai peut-être adopté une approche naïve pour résoudre ce problème. Comment vous y prendriez-vous ?
Vous avez besoin d'une solution de prototypage rapide ? Consultez ElektorPCB4Makers. Vous pouvez obtenir deux prototypes de PCB en trois jours ouvrables !
Certains codes de Gray, ceux qu’on dit "cycliques", présentent l'avantage que lorsqu'ils "debordent", c'est-à-dire lorsqu'ils passent de la valeur maximale à l'état initial, il n'y a qu'un seul changement de bit (c'est-à-dire que le premier et le dernier chiffre sont différents d'un seul bit). La page Wikipedia du code de Gray est intéressante et mérite d'être lue. Là, j'ai trouvé un algorithme pour convertir une valeur binaire en code de Gray :
num_gray = num_bin ^ (num_bin >> 1)
Où ^ est la fonction OU exclusif et >> correspond à un décalage vers la droite d’un bit. Pas mal, et facile à retenir pour la prochaine fois que l'on vous demandera pendant un dîner mondain le code de Gray de 10010110. Vous pourriez répondre rapidement 11011101 après un gribouillage sur une serviette en papier. À vous, l'admiration de tous !
Je me suis demandé à quoi pouvait ressembler le circuit logique équivalent. Comme je n'étais pas assez malin pour convertir directement l'algorithme ci-dessus en portes logiques, j'ai regardé les bits.
On voit que dans le cas d'un seul bit (en jaune) les codes binaire et Gray sont les mêmes. En matériel, c'est juste un fil. Pour deux bits (en bleu), nous voyons que le bit de poids fort est G1 = B1, et le bit de poids faible est G0 = NON B0. Pour trois bits (en violet) c’est G2 = B2 comme précédemment, mais sans la négation. Nous avons donc besoin d'une nouvelle stratégie. En cherchant un peu plus, nous remarquons que Gn = Bn XOR Bn+1 pour GN-1 à G0 et GN = BN.
J'ai peut-être adopté une approche naïve pour résoudre ce problème. Comment vous y prendriez-vous ?
En savoir plus sur la conception de circuits, le code de Gray, et plus encore...
Pour plus d’informations:- Articles sur la conception de circuits imprimés, ElektorMagazine.fr.
- S. Drimer, "Circuits courts : Les formes des décimales codées en binaire (DCB)", 30 Mars 2021.
- Suivez la série Circuit Court pour être tenue au courant des nouveautés.
Vous avez besoin d'une solution de prototypage rapide ? Consultez ElektorPCB4Makers. Vous pouvez obtenir deux prototypes de PCB en trois jours ouvrables !
Lire l'article complet
Hide full article
Discussion (1 commentaire(s))