SEm/labore/02 interpolation

(Difference between revisions)
Jump to: navigation, search
m
Line 1: Line 1:
 
{{TOC right}}
 
{{TOC right}}
  
= Funktionsgenerator mit Interpolationsberechnung =
+
= Générateur de fonctions avec calcul d'interpolation =
 +
== Introduction ==
 +
Dans ce laboratoire, nous allons effectuer des opérations sur des nombres. Ceci sera illustré par le clacul de l'interpolation de points de la fonction sinus d'un générateur de fonctions numérique.
  
== Einleitung ==
+
[[Image:SEm_sineGen.png|thumb|Générateur de fonctions avec calcul de sinus par interpolation]]
  
In diesem Labor werden wir verschiedene Operationen mit Zahlen durchführen.
+
Le calcul de l'interpolation se base sur l'approximation de la fonction entre deux points donnés par des fonctions polynomiales du troisième ordre. Cette méthode appartient à la grande famille des "splines".
Dies am Beispiel der Interpolation der Punkte der Sinuskurve eines digitales Funktionsgenerator.
+
  
Die Berechnung der Interpolation basiert auf der Annäherung der Funktion zwischen 2 Punkten mit Polynomialfunktionen dritter Ordnung.
+
Le circuit se trouve dans la librairie '''SineInterpolator''', le banc de test dans la librairie '''SineInterpolator_test'''.
Diese Methode gehört zur grossen Familie der ''Splines''.
+
  
Die Schaltung befindet sich in der Library '''SineInterpolator''', die Testbank in der Library '''SineInterpolator_test'''.
+
== Table de sinus ==
  
[[Image:SEm_sineGen.png|Funktionsgenerator mit Berechnung des Sinus durch Interpolation]]
+
L'interpolation se fera à partir d'une table contenant 8 valeurs de sinus pour un quart de sa période. Pour fonctionner sur toute la période, le signal en dents de scie provenant du compteur et considéré comme phase du sinus est utilisé comme suit:
  
== Sägezahn ==
+
* Le bit de poids fort signale le changement de signe des valeurs du sinus.
 +
* Le bit suivant signale un changement à apporter à la phase pour lire la table dans le sens inverse, ceci pour les deuxième et quatrième quarts de la période.
 +
* Les 3 bits suivants ('''tableAddressBitNb = 3''') sont utilisés pour adresser les valeurs de la table.
 +
* Les autres bits sont ignorés.
  
In dieser Schaltung ist die Anzahl Bits der Phase nicht gleich derjenigen der Funktionsgenerator-Ausgänge.
+
[[Image:SEm_sineTable.png|thumb|Table de sinus]]
  
Wenn Ihr die Basisausgänge ''Sägezahn'', ''Viereck'' und ''Dreieck'' erstellt, ändert der Block '''resizer''' die Anzahl Bits des Phasensignals und passt es den Ausgängssignalen an. Dabei gibt es drei Fälle zu beachten:
+
=== Code VHDL ===
  
* Die Anzahl Bits der Ausgänge ist kleiner als die des Phasensignals: in diesem Fall werden die MSBs behalten.
+
Ecrire l'architecture VHDL du générateur de sinus.
* Die Anzahl Bits der Ausgänge ist gleich wie die des Phasensignals: in diesem Fall werden alle Bits übertragen.
+
* Die Anzahl Bits der Ausgänge ist kleiner als die des Phasensignals: in diesem Fall wird das Phasensignal in die MSBs des Sägezahnsignals gelegt.
+
  
=== VHDL Code ===
+
L'adresse de la table de sinus est tirée des 3 bits suivant les 2 bits de poids fort de la phase. Elle effectue la séquence 0, 1, 2, 3, 4, 5, 6, 7, 0, 7, 6, 5, 4, 3, 2, 1, 0, 1, 2, 3, ....
  
{{TaskBox|content=
+
La table de sinus contient les valeurs hexadécimales 0000 ou 7FFF (selon la valeur du deuxième bit de poids fort), 18F9, 30FB, 471C, 5A82, 6A6D, 7641 et 7D89.
Mit Hilfe des Konstruktes '''if ... generate''', schreiben Sie den VHDL Code des '''resizer'''-Blocks.}}
+
  
