基于FPGA流水线分布式算法的FIR滤波器的实现
2.2.1 查找表的建立
我们知道,如果滤波器抽头数N过多,用单个查找表就不能执行全字(因为查找表位宽=滤波器抽头数的数量)。在这种情况下,可以将表的地址输入位数(即滤波器抽头数N)进行降低,既利用部分表并将结果相加。如果加上流水线寄存器,这一改进并没有降低速度,但是却可以极大地减少设计规模,因为查找表的规模是随着地址空间,也就是滤波器抽头数N的增加而呈指数增加,
根据卷积和javascript:window.open(this.src);" style="cursor:pointer;"/>定义16阶内积。
滤波器抽头数是16个,考虑到线性FIR滤波器的偶对称特性,只考虑8个独立滤波器抽头数,则需要一个2 8×8的表(其中指数8指的是8个滤波器抽头数,javascript:window.open(this.src);" style="cursor:pointer;"/>后面的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]、x[6]、x[7],而不是x[3]、x[2]、x[1]、x[0]。根据系数偶对称性质。x[8]、x[9]、x[10]、x[11]查查找表(2),x[12]、x[13]、x[14]、x[15]查查找表(1)。
3 设计结果javascript:window.open(this.src);" style="cursor:pointer;"/>
本系统的FPGA采用Xilinx公司的Virtex-E系列中的XCV100E FPGA,使用的软件是Xilinx公司的ISE5.2i及Modelsim公司的Modelsim时序仿真工具,对FIR滤波器进行描述编程使用的是VHDL语言。
实现FIR滤波器的最上层的原理图如图4所示,输入16个8位数据data_in={1,-1,3,2,2-1,1,-1,1,-1,3,2,2,-1,1,1}。
系统仿真的时序图如图5所示。所设计FIR滤波器的幅频、相频、单位脉冲冲激响应如图6~8所示。
FIR滤波是DPS的基本运算形式这一。本文介绍的基于FPGA的分布式算法提高了系统运行的速度并且节省了大量的FPGA资源。通过阶段以及查找表中抽头系数的设定,还可以灵活地实现除低通外的高通、宽阻和带通滤波器。
javascript:window.open(this.src);" style="cursor:pointer;"/>