Deneyebileceğiniz en basit düşük geçişli FIR filtresi y (n) = x (n) + x (n-1) 'dir. Bunu VHDL'de kolayca uygulayabilirsiniz. Aşağıda, uygulamak istediğiniz donanımın çok basit bir blok şeması bulunmaktadır.
Formüle göre, uygun çıktıyı elde etmek için mevcut ve önceki ADC örneklerine ihtiyacınız vardır. Yapmanız gereken, gelen ADC örneklerini saatin düşen kenarına kilitlemek ve uygun çıkışı elde etmek için yükselen kenarda uygun hesaplamaları yapmaktır. Birlikte iki 16 bit değer eklediğiniz için, 17 bitlik bir yanıt alabilirsiniz. Girişi 17 bitlik kayıtlara kaydetmeli ve 17 bitlik bir toplayıcı kullanmalısınız. Ancak çıktınız yanıtın en düşük 16 biti olacaktır. Kod böyle bir şeye benzeyebilir, ancak test etmediğim için tamamen çalışacağını garanti edemem, yalnız sentezlemeliyim.
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
Gördüğünüz gibi, bu genel fikri, katsayıları olanlar gibi daha karmaşık formüller eklemek için kullanabilirsiniz. IIR filtreleri gibi daha karmaşık formüller, algoritma mantığını doğru hale getirmek için değişkenlerin kullanılmasını gerektirebilir. Son olarak, katsayılar olarak gerçek sayılara sahip filtreleri dolaşmanın kolay bir yolu, bir ölçek faktörü bulmaktır, böylece tüm sayılar mümkün olduğunca tam sayılara yakın olur. Doğru sonucu elde etmek için nihai sonucunuzun aynı faktörle yeniden ölçeklenmesi gerekecektir.
Umarım bu sizin için yararlı olabilir ve topu yuvarlamanıza yardımcı olabilir.
* Bu, veri mandallama ve çıkış mandallama ayrı işlemlerde olacak şekilde düzenlenmiştir. Ayrıca std_logic_vector yerine imzalı türleri kullanıyor. ADC girişinizin bir std_logic_vector sinyali olacağını varsayıyorum.