=== Simulation ===
+
Lorsque le bit de poids fort de la phase vaut '1', la valeur lue de la table change de signe pour donner la sortie.
 
+
{{TaskBox|content=
+
Kompilieren und simulieren Sie den Block '''sineGen_tb'''.
+
Ändern Sie die Anzahl Bits des Phasensignals und überprüfen Sie die Anpassung der Anzahl Bits in jedem möglichen Operationsfall.}}
+
 
+
== Sinustabelle ==
+
 
+
[[Image:SEm_sineTable.png|thumb|Sinustabelle]]
+
 
+
Die Interpolation wird durchgeführt abhand einer Tabelle, welche 8 Werte der
+
Sinusfunktion im ersten Viertel der Periode enthält. Um die Werte für die ganze Periode
+
anzuwenden, wird das Sägezahnsignal des Phasenzählers wie folgt angewandt:
+
 
+
* Der MSB gibt an, ob das Vorzeichen zu ändern ist.
+
* Der nächste Bit meldet, dass die Phase geändert sein soll, um die Tabelle in der umgekehrten Richtung zu lesen, dies für den zweiten und den vierten Viertel der Periode.
+
* Die 3 weitere Bits ('''tableAddressBitNb = 3''') sind als Adresse für das Lesen der Tabellenwerte angewandt.
+
* Alle andere Bits werden vernachlässigt.
+
 
+
=== VHDL Code ===
+
 
+
{{TaskBox|content=
+
Schreiben Sie die VHDL Architektur des Sinuswellengenerators.}}
+
 
+
Die Adresse der tabelle stammt aus den 3 Bits nach den 2 MSBs. Sie zählt die
+
Sequenz 0, 1, 2, 3, 4, 5, 6, 7, 0, 7, 6, 5, 4, 3, 2, 1, 0, 1, 2, 3, ....
+
 
+
Die SinusTabelle enthält die Hexadezimalwerte 0000 oder 7FFF (abhängend auf den zweiten
+
MSB), 18F9, 30FB, 471C, 5A82, 6A6D, 7641 und 7D89.
+
 
+
Wenn der MSB der Phase gleich '1' ist, so wird das Vorzeichen des Tabellenwertes
+
invertiert, um den Ausgang zu erzeugen.
+
  
 
=== Simulation ===
 
=== Simulation ===
  
{{TaskBox|content=
+
Compiler et simuler le bloc '''sineGen_tb'''. Vérifier le bon fonctionnement du générateur de sinus.
Kompilieren Sie und simulieren Sie den Block '''sineGen_tb'''. Prüfen Sie
+
die Funktionalität des Sinuswellensignalgenerators.}}
+
  
 
== Interpolation ==
 
== Interpolation ==
  
Die Interpolation wird gemacht, indem man eine verschiedene Polynomialfunktion 3. Ordnung
+
L'interpolation se fait en associant une fonction polynomiale d'ordre 3 entre chaque point de la table de sinus:
zu jedem Intervall zwischen zwei Pünkte der Sinustabelle zuweist:
+
  
 
''' y = a·k^3 + b·k^2 + c·k +d'''
 
''' y = a·k^3 + b·k^2 + c·k +d'''
  
Während dieser Berechnung wird der jeweilige Punkt der Tabelle mit
+
Au cours du calcul, le point courant de la table de sinus est défini en '''= 0''', le point précédent en '''= -1''' et le point suivant en '''= 1'''. Nous calculerons la valeur du polynome pour '''= 2^m''' points situés entre 0 et 1.
'''k = 0''' definiert, der vorige Punkt mit '''k = -1''' und der
+
nächste mit '''k = 1''' definiert. Wir werden die Polynomialfunktion für
+
'''n = 2^m''' Pünkte zwischen 0 und 1 berechnen.
+
  
Um die Kontinuität der Kurve beim übergang vom Polynom des Segments
+
Pour assurer la continuité entre le polynôme qui relie le segment '''-< k < 0''' et celui qui relie '''< k < 1''', nous spécifons la dérivée au point '''y(k=0)''' comme étant égale à la pente entre les points '''y(k=-1)''' et '''y(k=1)'''. Nous ferons de même pour tous les points de la fonction à interpoler.
'''-1 < k < 0''' und dem von '''0 < k < 1''',
+
spezifieren wir, dass die derivative am Punkt '''y(k=0)''' gleich der Steigung
+
zwischen den Pünkten '''y(k=-1)''' und '''y(k=1)'''sein soll. Wir
+
werden dasselbe für alle Pünkte der zu interpolierenden Funktion machen.
+
  
