Hallo,
ich versuch gerade einen exp. gleitenden Mittelwert zu beschreiben.
1 |
|
2 | entity exp_average is
|
3 | Port ( clk : in STD_LOGIC;
|
4 | value : in signed (1 downto 0); -- -1, 0 , +1
|
5 | mean : out signed (31 downto 0));
|
6 | end exp_average;
|
7 |
|
8 | architecture Behavioral of exp_average is
|
9 |
|
10 | signal state : std_logic := '0';
|
11 | signal exp_mean_a : signed (31 downto 0) := to_signed(0, 32);
|
12 | signal exp_mean_b : signed (31 downto 0) := to_signed(0, 32);
|
13 |
|
14 | begin
|
15 |
|
16 | process (clk)
|
17 | begin
|
18 | if rising_edge(clk) then
|
19 |
|
20 | if state = '0' then
|
21 | state <= '1';
|
22 | mean <= exp_mean_b srl 12;
|
23 | exp_mean_a <= (exp_mean_b - (exp_mean_b srl 12)) + (resize(signed(value),32) sll 12);
|
24 | else
|
25 | state <= '0';
|
26 | mean <= exp_mean_b srl 12;
|
27 | exp_mean_b <= (exp_mean_a - (exp_mean_a srl 12)) + (resize(signed(value),32) sll 12);
|
28 | end if;
|
29 | end if;
|
30 | end process;
|
31 |
|
32 | end Behavioral;
|
Value soll nur die Werte -1, 0, 1 annehmen. Wenn es 1 hat, dann
konvergiert mean auch schön gegen 4096. Jedoch bei -1 funktioniert, dass
ganze nicht. Wahrscheinlich liegt es an dem Shiften. Man könnte das
Shiften durch Multiplikation/Divison ersetzen, aber da müsste man doch
die Bitzahl des Ergebnisses erweitern? Gibt es eine Möglichkeit das
Shiften vorzeichen unabhänging durchzuführen?
Mfg
Hans