基于FPGA流水线分布式算法的FIR滤波器的实现
类型:低通 输入数据宽度:8位
阶数:16阶 输出数据宽度:16位
2.1.2 参数提取
采用汉字窗函数(Hanning)设计16阶线性相位FIR数字滤波器,并提取其特性参数。
这里需要注意的是:下载到FPGA的程序是按照FIR滤波器的差分方程式编写的。由于从MATLAB中算出的系数h(n)的值是一组浮点数,而FPGA器件只进行定点值的计算,所以要进行浮点值到定点值的转换。假定“1”对应10000000000000000(17位,相当于乘上65536)。
用汉字窗(Hanning)进行设计,此16阶FIR数字低通滤波器特性参数经过换算如下:
h[0]=h[15]=0000 h[1]=h[14]=0065 h[2]=h[13]=018F
h[3
]=h[12]=035A h[4]=h[11]=0579 h[5]=h[10]=078E
h[6]=h[9]=0935 h[7]=h[8]=0A1F
图5
2.2 系统具体实现步骤
2.2.1 查找表的建立
我们知道,如果滤波器抽头数N过多,用单个查找表就不能执行全字(因为查找表位宽=滤波器抽头数的数量)。在这种情况下,可以将表的地址输入位数(即滤波器抽头数N)进行降低,既利用部分表并将结果相加。如果加上流水线寄存器,这一改进并没有降低速度,但是却可以极大地减少设计规模,因为查找表的规模是随着地址空间,也就是滤波器抽头数N的增加而呈指数增加,
根据卷积和定义16阶内积。
滤波器抽头数是16个,考虑到线性FIR滤波器的偶对称特性,只考虑8个独立滤波器抽头数,则需要一个2 8×8的表(其中指数8指的是8个滤波器抽头数,后面的8指的是输入数据的位宽)。但是Virtex-e FPGA只能提供4输入的查找表,所以要对查找表的地址进行电路分割。将8位地址线分为高4位和低4位,分别作为两个2 4×8的查找表的地址输入,从而指数倍地节省了硬件资源。
2.2.2 查表计算部分积累加和的过程
假定输入数据x[n]的值x[0]=1 10=00000001 2c,x[1]=-1 10=11111111 2c,x[2]=3 10=00000011 2c,x[3]=2 10=00000010 2c。(注:2c代表用二进制补码表示,最高位为符号位。)
数据校验结果:h[0]x[0]+h[1]x[1]+h[2]x+h[3]x[3]=2812
说明利用分布式查表算法的计算结果与直接计算结果相同,算法正确无误。
查找表(2)的查表计算结果依此类推。只是需要注意:查找表(2)的数据输入x是8位数据x[4]、x[5
《基于FPGA流水线分布式算法的FIR滤波器的实现(第3页)》