Speak English ? Click for the english version.

Parmi ces portes logiques on trouve des portes AND, OR, XOR, NOT, des multiplexeurs, ou encore des démultiplexeurs. Je cherchais une idée assez simple à mettre en place, mais faisant appel à pas mal de portes logiques donc j'ai eu l'idée de créer un convertisseur binaire vers décimal. Le but est d'entrer un chiffre en binaire et d'obtenir son équivalent en base décimale.
Pour ceux qui auraient du mal avec ces histoires de bases : on compte en utilisant un système de base décimales, c'est à dire en utilisant des puissances de 10.

Par exemple en base 10 :
157 = 1*10^2 + 5*10^1 + 7*10^0

En binaire on utilise une base deux, donc on compte à l'aide puissance de deux.
On reprends l'exemple précédent en binaire cette fois :
157 = 1*2^7 + 0*2^6 + 0*2^5 + 1*2^4 + 1*2^3 + 1*2^2 + 0*2^1 + 1*2^0
Soit en binaire naturel, 157 = 10011101

L'idée ici est donc de passer d'un code en binaire naturel à sa transcription en décimal. Pour simplifier le problème, j'ai décidé de n'utiliser que 4 bits. Ainsi les valeurs vont de 0 à 15. Pour entrer un bit, j'utilise un interrupteur double position : l'une pour 0, l'autre pour 1. De ce fait, je vais utiliser 4 interrupteurs : un pour chaque bit, c'est tout simple. On les nomme Ai avec i compris entre 0 et 3.

Une fois la valeur en binaire entrée, il faut obtenir sa conversion en décimal, et donc l'afficher. Pour ce faire, l'idée est d'utiliser simplement un afficheur sept segment. Qu'est ce que c'est ?
C'est le type d'affichage le plus simple qu'on trouve sur un radio-réveil par exemple. Les chiffres ont alors cette allure :

liste.PNG

Comme on le voit ci-dessous, l'affichage d'un chiffre décimal correspond à l'affichage simultané de plusieurs segments repérés par des lettres de a à g.

abcdefg.PNG

Il suffit donc d'écrire les équations de chaque segment, c'est à dire indiquer tous les cas où un segment devra être allumé. C'est ici qu'interviennent les fonctions logiques. Petit rappel à leur sujet : une porte NOT inverse son entrée, c'est à dire qu'un 0 deviendra un 1 en sortie, et inversement. Une porte OR verra sa sortie passer à 1 si au moins l'une des entrées est à 1. Quant à la porte AND, sa sortie ne sera à 1 que dans un seul cas : si toutes ses entrées sont à 1. Pour fixer les idées, on peut écrire les tables de vérité suivantes :

Logic_Gate.bmp

Dans ce qui suit, v correspond au OR et . au AND. Par exemple, le segment a sera allumé pour 2, 3, 4, 5, 6, 8 ou 9.
De ce fait l'équation de a sera :
a = 2 v 3 v 4 v 5 v 6 v 8 v 9
Soit en binaire :
a = 0010 v 0011 v 0100 v 0101 v 0110 v 1000 v 1001
Soit en utilisant la notation des interrupteurs :
a = [non(A3).non(A2).A1.non(A0)] v [non(A3).non(A2).A1.A0] v [non(A3).A2.non(A1).non(A0)] v [non(A3).A2.non(A1).A0] v [non(A3).A2.A1.non(A1)] v [A3.non(A2).non(A1).non(A0)] v [A3.non(A2).non(A1).A0]

De la même manière pour les autres segments (sous réserve d'erreurs):
b =[non(A3).non(A2).non(A1).non(A0)] v [non(A3).non(A2).non(A1).A0] v [non(A3).non(A2).A1.A0] v [non(A3).A2.non(A1).non(A0)] v [non(A3).A2.non(A1).A0] v [non(A3).A2.A1.non(A0)] v [non(A3).(A2).(A1).(A0)] v [A3.non(A2).non(A1).non(A0)] v [A3.non(A2).non(A1).A0]

c = [non(A3).non(A2).non(A1).non(A0)] v [non(A3).non(A2).A1.non(A0)] v [non(A3).non(A2).A1.A0] v [non(A3).A2.non(A1).A0] v [non(A3).A2.A1.non(A0)] v [A3.non(A2).non(A1).non(A0)] v [A3.non(A2).non(A1).A0]

d = [non(A3).non(A2).non(A1).non(A0)] v [non(A3).non(A2).A1.non(A0)] v [non(A3).A2.A1.non(A0)] v [A3.non(A2).non(A1).non(A0)]

e = [non(A3).non(A2).non(A1).non(A0)] v [non(A3).A2.non(A1).non(A0)] v [non(A3).A2.non(A1).A0] v [non(A3).A2.A1.non(A0)] v [A3.non(A2).non(A1).non(A0)] v [A3.non(A2).non(A1).A0]

f = [non(A3).non(A2).non(A1).non(A0)] v [non(A3).non(A2).A1.non(A0)] v [non(A3).non(A2).A1.A0] v [non(A3).A2.non(A1).A0] v [non(A3).A2.A1.non(A0)] v [non(A3).A2.A1.A0] v [A3.non(A2).non(A1).non(A0)] v [A3.non(A2).non(A1).A0]

g = [non(A3).non(A2).non(A1).non(A0)] v [non(A3).non(A2).non(A1).A0] v [non(A3).non(A2).A1.non(A0)] v [non(A3).non(A2).A1.A0] v [non(A3).A2.non(A1).non(A0)] v [non(A3).A2.A1.A0] v [A3.non(A2).non(A1).non(A0)] v [A3.non(A2).non(A1).A0]

Il suffit donc de relier tout ceci aux interrupteurs en utilisant des inverseurs NOT pour créer les 0, puis une porte AND pour chaque combinaison binaire. Ces dernières sont ensuite reliées par une porte OR.
Pour donner une petite idée, ci-dessous est présenté le schéma logique pour un segment.

06102011094.jpg

Pour créer mon afficheur j'ai simplement utilisé des "Néons droits" disposés correctement. Un problème se posait néanmoins puisque tous les bits ne pouvaient être changés simultanés pour une nouvelle valeur binaire. C'est pour cela que j'ai rajouté une dernière porte AND relié à un interrupteur à pression. De ce fait, seule une pression sur l'interrupteur allumera l'afficheur. L'ensemble est assez massif à vrai dire et un peu bordélique. Il faut vraiment s'organiser pour ne pas se tromper dans les câbles. Globalement, ça donne ça :

06102011093.jpg

Il est possible d'améliorer le tout évidemment. Tout d'abord si la valeur binaire entrée dépasse 9, l'affiche n'affiche rien. Il faudrait ajouter 6 portes logiques pour transcrire en héxadécimal et ainsi afficher A, B, C, D, E et F correspondant respectivement à 10, 11, 12, 13, 14 et 15. Il serait aussi possible de créer un second afficheur afin d'afficher directement les nombres de 10 à 15. Je verrai pour modifier ces petits détails.
Je réfléchis aussi par ailleurs à la possibilité de créer un additionneur à l'aide de ces portes logiques. Toute proposition ou remarque est la bienvenue !
Si vous souhaitez essayer ce niveau, il suffit de rechercher mon Id PSN, Eldrox, ou le nom de mon niveau : Binary To Digits Converter.

Mais sans plus tarder, démonstration en vidéo :


Binary to Digits Converter - Little Big Planet 2 par Eldroth