Das Segment '''0 < k < 1''' dient somit den 4 folgenden
+
Le segment '''< k < 1''' est donc soumis aux 4 conditions suivantes
Bedingungen:
+
  
''' y(k=0) = y0''': das Polynom geht durch den Punkt '''(k=0,
+
''' y(k=0) = y0''': le polynôme passe par le point '''(k=0, y=y0)''',
y=y0)''',
+
  
''' y(k=1) = y1''': das Polynom geht durch den Punkt '''(k=1,
+
''' y(k=1) = y1''': le polynôme passe par le point '''(k=1, y=y1)''',
y=y1)''',
+
  
''' y'(k=0) = [y(k=1) - y(k=-1)] / 2''': die Ableitung am Punkt
+
''' y'(k=0) = [y(k=1) - y(k=-1)] / 2''': la dérivée au point '''(k=0)''' est la pente entre '''y(k=-1)''' et '''y(k=1)''',
'''(k=0)''' ist die Steigung zwischen '''y(k=-1)''' und
+
'''y(k=1)''',
+
  
''' y'(k=1) = [y(k=2) - y(k=0)] / 2''': die Ableitung am Punkt
+
''' y'(k=1) = [y(k=2) - y(k=0)] / 2''': la dérivée au point '''(k=1)''' est la pente entre '''y(k=0)''' et '''y(k=2)'''.
'''(k=1)''' ist die Steigung zwischen '''y(k=0)''' und
+
'''y(k=2)'''.
+
  
Diese 4 Bedingungen dienen zur Bestimmung des 4 Koeffizienten '''a''',
+
Ces 4 conditions nous servent à déterminer les 4 coefficients '''a''', '''b''', '''c''' et '''d''' du ploynôme à partir des 4 points '''y(k=-1)''' à '''y(k=2)''' de la courbe à interpoler. La résolution de ce système d'équations nous donne les valeurs suivantes des coefficients:
'''b''', '''c''' und '''d''' des Polynoms abhand der
+
4 Punkte '''y(k=-1)''' bis '''y(k=2)''' der zu interpolierende
+
Kurve. Die Auflösung dieses Gleichungssystems gibt uns die folgenden Werte der
+
Koeffizienten:
+
  
 
''' a = 1/2 [ - y(k=-1) +3·y(k=0) -3·y(k=1) + y(k=2) ]'''
 
''' a = 1/2 [ - y(k=-1) +3·y(k=0) -3·y(k=1) + y(k=2) ]'''
Line 118: Line 66:
 
''' d = y(k=0)'''
 
''' d = y(k=0)'''
  
Um die Berechnungen zu vereinfachen werden wir den doppelten Wert der Koeffizienten
+
Par souci de simplification, nous calculerons le double de la valeur des coefficients et par la suite nous diviserons la valeur du polynome calculé par 2.
evaluieren und später die berechnete Werte des Polynoms durch 2 teilen.
+
  
Beim Auftreten jedes neuen Werts des ursprünglichen Signals (hier die Sinustabelle),
+
A chaque nouvelle valeur du signal d'origine (ici, de la table de sinus), il faut recalculer les coefficients du polynôme. Puis, à chaque période d'horloge et en attendant l'arrivée de la valeur suivante, on calcule la fonction polynomiale pour déterminer la valeur courante de l'échantillon de sortie.
müssen die Ploynomkoeffiziente neu berechnet werden. Dann, in der Zwischenzeit, wird die
+
Polynomilafunktion berechnet, um den jeweilgen Wert des Ausgangssignal zu bestimmen.
+
  
=== Generator von Sequenzierungsimpulsen ===
+
=== Générateur d'impulsions de séquencement ===
  
[[Image:SEm_interpolatorTrigger.png|thumb|Genrator von Sequenzierungsimpulsen]]
+
Ecrire l'architecture VHDL du générateur d'impulsions de séquencement.
  
