SEm/labore/01 generator

From FSI
(Difference between revisions)
Jump to: navigation, search
(Created page with "{{TOC right}} = Funktionsgenerator = == Einleitung == In diesem Labor werden wir das Schreiben Von VHDL-Code von kombinatorischen und sequenziellen Blöcken illustrie...")
 
(Einleitung)
 
(10 intermediate revisions by 3 users not shown)
Line 5: Line 5:
 
== Einleitung ==
 
== Einleitung ==
  
In diesem Labor werden wir das Schreiben Von VHDL-Code von kombinatorischen und
+
In diesem Labor werdet ihr das Schreiben von VHDL-Code für kombinatorische und sequenzielle Blöcke lernen.
sequenziellen Blöcken illustrieren, durch die Erstellung eines digitalen
+
Dies am Beispiel eines Funktionsgenerator welche folgende Signale erzeugt:
Funktionsgenerator.
+
  
'''Abbildung 1. Funktionsgenerator'''
+
* ein Sägezahnsignal, '''sawtooth''',
 
+
[[Image:waveformGen.png]]<br>
+
Der Generator erzeugt
+
 
+
* ein S&auml;gezahnsignal, '''sawtooth''',
+
 
* ein Vierecksignal, '''square''',
 
* ein Vierecksignal, '''square''',
 
* ein Dreiecksignal, '''triangle''',
 
* ein Dreiecksignal, '''triangle''',
 
* ein Sinuswellensignal, '''sine'''.
 
* ein Sinuswellensignal, '''sine'''.
  
All diese Signale sind auf 16 Bits als Bin&auml;rzahlen (immer positiv) dargestellt.
+
Alle diese Signale sind als 16-Bit Binärzahlen ohne Vorzeichen dargestellt.
 +
Die Schaltung befindet sich in der Bibliothek '''WaveformGenerator''', die Testbank dazu in der Bibliothek '''WaveformGenerator_test'''.
 +
Das Zeichnungprogramm wir mit Hilfe des Skripts '''sineGen.bat''' gestartet.
  
Die Schaltung befindet sich in der Library '''WaveformGenerator''', die
 
Testbank in der Library '''WaveformGenerator_test'''.
 
  
== S&auml;gezahnsignalgenerator ==
+
[[Image:SEm_WaveformGen.png|center|Funktionsgenerator]]
  
