VHDL Projekt 12 - Sourcecode

 

Gliederung

  1. Download des Sourcecodes
  2. VHDL-Sourcecode

Projektüberblick VHDL Frames anzeigen
Zurück zur Homepage

Download des Sourcecodes

Der Sourcecode unseres VHDL-Projektes findet sich hier als Bzip2-komprimiertes TAR-Archiv. Die Dateien wurden mit ALDEC Active VHDL 3.2 erstellt.

Download [3,5 kB]



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

VHDL-Sourcecode

library IEEE;

use IEEE.std_logic_1164.all;

entity Peak_Detect is
port (
LOG_L: in STD_LOGIC_VECTOR (3 downto 0);
LOG_R: in STD_LOGIC_VECTOR (3 downto 0);
FLAG: in STD_LOGIC;
MAX_L: out STD_LOGIC_VECTOR (3 downto 0):= "0000";
MAX_R: out STD_LOGIC_VECTOR (3 downto 0):= "0000";
PEAK_L: out STD_LOGIC_VECTOR (3 downto 0):= "0000";
PEAK_R: out STD_LOGIC_VECTOR (3 downto 0):= "0000";
);
end Peak_Detect;

architecture Peak_Detect of Peak_Detect is
--Zwischenspeicher für langfristige Maxima
Signal peak_left, peak_right: STD_LOGIC_VECTOR (3 downto 0):= "0000";
--Zwischenspeicher für kurzfristige Maxima
Signal max_left, max_right: STD_LOGIC_VECTOR (3 downto 0):= "0000";
--Wert den den größten absoluten Pegelwert kleiner gleich -12 db repräsentiert
Constant twelve_db: STD_LOGIC_VECTOR (3 downto 0):= "1000";
--Zähler für kurzfristige Maxima
Signal count_max: INTEGER range 0 to 2204;
--Zähler für langfristige Maxima des linken Kanals
Signal count_peak_l: INTEGER range 0 to 40;
--Zähler für langfristige Maxima des rechten Kanals
Signal count_peak_r: INTEGER range 0 to 40;
begin
alles: PROCESS
begin
--auf fallende Taktflanke warten
wait until Flag = '0';
--testen ob 0,05s vergangen (2205 * (1/44100)s = 0,05s)
if count_max = 0 then
--für die linken Spitzenwerte
--testen ob inzwischen größerer Spizenwert vorliegt
if (max_left >= peak_left) AND (max_left > twelve_db) then
--Zähler zurücksetzen und neuen Wert zuweisen
count_peak_l <= 0;
peak_left <= max_left;
end if;

--Zähler für die rechten Spitzenwerte
--testen ob inzwischen größerer Spizenwert vorliegt
if (max_right >= peak_right) AND (max_right > twelve_db) then
--Zähler zurücksetzen und neuen Wert zuweisen
count_peak_r <= 0;
peak_right <= max_right;
end if;
end if;

wait for 5 ns;
if count_max = 0 then
--Ausgabe des kurzfristigen Maxima
MAX_L <= max_left;
MAX_R <= max_right;
--und Rücksetzen
max_left <= LOG_L;
max_right <= LOG_R;

--Ausgabe des Langfristigen Maxima
PEAK_L <= peak_left;
PEAK_R <= peak_right;
else
--Ermittlung des kurzfristigen Maxima
if LOG_L > max_left then
max_left <= LOG_L;
end if;
if LOG_R > max_right then
max_right <= LOG_R;

end if;
end if;

--auf steigende Taktflanke warten
wait until FLAG = '1';

--testen ob 0,05s vergangen (2205 * (1/44100)s = 0,05s)
if count_max = 2204 then

--rücksetzen des Zählers auf Null
count_max <= 0;
--Erhöhen der Zähler für die langfristigen Maxima
count_peak_l <= count_peak_l + 1;
count_peak_r <= count_peak_r + 1;

--für die linken Spitzenwerte
--testen ob 2s vergangen (40 * 0,05s = 2s)
if count_peak_l = 39 then
peak_left <= "0000";
count_peak_l <= 0;
else
--Erhöhen der Zähler für die langfristigen Maxima
count_peak_l <= count_peak_l + 1;
end if;

--Zähler für die rechten Spitzenwerte
--testen ob 2s vergangen (40 * 0,05s = 2s)
if count_peak_r = 39 then
peak_right <= "0000";
count_peak_r <= 0;
else
--Erhöhen der Zähler für die langfristigen Maxima
count_peak_r <= count_peak_r + 1;
end if;
else
--Erhöhen des Zählers für das kurzfristige Maxima
count_max <= count_max + 1;
end if;

end Process;

end Peak_Detect;


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