Filter low pass FIR paling sederhana yang dapat Anda coba adalah y (n) = x (n) + x (n-1). Anda dapat menerapkan ini dengan cukup mudah di VHDL. Di bawah ini adalah diagram blok yang sangat sederhana dari perangkat keras yang ingin Anda implementasikan.
Menurut rumus, Anda memerlukan sampel ADC saat ini dan sebelumnya untuk mendapatkan hasil yang sesuai. Yang harus Anda lakukan adalah mengunci sampel ADC yang masuk di tepi jatuh jam, dan melakukan perhitungan yang sesuai pada tepi naik untuk mendapatkan output yang sesuai. Karena Anda menambahkan dua nilai 16-bit secara bersamaan, ada kemungkinan Anda akan mendapatkan jawaban 17-bit. Anda harus menyimpan input ke register 17-bit dan menggunakan adder 17-bit. Output Anda, bagaimanapun, akan menjadi 16 bit jawaban yang lebih rendah. Kode mungkin terlihat seperti ini, tetapi saya tidak dapat menjamin bahwa kode tersebut akan berfungsi sepenuhnya karena saya belum mengujinya, apalagi mensintesisnya.
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
Seperti yang Anda lihat, Anda dapat menggunakan ide umum ini untuk menambahkan formula yang lebih rumit, seperti yang memiliki koefisien. Rumus yang lebih rumit, seperti filter IIR, mungkin memerlukan penggunaan variabel untuk mendapatkan logika algoritma yang benar. Akhirnya, cara mudah untuk menyiasati filter yang memiliki bilangan real sebagai koefisien adalah menemukan faktor skala sehingga semua angka akhirnya sedekat mungkin dengan bilangan bulat. Hasil akhir Anda harus diperkecil oleh faktor yang sama untuk mendapatkan hasil yang benar.
Saya harap ini bisa berguna bagi Anda dan membantu Anda membuat bola bergulir.
* Ini telah diedit sehingga data latching dan output latching berada dalam proses yang terpisah. Juga menggunakan tipe bertanda bukan std_logic_vector. Saya berasumsi input ADC Anda akan menjadi sinyal std_logic_vector.