SEm/laboratoires/01 generateur

From FSI
(Difference between revisions)
Jump to: navigation, search
(Introduction)
 
(8 intermediate revisions by 2 users not shown)
Line 5: Line 5:
 
== Introduction ==
 
== Introduction ==
 
Dans ce laboratoire, nous allons illustrer l'écriture du code VHDL de blocs combinatoires et de blocs séquenciels synchrones par la réalisation d'un générateur de fonctions numérique.
 
Dans ce laboratoire, nous allons illustrer l'écriture du code VHDL de blocs combinatoires et de blocs séquenciels synchrones par la réalisation d'un générateur de fonctions numérique.
 
[[Image:SEm_WaveformGen.png|center|Générateur de fonctions]]
 
  
 
Le générateur délivre
 
Le générateur délivre
Line 14: Line 12:
 
* un signal sinusoïdal, '''sine'''.
 
* un signal sinusoïdal, '''sine'''.
  
Tous ces signaux sont codés en tant que nombres non-signés de 16 bits.
+
Tous ces signaux sont codés en tant que nombres de 16 bits.
 
Le circuit se trouve dans la librairie '''WaveformGenerator''', le banc de test dans la librairie '''WaveformGenerator_test'''.
 
Le circuit se trouve dans la librairie '''WaveformGenerator''', le banc de test dans la librairie '''WaveformGenerator_test'''.
 +
Le programme de dessin de circuit est lancé à l'aide du fichier de commande '''sineGen.bat'''.
 +
 +
[[Image:SEm_WaveformGen.png|center|Générateur de fonctions]]
  
 
== Générateur de signal en dents de scie ==
 
== Générateur de signal en dents de scie ==
Le générateur de signal en dents de scie se fait à l'aide d'un compteur qui tourne en rond. Un nombre en entrée, '''step''', permet de commander la fréquence du signal en dents de scie. A chaque flanc montant de l'horloge, lorsque '''en = '1'''', le compteur ajoute la valeur de '''step''' à sa valeur courante. Ainsi, plus la valeur de '''step''' est grande et plus le compteur tourne rapidement.
 
  
 
[[Image:SEm_SawtoothGen.png|thumb|Générateur de signal en dents de scie]]
 
[[Image:SEm_SawtoothGen.png|thumb|Générateur de signal en dents de scie]]
 +
 +
Le générateur de signal en dents de scie se fait à l'aide d'un compteur qui tourne en rond. Un nombre en entrée, '''step''', permet de commander la fréquence du signal en dents de scie. A chaque flanc montant de l'horloge, lorsque '''en = '1''', le compteur ajoute la valeur de '''step''' à sa valeur courante. Ainsi, plus la valeur de '''step''' est grande et plus le compteur tourne rapidement.
  
 
=== Code VHDL ===
 
