1 | library ieee;
|
2 | use ieee.std_logic_1164.all;
|
3 | use ieee.numeric_std.all;
|
4 |
|
5 | entity filter is
|
6 | generic(
|
7 | data_width : positive := 8;
|
8 | filter_bits : positive := 4); -- Filterlänge ist 2**filter_bits --> z.B. filter_bits = 4 --> Filterlänge = 16
|
9 | port( -- --> Gewichtung eines neuen Wertes = 1/16
|
10 | clk : in std_logic;
|
11 | inp : in std_logic_vector(data_width-1 downto 0);
|
12 | outp : out std_logic_vector(data_width-1 downto 0));
|
13 | end entity filter;
|
14 |
|
15 | architecture behavioral of filter is
|
16 | signal sum : unsigned(data_width+filter_bits-1 downto 0) := (others=>'0');
|
17 | alias meanvalue : unsigned(data_width-1 downto 0) is sum(sum'left downto filter_bits); -- Mittelwert = höchstwertige Bits der Summe
|
18 | begin
|
19 | -- mit jedem Takt von der Summe den alten Mittelwert abziehen und neuen Wert aufaddieren
|
20 | sum <= sum - meanvalue + unsigned(inp) when rising_edge(clk);
|
21 | -- Mittelwert (= linke data_width Bits) ausgeben
|
22 | outp <= std_logic_vector(meanvalue);
|
23 | end architecture behavioral;
|
24 |
|
25 |
|
26 | -- Wers lieber umständlich mag, kann die Summenbildung statt in einer Zeile auch so machen:
|
27 | -- process
|
28 | -- variable s : unsigned(data_width+filter_bits-1 downto 0);
|
29 | -- begin
|
30 | -- wait until rising_edge(clk);
|
31 | -- s := sum;
|
32 | -- s := s - s(sum'left downto filter_bits); -- subtract "old meanvalue"
|
33 | -- s := s + unsigned(inp); -- add new value
|
34 | -- sum <= s;
|
35 | -- end process;
|