电子科大毕设——基于FPGA的FIR滤波器的设计(第三章)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第3章 基于FPGA 设计FIR 滤波器
在前面几章讨论了基于FPGA 设计FIR 滤波器的相关原理及其相关的基础知识。

在本章中将针对前面提到的原理和方法进行进一步的应用和组合。

3.1 指标的确定
在本文的设计中,所确定的指标如下:
(1) 带宽100MHZ ,最小阻带衰减-35db ,带内波动小于2db 。

(2) 综合仿真。

(3) 设计出满足上述性能指标并且所需资源最少的FIR 滤波器。

(4) 阶数:22。

3.2 设计思路
将输入信号的每一位通过四个延时器后,以每位信号的4个引出点作为选择控制端,选择出己经算好的系数,每一位信号选取存储器中的不同位上的数值,达到乘法移位的功能,并送到累加器。

累加器将8位信号选择出的8个数据累加后输出,得到滤波结果。

为了充分利用FPGA 中四输入查找表的电路结构,采用每8节为滤波器的一个基本单元.对于64节滤波器的设计,采用8个基本滤波单元。

3.2.1 FIR 滤波器的基本算法
(1) 加法器的设计
加法器是数字系统中最常用的运算电路,其他运算电路如减法器、乘法器和除法器等都可以利用加法器来实现,在本设计的中也大量的使用到了加法器。

一个基本N 位二进制加法器/减法器由N 个加法器组成。

每个加法器都执行
如下的布尔方程[19]:
k x =k s XOR k y y XOR k k k k c y x c ⊕⊕= (3.1)
进位位按如下方法计算:
1+k c =(k x AND k y ) OR (k x AND k c ) OR (k y AND k c )
=(k x k y )+(k x k c )+(k y k c ) (3.2) 最简单的加法器结构称为并行加法,如图 3.4所示,是位串行格式的。

图3.4并行加法器
在quartusII中提供宏模块lpm_add_sub来构造加法器和减法器。

表3.1列出了lpm add_sum 的基本逻辑参数[19]。

(2)乘法器的设计
乘法器是构成DSP系统的基本部件,也是FIR数字滤波器的基本运算。

乘法器按数字表示法的不同,分为定点乘法器和浮点乘法器。

虽然浮点运算的动态范围大、精度高,但其运算速度低、复杂度高,所以本文以定点乘法器的设计为研究对象。

本章从乘法器的算法入手,研究了多种乘法器的算法及其实现方法,并讨论了各自的优缺点,最后给出了一种基于Booth算法的硬件乘法器电路[20]。

1、定点乘法器的算法和实现
数字系统中,主要的数制表示方法为二进制表示法。

二进制表示法主要有二进制原码、反码、补码三种,其中二进制原码属于无符号数,二进制反码和补码属于有符号数。

根据二进制码的不同,定点乘法可分为无符号数乘法和有符号数乘法。

2、无符号数一位乘法
无符号数二进制乘法与十进制乘法的运算方法一样,只是二进制乘法规则不同,其运算规则和逻辑“与”运算规则相同,为:0×0=0;0×1=0;1×0=0;l×1=1。

以两个无符号数的二进制乘法运算为例,其“手算”过程如图3.5所示。

图3.5 无符号数二进制乘法过程
“手算”时,将所有乘积项(被乘数与乘数中某一位的乘积)全都算出后再作累加,其对应的硬件实现方法称为阵列实现,该方法速度快,但资源耗费大。

要实现一个4X4的乘法,该阵列乘法器实现a[3]a[2]a[1]a[0]与x[3]x[2]x[1]x[0]两个四位数的乘法。

乘法器的每一位输出都可以写成两个操作数的逻辑函数,随着操作数位宽的增加,将使乘法器电路变得越来越复杂,实现起来比较困难。

“手算”时,也可以每算出一个乘积项,就加到乘积中,此时的积称为部分积。

若在硬件实现时乘积项与乘数相应位对齐,即将乘积项左移,加法运算宽度与被乘数位宽相同,实现起来比较困难。

常用的方法是将部分积右移,部分积的高位部分与乘积项相加,运算原理如图3.6所示,运算流程如图3.7所示。

用该方法实现的乘法器通常称为移位相加乘法器,由图3.6和图3.7可见,被乘数和乘数分别置于寄存器A和B中,寄存器B同时作为部分积的低位部分,寄存器D存储部分积的高位部分,初始清零,考虑到两数相加存在进位,用一位寄存器C保存进位。

图3.6 移位相加乘法运算原理
图3.7移位相加乘法流程图
该乘法器运算原理为:从寄存器B即乘数的最低位开始,若为1,则被乘数A 与部分积高位寄存器D内的值相加,和值存于寄存器D,进位存于寄存器C;若为0,则将0与部分积高位寄存器D内的值相加,即寄存器D内的值不变。

然后将进位、和值、部分积低位部分右移1位,得到一次运算的结果。

右移后乘数的次低位处
于最低位,乘数己用过的位可以舍弃,如此重复上述运算,直至乘数的最高位移出寄存器B 。

在上述乘法器实现时,乘数寄存器与部分积低位部分共用,在乘数寄存器右移后空出的高位部分正好可以存放部分积的低位部分,节省了资源。

符号数相乘可以将符号部分与数值部分分别处理,即:数值部分绝对值相乘,符号部分异或。

对于二进制原码表示的数,该方法便于实现;对于二进制反码表示的数,只需将操作数按条件取反即可,实现也相对容易。

