-- Komponente zur Umrechnung eines logarithmischen Verstärkungsfaktors in -- einen linearen Verstärkungsfaktors über eine LUT component db2linear port ( db : in signed(7 downto 0); -- logarithmischer Verstärkungsfaktor linear : out signed(39 downto 0) -- linearer Verstärkungsfaktor ); end component; -- Signale zur Übernahme der Umrechnungsergebnisse der logarithmischen Verstärkungsfaktoren -- in die linearen Verstärkungsfaktoren der einzelnen Kaskaden des IIR-Filters signal g : signed(7 downto 0) := x"00"; signal v : signed(39 downto 0) := x"0800000000"; -- Multiplizierer zur Berechnung der Koeffizienten b0 und b2. component coeff_mul port ( dataa : in signed (63 DOWNTO 0); datab : in signed (39 DOWNTO 0); result : out signed (103 DOWNTO 0) ); end component; -- Signale zur Übergabe der Operatoren und zur Übernahme des Multiplkationsergebnisses signal mul_a : signed(63 downto 0); signal mul_b : signed(39 downto 0); signal mul_r : signed(103 downto 0); begin -- LUT db zu linear Komponente Ports zuweisen db2linear_1 : db2linear port map (g, v); -- Multiplizierer Ports zuweisen coeff_mul_1 : coeff_mul port map (mul_a, mul_b, mul_r); -- Prozess zur Berechnung der Koeffizienten b0 und b2 -- der einzelnen Kaskaden des IIR-Filters process begin -- Warten auf steigende Flanke des 50 MHz Taktes wait until rising_edge(clk_50MHz); case counter is -- Bei der Berechnung der Koeffizienten b0 und b2 der -- einzelnen Kaskaden wird wie folgt vorgegangen. -- 1. Umrechnung logarithmischer Verstärkungsfaktor in linearen Verstärkungsfaktor v = 10^(g/20) -- 2. Multiplikation des Koeffizienten c2 mit dem linearen Verstärkungsfaktor c2' = c2 * v -- 3. Addition bzw. Subtraktion der jeweiligen Koeffizienten zur Berechnung von b0 und b2 -- b0 = c1 + c2' + c3 -- b2 = c1 - c2' + c3 -- 4. Übergabe des Berechnungsergebnisses der Koeffizienten b0 und b2 an den jeweiligen Ausgang -- Koeffizeinten b0 und b2 der Kaskade 1 berechnen when x"00" => g <= g1; when x"01" => mul_a <= c2_1; mul_b <= v; when x"05" => b0_1 <= c1_1 + mul_r(98 downto 35) + c3_1; b2_1 <= c1_1 - mul_r(98 downto 35) + c3_1; -- Koeffizeinten b0 und b2 der Kaskade 2 berechnen when x"0A" => g <= g2; when x"0B" => mul_a <= c2_2; mul_b <= v; when x"0F" => b0_2 <= c1_2 + mul_r(98 downto 35) + c3_2; b2_2 <= c1_2 - mul_r(98 downto 35) + c3_2; -- Koeffizeinten b0 und b2 der Kaskade 3 berechnen when x"10" => g <= g3; when x"11" => mul_a <= c2_3; mul_b <= v; when x"15" => b0_3 <= c1_3 + mul_r(98 downto 35) + c3_3; b2_3 <= c1_3 - mul_r(98 downto 35) + c3_3; -- Koeffizeinten b0 und b2 der Kaskade 4 berechnen when x"1A" => g <= g4; when x"1B" => mul_a <= c2_4; mul_b <= v; when x"1F" => b0_4 <= c1_4 + mul_r(98 downto 35) + c3_4; b2_4 <= c1_4 - mul_r(98 downto 35) + c3_4; -- Koeffizeinten b0 und b2 der Kaskade 5 berechnen when x"20" => g <= g5; when x"21" => mul_a <= c2_5; mul_b <= v; when x"25" => b0_5 <= c1_5 + mul_r(98 downto 35) + c3_5; b2_5 <= c1_5 - mul_r(98 downto 35) + c3_5; -- Koeffizeinten b0 und b2 der Kaskade 6 berechnen when x"2A" => g <= g6; when x"2B" => mul_a <= c2_6; mul_b <= v; when x"2F" => b0_6 <= c1_6 + mul_r(98 downto 35) + c3_6; b2_6 <= c1_6 - mul_r(98 downto 35) + c3_6; -- Koeffizeinten b0 und b2 der Kaskade 7 berechnen when x"30" => g <= g7; when x"31" => mul_a <= c2_7; mul_b <= v; when x"35" => b0_7 <= c1_7 + mul_r(98 downto 35) + c3_7; b2_7 <= c1_7 - mul_r(98 downto 35) + c3_7; -- Koeffizeinten b0 und b2 der Kaskade 8 berechnen when x"3A" => g <= g8; when x"3B" => mul_a <= c2_8; mul_b <= v; when x"3F" => b0_8 <= c1_8 + mul_r(98 downto 35) + c3_8; b2_8 <= c1_8 - mul_r(98 downto 35) + c3_8; -- Koeffizeinten b0 und b2 der Kaskade 9 berechnen when x"40" => g <= g9; when x"41" => mul_a <= c2_9; mul_b <= v; when x"45" => b0_9 <= c1_9 + mul_r(98 downto 35) + c3_9; b2_9 <= c1_9 - mul_r(98 downto 35) + c3_9; -- Koeffizeinten b0 und b2 der Kaskade 10 berechnen when x"4A" => g <= g10; when x"4B" => mul_a <= c2_10; mul_b <= v; when x"4F" => b0_10 <= c1_10 + mul_r(98 downto 35) + c3_10; b2_10 <= c1_10 - mul_r(98 downto 35) + c3_10; -- Koeffizeinten b0 und b2 der Kaskade 11 berechnen when x"50" => g <= g11; when x"51" => mul_a <= c2_11; mul_b <= v; when x"55" => b0_11 <= c1_11 + mul_r(98 downto 35) + c3_11; b2_11 <= c1_11 - mul_r(98 downto 35) + c3_11; -- Koeffizeinten b0 und b2 der Kaskade 12 berechnen when x"5A" => g <= g12; when x"5B" => mul_a <= c2_12; mul_b <= v; when x"5F" => b0_12 <= c1_12 + mul_r(98 downto 35) + c3_12; b2_12 <= c1_12 - mul_r(98 downto 35) + c3_12; -- Koeffizeinten b0 und b2 der Kaskade 13 berechnen when x"60" => g <= g13; when x"61" => mul_a <= c2_13; mul_b <= v; when x"65" => b0_13 <= c1_13 + mul_r(98 downto 35) + c3_13; b2_13 <= c1_13 - mul_r(98 downto 35) + c3_13; -- Koeffizeinten b0 und b2 der Kaskade 14 berechnen when x"6A" => g <= g14; when x"6B" => mul_a <= c2_14; mul_b <= v; when x"6F" => b0_14 <= c1_14 + mul_r(98 downto 35) + c3_14; b2_14 <= c1_14 - mul_r(98 downto 35) + c3_14; when others => null; end case; if (counter < x"70") then counter <= counter + 1; else counter <= x"00"; end if; end process; end behavior;