VHDL Projekt 12 - Entwicklerdokumentation

 

Gliederung

  1. Arbeitsweise des Bausteins
  2. Mögliche Erweiterungen des Bausteins
  3. Testumgebung
  4. Testergebnisse


Projektüberblick VHDL Frames anzeigen
Zurück zur Homepage

Arbeitsweise des Bausteins

Im folgenden wird näher auf die interne Arbeitsweise des Bausteins eingegangen. Die Benennung der Register und Signalleitungen orientiert sich dabei am VHDL - Quelltext. Dieser wurde mit der Entwicklungsumgebung Active VHDL 3.2 von Aldec erstellt. Um näheres über die Funktion des Bausteins oder seine Einsatzumgebung zu erfahren verwenden Sie bitte die Benutzerdokumentation.

Um die lang- bzw. kurzfristigen Maxima zu bestimmen und auszugeben werden vier interne Register, mit einer Breite von je vier Bit, zur Speicherung von Zwischenwerten verwendet. Alle Register werden bei der Inbetriebnahme des Bausteins mit "0000" initialisiert. Die Register im einzelnen sind:

max_left Speicherung von Werten für das kurzfristige Maxima für den linken Kanal
max_right Speicherung von Werten für das kurzfristige Maxima für den rechten Kanal
peak_left Speicherung von Werten für das langfristige Maxima für den linken Kanal
peak_right Speicherung von Werten für das langfristige Maxima für den rechten Kanal

Um die notwendigen Zeitmessungen zu realisieren werden insgesamt 3 Zähler verwendet. Alle Zähler werden mit 0 initialisiert. Die einzelnen Zähler sind:

count_max Zähler für die Bestimmung des Zeitraumes von 0,05 Sekunden
count_peak_l Zähler für den linken Kanal ,der mißt, wie lange der zwischengespeicherte Wert für die langfristigen Maxima nicht verändert wurde.
count_peak_r Zähler für den rechten Kanal ,der mißt, wie lange der zwischengespeicherte Wert für die langfristigen Maxima nicht verändert wurde.

Um die Dauer von 0,05s messen zu können werden die steigenden Flanken des FLAG Signals gezählt. Da dieses Signal eine Frequenz von 44,1 kHz aufweist, läßt sich dieser Zeitraum wie folgt ermitteln: Der Zähler count_max hat den Startwert 0. Mit jeder fallenden Flanke des FLAG Signals wird der Zähler inkrementiert und zwar so lange bis er den Wert 2204 annimmt (1/44100s * 2205 = 0,05s), dann wird er auf 0 zurückgesetzt. Immer wenn der Zähler count_max den Wert 0 annimmt sind dann 0,05 Sekunden vergangen.

Um die kurzfristigen Maxima zu bestimmen werden bei jeder fallenden Flanke des Signals FLAG die Werte von LOG_R und LOG_L eingelesen und jeweils mit dem im entsprechenden Register zwischengespeicherten Wert verglichen. Ist der zwischengespeicherte Wert kleiner als der neu eingelesene, so wird er durch den neuen Wert überschrieben. Nimmt der Zähler count_max den Wert 0 an, so wird der Inhalt des Registers ausgegeben und das Register auf "0000" zurückgesetzt. Die Ausgabe erfolgt für die kurzfristigen Maxima des rechten Kanals über MAX_R bzw. über MAX_L für die des linken Kanals.

Wurden noch keine Werte von LOG_R und LOG_L eingelesen, so haben die Register max_left und max_right den Wert "0000".

Die langfristigen Maxima werden unmittelbar vor der Ausgabe der kurzfristigen Maxima bestimmt. Immer wenn der Zähler count_max den Wert 0 annimmt, werden dazu die zwischengespeicherten Werte für die langfristigen Maxima mit den zwischengespeicherten Werten der kurzfristigen Maxima verglichen. Dies geschieht für den linken und den rechten Kanal getrennt. Ist der Pegelwert des kurzfristigen Maxima größer -12 db und auch größer oder gleich dem zwischengespeicherten Wert für das entsprechende langfristige Maxima, so wird der zwischengespeicherte Wert für das langfristige Maxima durch den Wert des kurzfristigen Maximums ersetzt.

Um zu messen wie lange die zwischengespeicherten Werte für die langfristigen Maxima nicht verändert wurden werden die Zähler (count_peak_l und count_peak_r) immer dann, wenn der Zähler count_max den Wert 0 annimmt, inkrementiert. Der Startwert der beiden Zähler ist 0. Die Zähler werden immer dann auf 0 zurückgesetzt, wenn der zwischengespeicherte Wert für das entsprechende langfristigen Maxima geändert wird. Beide Zähler sind völlig unabhängig von einander.