Der S&auml;gezahnsignalgenerator wird durch einen Z&auml;hler erstellt, welcher um und um z&auml;hlt.
+
== Sägezahnsignalgenerator ==
Eine Eingangszahl, '''step''', erlaubt es, die Frequenz des erzeugten
+
S&auml;gezahnsignals zu steuern. Bei jeder steigenden Flanke des Clocks, wenn '''en =
+
'1'''', addiert des Z&auml;hler den Wert von '''step''' zu seinem eigenem.
+
Somit z&auml;hlt er um so schneller als der Wert von '''step''' gr&ouml;sser ist.
+
  
'''Abbildung 2. S&auml;gezahnsignalgenerator'''
+
[[Image:SEm_SawtoothGen.png|thumb|Sägezahnsignalgenerator]]
 +
 
 +
Der Sägezahnsignalgenerator wird durch einen Zähler erstellt, welcher um und um zählt.
 +
Das Eingangssignal '''step''' erlaubt es, die Frequenz des erzeugten Sägezahnsignals zu steuern.
 +
Bei jeder steigenden Flanke des '''clock''' und wenn '''en = '1'''' addiert der Zähler den Wert von '''step''' zu seinem eigenem.
 +
Somit zählt er um so schneller je grösser der Wert von '''step''' ist.
  
[[Image:sawtoothGen.png]]<br>
 
 
=== VHDL Code ===
 
=== VHDL Code ===
  
Schreiben Sie die VHDL Architektur des S&auml;gezahnsignalgenerators.
+
{{TaskBox|content=
 +
Schreiben Sie die VHDL Architektur des Sägezahnsignalgenerators.}}
  
Dies ist eine synchrone sequenzielle Schaltung.
+
Dies ist eine '''''synchrone sequenzielle''''' Schaltung.
  
Betrachten Sie die Entity des S&auml;gezahnsignalgenerators, um die Typen der Ein- und
+
{{TaskBox|content=
Ausgangssignalen zu kennen. Gehen Sie durch die Library '''numeric_std''', um
+
Betrachten Sie die Entity des Sägezahnsignalgenerators, um die Typen der Ein- und Ausgangssignale zu erfahren. Gehen Sie durch die Bibliothek '''numeric_std''', um eine Idee der zur Verfügung stehenden Funktionen für den Typ '''unsigned''' zu erhalten.}}
eine Idee der zur Verf&uuml;gung stehenden Funktion f&uuml;r den Typ '''unsigned''' zu
+
haben.
+
  
Dieser Block hat einen generischen Parameter (generic):
+
Dieser Block hat einen generischen Parameter (generic): ''bitNb''. Dieser Parameter ist sowohl für die Entity wie auch für die zu schreibende Architektur definiert.
bitNb. Dieses Parameter ist sowohl f&uuml;r die Entity wie auch f&uuml;r die zu
+
schreibende Architektur definiert.
+
  
''Aufgepasst'': das Ausgangssignal, '''sawtooth''', kann
+
{{WarningBox|content='''sawtooth''' ist ein Ausgangssignal und ihm kann deshalb nur ein Wert zugewiesen werden.
nur zugewiesen werden. Es kann nicht zur&uuml;ckgelesen werden, um ihm den Wert von
+
Es ist nicht möglich, seinen Wert zurückzulesen, um ihm den Wert von '''step''' zu addieren.
'''step''' zu addieren. Deshalb muss man ein internes Signal definieren.
+
Deshalb muss man ein internes Signal definieren, welches gelesen und geschrieben werden kann.
Dieses kann gelesen und geschrieben werden, und es wird letzlich auf dem Ausgangsport
+
Am Ende wird das interne Signal auf das Ausgangssignal zugewiesen.}}
copiert.
+
  
 
=== Simulation ===
 
=== Simulation ===
  
Bestimmen Sie die Periode des S&auml;gezahnsignals mit einer Taktfrequenz von 66 MHz,
+
{{TaskBox|content=
einem 16-Bit Z&auml;hler und einem Wert von '''step''' gleich 8.
+
Berechnen Sie die Periode des Sägezahnsignals bei einer Taktfrequenz von 66 MHz, einem 16-Bit Zähler und einem Wert von '''step''' gleich 8.}}
  
Geben Sie die generelle Formel der Frequenz des erzeugten Signals als Funktion der
+
{{TaskBox|content=
Taktfrequenz, der Anzahl Bits des Z&auml;hlers und des Werts des Schrittes.
+
Geben Sie die generelle Formel der Frequenz des erzeugten Signals als Funktion der Taktfrequenz, der Anzahl Bits des Zählers und des Werts des Schrittes.}}
  
Compilieren Sie den Block '''waveformGen_tb'''. Pr&uuml;fen Sie die
+
{{TaskBox|content=
Funktionalit&auml;t des S&auml;gezahnsignalgenerators.
+
Kompilieren und simulieren Sie den Block '''waveformGen_tb'''. Prüfen Sie die Funktionalität des Sägezahnsignalgenerators.}}
  
== Umwandlung von S&auml;gezahn zu Viereck ==
+
== Umwandlung von Sägezahn zu Viereck ==
  
Die Umwandlung vom S&auml;gezahnsignal zu einem Viereck wird durch das Betrachten des MSBs des
+
[[Image:SEm_SawtoothToSquare.png|thumb|Umwandlung von Sägezahn zu Viereck]]
S&auml;gezahnsignals. Doch wird das erzeugte Signal auf 16 Bit codiert.
+
  
'''Abbildung 3. Umwandlung von S&auml;gezahn zu Viereck'''
+
Das Sägezahnsignal wird in ein Viereck umgewandelt indem nur das MSBs des Sägezahnsignals betrachtet wird. Dennoch soll das erzeugte Vierecksignal auf 16 Bit kodiert sein.
  
[[Image:sawtoothToSquare.png]]<br>
 
 
=== VHDL Code ===
 
=== VHDL Code ===
  
Schreiben Sie die VHDL Architektur des Blocks zur Umwandlung des S&auml;gezahnsignals in
+
{{TaskBox|content=
einem Vierecksignal.
+
Bestimmen Sie den Wert der kleinstmöglichen ganzen Zahl, welche dem unterem Teil des Vierecksignals entsprechen wird.
 +
Bestimmen Sie auch die Binärdarstellung des grösstmöglichen Werts des Vierecksignals.
 +
}}
  
Dies ist eine kombinatorische Schaltung.
+
{{TaskBox|content=
 +
Schreiben Sie die VHDL Architektur des Blocks zur Umwandlung des Sägezahnsignals in ein Vierecksignal.}}
  
Der Ausgangssignal ist eine auf 16 Bits codierte Bin&auml;rzahl. Bestimmen Sie den Wert
+
Dies ist eine kombinatorische Schaltung. Das Ausgangssignal ist eine auf 16 Bits kodierte Binärzahl.
der kleinstm&ouml;glichen ganzen Zahl, welche dem unterem Teil des Vierecksignals entsprechen
+
wird. Bestimmen Sie auch die Bin&auml;rdarstellung des gr&ouml;sstm&ouml;glichen Wert des
+
Vierecksignals.
+
  
 
=== Simulation ===
 
=== Simulation ===
  
Compilieren Sie den Block '''waveformGen_tb''' neu. Pr&uuml;fen Sie die Form des
+
{{TaskBox|content=
Vierecksignals.
+
Kompilieren und simulieren Sie den Block '''waveformGen_tb''' neu. Prüfen Sie die Form des
 +
Vierecksignals.}}
  
== Umwandlung von S&auml;gezahn zu Dreieck ==
+
== Umwandlung von Sägezahn zu Dreieck ==
  
Die Umwandlung vom S&auml;gezahnsignal zu einem Dreiecksignal wird gemacht, indem man "den
+
[[Image:SEm_SawtoothToTriangle.png|thumb|Umwandlung von Sägezahn zu Dreieck ]]
oberen Teil der S&auml;gezahn nach unten biegt", wenn der MSB des Signals gleich '1'
+
ist.
+
  
'''Abbildung 4. Umwandlung von S&auml;gezahn zu Dreieck'''
+
Die Umwandlung vom Sägezahnsignal zum Dreiecksignal wird gemacht, indem man "den oberen Teil der Sägezahn nach unten biegt", wenn das MSB des Signals gleich '1' ist.
  
[[Image:sawtoothToTriangle.png]]<br>
 
 
=== VHDL Code ===
 
=== VHDL Code ===
  
Schreiben Sie die VHDL Architektur des Blocks zur Umwandlung des S&auml;gezahnsignals in
+
{{TaskBox|content=
einem Dreiecksignal.
+
Schreiben Sie die VHDL Architektur des Blocks zur Umwandlung des Sägezahnsignals in ein Dreiecksignal.}}
  
 
Dies ist eine kombinatorische Schaltung.
 
Dies ist eine kombinatorische Schaltung.
 
+
Wenn das MSB des Sägezahnsignals gleich '1' ist, invertieren Sie alle Bits des Sägezahnsignals.
Wenn der MSB des S&auml;gezahnsignals gleich '1' ist, invertieren Sie alle Bits des
+
Da das MSB des erzeugten Signals immer auf '0' ist, verwendet man nur die Hälfte des zu Verfügung stehenden Bereichs. Man wird also das erhaltene Signal mit zwei multiplizieren müssen um den ganzen Bereich auszunützen.
S&auml;gezahnsignals.
+
Eine Multiplikation mit 2 entspricht einer Schiebung um ein Bit nach links.
 
+
Es ist am einfachsten ein internes Signal zu definieren, das dem Resultat der ersten Operation entspricht. Dieses wird dann benutzt um den Ausgang zu erzeugen.
Da das erzeugte Signal sein MSB immer auf '0' ist, so verwendet man nur die H&auml;lfte
+
Der Code wird auch besser lesbar, wenn das MSB des Eingangssignals als zusätzliches internes Signal definiert wird.
des zu Verf&uuml;gung stehenden Bereichs. Man wird also das erhaltene Signal mal zwei
+
multiplizieren m&uuml;ssen. Dies entspricht einer Schiebung nach links.
+
 
+
Es wird einfacher, ein internes Signal zu definieren, das dem Resultat des ersten
+
Operation entspricht, und das benutzt wird, um den Ausgang zu erzeugen. Er ist auch besser
+
lesbar, als anderes internes Signal das MSB des Eingangssignals zu definieren.
+
  
 
=== Simulation ===
 
=== Simulation ===
  
Compilieren Sie den Block '''waveformGen_tb''' neu. Pr&uuml;fen Sie die Form des
+
{{TaskBox|content=
Dreiecksignals.
+
Kompilieren und simulieren Sie den Block '''waveformGen_tb''' neu. Prüfen Sie die Form des
 +
Dreiecksignals.}}
  
 
== Umwandlung von Dreieck zu Sinus ==
 
== Umwandlung von Dreieck zu Sinus ==
  
Die Umwandlung von Dreieck zu Sinus kann mit Hilfe einer Wahrheitstabelle (ROM) mit allen
+
[[Image:SEm_TriangleToSine.png|thumb|Umwandlung von Dreieck zu Sinus]]
Sinuswerten erstellt werden. Diese L&ouml;sung, auch wenn sie pr&auml;zis ist, ist kostbar in
+
Material.
+
  
In diesem labor werden wir die Wahl treffen, den Dreiecksignal zu filtern, um nur dessen
+
Die Umwandlung von Dreieck zu Sinus kann mit Hilfe einer Wahrheitstabelle (ROM) mit allen Sinuswerten erstellt werden. Diese Lösung ist zwar präzis, verbraucht aber viele Ressourcen in der programmierbaren Schaltung.
Fundamentalkomponent zu behalten: eine Sinuswelle. Um die Tiefpassarbeit zu vereinfachen,
+
werden wir das Dreiecksignal vorerst in einer Polygonform umwandeln, welche der Sinuswelle
+
n&auml;her steht.
+
  
'''Abbildung 5. Umwandlung von Dreieck zu Sinus'''
+
Für dieses Labor werden wir das Dreiecksignal filtern, um nur dessen Fundamentalkomponente zu behalten: eine Sinuswelle.
 +
Um die Arbeit des Tiefpassfilters zu vereinfachen, werden wir das Dreiecksignal vorerst in eine Polygonform umwandeln, welche der Sinuswelle näher steht.
  
[[Image:triangleToSine.png]]<br>
 
 
=== VHDL Code ===
 
=== VHDL Code ===
  
Schreiben Sie die VHDL Architektur des Blocks zur Umwandlung des Dreiecksignals in einem
+
{{TaskBox|content=
Polygonsignal sowie die des Tiefpassfilters ersten Ordnung.
+
Schreiben Sie die VHDL Architektur des Blocks zur Umwandlung des Dreiecksignals in ein Polygonsignal sowie die des Tiefpassfilters ersten Ordnung.
 +
}}
  
Die Umwandlung von Dreieck nach Polynom f&auml;ngt mit einer Multiplikation mit 1.5 an.
+
Die Umwandlung vom Dreieck zum Polygon fängt mit einer Multiplikation mit 1,5 an.
Dies ben&ouml;tigt ein Signal mit einem zus&auml;tzlichem Bit. Danach werden alle Werte des Signals,
+
Dies benötigt ein Signal mit einem zusätzlichem Bit.
die kleiner sind als 1/8 des Maximalwertes dieser 17-Bit Bin&auml;rzahl, mit diesem Wert
+
Danach werden die Spitzen des Dreiecks "abgeschnitten".
von 1/8 ersetzt: man schneidet was darunter ist. Symmetrisch dazu schneidet man was
+
Dazu werden alle Werte des Signals die kleiner sind als 1/8 des Maximalwertes durch denselben Wert von 1/8 ersetzt.
&uuml;ber 5/8 ist. letzlich wird das Polygonsignal um 1/8 nach unten verschoben. Erinnern
+
Symmetrisch dazu ersetzt man alle Werte über 5/8 des Maximalwertes durch denselben Wert von 5/8.
wir, dass die Werte 1/8 und 5/8 zur vollen Skala (Full Scale, FS) des
+
Letztlich wird das Polygonsignal um 1/8 nach unten verschoben um den Minimalwert bei 0 zu haben.
17-Bit Signals und nicht zur Amplitude des DreieckSignals zu nehmen sind.
+
  
Die Multiplikation mit 1.5 wird durch eine Schiebung und eine Addition erstellt.
+
{{WarningBox|content=
Das Resultat ben&ouml;tigt ein Bit mehr als die Originalzahl. Jedoch kann nach der Schiebung nach
+
Es ist zu beachten, dass die Werte 1/8 und 5/8 der vollen Skala (Full Scale, FS) des 17-Bit Signals
unten dieses zus&auml;tsliche Bit vernachl&auml;ssigt werden, und das Ausgangssignal auf derselben
+
und nicht der Amplitude des Dreiecksignals zu entnehmen sind.
Anzahl an Bits wie der Eingang codiert sein.
+
}}
  
Die Tiefpassfilterung wird mit Hilfe eines Integrators (aus einem Akkumulator erstellt)
+
Die Multiplikation mit 1,5 wird durch eine Schiebung und eine Addition erstellt.
mit D&auml;mpfung. In jeder Taktperiode wird dem Akkumulatorwert der Wert des Eingangs zuaddiert
+
Das Resultat benötigt ein Bit mehr als die Originalzahl.
(Integration), und der um eine gewisse Anzahl Bits verschobene Wert des Akkumulators
+
Jedoch kann nach der Schiebung um 1/8 nach unten dieses zusätzliche Bit vernachlässigt werden und das Ausgangssignal auf derselben Anzahl an Bits wie der Eingang kodiert werden.
substrahiert (D&auml;mpfung). Die Anzahl Bits der Verschiebung gibt die Schanittfrequenz. Wird
+
diese Zahl um 1 gr&ouml;sser so wird die Schnittfrequenz durch 2 geteilt.
+
  
Der Akkumulator braucht eine Anzahl Bits gleich die Anzahl Bits des Eingangs plus die
+
Die Tiefpassfilterung wird mit Hilfe eines Integrators (ein Akkumulator) mit Dämpfung erstellt.
Anzahl Bits der Verschiebung. Als Ausgang sollen die MSBs des Akkumulators genommen
+
In jeder Taktperiode wird zum Akkumulatorwert der Wert des Eingangsignals hinzu addiert (Integration).
werden.
+
Gleichzeitig wird der um eine gewisse Anzahl Bits verschobene Wert des Akkumulators subtrahiert (Dämpfung).
 +
Die Anzahl Bits der Verschiebung ergeben die Schnittfrequenz.
 +
Wird diese Zahl um 1 vergrössert, so wird die Schnittfrequenz durch 2 geteilt.
 +
 
 +
{{WarningBox|content=
 +
Die Anzahl Bits der Verschiebung ist ein generischer Parameter des Blocks.
 +
}}
 +
 
 +
Der Akkumulator braucht gleichviel Bits wie das Eingangssignal plus die Anzahl Bits der Verschiebung.
 +
Als Ausgang sollen die MSBs des Akkumulators genommen werden.
  
 
=== Simulation ===
 
=== Simulation ===
  
Compilieren Sie uns simulieren Sie den Block '''waveformGen_tb''' neu.
+
{{TaskBox|content=
Pr&uuml;fen Sie die Form des Polygonsignals.
+
Kompilieren und simulieren Sie den Block '''waveformGen_tb''' neu. Prüfen Sie die Form des Polygonsignals.}}
 +
 
 +
{{TaskBox|content=
 +
Ändern Sie die Anzahl Bits der Verschiebung des Tiefpassfilters, bis ein "passendes"Signal erzeugt wird.}}
 +
 
 +
{{navNamed|left=SEm/labore/00_installation|left_name=00 Installation|up=SEm/labore|up_name=Anleitung auf Deutsch|right=SEm/labore/02_interpolation|right_name=02 Interpolation}}
  
&Auml;ndern Sie die Anzahl Bits der Vershiebung des Tiefpassfilters, bis ein "passendes"
+
[[Category:Bachelor]][[Category:SEm]][[Category:Deutsch]]
Signal erzeugt wird.
+

Latest revision as of 12:33, 26 March 2018

Contents

Funktionsgenerator

Einleitung

In diesem Labor werdet ihr das Schreiben von VHDL-Code für kombinatorische und sequenzielle Blöcke lernen. Dies am Beispiel eines Funktionsgenerator welche folgende Signale erzeugt:

  • ein Sägezahnsignal, sawtooth,
  • ein Vierecksignal, square,
  • ein Dreiecksignal, triangle,
  • ein Sinuswellensignal, sine.

Alle diese Signale sind als 16-Bit Binärzahlen ohne Vorzeichen dargestellt. Die Schaltung befindet sich in der Bibliothek WaveformGenerator, die Testbank dazu in der Bibliothek WaveformGenerator_test. Das Zeichnungprogramm wir mit Hilfe des Skripts sineGen.bat gestartet.


Funktionsgenerator

Sägezahnsignalgenerator

Sägezahnsignalgenerator

Der Sägezahnsignalgenerator wird durch einen Zähler erstellt, welcher um und um zählt. Das Eingangssignal step erlaubt es, die Frequenz des erzeugten Sägezahnsignals zu steuern. Bei jeder steigenden Flanke des clock und wenn en = '1' addiert der Zähler den Wert von step zu seinem eigenem. Somit zählt er um so schneller je grösser der Wert von step ist.

VHDL Code

View-pim-tasks.png

Schreiben Sie die VHDL Architektur des Sägezahnsignalgenerators.

Dies ist eine synchrone sequenzielle Schaltung.


View-pim-tasks.png

Betrachten Sie die Entity des Sägezahnsignalgenerators, um die Typen der Ein- und Ausgangssignale zu erfahren. Gehen Sie durch die Bibliothek numeric_std, um eine Idee der zur Verfügung stehenden Funktionen für den Typ unsigned zu erhalten.

Dieser Block hat einen generischen Parameter (generic): bitNb. Dieser Parameter ist sowohl für die Entity wie auch für die zu schreibende Architektur definiert.

Dialog-warning.png

sawtooth ist ein Ausgangssignal und ihm kann deshalb nur ein Wert zugewiesen werden. Es ist nicht möglich, seinen Wert zurückzulesen, um ihm den Wert von step zu addieren. Deshalb muss man ein internes Signal definieren, welches gelesen und geschrieben werden kann. Am Ende wird das interne Signal auf das Ausgangssignal zugewiesen.

Simulation

View-pim-tasks.png

Berechnen Sie die Periode des Sägezahnsignals bei einer Taktfrequenz von 66 MHz, einem 16-Bit Zähler und einem Wert von step gleich 8.


View-pim-tasks.png

Geben Sie die generelle Formel der Frequenz des erzeugten Signals als Funktion der Taktfrequenz, der Anzahl Bits des Zählers und des Werts des Schrittes.


View-pim-tasks.png

Kompilieren und simulieren Sie den Block waveformGen_tb. Prüfen Sie die Funktionalität des Sägezahnsignalgenerators.

Umwandlung von Sägezahn zu Viereck

Umwandlung von Sägezahn zu Viereck

Das Sägezahnsignal wird in ein Viereck umgewandelt indem nur das MSBs des Sägezahnsignals betrachtet wird. Dennoch soll das erzeugte Vierecksignal auf 16 Bit kodiert sein.

VHDL Code

View-pim-tasks.png

Bestimmen Sie den Wert der kleinstmöglichen ganzen Zahl, welche dem unterem Teil des Vierecksignals entsprechen wird. Bestimmen Sie auch die Binärdarstellung des grösstmöglichen Werts des Vierecksignals.


View-pim-tasks.png

Schreiben Sie die VHDL Architektur des Blocks zur Umwandlung des Sägezahnsignals in ein Vierecksignal.

Dies ist eine kombinatorische Schaltung. Das Ausgangssignal ist eine auf 16 Bits kodierte Binärzahl.

Simulation

View-pim-tasks.png

Kompilieren und simulieren Sie den Block waveformGen_tb neu. Prüfen Sie die Form des Vierecksignals.

Umwandlung von Sägezahn zu Dreieck

Umwandlung von Sägezahn zu Dreieck

Die Umwandlung vom Sägezahnsignal zum Dreiecksignal wird gemacht, indem man "den oberen Teil der Sägezahn nach unten biegt", wenn das MSB des Signals gleich '1' ist.

VHDL Code

View-pim-tasks.png

Schreiben Sie die VHDL Architektur des Blocks zur Umwandlung des Sägezahnsignals in ein Dreiecksignal.

Dies ist eine kombinatorische Schaltung. Wenn das MSB des Sägezahnsignals gleich '1' ist, invertieren Sie alle Bits des Sägezahnsignals. Da das MSB des erzeugten Signals immer auf '0' ist, verwendet man nur die Hälfte des zu Verfügung stehenden Bereichs. Man wird also das erhaltene Signal mit zwei multiplizieren müssen um den ganzen Bereich auszunützen. Eine Multiplikation mit 2 entspricht einer Schiebung um ein Bit nach links. Es ist am einfachsten ein internes Signal zu definieren, das dem Resultat der ersten Operation entspricht. Dieses wird dann benutzt um den Ausgang zu erzeugen. Der Code wird auch besser lesbar, wenn das MSB des Eingangssignals als zusätzliches internes Signal definiert wird.

Simulation

View-pim-tasks.png

Kompilieren und simulieren Sie den Block waveformGen_tb neu. Prüfen Sie die Form des Dreiecksignals.

Umwandlung von Dreieck zu Sinus

Umwandlung von Dreieck zu Sinus

Die Umwandlung von Dreieck zu Sinus kann mit Hilfe einer Wahrheitstabelle (ROM) mit allen Sinuswerten erstellt werden. Diese Lösung ist zwar präzis, verbraucht aber viele Ressourcen in der programmierbaren Schaltung.

Für dieses Labor werden wir das Dreiecksignal filtern, um nur dessen Fundamentalkomponente zu behalten: eine Sinuswelle. Um die Arbeit des Tiefpassfilters zu vereinfachen, werden wir das Dreiecksignal vorerst in eine Polygonform umwandeln, welche der Sinuswelle näher steht.

VHDL Code

View-pim-tasks.png

Schreiben Sie die VHDL Architektur des Blocks zur Umwandlung des Dreiecksignals in ein Polygonsignal sowie die des Tiefpassfilters ersten Ordnung.

Die Umwandlung vom Dreieck zum Polygon fängt mit einer Multiplikation mit 1,5 an. Dies benötigt ein Signal mit einem zusätzlichem Bit. Danach werden die Spitzen des Dreiecks "abgeschnitten". Dazu werden alle Werte des Signals die kleiner sind als 1/8 des Maximalwertes durch denselben Wert von 1/8 ersetzt. Symmetrisch dazu ersetzt man alle Werte über 5/8 des Maximalwertes durch denselben Wert von 5/8. Letztlich wird das Polygonsignal um 1/8 nach unten verschoben um den Minimalwert bei 0 zu haben.

Dialog-warning.png

Es ist zu beachten, dass die Werte 1/8 und 5/8 der vollen Skala (Full Scale, FS) des 17-Bit Signals und nicht der Amplitude des Dreiecksignals zu entnehmen sind.

Die Multiplikation mit 1,5 wird durch eine Schiebung und eine Addition erstellt. Das Resultat benötigt ein Bit mehr als die Originalzahl. Jedoch kann nach der Schiebung um 1/8 nach unten dieses zusätzliche Bit vernachlässigt werden und das Ausgangssignal auf derselben Anzahl an Bits wie der Eingang kodiert werden.

Die Tiefpassfilterung wird mit Hilfe eines Integrators (ein Akkumulator) mit Dämpfung erstellt. In jeder Taktperiode wird zum Akkumulatorwert der Wert des Eingangsignals hinzu addiert (Integration). Gleichzeitig wird der um eine gewisse Anzahl Bits verschobene Wert des Akkumulators subtrahiert (Dämpfung). Die Anzahl Bits der Verschiebung ergeben die Schnittfrequenz. Wird diese Zahl um 1 vergrössert, so wird die Schnittfrequenz durch 2 geteilt.

Dialog-warning.png

Die Anzahl Bits der Verschiebung ist ein generischer Parameter des Blocks.

Der Akkumulator braucht gleichviel Bits wie das Eingangssignal plus die Anzahl Bits der Verschiebung. Als Ausgang sollen die MSBs des Akkumulators genommen werden.

Simulation

View-pim-tasks.png

Kompilieren und simulieren Sie den Block waveformGen_tb neu. Prüfen Sie die Form des Polygonsignals.


View-pim-tasks.png

Ändern Sie die Anzahl Bits der Verschiebung des Tiefpassfilters, bis ein "passendes"Signal erzeugt wird.


Navigation
Arrow left.gif 00 Installation Arrow up.gif Anleitung auf Deutsch 02 Interpolation Arrow right.gif

Personal tools
Namespaces
Variants
Actions
Navigation
Modules / Projects
Browse
Toolbox