但对于二进制补码表示的数,则需要一取补逻辑,考虑到时延、资源耗费等因素,该方法不适于二进制补码表示的两数进行乘法运算。

若被乘数为:1210[]N N A A A A A --= 补, 乘数为:1210[]N N B B B B B --= 补
乘积为:[][]C A B =⨯补补。

乘数B 可表示为:
121012102222N N N N B B B B B ----=-⨯+⨯+⨯+⨯ (3.3)
因此乘积可表示为: 121012101210
1210[][][(2222)][]2[]2[]2[]2N N N N N N N N C A B A B B B B B A B A B A B A --------=⨯=⨯-⨯+⨯++⨯+⨯=-⨯⨯+⨯⨯++⨯⨯+⨯⨯ 补补

补补补补(
3.4)
据此,符号数乘法也就不难实现。

在对最高位计算时,需要作特殊的减操作,逻辑复杂度便不可避免。

而下面讨论的Booth 算法将最高位(符号位)作为数据位考虑,可免去特殊的减操作。

若被乘数和乘数不变,式3.3可变为[17]:
111210
12122310
10022()2()2()2(0)2N N N N N N N N N B B B B B B B B B B B B ---------=-⨯+++⨯+=-++-+⨯++-+⨯+-+⨯ 11
1
10,0
()2(2)
N N n
n n n n n A n B B E ----〈〉====-+⨯=⨯∑

(3.5)
式3.5中,11,0(1) ,0,n n n E B B n N B 〈〉--=-+<<-= 乘积补码结果为:
N-1
n=0[][]=[([])2]n n C A B E A 〈〉=⨯⨯⨯∑补补补
(3.6)
上述便是Booth 算法,在该处理方式中,不需要对最高位进行特殊操作,它
通过对本位及相邻低位的编码,确定操作为加或减,运算量为0或B,总的编码项为N项,乘积项为N项。

在这种处理方式中每一步都要编码,使门延迟增加,甚至相对于式(3.4)来说更复杂,但是只要对该算法进行一些改进,便能得到一个较理想的算法,即高基Booth算法[17]。

为了实现两个用12位二进制补码表示的有符号的相乘,可以得布斯(Booth)乘法器的原理,用移位相加的方式实现。

.
3.3 使用Matlab来设计FIR滤波器
基于FPGA 来设计FIR 滤波器,由于设计的平台是MAX+PLUSII,不同于软件开发的环境,滤波器的效果并不能明确的显示,因此,需要在设计之前用软件的平台来仿真分析[22]。

3.3.1 Matlab简介
MATLAB是矩阵实验室(Matrix Laboratory)之意。

除具备卓越的数值计算能力外,它还提供了专业水平的符号计算,文字处理,可视化建模仿真和实时控制等功能。

MATLAB的基本数据单位是矩阵,它的指令表达式与数学,工程中常用的形式十分相似,故用MATLAB来解算问题要比用C,FORTRAN等语言完相同的事情简捷得多。

当前流行的MATLAB 5.3/Simulink 3.0包括拥有数百个内部函数的主包和三十几种工具包(Toolbox).工具包又可以分为功能性工具包和学科工具包.功能工具包用来扩充MATLAB的符号计算,可视化建模仿真,文字处理及实时控制等功能.学科工具包是专业性比较强的工具包,控制工具包,信号处理工具包,通信工具包等都属于此类。

Matlab语言有如下特点:1.编程效率高,2.用户使用方便,3.扩充能力强,4.语句简单,内涵丰富,5.高效方便的矩阵和数组运算,6.方便的绘图功能。

开放性使MATLAB广受用户欢迎.除内部函数外,所有MATLAB主包文件和各种工具包都是可读可修改的文件,用户通过对源程序的修改或加入自己编写程序构造新的专用工具包。

firrcos()用于设计具有光滑,正弦过渡带的低通线性相位滤波器。

filter()用于实现IIR和FIR滤波器对数据的滤波,常用来计算滤波器对输入的响应。

fftfilt()利用效率高的基于 FFT重叠相加算法实现对数据
滤波,该函数只适用 FIR 滤波器。

freqz()用于求数字滤波器的频率响应。

并且提供了各种窗函数的函数,比如,hamming()是海明窗函数,kaiser()是凯塞窗函数,使在设计的过程中,不用自己重新设计窗函数。

3.3.2 用Matlab来设计带通FIR滤波器
在硬件描述时程序需要的带通滤波器的参数我们用Matlab来提取。

在Matlab的SINGNAL PROCESSING TOOLBOX中有一个专门的数字滤波器设计软件模块FDA TOOL,其功能强大,操作简单。

可以设计多种滤波器。

打开软件选择带通滤波器,带通100Mhz,最小阻带衰减-35db带内波动小于2db,
阶数为22,设计出符合设计指标的线性相位的22阶FIR带通滤波器的特征参数如图3.8所示:
图3.822阶FIR带通滤波器系数
设计得到的FIR带通滤波器的幅频和相频特性如图3.9和图3.10所示
图3.9幅频特性图3.10相频特性
由图可知通带内最大波动小于2dB,阻带最小衰减略小于-35dB,符合设计
要求。

将系数放大10000倍,然后转化为二进制补码的形式,为了防止溢出。

将数
据扩展为12位,当系数为负数时,前面补1,当系数为正数时,前面补0;以待
编程时使用,如表3.2所示;
表3.222阶FIR带通滤波器系数
联想商务网 cjb13x。

相关文档
最新文档