|
Zurück zur Homepage |
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.
|
Zurück zur Homepage |
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:
Zu Begin des Process
Statements, unmittelbar nach dem ersten
wait
, müßten dann die folgenden Zeilen eingefügt
werden:
Weitere sinnvolle Erweiterungsmöglichkeiten konnten nicht gefunden werden.
|
Zurück zur Homepage |
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:
FLAG
-
Signals inkrementiert?FLAG
- Zyklen korrekt
zurückgesetzt (normalerweise 2204)?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?Die hier aufgezählten Kriterien sind, sofern sie sich nicht auf die gesamte Simulationszeit beziehen, in der Testbench entsprechend dokumentiert.
|
Zurück zur Homepage |
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.
FLAG
- Signals inkrementiert. Dieses
Verhalten änderte sich während des gesamten Testes nicht.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: 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.
FLAG
- Zyklen (normalerweise 2204)
korrekt zurückgesetzt. Siehe dazu Abbildung 1.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 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.
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.
|
Zurück zur Homepage |