Najprostszy filtr dolnoprzepustowy FIR, jaki możesz wypróbować, to y (n) = x (n) + x (n-1). Możesz to dość łatwo zaimplementować w VHDL. Poniżej znajduje się bardzo prosty schemat blokowy sprzętu, który chcesz wdrożyć.
Zgodnie ze wzorem potrzebne są bieżące i poprzednie próbki ADC, aby uzyskać odpowiednią moc wyjściową. Co należy zrobić, to zatrzasnąć przychodzące próbki ADC na zboczu opadającym zegara i wykonać odpowiednie obliczenia na zboczu narastającym, aby uzyskać odpowiednią moc wyjściową. Ponieważ dodajesz dwie wartości 16-bitowe razem, możliwe, że otrzymasz 17-bitową odpowiedź. Powinieneś zapisać dane wejściowe w 17-bitowych rejestrach i użyć 17-bitowego sumatora. Twój wynik będzie jednak niższymi 16 bitami odpowiedzi. Kod może wyglądać mniej więcej tak, ale nie mogę zagwarantować, że będzie działał całkowicie, ponieważ go nie testowałem, nie mówiąc już o jego syntezie.
IEEE.numeric_std.all;
...
signal x_prev, x_curr, y_n: signed(16 downto 0);
signal filter_out: std_logic_vector(15 downto 0);
...
process (clk) is
begin
if falling_edge(clk) then
--Latch Data
x_prev <= x_curr;
x_curr <= signed('0' & ADC_output); --since ADC is 16 bits
end if;
end process;
process (clk) is
begin
if rising_edge(clk) then
--Calculate y(n)
y_n <= x_curr + x_prev;
end if;
end process;
filter_out <= std_logic_vector(y_n(15 downto 0)); --only use the lower 16 bits of answer
Jak widać, można użyć tego ogólnego pomysłu, aby dodać bardziej skomplikowane formuły, na przykład o współczynnikach. Bardziej skomplikowane formuły, takie jak filtry IIR, mogą wymagać użycia zmiennych, aby uzyskać poprawną logikę algorytmu. Wreszcie, łatwym sposobem na obejście filtrów, które mają liczby rzeczywiste jako współczynniki, jest znalezienie współczynnika skali, aby wszystkie liczby były jak najbardziej zbliżone do liczb całkowitych. Ostateczny wynik będzie musiał zostać zmniejszony o ten sam współczynnik, aby uzyskać poprawny wynik.
Mam nadzieję, że to może ci się przydać i pomóc w toczyć piłkę.
* Zostało to zmodyfikowane, aby blokowanie danych i blokowanie danych wyjściowych odbywało się w osobnych procesach. Również używając podpisanych typów zamiast std_logic_vector. Zakładam, że twoje wejście ADC będzie sygnałem std_logic_vector.