Der Zähler wird immer auch dann zurückgesetzt, wenn der Wert des Zählers 39 ist (40 * 0,05s = 2s). Gleichzeitig wird der zwischengespeicherte Wert für das entsprechende langfristigen Maxima zurückgesetzt. Dazu wird zwischengespeicherte Wert für das langfristigen Maxima durch den Wert des kurzfristigen Maximums für den entsprechenden Kanal ersetzt, sofern der Pegelwert des kurzfristigen Maximums größer -12 db ist, andernfalls wird der zwischengespeicherte Wert für das langfristige Maxima auf "0000" gesetzt.

Wurde noch kein Vergleich durchgeführt, so haben die zwischengespeicherte Wert für das langfristige Maxima den Wert "0000". Die Ausgabe der Werte für die langfristigen Maxima erfolgt zeitgleich mit der Ausgabe der Werte für die kurzfristigen Maxima über PEAK_R, für den rechten, und PEAK_L, für den linken Kanal.

Alle Ausgangssignale des Bausteins werden bei der Inbetriebnahme der Schaltung mit "0000" initialisiert, um zu verhindern das ungültige Daten an den Ausgängen anliegen. Eine detaillierte tabellarische Beschreibung der Ein- und Ausgangssignale des Bausteins findet sich in der Benutzerdokumentation unter der Rubrik Schnittstellen.

Wirklich sinnvolle Alternativen zu der hier beschriebenen Arbeitsweise konnten nicht gefunden werden.



Projektüberblick VHDL Frames anzeigen Zum Seitenanfang
Zurück zur Homepage

Mögliche Erweiterungen des Bausteins

Eine Erweiterungsmöglichkeit für diese Schaltung könnte darin bestehen, einen zusätzlichen Eingang LIMIT zu implementieren, über den die Mindestgröße der Spitzenwerte gesetzt werden kann.

Dieser Eingang müßte eine Breite von 4 Bit aufweisen. Um auf ein zusätzliches Set- oder Reset - Signal verzichten zu können, hat dieses Signal standardmäßig den Wert "0000". Nimmt das Signal einen anderen Wert an, so wird dieser Wert als neuer Mindestwert übernommen. Intern wird dieser Wert in einem Register limit_s gespeichert. Es könnte entweder mit dem Wert "0000" initialisiert werden, was aber den Nachteil hat, daß das Register bei Inbetriebnahme der Schaltung immer initialisiert werden muß, oder man sieht einen Standardwert vor.

Eine Implementierungsmöglichkeit könnte sich wie folgt gestalten: In der arcitecture - Definition, müßte zunächst das neue Register mittels signal deklariert weden:

Signal limit_s: STD_LOGIC_VECTOR (3 downto 0):= "1000";

Zu Begin des Process Statements, unmittelbar nach dem ersten wait, müßten dann die folgenden Zeilen eingefügt werden:

if LIMIT /= "0000" then
limit_s:= LIMIT;
end if;

wait for 5 ns;

Weitere sinnvolle Erweiterungsmöglichkeiten konnten nicht gefunden werden.



Projektüberblick VHDL Frames anzeigen Zum Seitenanfang
Zurück zur Homepage

Testumgebung

Sowohl die Implementierung, als auch die Testumgebung wurden mit Active VHDL 3.2 von Aldec geschrieben. Auch die Testbench - Läufe fanden komplett unter dieser Umgebung statt. Als Testplattform diente ein IBM - kompatibler Rechner mit Windows NT 4.0. Eine Hardwareform des Bausteins wurde weder erzeugt noch getestet.

Um den Simulationsprozeß zu vereinfachen wurde an der Implementierung eine Modifikation vorgenommen. Damit die Simulation schneller ablief und einigermaßen übersichtlich blieb, wurde der Zähler count_max in der modifizierten Form der Implementierung schon nach 16 FLAG - Zyklen zurückgesetzt, statt nach 2204. Trotzdem umfaßt die Simulation noch etwa 800 FLAG - Zyklen.

Neben den Eingangs- und Ausgangssignalen des Spitzenwertdetektors wurden auch die Werte seiner internen Zähler in die Waveform Datei ausgegeben.

Download der modifizierten Testbench