=== Code VHDL ===
Ecrire l'architecture VHDL du générateur de signal en dents de scie.
+
 
 +
{{TaskBox|content=
 +
Ecrire l'architecture VHDL du générateur de signal en dents de scie.}}
 +
 
 
Ce circuit est un circuit séquentiel synchrone.
 
Ce circuit est un circuit séquentiel synchrone.
Examiner l'entité du générateur de signal en dents de scie pour connaître les types des signaux d'entrée/sortie. Parcourir la définition du paquetage '''numeric_std''' pour se faire une idée des fonctions à disposition sur les signaux de type '''unsigned'''.
+
 
Ce bloc contient un paramètre générique (generic)<nowiki>: </nowiki>'''bitNb'''. Ce paramètre est défini aussi bien pour l'entité que pour l'architecture à écrire.
+
{{TaskBox|content=
''Attention''<nowiki>: le signal de sortie, </nowiki>'''sawtooth''', peut uniquement être assigné. Il ne peut être lu pour lui additionner la valeur de '''step'''. Il faut donc définir un signal interne, lequel peut être lu et assigné, et copier ce signal sur le port de sortie.
+
Examiner l'entité du générateur de signal en dents de scie pour connaître les types des signaux d'entrée/sortie. Parcourir la définition du paquetage '''numeric_std''' pour se faire une idée des fonctions à disposition sur les signaux de type '''unsigned'''.}}
 +
 
 +
Ce bloc contient un paramètre générique (generic): '''bitNb'''. Ce paramètre est défini aussi bien pour l'entité que pour l'architecture à écrire.
 +
 
 +
{{WarningBox|content=le signal de sortie, '''sawtooth''', peut uniquement être assigné. Il ne peut être lu pour lui additionner la valeur de '''step'''. Il faut donc définir un signal interne, lequel peut être lu et assigné, et copier ce signal sur le port de sortie.}}
  
 
=== Simulation ===
 
=== Simulation ===
Estimer la période du signal en dents de scie pour un signal d'horloge de 66 MHz, un compteur de 16 bits et une valeur de '''step''' égale à 8.
+
 
Donner la formule générale de la fréquence du signal généré en fonction de la fréquence de l'horloge, du nombre de bits du compteur et de la valeur du pas.
+
{{TaskBox|content=
Compiler et simuler le bloc '''waveformGen_tb'''. Vérifier le bon fonctionnement du générateur de signal en dents de scie.
+
Estimer la période du signal en dents de scie pour un signal d'horloge de 66 MHz, un compteur de 16 bits et une valeur de '''step''' égale à 8.}}
 +
 
 +
{{TaskBox|content=
 +
Donner la formule générale de la fréquence du signal généré en fonction de la fréquence de l'horloge, du nombre de bits du compteur et de la valeur du pas.}}
 +
 
 +
{{TaskBox|content=
 +
Compiler et simuler le bloc '''waveformGen_tb'''. Vérifier le bon fonctionnement du générateur de signal en dents de scie.}}
  
 
== Transformation de dents de scie à carré ==
 
== Transformation de dents de scie à carré ==
La transformation du signal en dents de scie en un signal carré se fait en ne considérant que le bit de poids fort du signal en dents de scie. Cependant, le signal généré sera aussi codé sur 16 bits.
 
  
 
[[Image:SEm_SawtoothToSquare.png|thumb|Transformation de dents de scie à carré]]
 
[[Image:SEm_SawtoothToSquare.png|thumb|Transformation de dents de scie à carré]]
 +
 +
La transformation du signal en dents de scie en un signal carré se fait en ne considérant que le bit de poids fort du signal en dents de scie. Cependant, le signal généré sera aussi codé sur 16 bits.
  
 
=== Code VHDL ===
 
=== Code VHDL ===
Ecrire l'architecture VHDL du bloc de transformation du signal en dents de scie en un signal carré.
+
 
Ce circuit est un circuit combinatoire.
+
{{TaskBox|content=
Le signal de sortie est un nombre non-signé codé sur 16 bits. Déterminer la valeur binaire du nombre entier le plus petit, qui correspondra à la valeur inférieure du signal carré. Déterminer aussi la représentation binaire de la valeur supérieure du signal carré.
+
Déterminer la valeur binaire du nombre entier le plus petit, qui correspondra à la valeur inférieure du signal carré.
 +
Déterminer aussi la représentation binaire de la valeur supérieure du signal carré.
 +
}}
 +
 
 +
{{TaskBox|content=
 +
Ecrire l'architecture VHDL du bloc de transformation du signal en dents de scie en un signal carré.}}
 +
 
 +
Ce circuit est un circuit combinatoire. Le signal de sortie est un nombre non-signé codé sur 16 bits.  
  
 
=== Simulation ===
 
=== Simulation ===
Recompiler et simuler le bloc '''waveformGen_tb'''. Vérifier la forme du signal carré.
+
 
 +
{{TaskBox|content=
 +
Recompiler et simuler le bloc '''waveformGen_tb'''. Vérifier la forme du signal carré.}}
  
 
== Transformation de dents de scie à triangle ==
 
== Transformation de dents de scie à triangle ==
La transformation du signal en dents de scie en un signal triangulaire se fait en "repliant la dent de scie vers le bas" lorsque le bit de poids fort du signal en dents de scie vaut '1'.
 
  
 
[[Image:SEm_SawtoothToTriangle.png|thumb|Transformation de dents de scie à triangle]]
 
[[Image:SEm_SawtoothToTriangle.png|thumb|Transformation de dents de scie à triangle]]
 +
 +
La transformation du signal en dents de scie en un signal triangulaire se fait en "repliant la dent de scie vers le bas" lorsque le bit de poids fort du signal en dents de scie vaut '1'.
  
 
=== Code VHDL ===
 
=== Code VHDL ===
Ecrire l'architecture VHDL du bloc de transformation du signal en dents de scie en un signal triangulaire.
+
 
 +
{{TaskBox|content=
 +
Ecrire l'architecture VHDL du bloc de transformation du signal en dents de scie en un signal triangulaire.}}
 +
 
 
Ce circuit est un circuit combinatoire.
 
Ce circuit est un circuit combinatoire.
 
Lorsque le bit de poids fort du signal en dents de scie vaut '1', inverser tous les bits du signal en dent de scie.
 
Lorsque le bit de poids fort du signal en dents de scie vaut '1', inverser tous les bits du signal en dent de scie.
Line 60: Line 89:
  
 
=== Simulation ===
 
=== Simulation ===
Recompiler et simuler le bloc '''waveformGen_tb'''. Vérifier la forme du signal triangulaire.
+
 
 +
{{TaskBox|content=
 +
Recompiler et simuler le bloc '''waveformGen_tb'''. Vérifier la forme du signal triangulaire.}}
  
 
== Transformation triangle à sinus ==
 
== Transformation triangle à sinus ==
La transformation de triangle à sinus peut se faire par une table de vérité (ROM) qui contient toutes ces valeurs. Cette solution, même si elle est la plus précise, est très coûteuse en matériel.
 
 
Dans ce laboratoire, nous prendrons le parti de filtrer le signal triangulaire pour ne conserver que sa fondamentale: une sinus. Pour simplifier la tâche de filtrage, nous allons transformer le signal triangulaire en un signal polygonal de forme plus proche du sinus désiré.
 
  
 
[[Image:SEm_TriangleToSine.png|thumb|Transformation de triangle à sinus]]
 
[[Image:SEm_TriangleToSine.png|thumb|Transformation de triangle à sinus]]
 +
 +
La transformation de triangle à sinus peut se faire par une table de vérité (ROM) qui contient toutes ces valeurs. Cette solution, même si elle est la plus précise, est très coûteuse en matériel.
 +
 +
Dans ce laboratoire, nous prendrons le parti de filtrer le signal triangulaire pour ne conserver que sa fondamentale: une sinus. Pour simplifier la tâche de filtrage, nous allons transformer le signal triangulaire en un signal polygonal de forme plus proche du sinus désiré.
  
 
=== Code VHDL ===
 
=== Code VHDL ===
  
 +
{{TaskBox|content=
 
Ecrire l'architecture VHDL du bloc de transformation du signal triangulaire en un signal polygonal ainsi que celle du filtre passe-bas de premier ordre.
 
Ecrire l'architecture VHDL du bloc de transformation du signal triangulaire en un signal polygonal ainsi que celle du filtre passe-bas de premier ordre.
 +
}}
 +
 +
La transformation de triangle à ploygone se commence en multipliant le triangle par 1.5.
 +
Après cela, il faut remplaçer toutes les valeurs plus petites que 1/8 de la gamme du triangle obtenu par cette valeur de 1/8:
 +
on coupe ce qui est en-dessous.
 +
De même, on coupe aussi ce qui dépasse les 5/8.
 +
Finalement, on peut décaler le signal de 1/8 vers le bas.
 +
 +
{{WarningBox|content=
 +
Les valeurs 1/8 et 5/8 sont relatives à la pleine échelle (Full Scale, FS) possible du signal et non à l'amplitude maximale du triangle.
 +
}}
  
La transformation de triangle à ploygone se commence en multipliant le triangle par 1.5. Après cela, il faut remplaçer toutes les valeurs plus petites que 1/8 du triangle obtenu par cette valeur de 1/8: on coupe ce qui est en-dessous. De même, on coupe aussi ce qui dépasse les 5/8. Finalement, on peut décaler le signal de 1/8 vers le bas. Les valeurs 1/8 et 5/8 sont relatives à la pleine échelle (Full Scale, FS) possible du signal et non à l'amplitude maximale du triangle.
+
La multiplication par 1.5 se fait par un décalage et une addition.
 +
Le résultat de la multiplication nécessite un bit de plus que le signal de départ.
 +
Après le décalage vers le bas, on peut ignorer le bit de poids fort et revenir au même nombre de bits qu'à l'entrée.
  
La multiplication par 1.5 se fait par un décalage et une addition. Le résultat de la multiplication nécessite un bit de plus que le signal de départ. Après le décalage vers le bas, on peut ignorer le bit de poids fort et revenir au même nombre de bits qu'à l'entrée.
+
Le filtrage passe-bas se fait à l'aide d'un intégrateur réalisé par un accumulateur.
 +
A chaque période d'horloge, on additionne la valeur de l'entrée au contenu de l'accumulateur (intégration), et on leur soustrait la valeur de l'accumulateur décalée d'un certain nombre de bits.
 +
Le nombre de bits de décalage donne la fréquence de coupure.
 +
A chaque incrémentation de ce nombre, la fréquence de coupure est divisée par 2.
  
Le filtrage passe-bas se fait à l'aide d'un intégrateur (réalisé par un accumulateur) avec limitation. A chaque période d'horloge, on additionne la valeur de l'entrée au contenu de l'accumulateur (intégration), et on leur soustrait la valeur de l'accumulateur décalée d'un certain nombre de bits (limitation). Le nombre de bits de décalage donne la fréquence de coupure. A chaque incrémentation de ce nombre, la fréquence de coupure est divisée par 2.
+
{{WarningBox|content=
 +
Le nombre de bits de décalage est un paramètre générique du bloc.
 +
}}
  
L'accumulateur nécessite un nombre de bits égal à celui du signal d'entrée plus le nombre de bits de décalage. En sortie, il faut reprendre les bits de poids fort de l'accumulateur.
+
L'accumulateur nécessite un nombre de bits égal à celui du signal d'entrée plus le nombre de bits de décalage.
 +
En sortie, il faut reprendre les bits de poids fort de l'accumulateur.
  
 
=== Simulation ===
 
=== Simulation ===
  
Recompiler et simuler le bloc '''waveformGen_tb'''. Vérifier la forme du signal polygonal.
+
{{TaskBox|content=
 +
Recompiler et simuler le bloc '''waveformGen_tb'''. Vérifier la forme du signal polygonal.}}
  
Modifier le nombre de bits de décalage du filtre passe-bas jusqu'à obtenir un signal sinusoïdal "satisfaisant".
+
{{TaskBox|content=
 +
Modifier le nombre de bits de décalage du filtre passe-bas jusqu'à obtenir un signal sinusoïdal "satisfaisant".}}
  
{{navNamed|left=SEm/laboratoires/00_installation|left_name=00 Installation|up=SEm/laboratoires|up_name=Instructions en français|right=SEm/laboratoires/02_interpolation|right_name=02 Générateur de fonctions avec calcul d'interpolation}}
+
{{navNamed
 +
|left=SEm/laboratoires/00_installation|left_name=00 Installation
 +
|up=SEm/laboratoires|up_name= Travaux de laboratoire
 +
|right=SEm/laboratoires/02_interpolation|right_name=02 Générateur de fonctions avec calcul d'interpolation
 +
}}
  
[[Category:SEm]]
+
[[Category:Bachelor]] [[Category:SEm]] [[Category:Français]]

Latest revision as of 12:20, 26 March 2018

Contents

Générateur de fonctions

Introduction

Dans ce laboratoire, nous allons illustrer l'écriture du code VHDL de blocs combinatoires et de blocs séquenciels synchrones par la réalisation d'un générateur de fonctions numérique.

Le générateur délivre

  • un signal en dents de scie, sawtooth,
  • un signal carré, square,
  • un signal triangulaire, triangle,
  • un signal sinusoïdal, sine.

Tous ces signaux sont codés en tant que nombres de 16 bits. Le circuit se trouve dans la librairie WaveformGenerator, le banc de test dans la librairie WaveformGenerator_test. Le programme de dessin de circuit est lancé à l'aide du fichier de commande sineGen.bat.

Générateur de fonctions

Générateur de signal en dents de scie

Générateur de signal en dents de scie

Le générateur de signal en dents de scie se fait à l'aide d'un compteur qui tourne en rond. Un nombre en entrée, step, permet de commander la fréquence du signal en dents de scie. A chaque flanc montant de l'horloge, lorsque en = '1, le compteur ajoute la valeur de step à sa valeur courante. Ainsi, plus la valeur de step est grande et plus le compteur tourne rapidement.

Code VHDL

View-pim-tasks.png

Ecrire l'architecture VHDL du générateur de signal en dents de scie.

Ce circuit est un circuit séquentiel synchrone.


View-pim-tasks.png

Examiner l'entité du générateur de signal en dents de scie pour connaître les types des signaux d'entrée/sortie. Parcourir la définition du paquetage numeric_std pour se faire une idée des fonctions à disposition sur les signaux de type unsigned.

Ce bloc contient un paramètre générique (generic): bitNb. Ce paramètre est défini aussi bien pour l'entité que pour l'architecture à écrire.

Dialog-warning.png

le signal de sortie, sawtooth, peut uniquement être assigné. Il ne peut être lu pour lui additionner la valeur de step. Il faut donc définir un signal interne, lequel peut être lu et assigné, et copier ce signal sur le port de sortie.

Simulation

View-pim-tasks.png

Estimer la période du signal en dents de scie pour un signal d'horloge de 66 MHz, un compteur de 16 bits et une valeur de step égale à 8.


View-pim-tasks.png

Donner la formule générale de la fréquence du signal généré en fonction de la fréquence de l'horloge, du nombre de bits du compteur et de la valeur du pas.


View-pim-tasks.png

Compiler et simuler le bloc waveformGen_tb. Vérifier le bon fonctionnement du générateur de signal en dents de scie.

Transformation de dents de scie à carré

Transformation de dents de scie à carré

La transformation du signal en dents de scie en un signal carré se fait en ne considérant que le bit de poids fort du signal en dents de scie. Cependant, le signal généré sera aussi codé sur 16 bits.

Code VHDL

View-pim-tasks.png

Déterminer la valeur binaire du nombre entier le plus petit, qui correspondra à la valeur inférieure du signal carré. Déterminer aussi la représentation binaire de la valeur supérieure du signal carré.


View-pim-tasks.png

Ecrire l'architecture VHDL du bloc de transformation du signal en dents de scie en un signal carré.

Ce circuit est un circuit combinatoire. Le signal de sortie est un nombre non-signé codé sur 16 bits.

Simulation

View-pim-tasks.png

Recompiler et simuler le bloc waveformGen_tb. Vérifier la forme du signal carré.

Transformation de dents de scie à triangle

Transformation de dents de scie à triangle

La transformation du signal en dents de scie en un signal triangulaire se fait en "repliant la dent de scie vers le bas" lorsque le bit de poids fort du signal en dents de scie vaut '1'.

Code VHDL

View-pim-tasks.png

Ecrire l'architecture VHDL du bloc de transformation du signal en dents de scie en un signal triangulaire.

Ce circuit est un circuit combinatoire. Lorsque le bit de poids fort du signal en dents de scie vaut '1', inverser tous les bits du signal en dent de scie. Comme le signal généré aura ainsi toujours son bit de poids fort à '0', il n'utilise que la moitié de la gamme à disposition. Il faudra donc multiplier le signal obtenu par deux. Ceci correspond à un décalage vers la gauche. Il est indiqué de définir un signal interne résultant de la première opération de repliement et utilisé pour générer la sortie. Il est aussi plus lisible de définir un autre signal interne: le bit de poids fort du signal d'entrée.

Simulation

View-pim-tasks.png

Recompiler et simuler le bloc waveformGen_tb. Vérifier la forme du signal triangulaire.

Transformation triangle à sinus

Transformation de triangle à sinus

La transformation de triangle à sinus peut se faire par une table de vérité (ROM) qui contient toutes ces valeurs. Cette solution, même si elle est la plus précise, est très coûteuse en matériel.

Dans ce laboratoire, nous prendrons le parti de filtrer le signal triangulaire pour ne conserver que sa fondamentale: une sinus. Pour simplifier la tâche de filtrage, nous allons transformer le signal triangulaire en un signal polygonal de forme plus proche du sinus désiré.

Code VHDL

View-pim-tasks.png

Ecrire l'architecture VHDL du bloc de transformation du signal triangulaire en un signal polygonal ainsi que celle du filtre passe-bas de premier ordre.

La transformation de triangle à ploygone se commence en multipliant le triangle par 1.5. Après cela, il faut remplaçer toutes les valeurs plus petites que 1/8 de la gamme du triangle obtenu par cette valeur de 1/8: on coupe ce qui est en-dessous. De même, on coupe aussi ce qui dépasse les 5/8. Finalement, on peut décaler le signal de 1/8 vers le bas.

Dialog-warning.png

Les valeurs 1/8 et 5/8 sont relatives à la pleine échelle (Full Scale, FS) possible du signal et non à l'amplitude maximale du triangle.

La multiplication par 1.5 se fait par un décalage et une addition. Le résultat de la multiplication nécessite un bit de plus que le signal de départ. Après le décalage vers le bas, on peut ignorer le bit de poids fort et revenir au même nombre de bits qu'à l'entrée.

Le filtrage passe-bas se fait à l'aide d'un intégrateur réalisé par un accumulateur. A chaque période d'horloge, on additionne la valeur de l'entrée au contenu de l'accumulateur (intégration), et on leur soustrait la valeur de l'accumulateur décalée d'un certain nombre de bits. Le nombre de bits de décalage donne la fréquence de coupure. A chaque incrémentation de ce nombre, la fréquence de coupure est divisée par 2.

Dialog-warning.png

Le nombre de bits de décalage est un paramètre générique du bloc.

L'accumulateur nécessite un nombre de bits égal à celui du signal d'entrée plus le nombre de bits de décalage. En sortie, il faut reprendre les bits de poids fort de l'accumulateur.

Simulation

View-pim-tasks.png

Recompiler et simuler le bloc waveformGen_tb. Vérifier la forme du signal polygonal.


View-pim-tasks.png

Modifier le nombre de bits de décalage du filtre passe-bas jusqu'à obtenir un signal sinusoïdal "satisfaisant".


Navigation
Arrow left.gif 00 Installation Arrow up.gif Travaux de laboratoire 02 Générateur de fonctions avec calcul d'interpolation Arrow right.gif

Personal tools
Namespaces
Variants
Actions
Navigation
Modules / Projects
Browse
Toolbox