SEm/labore/01 generator

From FSI
Revision as of 17:45, 6 May 2013 by Guo (Talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

Contents

Funktionsgenerator

Einleitung

In diesem Labor werden wir das Schreiben Von VHDL-Code von kombinatorischen und sequenziellen Blöcken illustrieren, durch die Erstellung eines digitalen Funktionsgenerator.

Abbildung 1. Funktionsgenerator

File:WaveformGen.png
Der Generator erzeugt

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

All diese Signale sind auf 16 Bits als Binärzahlen (immer positiv) dargestellt.

Die Schaltung befindet sich in der Library WaveformGenerator, die Testbank in der Library WaveformGenerator_test.

Sägezahnsignalgenerator

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

Abbildung 2. Sägezahnsignalgenerator

File:SawtoothGen.png

VHDL Code

Schreiben Sie die VHDL Architektur des Sägezahnsignalgenerators.

Dies ist eine synchrone sequenzielle Schaltung.

Betrachten Sie die Entity des Sägezahnsignalgenerators, um die Typen der Ein- und Ausgangssignalen zu kennen. Gehen Sie durch die Library numeric_std, um eine Idee der zur Verfügung stehenden Funktion für den Typ unsigned zu haben.

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

Aufgepasst: das Ausgangssignal, sawtooth, kann nur zugewiesen werden. Es kann nicht zurückgelesen werden, um ihm den Wert von step zu addieren. Deshalb muss man ein internes Signal definieren. Dieses kann gelesen und geschrieben werden, und es wird letzlich auf dem Ausgangsport copiert.

Simulation

Bestimmen Sie die Periode des Sägezahnsignals mit 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 Taktfrequenz, der Anzahl Bits des Zählers und des Werts des Schrittes.

Compilieren Sie den Block waveformGen_tb. Prüfen Sie die Funktionalität des Sägezahnsignalgenerators.

Umwandlung von Sägezahn zu Viereck

Die Umwandlung vom Sägezahnsignal zu einem Viereck wird durch das Betrachten des MSBs des Sägezahnsignals. Doch wird das erzeugte Signal auf 16 Bit codiert.

Abbildung 3. Umwandlung von Sägezahn zu Viereck

File:SawtoothToSquare.png

VHDL Code

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

Dies ist eine kombinatorische Schaltung.

Der Ausgangssignal ist eine auf 16 Bits codierte Binärzahl. 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 Wert des Vierecksignals.

Simulation

Compilieren Sie den Block waveformGen_tb neu. Prüfen Sie die Form des Vierecksignals.

Umwandlung von Sägezahn zu Dreieck

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

Abbildung 4. Umwandlung von Sägezahn zu Dreieck

File:SawtoothToTriangle.png

VHDL Code

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

Dies ist eine kombinatorische Schaltung.

Wenn der MSB des Sägezahnsignals gleich '1' ist, invertieren Sie alle Bits des Sägezahnsignals.

Da das erzeugte Signal sein MSB immer auf '0' ist, so verwendet man nur die Hälfte des zu Verfügung stehenden Bereichs. Man wird also das erhaltene Signal mal zwei multiplizieren mü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

Compilieren Sie den Block waveformGen_tb neu. Prüfen Sie die Form des Dreiecksignals.

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, auch wenn sie präzis ist, ist kostbar in Material.

In diesem labor werden wir die Wahl treffen, den Dreiecksignal zu filtern, um nur dessen Fundamentalkomponent zu behalten: eine Sinuswelle. Um die Tiefpassarbeit zu vereinfachen, werden wir das Dreiecksignal vorerst in einer Polygonform umwandeln, welche der Sinuswelle näher steht.

Abbildung 5. Umwandlung von Dreieck zu Sinus

File:TriangleToSine.png

VHDL Code

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

Die Umwandlung von Dreieck nach Polynom fängt mit einer Multiplikation mit 1.5 an. Dies benötigt ein Signal mit einem zusätzlichem Bit. Danach werden alle Werte des Signals, die kleiner sind als 1/8 des Maximalwertes dieser 17-Bit Binärzahl, mit diesem Wert von 1/8 ersetzt: man schneidet was darunter ist. Symmetrisch dazu schneidet man was über 5/8 ist. letzlich wird das Polygonsignal um 1/8 nach unten verschoben. Erinnern wir, dass die Werte 1/8 und 5/8 zur vollen Skala (Full Scale, FS) des 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. Das Resultat benötigt ein Bit mehr als die Originalzahl. Jedoch kann nach der Schiebung nach unten dieses zusätsliche Bit vernachlässigt werden, und das Ausgangssignal auf derselben Anzahl an Bits wie der Eingang codiert sein.

Die Tiefpassfilterung wird mit Hilfe eines Integrators (aus einem Akkumulator erstellt) mit Dämpfung. In jeder Taktperiode wird dem Akkumulatorwert der Wert des Eingangs zuaddiert (Integration), und der um eine gewisse Anzahl Bits verschobene Wert des Akkumulators substrahiert (Dämpfung). Die Anzahl Bits der Verschiebung gibt die Schanittfrequenz. Wird diese Zahl um 1 grösser so wird die Schnittfrequenz durch 2 geteilt.

Der Akkumulator braucht eine Anzahl Bits gleich die Anzahl Bits des Eingangs plus die Anzahl Bits der Verschiebung. Als Ausgang sollen die MSBs des Akkumulators genommen werden.

Simulation

Compilieren Sie uns simulieren Sie den Block waveformGen_tb neu. Prüfen Sie die Form des Polygonsignals.

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

Personal tools
Namespaces
Variants
Actions
Navigation
Modules / Projects
Browse
Toolbox