方案一:QuartusII中的IP核。但是FIR IP没有破解,放弃。
方案二:用纯硬件描述语言搭建。
基本上分为MAC(乘积累加结构)和DA(分布式结构)。
MAC中具体结构有:
直接型FIR滤波器结构。利用FIR系数对称性特点,先对相应值相加,再做乘积运算,最后累加。该进措施可以是加上流水线结构。
实例:(参考自《EDA技术与Verilog设计》王金明编著)8KHZ采样率,8Bit输入,8Bit输出,11阶低通滤波器,fL=3.4KHZ。利用MATLAB得到滤波器系数,采用SD编码。Tips:SD(signed digit numbers有符号数字量),通过SD编码可以降低非零元素的数量。SD编码数字值域{1,0,-1},-1用1上面加“-”表示。
代码如下:
module Fir02 ( input clk, input [7:0] x, output reg [15:0] y ); reg [7:0] tap0,tap1,tap2,tap3,tap4,tap5,tap6,tap7,tap8,tap9,tap10; reg [7:0] t0,t1,t2,t3,t4,t5; reg [15:0] sum; always @(posedge clk) begin t0<=tap5; t1<=tap4+tap6; t2<=tap3+tap7; t3<=tap2+tap8; t4<=tap1+tap9; t5<=tap0+tap10; sum<= (t1<<4) +{t1[7],t1[7:1]} +{t1[7],t1[7],t1[7:2]} +{t1[7],t1[7],t1[7],t1[7:3]} -(t2<<3) -(t2<<2) +t2 -{t2[7],t2[7],t2[7:2]} +(t3<<2) +t3 +{t3[7],t3[7],t3[7:2]} +{t3[7],t3[7],t3[7],t3[7],t3[7:4]} +{t3[7],t3[7],t3[7],t3[7],t3[7],t3[7:5]} -t4 -{t4[7],t4[7:1]} -{t4[7],t4[7],t4[7],t4[7:3]} +{t5[7],t5[7:1]} -{t5[7],t5[7],t5[7],t5[7],t5[7],t5[7:5]} +(t0<<7) -((t0<<2)<<2) -(t0<<2) +{t0[7],t0[7:1]} +{t0[7],t0[7],t0[7:2]} +{t0[7],t0[7],t0[7],t0[7],t0[7:4]}; tap10<=tap9; tap9<=tap8; tap8<=tap7; tap7<=tap6; tap6<=tap5; tap5<=tap4; tap4<=tap3; tap3<=tap2; tap2<=tap1; tap1<=tap0; tap0<=x; y<={sum[15],sum[15],sum[15],sum[15],sum[15],sum[15],sum[15],sum[15:7]}; end endmodule