Il filtro FIR passa basso più semplice che puoi provare è y (n) = x (n) + x (n-1). Puoi implementarlo abbastanza facilmente in VHDL. Di seguito è riportato uno schema a blocchi molto semplice dell'hardware che si desidera implementare.
Secondo la formula, sono necessari i campioni ADC attuali e precedenti per ottenere l'output appropriato. Quello che dovresti fare è agganciare i campioni ADC in arrivo sul fronte di discesa del clock ed eseguire i calcoli appropriati sul fronte di salita per ottenere l'output appropriato. Dato che stai sommando due valori a 16 bit, è possibile che tu abbia una risposta a 17 bit. È necessario memorizzare l'input in registri a 17 bit e utilizzare un sommatore a 17 bit. Il tuo output, tuttavia, saranno i 16 bit inferiori della risposta. Il codice potrebbe assomigliare a questo, ma non posso garantire che funzionerà completamente poiché non l'ho testato, e tanto meno sintetizzato.
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
Come puoi vedere, puoi usare questa idea generale per aggiungere formule più complicate, come quelle con coefficienti. Formule più complicate, come i filtri IIR, potrebbero richiedere l'uso di variabili per ottenere la logica dell'algoritmo corretta. Infine, un modo semplice per aggirare i filtri che hanno numeri reali come coefficienti è quello di trovare un fattore di scala in modo che tutti i numeri finiscano per essere il più vicino possibile ai numeri interi. Il risultato finale dovrà essere ridimensionato dello stesso fattore per ottenere il risultato corretto.
Spero che questo possa esserti utile e aiutarti a far rotolare la palla.
* Questo è stato modificato in modo che il latching dei dati e il latching dell'output siano in processi separati. Utilizza anche tipi firmati anziché std_logic_vector. Suppongo che il tuo input ADC sarà un segnale std_logic_vector.