Filière ELT 2 ème année TP2 Synthèse d'un Générateur Basse Fréquence GBF Le but final de ce TP est de réaliser un générateur basse-fréquence (GBF). Il doit être capable de produire un signal sinusoïdal, un signal carré, et un signal dent de scie. Le choix de la forme d onde se fait par deux interrupteurs. La Figure 1 schématise le circuit général à synthétiser. Figure 1- Schéma global du circuit à réaliser Travail 1 Dans un premier temps nous allons mettre en évidence l utilisation du CNA. Le circuit du convertisseur numérique analogique passif et disponible en TP est donné sur la Figure 2. Figure 2- Le circuit du CNA passif disponible en TP 1
- Connecter la carte CNA aux broches d'extension de la carte FPGA (connecteur d'expansion JD1). - Créer un nouveau projet que vous appellerez gbf. - Créer un nouveau module VHDL avec les entrées/sorties SW et CNA. - Ecrire l'architecture de ce circuit qui ne contiendra qu'une seule instruction d'affectation pour connecter les 8 interrupteurs de la carte nexys3 aux 8 sorties CNA. - Ajouter les contraintes concernant les broches. - Après avoir configuré le FPGA, visualiser sur l oscilloscope la tension analogique de la sortie du CNA. En agissant sur les 8 interrupteurs de la carte nexys3, observer la tension analogique obtenue. - Tracer une courbe qui relie la tension analogique lue sur oscilloscope et la valeur numérique en décimal représentée par les interrupteurs. Travail 2 : Ecrire le programme principal Nous allons créer dans un premier temps un signal de référence qui fixera le rythme. C'est un signal périodique dont la période est contrôlée par deux des interrupteurs de la carte nexys3. Le tableau cicontre résume la fréquence d'échantillonnage que l'on doit obtenir en fonction des états des switch. La forme de ce signal de référence que l'on appelle "clk_en" doit ressembler à un signal de triger comme présente la Figure 3. Figure 3- Le signal clk_en - Garder le projet précédent, on modifiera le programme gbf.vhd. - Changer dans l'entité le port d'entrée SW en FREQ. Ceci donnera le circuit schématisé sur la Figure 4. Figure 4- Process qui génère le signal clk_en - Ecrire un process pour réaliser un circuit qui produit le signal clk_en à partir de MCLK et FREQ. Le listing de ce process est le suivant: 2
process(mclk) begin if MCLK event and MCLK= 1 then clk_en <= 0 ; cmp <= cmp + 1; if cmp = compt_max then clk_en <= 1 ; cmp <= 0; end if; end if; end process; cmpt_max est un signal de type entier qui dépend de l'état des switch. Nous devons déclarer ce signal dans la partie déclarative de l'architecture. Un circuit combinatoire relie les états des switch (le signal FREQ) au compt_max. - Tracer un chronogramme qui illustre le signal MCLK, cmp et clk_en quand compt_max=3 et un autre quand compt_max=7. Pour le moment on ne teste pas le fonctionnement de votre programme. Nous allons y ajouter 3 components pour générer les 3 types de signaux (carré, dent de scie et sinusoïdal). Dans un premier temps, nous allons réaliser la partie concernant le générateur du signal carré dans un fichier séparé et nous allons l ajouter comme un component à ce programme principale "gbf.vhd". Travail 3 : Générateur du signal carré Le schéma bloc du circuit à réaliser est le suivant : Figure 5- Schéma fonctionnel du circuit Le circuit «sig_carre» est un sous-programme qui réalise un générateur du signal carré, à écrire dans un fichier séparé. L entité de ce circuit est la suivante (nom du fichier doit être identique au nom de l entité : sig_carre.vhd) : 3
entity sig_carre is Port( MCLK : in std_logic ; CLK_EN : in std_logic ; SIG_OUT : out std_logic_vector(7 downto 0)) ; End sig_carre; Figure 6- le bloc sig_carre - Ecrire l architecture de cette entité pour envoyer la valeur «11111111» en sortie SIG_OUT (qui correspond à la tension analogique la plus importante en sortie du CNA) pendant 128 coups de CLK_EN. Ensuite, envoyez «00000000» en sortie pendant 128 coups de CLK_EN ; et ainsi de suite. Cette entité constituera le component à utiliser dans le circuit principal. Remarque important : Dans tous les process synchrones que vous faites, synchronisez les process sur le front montant de l horloge principal (MCLK à 100 MHz). Pour obtenir des fréquences différant de l'horloge principale, utiliser plutôt des signaux «enable» avec une synchronisation sur l horloge principale : Process(CLK) Begin If CLK event and CLK= 1 then If CLK_EN= 1 then Série d instructions End if ; End if ; End process ; Il faudra que maintenant le circuit principale fasse appelle à ce bloc. Deux étapes à réaliser: 1- déclaration de component, 2- instanciation. Pour la déclaration on ajoute les lignes suivantes dans la partie déclarative de l'architecture de gbf. component sig_carre Port( MCLK : in std_logic ; CLK_EN : in std_logic ; SIG_OUT : out std_logic_vector(7 downto 0)) ; end component; 4
Pour câbler ce bloc dans le module gbf, on l'instancie dans l'architecture de gbf : Gene:sig_carre: sig_carre Port map( MCLK => MCLK, CLK_EN => clk_en, SIG_OUT => carre_out) ; - Connecter le signal carre_out au port CNA: CNA <= carre_out; - synthétiser gbf et vérifier la sortie analogique du CNA sur l oscilloscope. Est-ce que la fréquence change en jouant sur les interrupteurs? Est-ce que les valeurs des fréquences sont correctes? Travail 4 : Générateur dent de scie Maintenant nous allons y ajouter le générateur de dent de scie. Ce circuit est schématisé cidessous. X"01" 8 8 1 EN 8 D CLK Figure 7- Schéma fonctionnel du circuit, à gauche schéma comportemental, à droite schéma RTL Ajouter un nouveau module VHDL à votre projet (dent_scie.vhd) où vous écrivez un programme VHDL pour créer un générateur de signal dent de scie. L entité est la suivante : entity DENT_SCIE is Port ( CLK : in std_logic ; CLK_EN : in std_logic ; SIG_OUT : out std_logic_vector(7 downto 0)) ; end DENT_SCIE; Modifiez le circuit principal pour que l'on puisse sélectionner la forme d'onde (carré ou dent de scie) en utilisant l interrupteur 7 (SW7) de la carte. 5
Travail 5 : Générateur du signal sinusoïdal Le diagramme de flux d un oscillateur sinusoïdal est le suivant : Figure 8- Diagramme de flux d'un oscillateur numérique Un programme VHDL réalisant ce diagramme de flux peut être téléchargé de la page web du TP (dans la partie "Resources". Sauvegarder ce fichier dans le répertoire courant puis l ajouter à votre projet. Retourner à votre entité «gbf» pour déclarer ce nouveau component. Modifier le programme «gbf.vhd» en considérant le diagramme global de la page 1. Attention: Un nouveau signal est à ajouter dans l'entité "gbf" en tant qu'une entrée binaire (std_logic), c'est un signal RESET qui sera relié à un des boutons poussoirs de la carte (BTND par exemple). Travail 6 : Ajout d'un quatrième signal Nous allons utiliser la mémoire embarquée de FPGA pour produire un quatrième signal. Utilisant le "corgen", ajoutez à votre projet une mémoire de type ROM de taille 256 octets. Initialisez cette mémoire par 256 échantillons. Ces échantillons ont été déjà rangés dans un fichier qui peut être récupéré à partir de la page web de TP. Faites un programme VHDL qui instancie ce component (la ROM) et lui fournit une adresse allant de 0 à 255 de manière circulaire. Le circuit récupère la data de la ROM et la sauvegarde dans un registre et c est la sortie de ce registre qui constitue la sortie finale du bloc. Figure 9- Utilisation d'un LUT (Look Up Table) 6
Intégrer ce circuit comme un quatrième component à votre programme principal précédent. Maintenant il faudra que votre GBF crée 4 types de signal que l'on peut sélectionner utilisant deux des interrupteurs de la carte Nexys3. Conclusion Vous devez savoir réaliser des blocs hiérarchiques, de les déclarer dans un programme principal, et de les appeler (instancier). Dans ce TP, nous avons réalisé un système numérique avec une fréquence d'échantillonnage inférieure à la fréquence d'horloge de la carte. Vous avez appris d'utiliser un signal "enable" dans des process synchrone pour faire exécuter un process à une fréquence différant de la fréquence d'horloge principale. Ce signal "enable" a été réalisé moyennant un process synchrone et un compteur. N'oublions pas que la durée "haute" de ce signal est une seule période d'horloge. Vous avez appris aussi comment en utilisant une LUT, on peut générer un signal périodique quelconque. Exercice Sachant que nous avions un CAN sur 8 bits, comment la LUT a été remplie? En effet on a calculé un vecteur de taille 256 (taille de la mémoire) contenant des valeurs de sinus (avec le programme Matlab ci-dessous): t=(0:255)/pi*2; Sinx = sin(t); Ceci donne dans le tableau "Sinx" les valeurs de sinus en réel: - 1 1. Sachant que la tension minimale en sortie du CNA est 0 et obtenue par "00000000" et que la tension maximale est le Vcc (3.3 V) et obtenu par "11111111", avec quelle formule vous calculez les valeurs entières du sinus allant de 0 à 255 à mettre dans la mémoire? 7