FPGAでFIRフィルタ

by K.I
2017/06/05〜2017/06/15

Index


概要

ピン接続

J2-1 接続 説明
113 lrclk_i LRCLK入力
115 bclk_i BCLK入力
119 data_i DATA入力
GND
121
125
127
J5-2 接続 説明
61 lrclk_o LRCLK出力(そのまま)
GND
58 bclk_o BCLK出力(そのまま)
57 data_o DATA出力(そのまま)
GND
54 datax DATA出力(フィルタ処理後)
52

RaspberryPiのI2S出力を接続

I2Sのタイムチャート


[top]

FIRフィルタの実装

FIRフィルタの係数は

FIRフィルタの特性を計算

係数を整数化

FIRフィルタのプログラム

シミュレーション

インプリメント出来ない?

Target Device:  LCMXO2-7000HETQFP144
        :
Design Summary
   Number of registers:    664 out of  7209 (9%)
      PFU registers:          664 out of  6864 (10%)
      PIO registers:            0 out of   345 (0%)
   Number of SLICEs:      1403 out of  3432 (41%)
SLICEs as Logic/ROM: 1403 out of 3432 (41%)
SLICEs as RAM: 0 out of 2574 (0%) SLICEs as Carry: 1349 out of 3432 (39%)
Number of LUT4s: 2805 out of 6864 (41%)
Number used as logic LUTs: 107 Number used as distributed RAM: 0 Number used as ripple logic: 2698 Number used as shift registers: 0 Number of PIO sites used: 19 + 4(JTAG) out of 115 (20%) Number of block RAMs: 0 out of 26 (0%) Number of GSRs: 1 out of 1 (100%) EFB used : No JTAG used : No Readback used : No Oscillator used : No Startup used : No POR : On Bandgap : On Number of Power Controller: 0 out of 1 (0%) Number of Dynamic Bank Controller (BCINRD): 0 out of 6 (0%) Number of Dynamic Bank Controller (BCLVDSO): 0 out of 1 (0%) Number of DCCA: 0 out of 8 (0%) Number of DCMA: 0 out of 2 (0%) Number of PLLs: 0 out of 2 (0%) Number of DQSDLLs: 0 out of 2 (0%) Number of CLKDIVC: 0 out of 4 (0%) Number of ECLKSYNCA: 0 out of 4 (0%) Number of ECLKBRIDGECS: 0 out of 2 (0%) :

1係数が少ないからまだ良いけど、まともなFIRフィルタ記述したら、とんでもなく長くなってしまう。
2これは、あまり追求していないので、やりようによっては出来るのかも。
3やり直すのが、面倒なので。。
4あまり現実的な波形とは言えないが。。

[top]

動作確認

Excelでの計算と比較

Ch dout datax 計算値
1 0 0
1 -941 0 0
1 -1009 0 0
1 -865 -2 -2
1 -818 -3 -2
1 -685 9 9
1 -654 26 26
1 -596 -9 -8
1 -658 -148 -147
1 -674 -343 -342
1 -768 -470 -470
1 -814 -475 -474
1 -885 -412 -412
1 -872 -354 -353
1 -856 -321 -321
1 -765 -312 -312
1 -670 -322 -322
1 -524 -348 -347
1 -405 -382 -381
1 -272 -415 -414
1 -118 -438 -437
1 65 -443 -442
1 266 -425 -425
1 462 -387 -387
1 686 -333 -332
1 874 -270 -270

FIRフィルタ出力dataxは、ちゃんと計算値とほぼ一致している
乗算器は、あれでちゃんと論理合成出来たんだな〜

FIRフィルタの効果

MaximaでFIRフィルタを計算


[top]

FIRフィルタプログラムの別解

module fir_filter2(
        input clk,
        input rst,
        input enable,
        input signed [15:0] idata,
        output signed [15:0] odata
);
        reg signed [31:0] data[0:12];
        reg signed [15:0] para[0:12];
        
        initial begin
                para[0] = 132;
                para[1] = 0;
                para[2] = -768;
                para[3] = -1103;
                para[4] = 2360;
                para[5] = 9308;
                para[6] = 13107;
                para[7] = 9308;
                para[8] = 2360;
                para[9] = -1103;
                para[10] = -768;
                para[11] = 0;
                para[12] = 132;
        end

        integer i;

        always @(posedge clk or posedge rst) begin
                if (rst) begin
                        
//                      for (i=0; i<13 ;i=i+1) data[i] <= 0;
                        data[0] <= 0;
                        data[1] <= 0;
                        data[2] <= 0;
                        data[3] <= 0;
                        data[4] <= 0;
                        data[5] <= 0;
                        data[6] <= 0;
                        data[7] <= 0;
                        data[8] <= 0;
                        data[9] <= 0;
                        data[10] <= 0;
                        data[11] <= 0;
                        data[12] <= 0;
                        
                end else if (enable) begin
                        
                        data[12] <= idata * para[12];
// for (n=0; n<12 ;n=n+1) data[n] <= data[n+1] + idata * para[n]; data[11] <= data[12] + idata * para[11];
data[10] <= data[11] + idata * para[10];
data[9] <= data[10] + idata * para[9];
data[8] <= data[9] + idata * para[8];
data[7] <= data[8] + idata * para[7];
data[6] <= data[7] + idata * para[6];
data[5] <= data[6] + idata * para[5];
data[4] <= data[5] + idata * para[4];
data[3] <= data[4] + idata * para[3];
data[2] <= data[3] + idata * para[2];
data[1] <= data[2] + idata * para[1];
data[0] <= data[1] + idata * para[0];
end end assign odata = data[0] >> 16; endmodule

インプリメントしてみる


[top]

まとめ

算術右シフト

参考


5RTLで記述すると、やっぱり楽で良いなぁ。
6そもそもこのFPGAボードでは大きな回路は無理なんだけど、大規模なFPGAボードでも、そんなに余裕があるわけじゃない。

[top] [電子工作関連に戻る]

comments powered by Disqus