# Circuits logiques Les portes logiques peuvent être combinées entre elles pour former des circuits logiques qui réalisent des fonctions logiques ou binaires. Certains circuits logiques réalisent des calculs sur des nombres binaires, d'autres peuvent servir de mémoire pour stocker des valeurs binaires. ## Combinaisons de portes Les portes peuvent être connectées les unes aux autres. Voici par exemple un circuit logique contenant une porte **ET** et une porte **NON**. ```{logic} :ref: nand :height: 100 :mode: tryout { // JSON5 v: 8, components: { in0: {type: 'in', pos: [55, 30], id: 0, name: 'A', val: 1}, in1: {type: 'in', pos: [55, 70], id: 1, name: 'B'}, and0: {type: 'and', pos: [165, 50], in: [2, 3], out: 4}, not0: {type: 'not', pos: [245, 50], in: 5, out: 6}, out0: {type: 'out', pos: [320, 50], id: 7, name: 'Z'}, }, wires: [[0, 2], [1, 3], [4, 5], [6, 7]] } ``` Sa table de vérité peut s'écrire ainsi: | $A$ | $B$ | $A$ ET $B$ | $Z$ = NON($A$ ET $B$) | |-----|-----|------------|-----------------------| | 0 | 0 | 0 | 1 | | 0 | 1 | 0 | 1 | | 1 | 0 | 0 | 1 | | 1 | 1 | 1 | 0 | Les deux premières colonnes ($A$ et $B$) correspondent aux entrées du circuit. La troisième colonne ($A$ **ET** $B$) représente la valeur intermédiaire à la sortie de la porte **ET** et la dernière colonne correspond à $Z$, la sortie du circuit. Les valeurs intermédiaires d'un circuit logiques sont utiles pour calculer les sorties de ce circuits, mais elles ne figurent pas nécessairement dans la table de vérité, contrairement aux valeurs d'entrées et de sorties qui sont obligatoires. On définit la porte **NON-ET** comme une porte **ET** directement suivie par une porte **NON**, comme dans l'exemple ci-dessus. On représente la porte **NON-ET** comme une porte **ET** à laquelle on ajoute un petit rond au bout pour indiquer la négation, comme ceci: ```{logic} :ref: nand2 :height: 150 :mode: tryout { // JSON5 v: 6, components: { in0: {type: 'in', pos: [55, 45], id: 0, name: 'A', val: 1}, in1: {type: 'in', pos: [55, 85], id: 1, name: 'B'}, nand0: {type: 'nand', pos: [165, 70], in: [2, 3], out: 4}, out0: {type: 'out', pos: [320, 70], id: 7, name: 'Z'}, }, wires: [[0, 2], [1, 3], [4, 7]] } ``` ```{micro} Vérifier que la porte ci-dessus a la même table de vérité (au niveau des entrées et des sorties) que le circuit précédent. ``` De la même manière, on définit les portes **NON-OU** et **NON-OU-X** en ajoutant un rond au bout des portes **OU** et **OU-X**. ````{exercise} Donner les tables de vérité des portes **NON-OU** et **NON-OU-X** ci-dessous. ```{logic} :ref: xnor :height: 150 :mode: tryout { // JSON5 v: 6, components: { in0: {type: 'in', pos: [55, 45], id: 0, name: 'A', val: 1}, in1: {type: 'in', pos: [55, 85], id: 1, name: 'B'}, out0: {type: 'out', pos: [255, 85], id: 7, name: 'Z'}, xnor0: {type: 'xnor', pos: [170, 85], in: [8, 9], out: 10}, nor0: {type: 'nor', pos: [170, 40], in: [11, 12], out: 13}, out1: {type: 'out', pos: [255, 40], id: 14, name: 'Y'}, }, wires: [[0, 8], [1, 9], [10, 7], [0, 11], [1, 12], [13, 14]] } ``` ```` ```{solution} | $A$ | $B$ | $Y$ = NON($A$ OU $B$) | $Z$ = NON($A$ OU-X $B$) | |-----|-----|------------|---------------------| | 0 | 0 | 1 | 1 | | 0 | 1 | 0 | 0 | | 1 | 0 | 0 | 0 | | 1 | 1 | 0 | 1 | ``` ## Analyse de circuits logiques L'analyse d'un circuit logique consiste à établir sa table de vérité, c'est-à-dire déterminer ses sorties pour chaque combinaison possible de ses entrées. ````{exercise} a. Etablir sans modifier les entrées la table de vérité du circuit logique suivant. ```{logic} :ref: xor_circuit :height: 150 :mode: static { "v": 3, "opts": {"showGateTypes": true, "hideWireColors": true}, "in": [ {"pos": [50, 30], "id": 0, "ref": "x", "name": "A", "val": 0}, {"pos": [50, 90], "id": 1, "ref": "y", "name": "B", "val": 0} ], "out": [{"pos": [390, 50], "id": 2, "ref": "z", "name": "Z"}], "gates": [ {"type": "OR", "pos": [190, 40], "in": [3, 4], "ref": "or", "out": 5}, {"type": "AND", "pos": [330, 50], "in": [6, 7], "ref": "and2", "out": 8}, {"type": "NAND", "pos": [190, 120], "in": [11, 12], "ref": "and1", "out": 13} ], "wires": [[0, 3], [0, 11], [1, 4], [1, 12], [13, 7], [5, 6], [8, 2]] } ``` b. À quelle porte logique ce circuit est-il équivalent? ```` ```{solution} a. | $A$ | $B$ | $Z$ | |-----|-----|------| | 0 | 0 | 0 | | 0 | 1 | 1 | | 1 | 0 | 1 | | 1 | 1 | 0 | b. Il s'agit de la porte **OU-X**. ``` Le nombre de lignes dans la table de vérité d'un circuit logique dépend du nombre d'entrées de ce circuit. ```{exercise} a. Combien de lignes a la table de vérité d'un circuit à trois entrées? Et si les circuit a 4 entrées? b. Donner le nombre de lignes de la table de vérité d'un circuit à $n$ entrées. ``` ```{solution} a. Un circuit à 3 entrées aura 8 lignes dans sa table de vérité, et un circuit à 4 entrées en aura 16. b. La table de vérité aura $2^{n}$ lignes. En effet, il y a deux lignes s'il n'y a qu'une seule entrée, et à chaque ajout d'une entrée, on double le nombre de combinaisons possibles d'entrées. (On garde les anciennes combinaisons, soit avec un 0 soit avec un 1 pour la nouvelle entrée.) ``` ## Synthèse de circuits logiques La synthèse d'un circuit logique consiste à concevoir le circuit réalisant une certaine fonction. Par exemple, on souhaite réaliser un circuit qui relie un capteur d'humidité planté dans un pot de fleurs à un robinet arrosant ces fleurs et qui est actionné électroniquement. Le capteur d'humidité ($H$) retourne un «1» lorsque la terre est humide, et un «0» lorsqu'elle est sèche. Le robinet ($R$) s'ouvre lorsqu'il reçoit un «1» et se ferme lorsqu'il reçoit un «0». On veut déterminer le circuit logique reliant le capteur d'humidité au robinet pour que le robinet s'ouvre lorsque la terre est sèche. Ce circuit a une entrée $H$ et une sortie $R$. Sa table de vérité est donc la suivante, si on veut que le robinet s'allume lorsque la terre est sèche et vice-versa: | $H$ | $R$ | |-----|-----| | 0 | 1 | | 1 | 0 | Cette table de vérité correspond à l'opération suivante: $R = NON(H)$, qui peut être réalisée par la porte **NON**. Donc le circuit logique est le suivant: ```{logic} :id: yUB58I :height: 80 :mode: tryout { // JSON5 v: 6, components: { in0: {type: 'in', pos: [50, 40], id: 0, name: 'H'}, not0: {type: 'not', pos: [120, 40], in: 1, out: 2}, out0: {type: 'out', pos: [190, 40], id: 3, name: 'R'}, }, wires: [[0, 1], [2, 3]] } ``` Cet exemple est très simple puisqu'il n'a qu'une entrée, une sortie et une porte logique. Mais il illustre bien les étapes du processus de synthèse de circuits logique: après avoir définit les entrées et les sorties, on exprime la fonction souhaitée du circuit logique sous forme de table de vérité, que l'on convertit ensuite en une fonction logique qui est elle-même convertie en circuit logique. ```{exercise} Réaliser la table de vérité et le circuit logique qui permet de commander un store électrique en fonction de la luminosité et du vent. Un capteur de lumière renvoie 1 lorsque la luminosité est forte et 0 lorsqu'elle est faible. Un capteur de vent renvoie 1 lorsqu'il y a du vent et 0 lorsqu'il n'y en a pas. On veut baisser le store, c'est-à-dire lui envoyer un 1, lorsque la luminosité est forte mais que le vent est faible. ``` ````{solution} On appelle $L$ le signal donné par le capteur de lumière, $V$ celui donné par le capteur de vent et $S$ le signal envoy au store. Les entrées sont donc $L$ et $V$, et la sortie est $S$. La table de vérité désirée est la suivante: | $L$ | $V$ | $S$ | |-----|-----|------| | 0 | 0 | 0 | | 0 | 1 | 0 | | 1 | 0 | 1 | | 1 | 1 | 0 | Cette table de vérité correspond à la fonction logique $S = L\ ET\ (NON\ V)$. Le circuit logique correspondant est le suivant: ```{logic} :id: yUB58I :height: 102 :mode: tryout { // JSON5 v: 6, components: { in0: {type: 'in', pos: [40, 70], id: 0, name: 'V'}, not0: {type: 'not', pos: [115, 70], in: 1, out: 2}, in1: {type: 'in', pos: [40, 25], id: 4, name: 'L'}, and0: {type: 'and', pos: [210, 35], in: [5, 6], out: 7}, out0: {type: 'out', pos: [280, 35], id: 8, name: 'S'}, }, wires: [[0, 1], [4, 5], [2, 6], [7, 8]] } ``` ```` Il y a d'habitude plusieurs solutions pour passer de la table de vérité à la fonction logique. Dans l'exemple si dessus, il aurait aussi été possible de mettre $S = NON(V\ OU\ NON\ L)$, qui correspond au circuit suivant: ```{logic} :id: yUB58I :height: 88 :mode: tryout { // JSON5 v: 6, components: { in0: {type: 'in', pos: [40, 70], id: 0, name: 'V'}, in1: {type: 'in', pos: [40, 25], id: 4, name: 'L'}, nor0: {type: 'nor', pos: [210, 35], in: [5, 6], out: 7}, out0: {type: 'out', pos: [280, 35], id: 8, name: 'S'}, not0: {type: 'not', pos: [115, 25], in: 9, out: 10}, }, wires: [[7, 8], [10, 5], [0, 6], [4, 9]] } ``` Il n'est pas forcément évident de trouver une fonction logique correspondant à une table de vérité donnée. Il s'agit de spécifier l'ensemble des lignes de la table de vérité dont la sortie vaut 1. Considérons l'exemple donné par la table de vérité ci-dessous, dont on a numéroté les lignes à droite. ```{figure} media/table1.png --- width: 400px align: center --- Un exemple de table de vérité. En exprimant Z comme l'union des lignes encadrées et rouge et celles encadrées en vert, on obtient $Z=(NON A) OU B$. ``` $A$ étant une des entrées de notre circuit, l'expression logique $A$ correspond à toutes les lignes de la table pour lesquelles $A=1$, c'est dire les lignes {3, 4} encadrées en bleu dans la table ci-dessus. A l'inverse, l'expression logique $NON\ A$ correspond à toutes les lignes de la table pour lesquelles $A=0$, c'est-dire celles encadrée en rouge. On peut étendre un ensemble de lignes de la table défini par une expression logique en la combinant par un $OU$ avec une autre expression logique pour obtenir l'union des ensembles de lignes données par ces deux expressions. Dans notre exemple, les lignes pour lesquelles la sortie vaut 1 correspond à l'union des lignes {1, 2} encadrées en rouge ($NON\ A$) et celles {2, 4} encadrées en vert ($B$). On obtient ainsi la fonction logique $Z=(NON\ A) OU\ B$. Inversément, on peut restreindre cet ensemble de ligne en combinant par un $ET$ l'expression logique correspondante avec une autre expresssion logique pour obtenir l'intersection des ensembles de lignes donnés par ces deux expresssions. Dans notre exemple ci-dessus, la ligne {3} correspond à l'intersection des blocs bleu ($A$) et violet ($NON\ B$), c'est-à-dire à l'expression $A\ ET (NON\ B$). C'est en effet la ligne pour laquelle A vaut 1 et B vaut 0. Enfin, en prenant la négation d'un expression, c'est à dire en mettant un $NON$ devant, on prend le complément de l'ensemble des lignes correspondant à cette expression, c'est-à-dire toutes les lignes de la table sauf celles-ci. Comme $Z$ vaut 1 pour toutes les lignes sauf la ligne {3}, correspondant à $A\ ET (NON\ B)$, on a $Z = NON \big(A\ ET\ (NON\ B)\big)$. A défaut de trouver une expression plus simple, on peut toujours adopter l'*approche systématique* consistant à "lister" toutes les lignes pour lesquelles la sortie vaut 1, séparées par des $OU$. Ainsi dans l'exemple ci-dessus, on obtient, en considérant les lignes {1, 2, 4} $Z=\big((NON\ A) ET\ (NON\ B)\big) OU \big(A\ ET\ (NON\ B)\big) OU \big(A\ ET\ B\big)$. ```{exercise} On considère la table de vérité ci-dessous, dont les lignes sont numérotées dans la colonne de gauche. | | $A$ | $B$ | $Z$ | |--- |-----|-----|------| | 1 | 0 | 0 | 1 | | 2 | 0 | 1 | 0 | | 3 | 1 | 0 | 1 | | 4 | 1 | 1 | 1 | Donner l'expression logique correspondant aux ensemble de lignes suivantes et en déduire deux manières d'exprimer la fonction logique correspondant à cette table de vérité. 1. Les lignes $\{1,3\}$ 1. Les lignes $\{3,4\}$ 1. Les lignes $\{2\}$ ``` ```{solution} 1. $NON\ B$ 1. $A$ 1. $(NON\ A) ET\ B$ La première manière est $Z=A OU (NON\ B)$, c'est-à-dire les lignes 3,4 ou 1,3. L'autre manière est $Z=NON\big((NON A) ET\ B\big)$ (toutes les lignes sauf la 2). ``` ## Des valeurs logiques aux nombres binaires Du fait de la correspondance entre les valeurs logiques, les valeurs binaires et l'état d'un circuit électronique, on peut interpréter les entrées et les sorties d'un circuit logique comme un nombre donné en binaire. ````{exercise} On considère que les entrées du circuit ci-dessous forment un nombre $x$ s'écrivant $X_2X_1X_0$ en binaire et que les sorties forment également un nombre $y$ s'écrivant $Y_2Y_1Y_0$ en binaire. Que vaut $y$ en fonction de $x$, ou autrement dit, quel calcul réalise ce circuit logique composé de trois portes NON? Les affichages rectangulaires indiquant la valeur en décimal de $x$ et $y$ ont été ajoutés pour vous aider, mais ne sont pas forcément nécessaires. ```{logic} :id: KeZJvf :height: 345 :mode: tryout { // JSON5 v: 8, components: { in0: {type: 'in', pos: [45, 45], orient: 's', id: 0, name: 'X2'}, in1: {type: 'in', pos: [95, 45], orient: 's', id: 1, name: 'X1'}, in2: {type: 'in', pos: [145, 45], orient: 's', id: 2, name: 'X0'}, not0: {type: 'not', pos: [45, 175], orient: 's', in: 3, out: 4}, out0: {type: 'out', pos: [45, 300], orient: 's', id: 5, name: 'Y2'}, not1: {type: 'not', pos: [95, 175], orient: 's', in: 6, out: 7}, not2: {type: 'not', pos: [145, 175], orient: 's', in: 8, out: 9}, out1: {type: 'out', pos: [95, 300], orient: 's', id: 11, name: 'Y1'}, out2: {type: 'out', pos: [145, 300], orient: 's', id: 12, name: 'Y0'}, disp0: {type: 'display', pos: [245, 105], id: '13-16', name: 'x'}, disp1: {type: 'display', pos: [245, 245], id: '17-20', name: 'y'}, }, wires: [[0, 3], [4, 5], [1, 6], [2, 8], [9, 12], [7, 11], [1, 14, {via: [[95, 95]]}], [2, 13], [0, 15, {via: [[45, 115]]}], [4, 19, {via: [[45, 255]]}], [7, 18, {via: [[95, 235]]}], [9, 17]] } ``` ```` ```{solution} Le circuit logique réalise le calcul suivant: $y = 7-x$. Autrement dit, ce circuit réalise la fonction $f(x)=7-x$ en binaire. ``` ```{exercise} Remplir la table de vérité du circuit de l'exercice ci-dessus. |$X_2$ | $X_1$ |$X_0$ | $Y_2$ | $Y_1$ |$Y_0$| |----- |------ |------|-------|-------|-----| | 0 | 0 | 0 | | | | | 0 | 0 | 1 | | | | | 0 | 1 | 0 | | | | | 0 | 1 | 1 | | | | | 1 | 0 | 0 | | | | | 1 | 0 | 1 | | | | | 1 | 1 | 0 | | | | | 1 | 1 | 1 | | | | ``` ```{solution} |$X_2$ | $X_1$ |$X_0$ | $Y_2$ | $Y_1$ |$Y_0$| |----- |------ |------|-------|-------|-----| | 0 | 0 | 0 | 1 | 1 | 1 | | 0 | 0 | 1 | 1 | 1 | 0 | | 0 | 1 | 0 | 1 | 0 | 1 | | 0 | 1 | 1 | 1 | 0 | 0 | | 1 | 0 | 0 | 0 | 1 | 1 | | 1 | 0 | 1 | 0 | 1 | 0 | | 1 | 1 | 0 | 0 | 0 | 1 | | 1 | 1 | 1 | 0 | 0 | 0 | ```