1 引 言
现场可编程逻辑器件(FPGA)由于兼具可编程逻辑器件现场可编程的灵活性,以及门阵列器件集成度高的优点,在数字系统设计中被广泛使用。FPGA有着规整的内部逻辑块阵列和丰富的连线资源,特别适合于细粒度和高并行度结构特点的数字信号处理任务,如FIR,FFT等。本文详细讨论了利用FPGA实现FIR滤波器的设计过程,并且对设计中的关键技术——分布式算法和基于RAM的移位寄存器都进行了详细的描述。本设计已经通过了FPGA验证,和其它同类设计相比,本文所设计的电路不仅速度快而且占用的面积小。
2 FIR和分布式算法
2.1 FIR的基本概念
FIR滤波器数学表达式为:
由此看出,FIR滤波器的基本结构如一个分节的延时线,把每一节的输出加权累加,得到滤波器的输出。对于FIR滤波器,在幅度上只需满足下列两个条件之一,就能构成线性相位FIR滤波器。
式(2)称为第一类线性相位的幅度条件,式(3)称为第二类线性相位的幅度条件。由此可写出线性相位FIR滤波器的数学表达式:
其中,hk即h(k),xk(n)即x(n-k),K为滤波器的长度。
为了使得乘法之后的数据宽度不至于展宽,先把数据源数据格式规定为浮点数2的补码形式。则
其中,xkb(n)为二进制数,取值为0或1;xk0(n)为符号位,xk0(n)为1表示数据为负,为0表示数据为正。将(7)式代入(6)式可得
由此看出,方括号中进行的是输入变量的一个数据位和所有滤波器抽头系数h0~hk的每一位进行与运算并求和。而指数部分则说明了求和结果的位权,整数乘以2-b就是右移b位,对此可以通过硬连线实现,不占用逻辑资源。这样可以通过建立查找表来实现方括号中的操作,查找表用所有输入变量的同一位进行寻址。
这样,式(6)所表示的方程就可以由加法、减法和二进制除法来实现了。
3 系统设计与实现
3.1 系统整体设计
下面以一个10阶的线性相位FIR滤波器(输入数据和抽头系数的位宽均为16比特)为例说明电路的设计过程。
根据(全串行)分布式算法的原理,线性相位FIR滤波器可分为并串变换单元、移位寄存器组、查找表地址产生单元、查找表、累加器以及控制单元。其结构框图如图1所示。
系统工作过程如下:并行输入的数据首先经过并串变换,并扩展一位,输出比特流送到移位寄存器组中,在移位寄存器组中,每级移位寄存器的输出端口都要按照一定的方式,每两个端口进行相加或相减,以此产生出查找表的地址,并从查找表中读出相应的数据,送到累加器中进行自身移位相加,累加到一定次数输出正确结果。若数据是从级联输入端口
进入,那么输入数据无需再经过并串变换,可直接进行移位寄存,后面的工作过程和上述一致。
3.2 并串变换单元
并串变换单元的主要功能就是将并行输入的数据按照一定的顺序依次输出。由式(4)和(5)可以看出,输入数据x(k)和x(n-k)要进行预相加或预相减,为了防止溢出,在这里对输入数据要进行扩展:若输入数据为有符号数,则在最高位前扩展一位符号位;若输入数据为无符号数,则在最高位前扩展一位0。
3.3 移位寄存器组
移位寄存器组的功能是对数据进行移位寄存。在实现时,利用XC4000系列芯片中内含RAM的特点,采用基于RAM的移位寄存器,有效地减小面积。基于RAM的移位寄存器就是把数据存储在RAM中,通过对读和写进行适当的操作,使写进去的数据经过一定的时钟周期才能输出,从而实现移位寄存的功能。芯片中内含RAM,可以使其一个CLB中存储高达64比特的数据,否则,在一个CLB的触发器中只能存储2比特的数据,这样,就大大减少了数据存储所占用的资源。经测试,在XC4000系列芯片中,一个16位的移位寄存器需要占用7个CLB,而基于RAM(16×1)的移位寄存器只需占用1个CLB。
采用基于RAM的移位寄存器,就要产生用于控制RAM的读地址及读写操作信号,这些都由控制单元产生。对于一个长度为N的基于RAM的移位寄存器,可以使它的写数据操作比读数据操作延时一个时钟周期,这样写进的数据,经过N个时钟周期才能输出,从而完成移位寄存的功能。
为了实现滤波器级联的功能,需要加入一个输入端口——级联输入端口,并要引出一个输出端口——级联输出端口,这样,两个滤波器才能够级联。这十级移位寄存器既能对从输入数据端口输入的数据进行移位寄存,又能对从级联输入端口输入的数据进行移位寄存。具体实现时,在这十级移位寄存器中,第一级只需对级联输入端口的数据进行移位寄存,这是因为并串变换单元已经相当于一级移位寄存了,在第二级的输入端就需要对并串变换单元输出端口的数据和第一级移位寄存器的输出端口的数据作出选择,究竟是对哪个端口的数据移位寄存。最后一级移位寄存器的输出端引出作为级联输出端口。
3.4 查找表地址产生单元
查找表地址产生单元是产生查找表的地址,它是由五个带进位的加法器组或减法器组构成的。若滤波器的系数是正对称的,使用加法器;若滤波器的系数是负对称的,使用减法器。
3.5 查找表
查找表的功能就是存储抽头系数的组合,并且给出地址能读出相应的数据。查找表的深度是由滤波器的阶数来决定的,假如N代表滤波器的阶数,对于线性相位滤波器,其系数是对称的,那么其独立系数的个数为N/2个,则查找表的深度就等于2(N/2);对于非对称滤波器,其独立系数的个数为N个,则查找表的深度就等于2N。在设计阶数较长的FIR滤波器时,我们可以将大的查找表划分为几块小的查找表来减少所占用的FPGA资源。XILINX公司的XC4000系列FPGA的一个CLB可以实现32×1大小的RAM,例如,对于一个16阶的非对称FIR滤波器(系数宽度为8比特),若不进行划分,查找表的深度就为216,需要占用16384个CLB;若将其划分为两块寻址位数均为8的查找表,每一块查找表的深度就为28,那么两块查找表需要占用128个CLB;若将其划分为四块寻址位数均为4的查找表,每一块查找表的深度就为24,那么四块查找表需要占用16个CLB。由此看出,查找表的划分也是减小面积的一个关键技术。
查找表可以由ROM来实现。对于10阶的线性相位FIR滤波器来说,独立系数为5个,则ROM的深度就为32。表1示出了这5个独立系数的组合在ROM中的位置。
3.6 累加器
累加器的功能就是通过中间数据的移位相加实现两个数相乘,在该单元中也要进行防溢出处理。由于该累加器实现的相当于乘法器的移位相加,所以每次都要将相加结果右移一位,再和下一次的输入数据相加。如果输入数据是无符号数并且抽头系数是正对称,则直至加到17次;如果输入数据为有符号数(抽头系数为正对称也可为负对称),或者输入数据为无符号数且抽头系数是负对称,则相加进行16次,最后一次进行的是相减运算。移位相加减由控制单元计数器信号来控制。
本文关键字:滤波器 电工文摘,电工技术 - 电工文摘