1. 概要
前回まででやっとディジタルフィルターの実験をする準備が整った。前回素通りさせた経路にFIRフィルターモジュールを挟み込む。
FIRフィルターモジュールは、Digi-Key TechForumにあったこれをほぼそのまま使う。計算結果がオーバーフローしないようビット拡張したあと定義どおりに積和演算をしているだけである。
まずはすべてのタップを同じ係数で重み付けして移動平均をとってみる。一種のローパスフィルターである。周波数特性が見たいだけなので、係数は全タップとも同じであればとりあえず何でもよい。タップ数は16、係数は16ビット長(signed)、サンプリング周波数は40 kHzにした。
2. 移動平均のためのVHDL
下のVHDLをコンパイルしてMAX10 FPGAに書き込む。
ファイル一式: https://github.com/ti-nspire/VHDL_for_Quartus_Prime/tree/main/fir_filter_experiment_moving_average
係数は、トップレベルエンティティfir_filter_experiment.vhdの下の部分に記述する。
constant coeffs_list : coefficient_array := (
16b"1",16b"1",16b"1",16b"1",
16b"1",16b"1",16b"1",16b"1",
16b"1",16b"1",16b"1",16b"1",
16b"1",16b"1",16b"1",16b"1"
);
-- 係数は全部1にしたので乗算でビット幅は変化しない。
-- 計算結果に必要なビット数はceil(log2((10ビット最大値1023) * (タップ数16))) = 14
constant BITS_NEEDED : natural := 14;
3. 全体の接続図
このときと同じ。
4. 実行結果
ファンクションジェネレーターから正弦波を入力して出力の周波数特性を見てみる。単なる移動平均なので帯域の制御はできないが一往ローパスの特性を示してはいる。

