L’entité Oscillator
est un générateur de sinusoïdes.
Son architecture n’effectue aucun calcul trigonométrique :
elle s’appuie sur le tableau SINE_TABLE
(voir le paquetage Vocoder_pkg
)
qui contient des valeurs de sinus calculées
à l’avance et mises au format virgule fixe.
Pour remplir le tableau SINE_TABLE
, nous avons calculé les échantillons
d’une sinusoïde de fréquence 200 Hz, avec une fréquence d’échantillonnage de 20 kHz.
Nous utiliserons le même tableau pour tous les oscillateurs du projet
en considérant qu’ils produiront des sinusoïdes à des fréquences multiples de
200 Hz.
Par exemple, pour générer une sinusoïde de fréquence 600 Hz, il suffit de
parcourir le tableau SINE_TABLE
en ne prenant qu’une valeur sur 3.
Cette situation est illustrée sur cette figure :
En réalité, SINE_TABLE
ne contient que les valeurs de sinus pour des angles de 0 à 90°.
Pour obtenir les autres valeurs, on exploite les symétries de la fonction sinus.
Sur la figure ci-dessus, les points en orange correspondent au contenu du tableau
SINE_TABLE
. Les points en bleu sont obtenus en changeant le sens de parcours
et le signe de chaque élément :
SINE_TABLE
dans le sens croissant.SINE_TABLE
dans le sens décroissant.SINE_TABLE
dans le sens croissant, et on prend l’opposé de chaque élément.SINE_TABLE
dans le sens décroissant et on prend l’opposé de chaque élément.Oscillator
L’entité Oscillator
produit un flux de données en utilisant le protocole ready/valid.
Elle joue le rôle de producteur :
Port | Direction | Type | Rôle |
---|---|---|---|
clk_i |
Entrée | Logique | Le signal d’horloge global du système |
reset_i |
Entrée | Logique | La commande de réinitialisation du système |
step_i |
Entrée | Entier | Le pas de parcours du tableau SINE_TABLE , pour générer une sinusoïde de fréquence step_i ×200 Hz |
ready_i |
Entrée | Logique | Indique que le consommateur est prêt à recevoir un nouvel échantillon |
data_o |
Sortie | Virgule fixe (vocoder_coef_t ) |
Une valeur de sinus |
Comme la donnée de sortie est toujours valide, la présence d’un port valid_o
n’est pas nécessaire : s’il y en avait un, il serait toujours à '1'
.
Nous ne vous demandons pas de réaliser l’architecture. Utilisez l’implémentation de référence fournie.
Nous fournissons l’oscillateur prêt à l’emploi dans le fichier
src/Oscillator/Oscillator-ref.vhd
.
Le contenu de ce fichier a été volontairement rendu illisible.
Nous vous conseillons de ne pas perdre de temps à essayer de le rendre lisible.