{{TaskBox|content=
+
[[Image:SEm_interpolatorTrigger.png|thumb|Générateurs d'impulsions de séquencement]]
Schreiben Sie die VHDL Architektur des Generators von Sequenzierungsimpulsen.}}
+
  
Diese Schaltung ermittelt einen Impuls mit der Dauer einer Taktperiode bei jedem
+
Ce circuit fournit une impulsion qui dure une période d'horloge à chaque changement de polynôme, c'est-à-dire pour chaque nouveau segment de courbe.
Polynomwechsel, das heisst zu jedem neuen Kurvensegment.
+
  
Dies erfolgt zu jeden '''2^n''' Taktperioden wo '''en =
+
Ceci se fait chaque '''2^n''' périodes d'horloge où '''en = '1'''', avec '''= sampleCountBitNb = phaseBitNb-2-tableAddressBitNb'''. Dans notre exemple de laboratoire, '''phaseBitNb = 10''' et '''sampleCountBitNb = 5'''.
'1'''', wobei '''n = sampleCountBitNb
+
= phaseBitNb-2-tableAddressBitNb'''. In unserem Laborbeispiel sind
+
'''phaseBitNb = 10''' und '''sampleCountBitNb = 5'''.
+
  
=== Schieberegister ===
+
=== Registre à décalage ===
  
[[Image:SEm_interpolatorShiftRegister.png|thumb|Schieberegister]]
+
Ecrire l'architecture VHDL du registre à décalage qui mémorise les 4 derniers points de la fonction à interpoler.
  
{{TaskBox|content=
+
[[Image:SEm_interpolatorShiftRegister.png|thumb|Registre à décalage]]
Schreiben Sie die VHDL Architektur des Schieberegisters, welcher die 4 letzte
+
Pünkte der zu interpolendierenden Funktion speichert.}}
+
  
Bei jedem Synchronisationsimplus '''shiftSamples''' speichert dis Schaltung
+
A chaque impulsion de synchronisation '''shiftSamples''', le circuit mémorise le nouvel échantillon de la fonction à interpoler, '''sampleIn''', et le mémorise comme dernière valeur d'échantillon, '''sample4'''. En même temps, il décale l'échantillon '''sample4''' dans '''sample3''', etc...
den neuen Wert der zu interpolendierenden Funktion, '''sampleIn''', und
+
speichert es als letzes Abtastwert, '''sample4'''. Zugleich schiebt er den
+
gespeicherten Wert von '''sample4''' zurück in '''sample3''',
+
usw...
+
  
=== Berechnung der Koeffizienten ===
+
=== Calcul des coefficients ===
  
[[Image:SEm_interpolatorCoefficients.png|thumb|Block zur Berechnung der Koeffizienten für die Interpolation]]
+
Ecrire l'architecture VHDL du bloc qui calcule les coefficients du polynôme en fonction de la valeur des 4 derniers points de la fonction à interpoler.
  
{{TaskBox|content=
+
[[Image:SEm_interpolatorCoefficients.png|thumb|Bloc de calcul des coefficients pour l'interpolation]]
Schreiben Sie die VHDL Architektur des Blocks, welcher die Koeffizienten des Polynoms
+
berechnet als Funktion der 4 letzten Pünkten der zu interpolendierenden
+
Funktion.}}
+
  
Die Koeffiziente werden wie folgt berechnet:
+
Les coefficients se calculent comme suit:
  
 
''' a = - sample1 +3·sample2 -3·sample3 + sample4'''
 
''' a = - sample1 +3·sample2 -3·sample3 + sample4'''
Line 173: Line 104:
 
''' d = sample2'''
 
''' d = sample2'''
  
{{TaskBox|content=
+
Expliquer le choix effectué '''coeffBitNb := signalBitNb+4'''.
Erklären Sie die getroffene Wahl im Schema '''coeffBitNb := signalBitNb+4'''.}}
+
  
{{TaskBox|content=
+
Parcourir la librairie '''ieee.numeric_std''' et vérifier l'effet de la multiplication d'un signal de type '''signed''' par un nombre entier. Vérifier également le fonctionnement de la fonction '''resize'''. Elle est très utile ici pour forcer le nombre de bits des signaux.
Öffnen Sie die Library '''ieee.numeric_std''' und durchsuchen Sie die
+
Auswirkung der Multiplikation eines Signals von Typ '''signed''' durch eine
+
ganze Zahl. Prüfen Sie ebenfalls das Funktionieren der Funktion '''resize'''.
+
Sie ist hier sehr nützlich, um die Anzahl der Bits der Signale zu bestimmen.}}
+
  
=== Berechnung des Polynoms ===
+
=== Calcul du polynôme ===
  
[[Image:SEm_interpolatorPolynom.png|thumb|Block zur Berechnung der Interpolation]]
+
Ecrire l'architecture VHDL du bloc qui calcule la valeur du polynôme d'interpolation de fonction à chaque nouvelle période d'horloge.
  
{{TaskBox|content=
+
[[Image:SEm_interpolatorPolynom.png|thumb|Bloc de calcul de l'interpolation]]
Schreiben Sie die VHDL Architektur des Blocks, welcher den Wert des
+
Interpolationspolynom bei jeder neuen Taktperiode berechnet.}}
+
  
Das Polynom wird iterativ berechnet.
+
Le polynôme se calcule de manière itérative.
  
Als Beispiel, für eine Funktion 1. Ordnung, '''y(x) = a·x + b''', ist der
+
Ainsi, pour une fonction de premier ordre, '''y(x) = a·x + b''', la valeur suivante vaut ''y(x+eps) = y(x) + a·eps''''''. Ceci se calcule en initialisant '''u = a·eps''', '''y(0) = b''', et en calculant '''y(i+1) = y(i) + u''' à chaque nouvelle période d'horloge.
nächste Wert gleich '''y(x+eps) = y(x) + a·eps'''. Die berechnet sich, indem
+
anfangs '''u = a·eps''', '''y(0) = b''' initialisiert wird, und
+
indem '''y(i+1) = y(i) + u''' bei jeder Taktperiode neu berchenet wird.
+
  
Für eine Funktion 2. Ordnung, '''y(x) = a·x^2 + b·x + c''', ergibt
+
Pour une fonction de deuxième ordre, '''y(x) = a·x^2 + b·x + c''', ce qui donne '''y(x+eps) = y(x) + u(x)''', avec '''u(x) = 2·a·eps·x + (a·eps^2 + b·eps)'''. L'incrément '''u(x)''' se calcule de la manière définie pour une fonction du premier ordre. Ceci se calcule donc en initialisant '''v = 2·a·eps^2''', '''u(0) = a·eps^2 + b·eps''','''y(0) = c''' et en calculant '''y(i+1) = y(i) + u(i)''' et '''u(i+1) = u(i) + v''' à chaque nouvelle période d'horloge.
sich '''y(x+eps) = y(x) + u(x)''', mit
+
'''u(x) = 2·a·eps·x + (a·eps^2 + b·eps)'''. Der zusatz
+
'''u(x)''' berechnet sich mit der Methode, welche für eine Funktion
+
1. Ordnung vorgegeben wurde. Dies berechnet sich also mit
+
'''v = 2·a·eps^2''', '''u(0) = a·eps^2 + b·eps''',
+
'''y(0) = c''' zu initialisation und mit
+
'''y(i+1) = y(i) + u(i)''' et '''u(i+1) = u(i) + v''' bei jeder
+
neuen Taktperiode.
+
  
Die Berechnung der Funktion dritter Ordnung erfolgt ähnlich.
+
Le calcul de la fonction de troisième ordre se fait de manière similaire.
  
Für die digitale Berechnung wird '''eps''' als gleich einer negativen
+
Pour le calcul numérique, '''eps''' est choisi comme égal à une puissance négative de 2, ce qui permet de la calculer par un décalage. De même, pour rester avec des nombres entiers, on calculera la fonction '''y(i)''' multipliée par une puissance de 2 et un décalage terminal nous donnera la valeur finale des échantillons du polynôme.
Potenz von 2 gewählt, was es erlaubt, Werte durch eine Verschiebung zu berechnen.
+
Ebenso, um mit ganzen Zahlen zu verbleiben, wird man die Funktion '''y(i)'''
+
mit einer Potenz von 2 multipliziert berechnen, und eine Abschlussverschiebung wird uns
+
den Abtastwert des Polynoms geben.
+
  
Somit ist unser Algorithmus der folgende:
+
Notre algorithme est donc le suivant:
  
* Bei der Ankunft eines neuen Abtastwertes werden die Initialwerte zur iterativen Bestimmung des Polynoms berechnet.
+
* A l'arrivée d'un nouvel échantillon, il faut calculer les valeurs initiales utilisée pour développer le polynôme de manière itérative.
* Zwischen zwei Abtastwerte wird die Berechnung der Polynomialfunktion mit Hilfe von Additionen durchgeführt, abhand der iterativen Gleichungen.
+
* Entre deux échantillons d'entrée, le calcul de la fonction polynomiale se fait par additions à l'aide des équations itératives.
  
Die Initialwerte sind die folgende:
+
Les valeurs initiales sont les suivantes:
  
 
''' x = 2·d·2^(3·m)'''
 
''' x = 2·d·2^(3·m)'''
Line 232: Line 141:
 
''' y = d'''
 
''' y = d'''
  
Die Iterativberechnung des Polynoms wird wie folgt durchgeführt:
+
Le calcul itératif du polynôme se fait comme suit:
  
 
''' x = x + u'''
 
''' x = x + u'''
Line 242: Line 151:
 
''' y = x / 2·2^(3·m)'''
 
''' y = x / 2·2^(3·m)'''
  
Es ist offensichtlich, das wegen der Verschiebungen '''2^m''', die Anzahl
+
Il est évident que, du fait des décalages '''2^m''', le nombre de bits des signaux internes devra être plus élevé que le nombre de bits des échantillons d'entrée ou de sortie. En fonction de la valeur du décalage '''= oversamplingBitNb''', estimer la taille nécessaire pour ces signaux. Les décalrer avec 8 bits supplémentaires pour s'assurer de ne pas avoir de dépassement de capacité.
der Bits der internen Signale höher sein muss als die Anzahl der Bits der Eingangs- oder
+
Ausgangswerte. Schätzen Sie die notwendige Grösse für diese Signale als Funktion der
+
Verschiebung '''m = oversamplingBitNb'''. Geben Sie diesen Signalen
+
8 zusätzliche Bits, um sicherzustellen, dass kein Overflow vortauschen wird.
+
  
Wiederum wird die Funktion '''resize''' hier von grosser Interesse
+
A nouveau, la fonction '''resize'''sera très utile ici.
sein.
+
  
 
=== Simulation ===
 
=== Simulation ===
  
{{TaskBox|content=
+
Recompiler et simuler le bloc '''sineGen_tb'''. Vérifier la forme du signal sinusoïdal après interpolation.
Kompilieren Sie und simulieren Sie den Block '''sineGen_tb''' neu. Prüfen
+
 
Sie die Form des Sinuswelle nach Interpolation.}}
+
Réduire le nombre de bits des signaux du circuit là où cela est possible.
  
{{TaskBox|content=
 
Verkleinern Sie die Anzahl Bits der Signale in der Schaltung überall, wo es möglich
 
ist, unter Beibehaltung der selben Sinuswelle nach Interpolation.}}
 
  
{{navNamed|left=SEm/labore/01_generator|left_name=01 Funktionsgenerator|up=SEm/labore|up_name=Anleitung auf Deutsch|right=SEm/labore/03_konverter|right_name=03 Digital / Analog Wandler}}
+
{{navNamed|left=SEm/laboratoires/01_generateur|left_name=01 Generateur|up=SEm/laboratoires|up_name=Instructions en français|right=SEm/laboratoires/03_convertisseur|right_name=03 Convertisseur numérique / analogique}}
  
 
[[Category:SEm]]
 
[[Category:SEm]]

Revision as of 15:08, 4 March 2015

Contents

Générateur de fonctions avec calcul d'interpolation

Introduction

Dans ce laboratoire, nous allons effectuer des opérations sur des nombres. Ceci sera illustré par le clacul de l'interpolation de points de la fonction sinus d'un générateur de fonctions numérique.

Générateur de fonctions avec calcul de sinus par interpolation

Le calcul de l'interpolation se base sur l'approximation de la fonction entre deux points donnés par des fonctions polynomiales du troisième ordre. Cette méthode appartient à la grande famille des "splines".

Le circuit se trouve dans la librairie SineInterpolator, le banc de test dans la librairie SineInterpolator_test.

Table de sinus

L'interpolation se fera à partir d'une table contenant 8 valeurs de sinus pour un quart de sa période. Pour fonctionner sur toute la période, le signal en dents de scie provenant du compteur et considéré comme phase du sinus est utilisé comme suit:

  • Le bit de poids fort signale le changement de signe des valeurs du sinus.
  • Le bit suivant signale un changement à apporter à la phase pour lire la table dans le sens inverse, ceci pour les deuxième et quatrième quarts de la période.
  • Les 3 bits suivants (tableAddressBitNb = 3) sont utilisés pour adresser les valeurs de la table.
  • Les autres bits sont ignorés.
Table de sinus

Code VHDL

Ecrire l'architecture VHDL du générateur de sinus.

L'adresse de la table de sinus est tirée des 3 bits suivant les 2 bits de poids fort de la phase. Elle effectue la séquence 0, 1, 2, 3, 4, 5, 6, 7, 0, 7, 6, 5, 4, 3, 2, 1, 0, 1, 2, 3, ....

La table de sinus contient les valeurs hexadécimales 0000 ou 7FFF (selon la valeur du deuxième bit de poids fort), 18F9, 30FB, 471C, 5A82, 6A6D, 7641 et 7D89.

Lorsque le bit de poids fort de la phase vaut '1', la valeur lue de la table change de signe pour donner la sortie.

Simulation

Compiler et simuler le bloc sineGen_tb. Vérifier le bon fonctionnement du générateur de sinus.

Interpolation

L'interpolation se fait en associant une fonction polynomiale d'ordre 3 entre chaque point de la table de sinus:

y = a·k^3 + b·k^2 + c·k +d

Au cours du calcul, le point courant de la table de sinus est défini en k = 0, le point précédent en k = -1 et le point suivant en k = 1. Nous calculerons la valeur du polynome pour n = 2^m points situés entre 0 et 1.

Pour assurer la continuité entre le polynôme qui relie le segment -1 < k < 0 et celui qui relie 0 < k < 1, nous spécifons la dérivée au point y(k=0) comme étant égale à la pente entre les points y(k=-1) et y(k=1). Nous ferons de même pour tous les points de la fonction à interpoler.

Le segment 0 < k < 1 est donc soumis aux 4 conditions suivantes

y(k=0) = y0: le polynôme passe par le point (k=0, y=y0),

y(k=1) = y1: le polynôme passe par le point (k=1, y=y1),

y'(k=0) = [y(k=1) - y(k=-1)] / 2: la dérivée au point (k=0) est la pente entre y(k=-1) et y(k=1),

y'(k=1) = [y(k=2) - y(k=0)] / 2: la dérivée au point (k=1) est la pente entre y(k=0) et y(k=2).

Ces 4 conditions nous servent à déterminer les 4 coefficients a, b, c et d du ploynôme à partir des 4 points y(k=-1) à y(k=2) de la courbe à interpoler. La résolution de ce système d'équations nous donne les valeurs suivantes des coefficients:

a = 1/2 [ - y(k=-1) +3·y(k=0) -3·y(k=1) + y(k=2) ]

b = 1/2 [ 2·y(k=-1) -5·y(k=0) +4·y(k=1) - y(k=2) ]

c = 1/2 [ - y(k=-1) + y(k=1) ]

d = y(k=0)

Par souci de simplification, nous calculerons le double de la valeur des coefficients et par la suite nous diviserons la valeur du polynome calculé par 2.

A chaque nouvelle valeur du signal d'origine (ici, de la table de sinus), il faut recalculer les coefficients du polynôme. Puis, à chaque période d'horloge et en attendant l'arrivée de la valeur suivante, on calcule la fonction polynomiale pour déterminer la valeur courante de l'échantillon de sortie.

Générateur d'impulsions de séquencement

Ecrire l'architecture VHDL du générateur d'impulsions de séquencement.

Générateurs d'impulsions de séquencement

Ce circuit fournit une impulsion qui dure une période d'horloge à chaque changement de polynôme, c'est-à-dire pour chaque nouveau segment de courbe.

Ceci se fait chaque 2^n périodes d'horloge où en = '1', avec n = sampleCountBitNb = phaseBitNb-2-tableAddressBitNb. Dans notre exemple de laboratoire, phaseBitNb = 10 et sampleCountBitNb = 5.

Registre à décalage

Ecrire l'architecture VHDL du registre à décalage qui mémorise les 4 derniers points de la fonction à interpoler.

Registre à décalage

A chaque impulsion de synchronisation shiftSamples, le circuit mémorise le nouvel échantillon de la fonction à interpoler, sampleIn, et le mémorise comme dernière valeur d'échantillon, sample4. En même temps, il décale l'échantillon sample4 dans sample3, etc...

Calcul des coefficients

Ecrire l'architecture VHDL du bloc qui calcule les coefficients du polynôme en fonction de la valeur des 4 derniers points de la fonction à interpoler.

Bloc de calcul des coefficients pour l'interpolation

Les coefficients se calculent comme suit:

a = - sample1 +3·sample2 -3·sample3 + sample4

b = 2·sample1 -5·sample2 +4·sample3 - sample4

c = - sample1 + sample3

d = sample2

Expliquer le choix effectué coeffBitNb := signalBitNb+4.

Parcourir la librairie ieee.numeric_std et vérifier l'effet de la multiplication d'un signal de type signed par un nombre entier. Vérifier également le fonctionnement de la fonction resize. Elle est très utile ici pour forcer le nombre de bits des signaux.

Calcul du polynôme

Ecrire l'architecture VHDL du bloc qui calcule la valeur du polynôme d'interpolation de fonction à chaque nouvelle période d'horloge.

Bloc de calcul de l'interpolation

Le polynôme se calcule de manière itérative.

Ainsi, pour une fonction de premier ordre, y(x) = a·x + b, la valeur suivante vaut y(x+eps) = y(x) + a·eps'. Ceci se calcule en initialisant u = a·eps, y(0) = b, et en calculant y(i+1) = y(i) + u à chaque nouvelle période d'horloge.

Pour une fonction de deuxième ordre, y(x) = a·x^2 + b·x + c, ce qui donne y(x+eps) = y(x) + u(x), avec u(x) = 2·a·eps·x + (a·eps^2 + b·eps). L'incrément u(x) se calcule de la manière définie pour une fonction du premier ordre. Ceci se calcule donc en initialisant v = 2·a·eps^2, u(0) = a·eps^2 + b·eps,y(0) = c et en calculant y(i+1) = y(i) + u(i) et u(i+1) = u(i) + v à chaque nouvelle période d'horloge.

Le calcul de la fonction de troisième ordre se fait de manière similaire.

Pour le calcul numérique, eps est choisi comme égal à une puissance négative de 2, ce qui permet de la calculer par un décalage. De même, pour rester avec des nombres entiers, on calculera la fonction y(i) multipliée par une puissance de 2 et un décalage terminal nous donnera la valeur finale des échantillons du polynôme.

Notre algorithme est donc le suivant:

  • A l'arrivée d'un nouvel échantillon, il faut calculer les valeurs initiales utilisée pour développer le polynôme de manière itérative.
  • Entre deux échantillons d'entrée, le calcul de la fonction polynomiale se fait par additions à l'aide des équations itératives.

Les valeurs initiales sont les suivantes:

x = 2·d·2^(3·m)

u = a + b·2^m + c·2^(2·m)

v = 6·a + 2·b·2^m

w = 6·a

y = d

Le calcul itératif du polynôme se fait comme suit:

x = x + u

u = u + v

v = v + w

y = x / 2·2^(3·m)

Il est évident que, du fait des décalages 2^m, le nombre de bits des signaux internes devra être plus élevé que le nombre de bits des échantillons d'entrée ou de sortie. En fonction de la valeur du décalage m = oversamplingBitNb, estimer la taille nécessaire pour ces signaux. Les décalrer avec 8 bits supplémentaires pour s'assurer de ne pas avoir de dépassement de capacité.

A nouveau, la fonction resizesera très utile ici.

Simulation

Recompiler et simuler le bloc sineGen_tb. Vérifier la forme du signal sinusoïdal après interpolation.

Réduire le nombre de bits des signaux du circuit là où cela est possible.


Navigation
Arrow left.gif 01 Generateur Arrow up.gif Instructions en français 03 Convertisseur numérique / analogique Arrow right.gif

Personal tools
Namespaces
Variants
Actions
Navigation
Modules / Projects
Browse
Toolbox