Die folgenden Problemfälle wurden getestet:

  1. Werden die Zähler bei jeder steigenden Flanke des FLAG - Signals inkrementiert?
  2. Werden die zwischengespeicherten Werte für die kurzfristigen Maxima durch einen größeren Eingangswert überschrieben? Ist das auch der Fall, wenn dieser größeren Eingangswert erst einen Zyklus vor der Ausgabe oder während der Ausgabe anliegt?
  3. Werden die zwischengespeicherten Werte und der Zähler für die kurzfristigen Maxima nach 16 FLAG - Zyklen korrekt zurückgesetzt (normalerweise 2204)?
  4. Werden die zwischengespeicherten Werte für die langfristigen Maxima nach 16 FLAG - Zyklen durch einen größeren oder gleich großen Wert bei den kurzfristigen Maxima überschrieben? Wird der Zähler in diesen Fall zurückgesetzt , so daß er den Wert 0 erhält?
  5. Werden die zwischengespeicherten Werte für die langfristigen Maxima nachdem sie 2s lang nicht verändert wurden korrekt zurückgesetzt?
  6. Verfügen die zwischengespeicherten Werte für die langfristigen Maxima immer über einen Wert mit Absolutbetrag größer -12db oder ist der Wert "0000"?
  7. Verfügen die Ausgangssignale immer über definierte Werte?

Die hier aufgezählten Kriterien sind, sofern sie sich nicht auf die gesamte Simulationszeit beziehen, in der Testbench entsprechend dokumentiert.



Projektüberblick VHDL Frames anzeigen Zum Seitenanfang
Zurück zur Homepage

Testergebnisse

In diesem Abschnitt werden die Ergebnisse des Testes kurz dargelegt. Als Grundlage für die korrekte Arbeitsweise des Bausteins dienten die von der Entwicklungsumgebung Active VHDL 3.2 von Aldec erzeugten Waveforms. Im folgenden werden die Punkte aus dem vorhergehenden Abschnitt schrittweise abgearbeitet. Die Spitzenwerte wurden ab einem Wert größer "1000" bestimmt.

  1. Wie in Abbildung 1 zu erkennen werden die Zähler genau mit der steigenden Flanke des FLAG - Signals inkrementiert. Dieses Verhalten änderte sich während des gesamten Testes nicht.
  2. Lagen an LOG_R beziehungsweise LOG_L größere Werte an, als in den entsprechenden Registern zwischengespeichert waren, so wurde der Inhalt der Register korrekt ersetzt, auch dieser größere Wert erst einen Zyklus vor der Ausgabe anlag. Liegt ein solcher Maximalwert genau während der Ausgabe an, so wird er korrekterweise mit dem nächsten Ausgabezyklus ausgegeben. Siehe dazu Abbildung 1.
    Abbildung 1

    Abbildung 1: Wie in dieser Abbildung zu erkennen liegt im Zyklus vor der Ausgabe der Wert 1001 an LOG_R an. Das ist der größte Wert der in den letzten 16 FLAG - Zyklen auftrat, folglich wird er im nächsten FLAG - Zyklus über MAX_R ausgegeben.

    Während der Ausgabe liegt an LOG_L der Wert "1111" an. Er wird erst mit der nächsten Ausgabe über MAX_L ausgegeben.

  3. Die zwischengespeicherten Werte und der Zähler für die kurzfristigen Maxima nach 16 FLAG - Zyklen (normalerweise 2204) korrekt zurückgesetzt. Siehe dazu Abbildung 1.
  4. Die zwischengespeicherten Werte für die langfristigen Maxima werden nach 16 FLAG - Zyklen (normalerweise 2204) durch einen größeren oder gleich großen Wert bei den kurzfristigen Maxima überschrieben (siehe Abbildung 2). Der Zähler wird in diesen Fall auf den Wert 0 zurückgesetzt.
    Abbildung 1

    Abbildung 2: Der zwischenspeicherte Spitzenwert des linken Kanals wird durch einen größeren Wert überschrieben. Der zwischenspeicherte Spitzenwert des rechten Kanals wird hingegen durch einen gleich großen ersetzt, was daran zu erkennen ist, daß sich das Signal PEAK_R nicht verändert. Beide Zähler werden korrekt zurückgesetzt.

  5. Die zwischengespeicherten Werte für die langfristigen Maxima werden, nachdem der entsprechende Zähler den Wert 39 angenommen hatte, korrekt zurückgesetzt, siehe Abbildung 3.
    Abbildung 1

    Abbildung 3: Der zwischenspeicherte Spitzenwert des rechten Kanals wurde in dem entsprechenden Zeitraum nicht mehr verändert. Daher wird er gelöscht und der entsprechende Zähler auf Null gesetzt. Das kurzfristige Maxima des rechten Kanals aber größer "1000", daher wird dieser Wert als neuer Spitzenwert übernommen.

  6. Die zwischengespeicherten Werte für die langfristigen Maxima verfügten während des gesamten Testes immer über einen Wert größer "1000" oder aber ihr Wert war "0000".
  7. Die Ausgangssignale verfügten während des gesamten Testes immer definierte Werte.


Projektüberblick VHDL Frames anzeigen Zum Seitenanfang
Zurück zur Homepage