以下是小编收集整理的基于FPGA流水线分布式算法的FIR滤波器的实现(共含5篇),仅供参考,希望对大家有所帮助。同时,但愿您也能像本文投稿人“不会很饱☺︎”一样,积极向本站投稿分享好文章。
基于FPGA流水线分布式算法的FIR滤波器的实现
摘要:提出了一种采用现场可编码门阵列器件(FPGA)并利用窗函数法实现线性FIR数字滤波器的设计方案,并以一个十六阶低通FIR数字滤波器电路的实现为例说明了利用Xilinx公司的Virtex-E系列芯片的设计过程。对于在FPGA中实现FIR滤波器的关键――乘加运算,给出了将乘加运算转化为查找表的分布式算法。设计的电路通过软件进行了验证并进行了硬件仿真,结果表明:电路工作正确可靠,能满足设计要求。关键词:FIR滤波器 FPGA 窗函数 分布式算法 流水线
随着数字技术日益广泛的应用,以现场可编程门阵列(FPGA)为代表的ASIC器件得到了迅速普及和发展,器件集成度和速度都在高速长。FPGA既具有门阵列的高逻辑密度和高可靠性,又具有可编码逻辑器件的用户可编程特性,可以减少系统设计和维护的风险,降低产品成本,缩短设计周期。
分布式算法是一种以实现乘加运算为目的的运算方法。它与传统算法实现乘加运算的不同在于执行部分积运算的先后顺序不同。简单地说,分布式算法在完成乘加功能时是通过将各输入数据每一对应位产生的部分积预先进相加形成相应部分积,然后在对各部门积进行累加形成最终结果,而传统算法是等到所有乘积产生之后再进行相加来完成乘加运算的。与传统算法相比,分布式算法可极大地减少硬件电路规模,很容易实现流水线处理,提高电路的执行速度。
(本网网收集整理)
FPGA有着规整的内部逻辑块阵列和丰富的连线资源,特别适合细粒度和高并行度结构特点的数字信号处理任务,如FIR、FFT等。本文详细讨论利用FPGA实现FIR滤波器的设计过程,并且对设计中的关键技术――分布式算法进行详细描述。
1 FIR和分布式算法
1.1 FIR的基本概念
FIR滤波器的数学表达式为:
式中,N是FIR滤波器的抽头数,x(n)表示第n时刻的输入样本;h(i)是FIR滤波器的第i级抽头系数。
普通的直接型FIR滤波器结构如图1所示。
FIR滤波器实质上是一个分节的延迟线,把每一节的输出加权累加,便得到滤波器的输出。对于FIR滤波器,幅度上只需满足以下两个条件之一,就能构成线性相位FIR滤波器。
h(n)=h(N-1-n) (2)
h(n)=-h(N-1-n) (3)
式(2)称为第一类线性相位的幅度条件(偶对称),式(3)称为第二类线性相位的幅度条件(奇对称)。
1.2 FIR滤波器的优化
在实际应用中,为了减少逻辑资源的占有量和提高系统的运行速度,对FIR滤波器需要进行优化处理。本文采用的优化主要有两种:一种是对表达式进行优化,另一种是在FPGA实现中利用特有的查找表进行优化。
1.2.1 表达式的直接优化
对于线性相位因果FIR滤波器,它的系列具有中心对称特性,即h(i)=±h(N-1-i)。令s(i)=x(i) ±x(N-1-i),对于偶对称,代入式(1)可得:
根据方程(4),线性相位FIR滤波器的直接型结构可以改为如图2所示的结构,从而使N次乘法减少为[N/2]次,加法次数增加了[N/2]次(N为偶数),总的运算量减少。
1.2.2 利用查找表进行设计优化
由于实现的是固定系数的FIR滤波器,所以可以用利用简化的过程(如查找表)减少设计所耗用的器件资源。
以一个8阶FIR滤波器为例来说明在FPGA实现中优化的过程。假定滤波器的输入为2bit的正整数,由(4)可以得到输出为:
y(n)=s(0)h(0)+s(1)h(1)+s(2)h(2)+s(3)h(3) (5)
这时的乘法和加法就可以并行地采用查找表实现,其结构示意图如图3所示。
在图3中,右面4个信号是输入的'低位bit,左边是输入信号的高位bit。低位和P1最多使用4bit,由于系数固定,查找表实现起来很方便;高位和P2可按同样方法计算。在该结构中,部门积P1和P2可以利用Virtex-E的4输入查找表实现,所有的计算都可并行完成。由于输入为2bit,因此只用了一个加法器;对于更多位数的输入来说,将需要更多的加法器。这样就实现了将乘法器转化为回法器,减少了解逻辑资源,优化了设计。
1.3 分布式算法
分布式算法在20多年前被首次提出,但直到Xilinx发明FPGA的查找表结构以后,分布式算法才在20世纪90年代初重新受到重视,并被有效地应用在FIR滤波器的设计中。下面介绍分布式算法的原理。
式(1)可以用下式表示:
式中,hi即h(i),xi(n)即x(n-i),N为滤波器的抽头数。
把数据源数据格式规定为2的补码形式,则:
式中,xib(n)为二进制数,取值为0或1;xio(n)为符号位,为1表示数据为负,为0表示数据为正。将(7)式代入(6)式可得:
由此可以看出,方括号是输入变量的一个数据位和所有滤波器抽头系数h0~hi的每一位进行“与”运算并求和。而指数部分则说明了求和结果的位权,整数乘以2b就是左移b位,对此可以通过硬件连线实现,不占用逻辑资源。这样就可以通过建立查找表来实现方括号中的运算,查找表可用所有输入变量的一同一位进行寻址。
2 系统设计与实现
下面以一个16阶的线性相位FIR低通滤波器为例说明设计的过程。
2.1 设计指标及参数提取
2.1.1 滤波器的设计指标
采样频率:≥50MHz 归一化截止频率:0.4MHz
类型:低通 输入数据宽度: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]、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 设计结果
本系统的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资源。通过阶段以及查找表中抽头系数的设定,还可以灵活地实现除低通外的高通、宽阻和带通滤波器。
设计的电路已通过FPGA验证,说明工作正常,符号设计指标。
基于FPGA实现FIR滤波器的研究
摘要:针对在FPGA中实现FIR滤波器的关键--乘法运算的高效实现进行了研究,给了了将乘法化为查表的DA算法,并采用这一算法设计了FIR滤波器。通过FPGA仿零点验证,证明了这一方法是可行和高效的,其实现的滤波器的性能优于用DSP和传统方法实现FIR滤波器。最后介绍整数的CSD表示和还处于研究阶段的根据FPGA实现的要求改进的最优表示。关键词:FPGA DA FIR滤波器 CSD
数字滤波器是语音与图像处理、模式识别、雷达信号处理、频谱分析等应用中的一种基本的处理部件,它能满足波器对幅度和相位特性的严格要求,避免模拟乙波器所无法克服的电压漂移、温度漂移和噪声等问题。有限冲激响应(FIR)滤波器能在设计任意幅频特性的同时保证严格的线性相位特性。
目前FIR滤波器的实现方法有三种:利用单片通用数字滤波器集成电路、DSP器件和可编程逻辑器件实现。单片通用数字滤波器使用方便,但由于字长和阶数的规格较少,不能完全满足实际需要。使用DSP器件实现虽然简单,但由于程序顺序执行,执行速度必然不快。FPGA有着规整的内部逻辑阵列和丰富的连线资源,特别适合于数字信号处理任务,相对于串行运算为主导的通用DSP芯片来说,其并行性和可扩展性更好。但长期以来,FPGA一直被用于系统逻辑或时序控制上,很少有信号处理方面的应用,其原因主要是因为在FPGA中缺乏实现乘法运算的有效结构。现在这个问题得到了解决,使FPGA在数字信号处理方面有了长足的发展。
图1
1 分布式运算原理
分布式算法(DA)早在1973年就已经被Croisier提出来了,但是直到FPGA出现以后,才被广泛地应用在FPGA中计算乘积和。
一个线性时不变网络的输出可以用下式表示:
(本网网收集整理)
=c[0]x[0]+c[1]x[1]+…+c[N-1]x[N-1]
假设系数c[n]是已知常数,x[n]是变量,在有符号DA系统中假设变量x[n]的表达式如下:
式中,xb[n]表示z[叫的第b位,而x[n]也就是x的第n次采样。于是,内积y可以表示为:
重新分别求和(也就是分布式算法的由来),其结果如下:
从(1)式可以发现,分布式算法是一种以实现乘加运算为目的的运算方法。它与传统算法实现乘加运算的不同在于执行部分积运算的先后顺序不同。分布式算法在实现乘加功能时,是通过将各输入数据的每一对应位产生的部分积预先进行相加形成相应的部分积,然后再对各个部分积累加形成最终结果的,而传统算法是等到所有乘积已经产生之后再来相加完成乘加运算的。与传统串行算法相比,分布式算法可极大地减少硬件电路的规模,提高电路的执行速度。它的实现框图如图1(虚线为流水线寄存器)所示。
图2
2 用分布式原理实现FIR滤波器
2.1 串行方式
当系统对速度的要求不高时,可以采用串行的设计方法,即采用一个DA表、一个并行累加器和少量的寄存器就可以了。
在用LUT实现串行分布式算法的时候,假设系数为8位,则DA表的规模为2N×8位。可以看到如果抽头系数N过多,则DA表的规模将十分庞大。这是因为LUT的规模随着地址空间的变化(也就是N的增加)而呈指数增加。例如EPFl0K20包含1152个LC,而一个27×7位的表就需要394个LC。当N过大时,一个FPGA器件就不够用了。
为了减小规模,可以利用部分表计算,然后将结果相加。假定长度为LN的内积为:
将和分配到L个独立的N阶并行DA的LUT之中结果如下:
如图2所示,实现一个4N的DA设计需要3个次辅助加法器。表格的规模从一个2 N×B位的LUT降到4个2 N×B的位表。
如果再加上流水线寄存器,由于EPFl0K20每个LC后面都跟有一个寄存器,所以并没有增加电路规模,而速度却得到了提高。
2.2 并行方式
采用并行方式的好处是处理速度得到了提高。由于数据是并行输入,所以计算速度要比串行方式快,但它的代价是硬件规模更大了。下面举出全并行的例子。
设 sum[0]=c[0]x0+[0]+c[1]x0[1]+…+c[N-1]x0[N-1]
sum[B-1]=c[B-1]xB-1[0]+c[1]xB-1[1]+…c[N-1]+xB-1[N-1]
可将(1)式改写成如下形式
y=sum[0]+sum[1]2 1+sum[2] 2+…+sum[B-1]2 B-1 (2)
利用式(2)可得一种直观的加法器树,如图3所示。
虽然硬件规模加大了,但是如果把系数的个数限制在4个或8个,再加上流水线寄存器,这个代价还是值得的。而且每张表都是相同的,不用为每个采样都设计一张表,减小了设计量。
DA算法的主要特点,是巧妙地利用ROM查找表将固定系数的MAC运算转化为查表操作,其运算速度不随系数和输入数据位数的增加而降低,而且相对直接实现乘法器而言在硬件规模上得到了极大的改善。利用ALTERA的FLEXl0K实现的16阶8位系数的并行FIR滤波器,其时钟频率可以达到101MHz,而实现的16阶8位系数的串行FIR滤波器,其时钟频率可以达到63MHz,每9个时钟周期可完成一次计算。但是其系数是传统二进制的,造成了很大的冗余(对于用逐位相加法实现的乘法器,当系数有一位为零时不用相加,零位越多,冗余越大),而且查找表的大小随着滤波器阶数的增加成指数增加,虽然可以采用将大查找表分解为小查找表,但是无法从根本上解决这一问题,这些都是DA方法的缺点。后面将对FIR滤波器实现给出新的设计方法,进一步降低逻辑资源的消耗。
3 CSD码及最优化方法
一个整数X与另一整数Y的乘积的二进制表示可以写成:
对于标准二进制,由于sn=0时的对应项Y2n并不参与累加运算,所以可以用另一种表示方法使非零元素的数量降低,从而使加法器的数目减少,降低硬件规模。有符号数字量(SD)有三重值{0,-1,+1},如果任意两个非零位均不相邻,即为标准有符号数字量(CSD)。
可以证明CSD表示对给定数是唯一的并且是最少非零位的。CSD表示相对于标准二进制表示的改进在于引入了负的符号位,从而降低了非零位个数,大大降低了逻辑资源的占用(大约平均降低33%的逻辑资源)。
当用硬件实现时,常常限制系数位数,即每个系数与N个正(负)2的幂次之和近似。标准二进制数在整数轴上是紧密和均匀分布的,而CSD码是非均匀分布的',其对实系数的量化误差比标准二进制大,虽然增加N可以减小量化误差,但是会增大逻辑资源的消耗;而且CSD表示无法应用流水线结构,从而降低处理速度。
还可采用优化的方法将系数先拆分成几个因子,再实现具体因子。这就是最优化的代码。例如对系数93,93=10111012=1100101CSD。用最优化法,系数93可以表示成93=3・31,每个因子需要一个加法器,如图4所示。
图4
从图中可以看出,CSD码需要三个加法器
,而最优法只需要两个加法器;CSD码的重要缺陷在于每一级加法都需要初节点参与,而最优表示仅依赖上一级加法的结果,因此也就更适合流水线处理。Dempster等人提出了需要1到4个加法器的所有可能配置表。利用这张表,就可以合成成本在0与4个加法器之间的所有8位二进制整数。
本文首先给出了一种巧妙利用FPGA的查找表,将乘法转化为查找表运算的DA算法,并用ALTERA的FLEXlOK器件分别实现了一个8位16阶的串行与并行FIR滤波器,系统频率分别达到63MHz与101MHz,采样速度分别达到7MSPS与101MSPS。而DSP实现的FIR滤波器只能达到5MSPS,明显低于FPGA。用传统的位串行方法实现的一个8阶8位FIR滤波器,也只能达到5MSPS,明显低于串行式DA方法;接着,针对系数的二进制表示非零位不是最少(即实现系数乘法的加法器不是最少)的问题,介绍了整数的CSD表示以及最优表示,它们可以用较小的代价和与加法器级数无关的处理速度实现整数乘法运算,能比DA方法用更少的逻辑资源实现FIR滤波器。这些算法都不同于传统的设计观念,为基于FPGA的DSP设计提出了新的思路,必将在高速FIR滤波器设计、高速FFT设计中得到广泛的应用。随着FPCA集成规模的不断提高,许多复杂的数学运算已经可以用FPCA来实现,利用单片FPGA实现系统的设想即将变为现实。
FIR数字滤波器分布式算法的原理及FPGA实现论文
摘要:在利用FPGA实现数字信号处理方面,分布式算法发挥着关键作用,与传统的乘积-积结构相比,具有并行处理的高效性特点。详细研究了基于FPGA、采用分布式算法实现FIR数字滤波器的原理和方法,并通过XilinxISE在Modelsim下进行了仿真。
关键词:分布式算法DALUTFPGAFIR
数字滤波器正在迅速地代替传统的由R、L、C元件和运算放大器组成的模块滤波器并且日益成为DSP的一种主要处理环节。FPGA也在逐渐取代ASIC和PDSP,用作前端数字信号处理的运算(如:FIR滤波、CORDIC算法或FFT)。乘累加运算是实现大多数DSP算法的重要途径,而分布式算法则能够大大提高乘累加运算的效能。
1传统的乘累加结构FIR数字滤波器基本理论
FIR滤波器被称为有限长脉冲响应滤波器,与IIR数字滤波器相对应,它的单位脉冲响应h(n)只有有限个数据点。输入信号经过线性时不变系系统输出的过程是一个输入信号与单位脉冲响应进行线性卷积的过程,即:
式中,x(n)是输入信号,y(n)是卷积输出,h(n)是系统的单位脉冲响应。可以看出,每次采样y(n)需要进行L次乘法和L-1次加法操作实现乘累加之和,其中L是滤波器单位脉冲响应h(n)的长度。可以发现,当L很大时,每计算一个点,则需要很长的延迟时间。
2乘累加运算的位宽分配
DSP算法最主要的就是进行乘累加运算。假设采样信号的位宽用N来表示,则N位与N位的乘累结果需要2N位的寄存器来保存;如果两个操作数都是有符号数,则乘积只有2N-1个有效位,因为产生了两个符号位。
为了使累加器的结果不产生溢出,需要对累加器进行冗余设计,也就是说要在累加器2N的位宽上多设计出K位,累加器的长度M计算方式如下(L为滤波器的长度):
对于无符号数:M=2N+K=2N+log2L
对于有符号数:M=2N=K=2N+log2L-1
3乘累加运算的分布式算法原理分析
得益于XilinxFPGA查找表结构的潜能,分布式算法在滤波器设计方面显示出了很高的效率,自20世纪90年代初以来越来越受到人们的.重要。分布式算法是基于查找表的一种计算方法,在利用FPGA实现数字信号处理方面发挥着重要的作用,可以大大提高信号的处理效率。它主要应用于数字滤波、频率转换等数字信号处理的乘累加运算。
分布式算法推导如下:
设Ak是已知常数(如滤波器系数、FFT中的正弦/余弦基本函数等),xk(n)是变量,可以看作是n时刻的第k个采样输入数据,y(n)代表n时刻的系统响应。那么它们的内积为:
其中,xk(n)变量可以写成下面的格式:
式中,B为数据格式的字长,xkb是变量的二进制位,只有“0”和“1”两种状态。将(2)式代入(1)式得:
4FPGA实现过程中查找表的构造方法
根据以上论述,括号中的每一乘积项代表着输入变量的某一位与常量的二进制“与”操作,加号代表着算术和操作,指数因子对括号中的值加权。如果事先构造一个查找表,该表存储着括号中所有可能的组合值,就可以通过所有输入变量相对应位的组合向量(XNb,X(N-1)b,...x1b)对该表进行寻址,该查找表称为DALUT。DALUT的构造规则如表1所示。
5采用分布式算法实现FIR数字滤波器
为了说明问题,以一个三个系数的FIR数字滤波器为例设计分布式算法,字宽也设置为三位。设FIR数字滤波器系数为:h(0)=5,h(1)=2,h(2)=3。
在进行FPGA设计时,该表以组件Component形式构建,设置为ROM结构,提供输入寻址端口table_in,输出端口table_out。FPGA算法的结构图如图2所示。
算法实现中的几个关键问题为:
(1)采用状态机实现分布式算法的状态转移
状态机的实现如图3所示,设置三个状态s0、s1、s2。状态s0完成数据的装入,数据寄存器需要成对出现,一个完成数据的延迟,另一个完成数据的移位,并将状态转移到s1;状态s1完成查找表功能、数据移位和分布式算法的乘累加运算,数据移位一个数据宽带后将状态转移到s2;状态s2完成数据的输出,并将状态转移到s0。利用状态机可以条理清楚地简化计算过程,在算法实现时发挥着关键的作用。
(2)系统时钟与数据输入时钟的关系
根据上述的状态转移关系,可以得出:每输入一个数据,在下一次数据输入之前,需要在状态s1停留一个数据宽带(三位)的时钟时间,在s2停留一个时钟的数据输出时间。也就是说,系统时钟频率应是数据输入频率的5倍,即fclkock=5fxin。
(3)分布式算法中的乘累加式公推导及核心代表实现
设B是数据的字宽,Pn是分布式算法第n位的结果,则有:
有了该关系式,就可以通过for...loop循环,使用一条语句完成
分布式乘累加算法。具体如下:
fornin0toB-1loop
P:=p/2+tableout(n)*2B-1;
Endloop;
6算法仿真验证与结论
本文实现的FIR滤波器在Xilinx的集成开发环境ISE下利用ModelSim进行了仿真。当输入数据为7,3,1...时,仿真输出依次为35,29,32,16...,与乘累加方式FIR滤波算法得出的结果完全一致。假设查找表和PDSP的通用乘法器延时时间相同,分布式算法的等待时间是Br,通用乘法器的等待时间是N1。可见,对于位宽较小的数据来说,分布式算法的执行速度远高于乘累加运算。可见,利用FPGA实现分布式计算大大提高了计算的速度,在高速信号处理中发挥着重要作用。
基于FPGA的α-β滤波器的实现
目标航迹滤波算法的实现通常是在PC机上通过软件实现滤波,滤波等待时间为毫秒级,且需要的设备量体积大.为了缩短滤波等待时间,减小设备体积,以工程实现为目标,以经典航迹滤波算法为基础,提出了一种新的'算法硬件解决方案.目标航迹滤波由嵌入式DSP实现,再通过FPGA局部总线实时上传.经实践验证该方法实现的目标航迹滤波在系统时钟为40MHz的情况下,DSP滤波网络等待时间仅为1.475μs.
作 者:郑希 王和明 ZHENG Xi WANG Heming 作者单位:空军工程大学导弹学院,陕西三原,713800 刊 名:电光与控制 ISTIC PKU英文刊名:ELECTRONICS OPTICS & CONTROL 年,卷(期): 17(4) 分类号:V271.4 TN713 关键词:数字信号处理 FPGA 高速α-β滤波 IIR基于流水线技术的并行高效FIR滤波器设计
摘要:基于流水线技术,利用FPGA进行并行可重复配置高精度的FIR滤波器设计。使用VHDL可以很方便地改变滤波器的系数和阶数。在DSP中采用这种FIR滤波器的设计方法可以充分发挥FPGA的优势。关键词:FIR滤波器 FPGA 流水线技术
数字滤波器可以滤除多余的噪声,扩展信号频带,完成信号预调,改变信号的特定频谱分量,从而得到预期的结果。数字滤波器在DVB、无线通信等数字信号处理中有着广泛的应用。在数字信号处理中,传统滤波器通过高速乘法累加器实现,这种方法在下一个采样周期到来期间,只能进行有限操作,从而限制了带宽。现实中的信号都是以一定的序列进入处理器的,因此处理器在一个时钟周期内只能处理有限的位数,不能完全并行处理。基于并行流水线结构的FIR滤波器可以使笔者设计的64阶或者128阶滤波器与16阶滤波器的速度一样快,其显著特别是在算法的每一个阶段存取数据。FPGA结构使得以采样速率处理数字信号成为常数乘法器的理想载体,提高了整个系统的性能。由于设计要求的差异,如字长、各级输出的保留精度等不同,在整个设计过程中,各个环节也有所不同,这就需要根据不同的要求对数据进行不同的处理,如截断、扩展等,从而设计出既满足设计需要,又节省FPGA资源的电路。
图1 并行滤波器结构
1 FIR并行滤波器结构
数字滤波器主要通过乘法器、加法器和移位寄存器实现。串行处理方式在阶数较大时,处理速度较慢。而现代数字信号处理要求能够快速、实时处理数据,并行处理数据能够提高信号处理能力,其结构如图1所示。
图2 查找表相乘和累加
从上面的算法可以看出,处理数据的采样时钟对每一个抽头来说都是并行的,并且加法器和移位寄存器采用级联方式,完成了累加器的功能,综合了加法器和移位寄存器的优点,而且这种算法的各级结构相同,方便扩展,实现了任意阶数的滤波器。算法中,真正点用系统资源的是乘法器。如果将系数量化成二进制,就能采用移位寄存器和加法器实现乘法功能。对于一个特定的滤波器,由于它有固定的系数,乘法功能就是一个长数乘法器。下面将讨论乘法器的设计问题。
(本网网收集整理)
2 FIR并行滤波器的乘法器设计
在并行滤波器的设计中,每一个乘法器的一端输入数据,另一端为固定常数。对于常数乘法器,可以预先将常数的部分乘积结构存储起来,然后通过查表的方式实现两个数据的乘积。以16位输入、常数为14位的乘法器为例,给出其实现结构如图2所示。
对于无符号数来说,这是一种理想结构。但是在实际使用中,通常使用有符号数且常用补码的形式,因此需要对这种结构进行改进。一种改进方法是将输入的数据分开,即最高的几位作为有符号数处理,其它作为无符号数处理。第二种改进方法是将符号数经过补码/原码变换器变换成原码,然后,将原码作为无符号数处理,通过有符号数的符号位来控制加法器的加减。第三种改进方法是一种优化方法,即要用三个二进制补码变换器,处理输入的有符号数和滤波器的系数,这样可以避免使用有符号数的乘法和加法运算。具体的乘法累加器运算过程及结果如图3所示。其中,对应乘数高位和低位部分积p1(n)和p2(2)可以分别先垂直相加后水平相加,或者先水平相加后垂直相加,最后的结果是一样的。若采用后种方法,由于FIR滤波器的h(n)均为常数,得到部分积的矢量乘法运算就演变成了查表法,其中,S1(n)表示S(n)的最低有效,p1表示最低有效位部分积之和。
图4 有符号数查找表优化结构
同理,得p2,将p2左移一位与p1相加,便得到最后结果。这种查表法就是采用流水线技术进行FIR滤波器算法分解的基础,当字长增加时,相应得到p3、p4等。并相应移位相加即可。
采用流水线技术和加法器的资源共享技术可以更好地提高常数乘法器的优越性。16比特输入、14比特常数的这种方法的常数乘法器的结构如图4所示。
图5 优化FIR滤波器结构
在这种结构中,时钟是f1,内部操作的时钟是4×f1,其中的4个多路复用器每次可以从16路信号中选出4位用作ROM的地址线。每次4位地址从ROM中读出数据,经过相应的移位相加即可,两位计数器用来控制这些多路复位器的输出。
3 FIR滤波器的FPGA实现
按照第2节所描述的第三种优化方法实现常数乘法器,乘法器输出以后按照图4所示的滤波器结构,通过流水线技术的'加法器可以实现高效的滤波器。值得注意的是:在乘法器输出的时候需要对输出的数据进行一位扩展,可以避免加法器的溢出问题。
为了有效地利用资源,先通过多路复用器将输入的序列复选出来,这样所有常数乘法器可以共用一个多路复用器,然后通过ROM查表方法实现常数乘法器。优化后的原理结构如5所示。
4 FIR滤波器的电路设计与仿真结果
在数字滤波器设计时,首先根据滤波器的频率特性,选定滤波器的长度和每一节的系数。就目前的设计手段而言,对节数和系数的计算可以采用等波动REMEZ逼近算法编程计算。但是,目前最好的方法还是使用使用的EDA软件来完成。在选择了设计方法和设计要求后,计算出各节系数,并以图形的直观形式显示幅频、相频、冲激响应和零极点图。
图6是一个采用等波动设计方法生成的均方根升余弦(RRC)FIR滤波器的频域特性。其中,滚降系数为0.35,输入数据率是2.048MHz。
由于在数字滤波器中,各节系数字长有限,所以还要对计算出来的实系数进行量化处理,即浮点数向定点数转换。系数量化后的频域特性如图7所示,量化字长为12。
比较图6与图7,不难看出,系数在量化前后的频域特性是不同的,量化带来了频域特性的恶化。在验证了量化后的频域特性满足设计要求和系数的有效性之后,就可以进行FPGA电路的设计。
笔者采用流水线技术,根据得到的滤波器系数用VHDL语言编写了滤波器程序。为了充分利用FPGA中四输入查找表的电路结构,一般采用每8节为滤波器的一个基本单元。设计中通过采用流水线技术提高速度,对于更多阶数滤波器的设计,可以采用扩展的方法来实现。仿真结果如图8所示。
图8 高效滤波器频率特征
本文介绍了并行高效数字滤波器的设计方法,给出了电路的仿真结果。利用VHDL语言,采用可重复配置的FPGA,降低了设计成本,提高了系统的适用性。由于FIR滤波器的系数是常数,可以保存在ROM中,在运算的通过查找表的方法可很快得到乘法输出,减少了使用的资源和布线延时,节省了运算时间。在设计中,充分利用先进的EDA团体操,大大提高了设计效率。