Der einfachste Tiefpass-FIR-Filter, den Sie ausprobieren können, ist y (n) = x (n) + x (n-1). Sie können dies ganz einfach in VHDL implementieren. Unten finden Sie ein sehr einfaches Blockdiagramm der Hardware, die Sie implementieren möchten.
Gemäß der Formel benötigen Sie die aktuellen und vorherigen ADC-Beispiele, um die entsprechende Ausgabe zu erhalten. Was Sie tun sollten, ist, die eingehenden ADC-Abtastwerte an der fallenden Flanke des Takts zu speichern und die entsprechenden Berechnungen an der ansteigenden Flanke durchzuführen, um die entsprechende Ausgabe zu erhalten. Da Sie zwei 16-Bit-Werte addieren, erhalten Sie möglicherweise eine 17-Bit-Antwort. Sie sollten die Eingabe in 17-Bit-Registern speichern und einen 17-Bit-Addierer verwenden. Ihre Ausgabe sind jedoch die unteren 16 Bits der Antwort. Code sieht vielleicht so aus, aber ich kann nicht garantieren, dass er vollständig funktioniert, da ich ihn nicht getestet oder gar synthetisiert habe.
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
Wie Sie sehen können, können Sie diese allgemeine Idee verwenden, um kompliziertere Formeln hinzuzufügen, z. B. solche mit Koeffizienten. Kompliziertere Formeln wie IIR-Filter erfordern möglicherweise die Verwendung von Variablen, um die Algorithmuslogik korrekt zu machen. Eine einfache Möglichkeit, Filter mit reellen Zahlen als Koeffizienten zu umgehen, besteht darin, einen Skalierungsfaktor zu finden, damit alle Zahlen so nahe wie möglich an ganzen Zahlen liegen. Ihr Endergebnis muss um denselben Faktor verkleinert werden, um das richtige Ergebnis zu erhalten.
Ich hoffe, dies kann Ihnen von Nutzen sein und Ihnen helfen, den Ball ins Rollen zu bringen.
* Dies wurde so bearbeitet, dass sich das Daten-Latching und das Output-Latching in getrennten Prozessen befinden. Verwenden Sie auch signierte Typen anstelle von std_logic_vector. Ich gehe davon aus, dass Ihr ADC-Eingang ein std_logic_vector-Signal sein wird.