VHDL Projekt 12 - Spezifikation

 

Gliederung

  1. Beschreibung des Lösungsansatzes
  2. Mögliche Alternativen
  3. Arbeitsumgebung
  4. Pseudocode
  5. Testumgebung


Projektüberblick VHDL Frames anzeigen
Zurück zur Homepage

Beschreibung des Lösungsansatzes

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. Das sind:

  1. Jeweils ein Register für den linken und den rechten Kanal für die Speicherung von Werten für das kurzfristige Maxima.
  2. Jeweils ein Register für den linken und den rechten Kanal für die Speicherung von Werten für das langfristige Maxima.

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 zwischengespeicherten Wert verglichen. Ist der zwischengespeicherte Wert kleiner als der neu eingelesene, so wird er durch den neuen Wert überschrieben. Nach 0,05 Sekunden wird der Wert 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 den Wert "0000".

Um die langfristigen Maxima zu bestimmen werden nach jeweils 0,05s, unmittelbar vor der Ausgabe der kurzfristigen Maxima, die zwischengespeicherten Werte für die langfristigen Maxima mit den Werten der kurzfristigen Maxima verglichen (jeweils 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.

Wurde der zwischengespeicherte Wert für das langfristige Maxima eines Kanals seit 2s nicht ersetzt, so wird er 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.

Für die notwendigen Zeitmessungen werden insgesamt 3 Zähler verwendet, das sind:

  1. Ein Zähler für die Bestimmung der 0,05 Sekunden.
  2. Jeweils ein Zähler für den linken und den rechten Kanal ,welcher die Zeit mißt, in welcher der zwischengespeicherte Wert des entsprechenden Kanals nicht verändert wurde.

Um die Dauer von 0,05s messen zu können werden die fallenden 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 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 den Wert 0 annimmt sind dann 0,05 Sekunden vergangen.

Um die Zeit zu messen die die zwischengespeicherten Werte für die langfristigen Maxima nicht verändert wurden werden die Zähler (für den linken und den rechten Kanal) immer dann, wenn der Zähler für die 0,05 s den Wert 0 annimmt, inkrementiert. Der Startwert der beiden Zähler ist 0. Der Zähler wird immer dann zurückgesetzt (die Zähler sind unabhängig von einander) 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 (siehe oben). Der Zähler wird aber immer auch dann zurückgesetzt, wenn der zwischengespeicherte Wert für das entsprechende langfristigen Maxima geändert wird.



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

Mögliche Alternativen

Die Aufgabenstellung definiert den Lösungsweg bereits relativ genau. Es wäre allerdings möglich die Zeitmessung über einen internen Timer durchzuführen. Dies hätte unter Umständen zwar den Vorteil einer höheren Genauigkeit bei der Zeitmessung wäre aber mit einem unverhältnismäßigen Mehraufwand bei der Implementierung verbunden. Insbesondere ist es sehr schwierig den Timer mit dem Flag Signal zu synchronisieren.



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

Arbeitsumgebung

Die Implementierung erfolgt in ALDEC Active VHDL Version 3.2. unter Windows NT 4.0 mit ServicePack 4. Es steht ein IBM-kompatibler PC mit K6-2 Prozessor von AMD mit 300MHz und einem Hauptspeicher von 64MB sowie ein Notebook mit PII-266 und 64MB zur Verfügung.



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

Pseudocode

count_max := 0                 // Zähler für die 0,05s
count_peak_l := 0              // Zähler für langfristige Maxima links
count_peak_r := 0              // Zähler für langfristige Maxima rechts
peak_left, peak_right := 0000  // 4 Bit Register für die langfristigen Maxima
max_left,  max_rigth  := 0000  // 4 Bit Register für die kurzfristigen Maxima

Warte bis FLAG == 0

Wenn count_max == 0
{
Wenn (max_left > peak_left) UND (max_left > -12db)
{
count_peak_l = 0
peak_left = max_left
}

Wenn (max_right > peak_right) UND (max_right > -12db)
{
count_peak_r = 0
peak_right = max_right
}

MAX_L = max_left
MAX_R = max_right

max_left = 0000
max_right = 0000

PEAK_L = peak_left
PEAK_R = peak_right
}

Wenn LOG_L > max_left
{
max_left = LOG_L
}

Wenn LOG_R > max_right
{
max_right = LOG_R
}

Wenn count_max == 2204 then
{
count_max = 0
count_peak_l ++
count_peak_r ++
}
Sonst
{
Wenn count_peak_l == 40
{
count_peak_l = 0
peak_left = 0000
}

Wenn count_peak_r == 40
{
count_peak_r = 0
peak_right = 0000
}

count_max ++
}


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

Testumgebung

Der Test der Implementierung erfolgt mittels eines Testbenches in ALDEC Active VHDL Version 3.2. Um Übersichtlichkeit der auszugebenden Waveforms zu erhöhen und den Rechenaufwand für die Simulation zu verringern wird der Zähler für die kurzfristigen Maxima so modifiziert das er schon nach 16 steigenden Flanken des FLAG Signals zurückgesetzt wird.

Mittels geeigneter Testdatensätze wird dabei überprüft:

  1. Ob die Zähler korrekt erhöht werden.
  2. Ob die zwischengespeicherten Werte für die kurzfristigen Maxima durch einen größeren Eingangswert überschrieben werden. Auch wenn dieser erst einen Zyklus vor der Ausgabe oder während der Ausgabe anliegt.
  3. Ob die zwischengespeicherten Werte und der Zähler für die kurzfristigen Maxima nach 0,05s korrekt zurückgesetzt werden.
  4. Ob die zwischengespeicherten Werte für die langfristigen Maxima nach 0,05s durch einen größeren oder gleich großen Wert bei den kurzfristigen Maxima überschrieben werden und ob der Zähler in diesen Fall zurückgesetzt wird, so daß er den Wert 0 erhält.
  5. Ob die zwischengespeicherten Werte für die langfristigen Maxima nachdem sie 2s lang nicht verändert wurden korrekt zurückgesetzt werden.
  6. Ob die zwischengespeicherten Werte für die langfristigen Maxima immer über einen Wert mit Absolutbetrag größer -12db verfügen oder denn Wert "0000" haben.
  7. Das die Ausgangssignale immer über definierte Werte verfügen.


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