几种FPGA的FIR滤波器方案详析Word文档格式.docx
《几种FPGA的FIR滤波器方案详析Word文档格式.docx》由会员分享,可在线阅读,更多相关《几种FPGA的FIR滤波器方案详析Word文档格式.docx(7页珍藏版)》请在冰豆网上搜索。
将H(z)分解成实系数二阶因子的乘积形式:
图中画出了一个FIR滤波器的级联结构,其中每一个二阶因子用一个横截型来表示:
这种结构的每一节控制一对零点,因而在需要控制传输零点时可以采用它。
但是这种结构所需要的系数比卷积型的系数h[n]要多,因而需要更多的储存单元。
理论上需要个单元储存系数,再加上各单元储存中间结果,结果一共需要个储存单元。
频率抽样型<
Decimation-type>
把一个N店有限长序列的z变换H(z)在单位圆上作N等分抽样,就得到,其主值序列就等于h(n)的离散傅里叶变换。
即H(z)的内插公式为:
这个公式就为FIR滤波器提供了另外一种结构,这种结构由两部分组成。
其中的第一部分为(这是一个FIR子系统,是由N节延时单元构成的梳状滤波器):
级联的第二部分为(这是一个由N个一节网络并联而成的IIR子系统):
频率抽样型的结构如图所示:
该系统需要2N个储存单元用来缓存输入的数据,N个储存单元用来储存系数,一共需要花费3N个储存单元。
量化误差分析
理论设计的FIR滤波器系数都是无限精度的,当他们有硬件实现时,必须要量化,这必然引起量化误差。
这也就使得理论滤波器和实际滤波器存在一些性能上的差别<
由于FIR滤波器只有z=0只一个极点,他在单位圆内,不会出现系统的不稳定,这还算Lucky!
>
系数的量化误差对系统的影响,不仅仅和量化字长有关,更是和滤波器的结构密切相关的!
分析:
假设为理论系数,为量化系数,为量化误差,则有:
可以得到由于各的偏差引起的第i个零点位置变化量为(推导过程见:
《数字信号处理教程.程佩青.清华大学出版社》):
上式分母中的每一个因子是由一个零点指向的矢量,而整个分母正是所有其它零点指向该零点的矢量积。
当系统的零点非常密集时,他们互相的矢量长度就很短,矢量积就更小,就较大。
高阶直接型滤波器的零点数目多而密集,而低阶直接型滤波器的零点数目少而稀疏,因而前者对系数的量化误差要敏感得多。
实现方案比较
Direct-type
使用储存单元最少,但是由于阶数很高,所以零点非常密集,系数的量化误差对零点的影响较大,必须要通过增加系数的量化字长来确保系统的正确。
Cascade-type
使用的储存单元较多,但是由于每一个子系统都是二阶系统,故量化误差对整个系统的影响较小,可以使用较短的系数量化字长。
Decimation-type
使用的储存单元较多,由于每一个并联的二阶字系统的误差值对自身影响,故该结构的整个系统误差最小。
但是由于引入了IIR系统,故在系数量化的时候,必须是极点量化在单位圆之内,否则将使系统不稳定。
指标:
采样频率系数量化字长
通带截止频率阻带截止频率
通带纹波系数阻带衰减
在右上角的幅频特性曲线图(经放大)中,我们可以看到,系数经过量化后,会对幅频特性产生一定的影响。
但是由于量化比特数非常的高,所以影响不是太大,能符合我们的设计指标。
右下角展示了量化过后的系数对零极点的影响。
设计方案
由于要求是硬件最少,并且最优,我们采取第一种方案,即:
系数高bit量化的直接型结构。
由于FIR滤波器的系数镜像对称,故将线形相位FIR滤波器的流图改造成如下格式:
在上结构中,每一个乘加单元<
MAC>
都是将镜像对称的两个值进行MAC运算。
所以我们在实现输入值x[n]的缓冲时,将缓冲设置成两个镜像对称的缓冲器<
top-buffer&
buttom-buffer>
。
这样在实现累加时两个buffer可以共用一个指针减计数器<
decrementor>
(采用减计数器,而不采用加计数器的原因将会在后续的时序关系中得到解释),而不必要使用一个指针加计数器<
incrementor>
和一个指针减计数器<
,或者让系数ROM的指针变量产生复杂的运动,这能简化时序设计的复杂性,同时也就节约了硬件;
并且采用用镜像对称buffer,再不额外增加硬件的同时,可以降低时钟一半的频率,这是非常重要的。
虽然增加了一个(24+1)-bit加法器,但是同时也减少了ROM中的计数器(资源共享原理将在ROM模块介绍),并且换来上述的优化设计。
在上述的原理框图中我们可以看到,所有的MAC都是规则分布的,这种几何上的“美”,正好是时分复用的最好例证。
假设x[n]的输入时钟clk的速率为,MAC单元的处理速率为,若存在,则可以实现MAC单元的复用,这样就将个MAC单元降低为1个,大大的节约了硬件。
FIR滤波器的实现框图如下:
ROM-cell实现:
方案一(直接法)
由于该FIR滤波器的性能要求极高,所以在实现时,FIR滤波器的系数非常的多。
且由以上的“零极点图”可以看出,零点非常的密集,这就修要使用高bit来量化FIR滤波器的系数。
当采用27-bit量化时才能取得较好的结果。
这样,理论上需要。
由于系数众多,所以需要大量的存储单元。
方案二(缩放法【ScalingTechä
】)
可以证明,一个十进制数要被二进制数表示时,该十进制数越接近于,产生相同精度时,用于表示该数的二进制位数越少。
若,其中c为滤波器系数,为量化间距,N为量化比特数。
假设为相对量化误差,则有:
显然,当相对量化误差一定时,系数c越大,所采用的量化比特数N就越少。
在下图中可以很明显地看出量化间距对相对量化误差的影响。
很明显,当系数c太小时,很容易被量化间距所造成的量化噪声所淹没,而完全不能恢复。
所以我们可以先把所有的系数(左图)放大后再进行量化,将放大后的数(右图)进行量化并进行乘法运算,最后将乘法的结果减小倍(这对于硬件实现非常容易,只需要讲结果右移N位即可)。
但是我们从系数上来观察,发现采用“直接型”FIR滤波器所产生的系数相差非常的大,其动态范围高达,不宜采用单因子缩放。
这里引入一个叫做缩放矩阵和趋一矩阵的概念:
记为缩放矩阵为,趋一矩阵为。
将所有的系数绝对值被1除,将得到的商项下取整得,由于,所以必有,再计算和,这时将满足。
分别将P和用二进制量化为t比特、c比特,于是有:
由于,所以只需要用较少的比特来量化他就可以满足精度的要求,试验证明:
当c=14时,较精确的满足了要求。
再算得t=5,所以一共只需要采用19比特就可以了。
这样每个系数就节约了8比特。
理论上一共节约了。
误差分析:
当采用直接法量化时,N=27,,算得:
而采用收缩法量化时,N=14,,算得:
可以看出,当采用【ScalingTechä
】技术以后,不仅能将量化比特数几乎降为原来的一半,而且最大相对量化误差降为原来的。
当采用【ScalingTechä
】算法时,乘法器所需要的最高速度变为:
采用直接法时,MAC单元可以直接采用Booth乘法器,而采用缩放法时需要对Booth乘法器添加移位运算器(shifter)。
当采用收缩法时,由于最后要将乘法结果进行右移以后才能将结果进行累加,所以会损失一定的精度。
移位得越多,精度损失得越多。
MAC-cell实现:
MAC-cell是由一个乘法器和一个累加器组成,累加器设计较为简单,也不会占用太多的资源,关键在于乘法器的设计。
在该FIR滤波器中,乘法器要实现的乘法运算,不合理的结构对资源的占用是巨大的,极有可能使资源崩溃!
乘法器的实现大致分为3种
串行乘法器:
资源最节约,但是由较多的延时,适合于大规模;
并形乘法器:
资源消耗很大,但是速度较快,适合于中规模;
查表乘法器:
资源耗费巨大,速度最快,只适合于小规模。
在该设计中,由于乘法运算的位数很高,所以必须采用“串行乘法器”来实现其功能。
“串行乘法器”在算法上是由一个移位寄存器<
SR>
和一个累加器构成<
ACC>
,SR负责进行乘数的移位,而ACC负责将移位的二进制数相加,并把结果保留在寄存器中,以供下次使用。
方案一(校正算法)
由于在该MAC运算单元中,涉及到的是两个有符号数的乘法,所以还必须先对有符号数进行编码,然后才能进行运算。
我们这里采用二进制补码的编码方案,该方案是目前在DSP领域类最为流行的有符号数字表示法。
考虑到,两个符号相依的数不能直接采用无符号乘法器<
unsigned-Multiplier>
,所以我们必须先对编码做一定转换后送入无符号乘法器,然后将结果通过另一个与之相反的网络,使结果正确。
算法框图如下图所示:
要对有符号数进行乘法运算,必须要将它们进行编码。
在编码方案中,二进制补码表示法是目前DSP领域最为流行的有符号数字表示法,在该编码方案中,若最高位为’0’,则表示该数为正数,反之则表示为负数。
首先将乘数和被乘数的首位进行比较,若它们相同,则直接送到无符号乘法器中进行乘法运算—我们可以证明两个负数相乘和两个正数相乘都可以采用无符号乘法器<
—得到结果。
若首位不相同,则将其中的负数通过“负正变换网络”<
N2PNetwork>
后再将两数送入无符号乘法器,最后将结果在通过“正负变换网络”<
P2NNetwork>
,进行校正。
此时得到的结果就是正确的。
方案二(Booth算法)
该算法不仅能处理负数相乘的情况,而且速度较快。
下图给出了Booth算法的流程:
乘数与被乘数分别载入Q和M寄存器内,同时还有一个1比特寄存器,位于Q寄存器最低位的右边,称为Q’。
乘法的结果出现在A和Q寄存器中。
A和Q’的初始值为0。
控制逻辑也是每次扫描乘数的一位(扫描的次数位Q长度-1),但同时也要检查右边的一位。
若两位相同,则A、Q和Q’的所有位右移一位。
若两位不同,则根据是1-0还是0-1决定A+M还是A-M;
加减之后再右移一位。
也就是说,右移运算总是要进行的。
智利的右移是算术移位,即如果移到后,原来得值仍然保留在中。
BoothArithmetic
可以明显地看出,采用Booth算法后,不但能大大的节约资源(339—>
107),而且可以大幅的提高最大频率(105.7—>
144.0),故在有符号乘法器中都采用Booth乘法器。
输入缓冲FIFO的读写时钟的时序关系图:
在in_clk的上升沿,缓冲FIFO写入一个外界数据x[n],在该个in_clk的上升沿余下一个in_clk的上升沿之间,FIFO中的数据经过out_clk时钟将FIFO中的N个数据<
x[n]~x[n-(N-1)]>
读出倒下一个模块进行运算。
由以上关系可以得出,out_clk的频率必须是in_clk频率的N倍。
当Reset信号有效时,FIFO被清零,并且读写指针都指向首地址。
coe-ROM读时钟与FIFO读时钟的时序关系图:
由于从缓冲FIFO中取出的数需要和FIR滤波器的系数相乘,所以ROM时钟<
ROM_clk>
必须要和FIFO读时钟<
out_clk>
同步,才能在下一个模块中进行MAC运算。
当Reset系号有效时,ROM指针指向首地址。
MAC单元系统运算时钟与移位时钟的时序关系图:
在MAC单元的设计中,采用的是串行乘法器,由于系数被量化成27-bit,所以移位寄存器的时钟频率必须是累加器频率的27倍,才能够完成一次MAC运算。
累计器中存储的数据不仅要在reset信号的作用下被清零,而且要在下一个数据x[n]输入FIFO进行下一个y[n]的数出之前必须被清零。
由于三个运算单元存在事实上的前后关系,所以这些关系必须要从时序上体现出来,这和采样时间密切相关。
系统在实际运行的过程中,先将外界的一个信号x[n]采样进来,然后将数据FIFO的镜像相加,最后将和数与系数ROM一起送到MAC单元移位相乘。
由此也就决定了,采样时间最优先,紧接着是FIFO的“镜像相加”,然后紧接着是MAC单元的移位相乘。
在以上的时序关系图中正好体现了这个特点:
当reset信号变为无效以后的紧接着的上升沿中(图中前面3个采样点),将数据采样并压入FIFO中,并且执行FIFO的镜像相加。
由于相加时钟和采样时钟同步,若使用加计数器<
(用来作为FIFO读指针),第一次是读首单元。
由于使用非阻塞赋值(<
=),所以并没有把这次的x[n]读出来,而读出的是上一次存在FIFO中的x[n]!
所以应该采用减计数器,“镜像相加”操作从x[n-(N/2-1)]+x[n-N/2]开始,这就是为什么要采用减计数器的原因。
当每一次“镜像相加”操作完成后,就应该是MAC单元的移位相乘,它必须紧接着“镜像相加”操作,它并不能在西一个上升沿采样,这样会让最后的一个bit无法进行移位操作,所以移位相乘的采样时间被安排到,紧接着的下一个上升沿。
在shift_clk的上升沿采样,并且仅当acc_clear信号有效时,MAC中的累加器执行一次清零操作,表示本次的整个y[n]以运算完毕。
ModelSim仿真
ctrl_cell模块仿真:
当reset信号有效时(reset=0),将所有的时钟信号清零(mac_clk=0/in_clk=0);
当reset信号有效时,使得所有的时钟信号开始工作。
此时当mac_clk的上升沿出现时,开始进行FIFO和ROM的数据读出,并送入MAC单元进行下一步的处理。
在MAC中,由于乘法器是采用的移位累加器来实现的,所以必须先要将外面的数据写入以后才能开始进行移位累加运算。
由于MAC-cell中的Booth-Multiplier是下降沿时钟有效,但是我们看到,由于reset信号的失效时刻到再次有效与系数采样时钟(mac_clk)之间有一个base_clk空操作信号,所以这会产生错位移位运算!
这里采用“动态锁死”技术【DynamicCaptureä
】来防止信号出现上面的错位移位运算。
当时使用该技术后,产生一个新的全局清零信号:
reset_d。
有上图可以看出,如果用reset_d作为时钟清零信号,第一个有效base_clk信号都将会紧接着出现在第一个有效mac_clk信号之后,这样就防止了信号的错位运算。
该图为上述时钟模块的全局仿真图,clear信号为MAC中累加器的清零信号(并非毛刺!
这可以在第一幅图中很清楚地看到)。
coe_cell模块仿真:
“index”为外界地址指针输入,它为ROM提供地址单元信号。
可以看出在”index”信号的作用下,FIR滤波器的悉数被一个一个地“读”出来(图中的coe_out信号)。
fifo_data模块仿真
该仿真中可以看到,外界向FIFO中写数据x[n],并且读指针”index”才开始工作—对FIFO进行一次循环取数,即当”index”每一次不同的取值,都要从FIFO中读一次数据”data_out”。
由于在”in_clk”第一次写入的数据为”000000”
由于第一次写入的数据为”000000”,所以第一次读出的数据为”000000+000000=000000”。
第二次写入的数据为”00198e”。
由于第二次写入的数据为”00198e”,所以第二次读出的数据为”00198e+000000=00198e”。
第三次写入的数据为”0032db”。
然后紧接着读出:
”000000+000000=000000”……。
第三次读出的数据为”0032db+000000=0032db”和”00198e+000000=00198e”。
第四次写入的数据为”004ba7”……
全景仿真图
结束语
由于采用高度的时分复用模型,故能采取最少的硬件资源实现该高性能FIR滤波器,但是高度的时分复用对时序设计提出了较高的要求,在考虑延迟(包括:
器件延迟、路径延迟,等)的问题上必须要仔细,否则可能达不到时序上的要求,这需要仔细的分析每个模块的关键路径,并设置一些约束条件来保证时序关系的正确性。
ResourceEstimation