Dans ce TP, vous allez utiliser circuitverse pour construire des circuits logiques hiérarchiques manipulant des entiers non signés, par assemblage de portes logiques élémentaires. Vous vérifierez par simulation que les fonctionnalités des circuits correspondent effectivement à vos spécifications.
Un circuit combinatoire permet de produire une ou plusieurs valeurs binaires à partir de signaux en entrée. Lorsque l’on donne un sens à ce codage binaire, le circuit électronique produit sans le savoir une information qui peut être bien plus complexe qu’un ‘0’ ou un ‘1’. L’assemblage de plusieurs signaux permet de représenter un ensemble de valeurs dont la cardinalité croit de manière exponentielle en fonction du nombre de signaux. Avec 4 signaux en sorties, vous pouvez représenter 16 éléments d’un ensemble. Un des ensembles les plus intuitifs reste un sous-ensemble des nombres entiers non signés. Sur 4 bits vous pouvez représenter 0 1 2 3 … E F. Le même assemblage de signaux aurait pu aussi représenter un ensemble de pays de la CE : France, Belgique, …. Pologne. J’insiste sur le fait que c’est vous qui allez donner un sens aux résultats produits par votre circuit, par exemple en lisant les sorties de votre carte avec une certaine interprétation de leur signification.
Portes logiques, algèbre de Boole
Vous allez concevoir un système capable de faire la somme de deux nombres entiers codés sur 4 bits. L’addition est bien évidemment réalisée en binaire, mais elle ressemble beaucoup à l’addition décimale que vous posiez sur votre ardoise à l’école primaire. Vous aligniez les deux nombres de votre addition et commenciez par la gauche en ajoutant les deux chiffres des unités. Cette addition produit potentiellement une retenue qu’il faut prendre en compte pour la somme des dizaines etc… En binaire, on doit donc être capable de faire la somme de deux signaux binaires, mais aussi de trois signaux binaires afin de prendre en compte la retenue qui peut être produite par le calcul précèdent. C’est ce que vous allez construire pas à pas. Chaque étape sera simulée sur circuitverse.
Un demi-additionneur (on comprendra le sens du nom par la suite) réalise l’addition de deux bits a et b et produit la somme s et une retenue c. Voici les tables de vérité de s et c.
Créez un nouveau projet TP3 et nommez votre circuit principal toplevel . Il sera disponible comme racine de votre design, on y reviendra plus tard. La première étape consiste à créer un nouveau circuit demiadd. Ajoutez au projet ce circuit . Dans la fenêtre correspondante, vous pouvez saisir le circuit demi-additionneur avec les portes logiques nécessaires, les fils et les ports : a, b en entrée et s, c en sortie. Une fois les 4 cas testés et le circuit sauvegardé, vous pouvez utiliser ce circuit.
Passons à l’étape suivante, il faut comme on l'a dit précédemment pouvoir ajouter deux bits en prenant en compte la retenue du tour précèdent. Il s’agit donc de faire la somme de trois bits pour produire un résultat. La somme de 3 bits produit un résultat compris entre b00 et b11. Le bit à droite (le poids faible) est le résultat nommé s, le bit à gauche (le poids fort) est la retenue nommé cout (carry out), celle-ci servira pour l’addition suivante. Deux méthodes existent, soit vous produisez la table de vérité des deux sorties s et cout en fonction de 3 entrées a, b et cin ; soit vous utilisez successivement deux demi-additionneurs. Bien sûr c’est la seconde qui vous choisirez ici, elle permet de réutiliser le composant déjà créé demiadd. Un premier demiadd additionne a et b, le second ajoute le résultat produit par le premier à une entrée cin qui lui proviendra de la retenue du tour précèdent. Un et un seul des deux demiadd peut produire une retenue, il suffira de faire un OU sur les deux retenues produites pour générer la retenue finale en sortie cout. Allez-y, créez un nouveau circuit add1bit dans votre projet. Placez-y deux instances du même circuit demiadd, les fils en entrée et sortie, puis nommer les ports...
Ces deux circuits seront placés sur moodle.
Pour additionner deux mots de 4 bits a3a2a1a0 et b3b2b1b0, il vous faut donc un demiadd pour les 2 premiers bits a0 et b0, ensuite 3 add1bit pour les autres bits. On construit ainsi une cascade de composants add1bit autant que nécessaire. Je vous propose de créer un autre circuit add4bit. Vous y instanciez un demiadd et 3 add1bit les uns sous les autres. Ensuite créez deux input a(3:0) et b(3:0) à gauche des composants et une sortie s(3:0) à droite , pour cela il faudra modifier les properties de chaque port avec un Bitwidth de 4 (largeur en nombre de fils).
Circuitverse propose dans MISC le Splitter: il permet de séparer les 4 fils d'un bus en 4 fois un fil (cf la figure suivante). Placez en un pour chaque entrée a et b avec comme argument 4 puis 1 1 1 1 , vous avez toujours la possibilité de changer l'orientation du dessin.. Connectez les 2 ports a et b en entrée des 2 splitters et chaque sortie de 1 bit des splitters sur une entrée a ou b d'un adder. A vous de connecter les bons fils aux bons adder....
Pour les 4 fils de sortie s, il faut aussi un splitter pour regrouper les sorties des adder sur un bus qui sera relié à un port de sortie s qui lui aussi aura été modifié pour supporter 4 comme bitwidth. Chaque fil s produit par un adder doit être relié au bon fils de votre splitter de sortie. Il faut faire attention de respecter les indices des fils pour replacer les bits à leur place dans le mot de 4 bits résultat final de votre addition! (cf la figure derrière)
NOUVELLE VERSION de CIRCUITVERSE
Testez votre circuit sur plusieurs valeurs , vérifiez la production de la retenue pour certaines valeurs qui donnent un résultat supérieur à F. Une fois valide chargez la copie du circuit sur Moodle...
Vous allez placer une instance de add4bit dans toplevel. Placez y 2 ports de largeur 4 a et b.
Reliez ces ports avec les entrées de add4bit. enfin pour la sortie utilisez un afficheur hexa que vous trouverez dans les output .. Pour la retenu utilisez une led elle aussi disponible dans les output.
Testez validez et enregistrez le circuit final sur moodle.