Nous allons poursuivre le développement de notre mini calculatrice en mettant en œuvre ce que l'on vient d'apprendre sur les process.
Pour l'instant le TP2 proposait 4 opérations différentes suivant les boutons appuyés: btn0 et btn1
Voici les trois nouvelles opérations qu'il faut mettre en place:
Comparateur affiche sur le premier afficheur 7 segments 1 si les 4 switches de poids faibles sont bit à bit égaux aux 4 switches de poids forts et 0 sinon.
Vous utiliserez un when else d'abord. Faites ensuite une version avec un Process! comparez les deux schematic.
Parité affiche 0 si le nombre de bit à '1' et pair et '1' si impair. Des xor entre les 8 bits réalisent cette fonction.
Vous utiliserez un FOR, une variable et XOR pour réaliser ce circuit ( et donc un process). Vous pouvez utiliser 'range ou 'reverserange dans votre boucle.
Count1 affiche le nombre de bits à 1 sur les 8 switches.
Il suffit d'étendre le code proposé pour la leçon 3. Pour convertir un integer en std_logic_vector il suffit d'utiliser la bonne fonction de conversion :
SOME_VECTOR <= conv_std_logic_vector(SOME_INTEGER, 4); et d'ajouter la bibliothèque qui la contient use ieee.std_logic_arith.all;
Ceux qui ont le temps n’hésitez pas à rechercher ensuite d'autres façons de les écrire en VHDL. Il y a plein de références sur le net!
Avant de commencer votre développement, je vous propose d'ouvrir le TP2, Après avoir sélectionné le projet TP2 dans la hiérarchie, sur le menu File>Project >Save as et nommez le nouveau projet TP3. Vous pouvez ensuite travailler sur TP3 , et ce sans altérer votre ancien TP2, VIVADO devrait ouvrir ce nouveau projet dès la copie.
Voici la procédure que je vous conseille de suivre pour chacune des trois extensions :
Créez des nouvelles design sources VHDL dans votre projet, il faut les nommer (par exemple comp, parity et count1) mais aussi identifier les ports d'entrées et de sorties pour chacun.
Il est inutile de prendre en entrée les boutons pour le calcul . c'est plus simple de faire travailler ces trois process ou architectures en parallèle avec l'add4 et de sélectionner ensuite le résultat que vous voulez afficher en fonction des valeurs des boutons. Ce n'est pas du code ici mais des circuits, ils sont de toutes façons toujours actifs sur le FPGA!!! Il faut mieux des petits circuits dédiés aux calculs en parallèles avec un multiplexeur derrière qui se charge de sélectionner le résultat voulu en fonction des boutons actifs....
Pour chaque architecture: placez un process qui effectue le travail souhaité. Regardez, une fois la syntaxe correcte ce que donne VIVADO coté circuit avec un RTL Analysis>Open Elaborated Design> Schematic.
Simulez un à un les trois composants sur quelques jeux de données avec un force constant avec la simulation comportementale.
Pour les curieux , un script qui génère un fichier vhdl dédié à la simulation: Doulos . Voici un exemple de test bench pour calc , vous pouvez faire la même chose composant par composant .
BEGIN
switches <= x"23" after 10ns, x"78" after 20 ns, x"88" after 30 ns;
-- Instantiate the Unit Under Test (UUT)
uut: calc PORT MAP (
switches => switches,
led => led,
sevenseg => sevenseg,
anodes => anodes
);
.......
Instanciez un à un les composants dans votre calculatrice. Il faudra ajouter dans votre entity de calc les 3 autres boutons en entrée, idem dans le fichier .xdc en dé-commentant les bonnes lignes.
Générez les signaux de sortie en fonction des boutons et des valeurs produites par tous ces composants.
Testez sur la carte puis faire valider par votre enseignant.
Comme vous l'avez vu en générant le Schematic de count1, VIVADO génère 7 additionneurs en série avec 7 multiplexeurs. Un peu long à traverser!!! Trouvez une autre programmation plus efficace qui génère un arbre d'additionneur! Pour additionner 2 std_logic_vector il vous faudra utiliser la librairie use IEEE.std_logic_unsigned.all; Voici les deux circuits que j'ai pu observer moi-même.... Identifiez les différences en nombre de Cells et Nets.( visible aussi dans la fenêtre schematic en haut)
Avec un FOR
Algorithme dichotomique
Est-il vraiment nécessaire d'utiliser des additionneurs 4 bits??? Proposez une autre implémentation de count1 avec des add1.vhd ( 3 entrées 2 sorties) et quelques portes logiques . On peut aussi définir un add2bit.vhd. Comparez l'utilisation des ressources par VIVADO en nombre de cell après synthèse..
D'abord modifiez vos codes pour implémenter les trois dernières fonctions sur 16 bits.
Comparateur de 2 mots de 8 bits
Parity sur 16 bits
Count1 sur 16 bits
Voici un truc à lire qui peut faciliter la généricité des composants vhdl . Vous pouvez essayer à partir de ces exemples : GENERIC
Je vous propose de changer l'affichage sur le 7 segments pour les résultats des 2 opérateurs parity et comp.
Pour Parity, je voudrais voir afficher P ou I sur l'afficheur. ( I sera aligné sur les segments de gauche) (Pair ou Impair)
Pour Comp, je voudrais voir afficher F et t sur l’afficheur. ( False ou true)
Pour toute combinaison invalide des boutons, affichez tous les segments en même temps (Ø).
Il faut sans doute modifier le code de l'afficheur en prenant en compte quatre modes de fonctionnement avec donc quatre décodages différents. Un port sur 2 bits doit être ajouté en entrée afin de coder ce mode.
Le mode de fonctionnement dépend directement des boutons pressés. Il faudrait câbler les 4 décodeurs et ne garder que le bon codage à envoyer vers l'afficheur avec un process puis une seconde version avec un with select. Mais il y a bien d'autres façons de faire qui sont acceptables....
Faites valider avant de partir !