Filter.vhd


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;