dimanche 27 octobre 2013

comment fonctionne un UAL

Dans cet article j'explique comment fonctionne l'Unité Arithmétique et Logique d'un microprocesseur. l'UAL (ALU en anglais) est la partie du processeur qui effectue les opérations arithmétiques et logiques sur les données. Les opérations les plus fréquentes sont l'inversion (NOT), le OU (OR), le ET (AND) et le OU exclusif (XOR), l'addition et la soustraction. Référez-vous à la page MCU 101 pour le schéma interne d'un microcontrôleur PIC de base.

Les fonctions logiques de base et leur symbole électronique sont à la page suivante: toute la vérité. Donc pour ces opérations logiques c'est simple il suffit de mettre en parallèle autant de portes logiques qu'il y a de bits dans les mots. Pour un microcontrôleur 8 bits on a donc 8 portes pour chaque opérations, un pour chaque paire de bits.

Pour chaque opération logique il existe un circuit semblable sauf que le ET est remplacé par l'opérateur désiré.

Addition et soustraction

Le circuit logique pour faire des additions est un peu plus complexe. Un additionneur sur 1 bit ressemble à ceci.

Si on regarde les tables de vérité des fonctions logique XOR et AND on comprend comment cet additionneur fonctionne. En effet dans le cas du XOR on a un 1 à la sortie seulement si A ou B a pour valeur 1 mais pas les 2 en même temps. En effet puisque 1+1=2 le bit le moins significatif reste à zéro et on a un report sur le bit suivant plus significatif. C'est le rôle du ET de faire ce report. Cependant puisque l'additionneur doit tenir compte du report du bit de poids faible qui le précède on doit doubler le circuit pour avoir un additionneur complet. Le Cin est le report du bit précédent et le Cout est le report qui va au Cin du bit suivant. Cout est à 1 si A+B=2 ou si Cin+A+B > 1. C'est bien ce que nous dit ce circuit.

Donc pour avoir une addition sur N bits il suffit de reproduire ce circuit N fois en rapportant le Cout vers le Cin du bit de poids plus fort qui suit. C'est à dire Cout0 -> Cin1, Cout1 -> Cin2, etc et le dernier Cout va dans le Carry du registre d'état (STATUS REGISTER) et indique s'il y a eu débordement lors de l'addition.

Pour faire les soustractions le même additionneur est utilisé mais avec un astuce qu'on appelle addition sur complément de 2. Je vais expliquer ce principe en utilisant la base 10 qui nous est plus familière. Supposons que je veux faire la soustraction 7-3=4 mais je n'ai pas de soustracteur alors j'utilise le complément à 10 de 3 et je l'additionne à 7. Le complément est la différence entre le chiffre et sa base. Donc pour 3 le complément est 7. Donc eu lieu de faire une soustraction je fait l'addition 7+7=14. Je ne garde que le 4 ce qui est bien le résultat de 7-3. Oui mais si j'ai 2 digits? 75-31=44. Ici le complément est sur 100 donc pour 31 il s'agit de 69. 75+69=144. Ce principe s'applique à toutes les bases numériques. Donc c'est le même concept en base 2. Pour faire une soustraction en base 2. J'inverse tous les bits de l'opérande qui est soustraite et j'ajoute 1 et ça donne le complément à 2.

En terme de circuit c'est simple, avant d'envoyer l'opérande qui est soustraite à l'additionneur on la fait passer par l'inverseur et de plus le Cin du bit 0 est mis à 1 et on effectue l'addition. Le carry bit du Status register est maintenant à 1 si le nombre soustrait est plus petit ou égal à l'autre nombre sinon il est zéro. Voilà pourquoi la logique du carry bit est inversée lors d'une soustraction par rapport à l'addition. Alors que lors d'une addition 1 dans le Carry indique un débordement, lors d'une soustraction 1 signifie qu'il n'y a pas eu d'emprunt (borrow).

Comment l'opération est sélectionnée

Maintenant comment l'opération indiqué par le code machine est-elle sélectionnée? On utilise des démultiplexeurs et des multiplexeurs. Voici un bloc diagramme avec démultiplexeurs sur les opérandes et un multiplexeur sur la sortie du résultat. Le deuxième shéma n'utilise pas de démultiplexeurs en entrée. les opérandes sont envoyées vers tous les opérateurs et on ne sélectionne que le résultat désiré. Dans le cas d'un PIC puisque W est toujours sélectionné comme une des opérandes on peut le laissé branché en permanence sur une des entrées des opérateurs. Pour l'autre opérande le seul sélecteur est le décodeur d'adresse de la RAM. C'est plus économique comme circuit.

Les signaux Sx sont les entrées de sélection, les bits du code machine qui sélectionne l'opération sont envoyés vers ces entrées. Le nombre d'entrées Sx est le logarithme base 2 du nombre de sorties. S'il y avait plus de 4 sorties il faudrait ajouté une entrée S2 et les portes ET devrait avoir 4 entrées. Il faut une entrée par bit sélecteur plus 1 pour le bit à transférer.

