Найпростіший низькопрохідний фільтр FIR, який ви можете спробувати, це y (n) = x (n) + x (n-1). Ви можете реалізувати це досить легко у VHDL. Нижче наведена дуже проста блок-схема обладнання, яке ви хочете реалізувати.
Відповідно до формули, вам потрібні поточні та попередні зразки АЦП, щоб отримати відповідний вихід. Що потрібно зробити, це зафіксувати вхідні зразки АЦП на падаючому краю годинника та виконати відповідні обчислення на зростаючому краю, щоб отримати відповідний вихід. Оскільки ви додаєте два 16-бітні значення разом, можливо, ви отримаєте 17-бітну відповідь. Ви повинні зберігати вхідні дані в 17-бітові регістри та використовувати 17-бітове додавання. Однак ваш вихід буде нижчим 16 біт відповіді. Код може виглядати приблизно так, але я не можу гарантувати, що він буде працювати повністю, оскільки я його не перевірив, не кажучи вже про синтезований.
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
Як бачите, ви можете використовувати цю загальну ідею для додавання у складніші формули, наприклад, з коефіцієнтами. Більш складні формули, як-от фільтри IIR, можуть вимагати використання змінних, щоб коректувати логіку алгоритму. Нарешті, найпростіший спосіб обійти фільтри, у яких реальні числа є коефіцієнтами, - знайти коефіцієнт масштабу, щоб усі цифри були максимально близькими до цілих чисел. Ваш кінцевий результат доведеться зменшити тим самим фактором, щоб отримати правильний результат.
Я сподіваюся, що це може вам стати в нагоді і допомогти вам прокатати м'яч.
* Це було відредаговано таким чином, що фіксація даних та фіксація вихідних даних проходять в окремих процесах. Також використовуються підписані типи замість std_logic_vector. Я припускаю, що ваш вхід АЦП буде сигналом std_logic_vector.