Простейший фильтр низких частот 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
Как видите, вы можете использовать эту общую идею для добавления в более сложные формулы, например, с коэффициентами. Более сложные формулы, такие как БИХ-фильтры, могут потребовать использования переменных для получения правильной логики алгоритма. Наконец, простой способ обойти фильтры, которые имеют действительные числа в качестве коэффициентов, - это найти масштабный коэффициент, чтобы все числа оказались как можно ближе к целым числам. Ваш конечный результат должен быть уменьшен на тот же коэффициент, чтобы получить правильный результат.
Я надеюсь, что это может быть полезно для вас и поможет вам запустить мяч.
* Это было отредактировано так, что фиксация данных и фиксация выходных данных находятся в отдельных процессах. Также используя подписанные типы вместо std_logic_vector. Я предполагаю, что ваш вход АЦП будет сигналом std_logic_vector.