TME4 -- Modélisation et Simulation vhdl
Contents
Objectifs
- Un premier objectif est de décrire (en vhdl) et simuler un petit circuit dont le schéma est fourni.
- Dans un second temps, vous allez décrire et simuler deux blocks : l’ALU et le décaleur qui seront utilisés dans le processeur que vous allez réaliser.
Pour simuler vos circuits, vous allez utiliser l’outil ghdl et le visualiseur de chronogrames gtkwave. Ces deux outils sont sous licence gpl et peuvent donc etre utilisés librement par vous.
Exercices
Exercice 1 -- Additionneur 4 bits
Nous vous demandons de décrire en vhdl un petit circuit réalisant l’addition de ses deux entrées chacune codée sur 4 bits. le résultat produit sera egalement codésur 4 bits.
Question 1
Écrivez le fichier .|VHDL| correspondant a ce circuit en partant des informations fournies en cours. Cette description doit etre de type zéro-délai (pas de clause After).
Vous allez pouvoir vérifier la syntaxe et analyser votre fichier grâce a la commande suivante :
etudiant@pc:~> ghdl -a -v adder.vhdl
Si l’analyse de votre circuit a réussi vous devez avoir obtenu un fichier adder.o correspondant au résultat de la compilation.
Question 2
Une fois la description comportementale compilée avec succès (sans aucune erreur), pour valider votre description vous devez écrire un autre fichier vhdl pour tester votre circuit. Dans ce fichier que l’on appelle courament test bench, vous allez d’une part instancier votre votre circuit a tester et d’autre part écrire un process dont le rôle va être de fournir des valeurs pour les entrées du circuit a tester et eventuellement vérifier la valeur des sorties.
Compilez votre fichier test bench comme vous l’avez déjà fait avec votre circuit adder.vhdl puis réalisez l’élaboration de votre projet.
Commencez par quelques test simples de votre circuit :
etudiant@pc:~> ghdl -a -v adder_tb.vhdl etudiant@pc:~> ghdl -e -v adder_tb
Simulez votre circuit :
etudiant@pc:~> ghdl -r adder_tb --vcd=adder.vcd
Visualisez avec gtkwave le résultat de votre simulation.
Question 3
Modifiez votre fichier test bench pour effectuer un test exhaustif de votre circuit, rendez-le auto-testant (ne plus visualiser les résultats avec gtkwave).
Exercice 2 -- alu pour l’arm
Comme vous allez le voir dans les semaines à venir on peut simplifier cette alu en restreignant ses fonctionnalités à 4 opérations de base : add avec retenue, and, or et xor.
Cette alu recoit ses deux opérandes codés sur 32 bits et fournit un résultat sur 32 bits. Elle recoit également en entrée une retenue (cin) et fournit en sortie les 4 flags : Z, N, V et Cout. Cette alu est exclusivement combinatoire, voici son interface :
entity Alu is port ( op1 : in Std_Logic_Vector(31 downto 0); op2 : in Std_Logic_Vector(31 downto 0); cin : in Std_Logic; cmd : in Std_Logic_Vector(1 downto 0); res : out Std_Logic_Vector(31 downto 0); cout : out Std_Logic; z : out Std_Logic; n : out Std_Logic; v : out Std_Logic; vdd : in bit; vss : in bit ); end Alu;
Les entrées cmd permettent de spécifier l’opération à effectuer, une seule d’entre elles doit être égale a 1, les autres doivent être egales à 0.
Question 1
Écrivez le modèle .vhdl de l’alu.
Question 2
Écrivez un test bench permettant de tester cette alu. Voux pourrez utiliser un générateur pseudo-aléatoire pour générer des valeurs quelconques sur 32 bits.
Exercice 3 -- Shifter pour l’arm
Pour notre processeur arm nous allons avoir besoin d’un composant dédié à la réalisation des décalages et rotations. Ce Shifter est exclusivement combinatoire, voici son interface :
entity Shifter is port( shift_lsl : in Std_Logic; shift_lsr : in Std_Logic; shift_asr : in Std_Logic; shift_ror : in Std_Logic; shift_rrx : in Std_Logic; shift_val : in Std_Logic_Vector(4 downto 0); din : in Std_Logic_Vector(31 downto 0); cin : in Std_Logic; dout : out Std_Logic_Vector(31 downto 0); cout : out Std_Logic; -- global interface vdd : in bit; vss : in bit ); end Shifter;
Question 1
Écrivez son modèle en .vhdl et le test bench permettant de le tester.