Dans le cas du démultiplexeur le bit d'entrée i est dirigé vers le circuit de la fonction désirée fx en fonction du code présent en S1 et S0.

Dans le cas du multiplexeur l'un des bits d'entrée ix est dirigé vers la sortie dépendant du code présent en S1 et S0.

fonctionnement d'un sélecteur

En réalité la majorité des portes logiques utilisées dans un MCU sont dans les sélecteurs (multiplexeur/démultiplexeur). Les sélecteurs sont basés sur des portes ET. Leur principe de fonctionnement est le suivant.

Si une des entrées d'une porte ET est à zéro la sortie sera bloquée à zéro quelque soit la valeur des autres entrées. Donc dans le schéma ci-haut il suffit qu'une seule des entrée de sélection soit à zéro pour que i ne puisse être transféré à la sortie. Pour la porte ET du haut la valeur inverse de S0 et S1 est utilisé pour contrôler la porte. Donc pour que i puisse contrôler la valeur de sortie de cette porte il faut que S0=0 et S1=0 de sorte que leur inverse est à 1. Pour la porte ET du bas les entrées de contrôle sont S0 et ~S1. Donc pour que i puisse contrôler la sortie il faut que S0=1 et S1=0 de sorte que les 2 entrées de contrôle sont à 1. Avec ce type d'arrangement 1 seule porte est ouverte à la fois. On peut multiplié le nombre d'entrées de contrôles et le principe demeure le même. Pour 2 entrées de contrôle la table de vérité est la suivante.

S1S0f0f1f2f3
00=i000
010=i00
1000=i0
11000=i

Le décodeur d'instruction

Si on regarde comment les instructions sont encodé dans un microcontrôleur PIC de base comme le PIC10F200. Les instructions sont encodées sur 12 bits.

Prenons le premier format appelée byte-oriented file register operations. Le code d'opération est dans les bits 6 à 11. Ça veut dire que ces 6 bits contrôlent un multiplexeur qui sélectionne l'opération. Sur les PIC l'une des opérandes est toujours dans le registre W et l'autre provient d'un file register qui lui est sélectionné par les bits 0 à 4. Le bit 5 d décide de la destination du résultat. Puisque le résultat n'a que 2 destinations possibles 1 seul bit suffit. Ce bit contrôle un démultiplexeur à 2 sorties vers W ou vers F. Le fait qu'une des opérandes est fixe simplifie le circuit puisqu'on n'a pas besoins de sélecteur pour cette opérande et de plus les instructions peuvent-être encodées sur moins de bits. Il n'y a pas de doute que les PIC nécessitent moins de portes logiques que les AtTiny. Je serais curieux de savoir combien de gates il y a dans le core des PIC de base, 3000, 4000 peut-être.

Décodeurs d'adresse mémoire

Qu'il s'agisse de la mémoire flash ou de la RAM il y a 2 bus, 1 pour l'adresse et un pour la donnée. Le bus d'adresse est branché sur le sélecteur et détermine quel cellule mémoire sera connectée au bus de données. Le nombre d'adresses mémoire à sélectionner est trop élevé pour le multiplexeur simple montrer ci-haut. La raison principale est qu'il y a une limite au nombre de porte qu'une sortie peut alimenter. Or on le voie chaque bit sélecteur doit alimenter la moitié des portes. D'autre part il y a aussi une limite au nombre d'entrées qu'une porte ET peut avoir. Pour régler ce problème les sélecteurs de mémoire sont à 2 dimensions ou plus dépendant de la taille de la mémoire. Voici de quoi a l'air un sélecteur à 2 dimensions.

Il y a 2 décodeurs. Un appelé lignes et l'autre colonnes. Les cellules mémoires sont reliées aux 2 décodeurs selon une topologie qui rappelle un plan. Pour qu'une cellule soit sélectionnée il faut que sa ligne et sa colonne le soit. Si la mémoire est trop grosse pour 2 décodeurs on ajoute un troisième décodeur qui lui sélectionne des plans superposés d'où le nom de 3 dimensions. Si on prend le PIC10F200 qui n'a que 256 mots flash, le décodeur doit avoir seulement 2 dimensions avec 4 bits par décodeur. Les bits 0-3 du compteur ordinal vont sur le décodeur de lignes et les bits 4-7 sur le décodeur de colonnes ou vice-versa peut importe.

Conclusion

En conclusion peut importe le nombre de bits du processeur il s'agit simplement de répéter ces circuits le nombre de fois qu'il y a de bits 8, 16, 32, 64 . Si cette introduction vous a plus et que vous avez envie d'en savoir plus il y a cours gratuit sur internet (en anglais) qui s'appelle from NAND to TETRIS

. Ce cours commence avec les portes simples et progresse vers les circuits plus complexe jusqu'au processeur complet et s'accompagne d'un logiciel qui permet de définir les circuits logiques et de les tester dans un simulateur. Très bien fait, c'est une formation 5 étoiles gratuite.

Aucun commentaire:

Enregistrer un commentaire