FPGAFIR滤波器设计方案.docx
- 文档编号:8155507
- 上传时间:2023-01-29
- 格式:DOCX
- 页数:14
- 大小:19.29KB
FPGAFIR滤波器设计方案.docx
《FPGAFIR滤波器设计方案.docx》由会员分享,可在线阅读,更多相关《FPGAFIR滤波器设计方案.docx(14页珍藏版)》请在冰豆网上搜索。
FPGAFIR滤波器设计方案
封面
作者:
PanHongliang
仅供个人学习
数字滤波器由数字乘法器、加法器和延时单元组成的一种算法或装置。
数字滤波器的功能是对输入离散信号的数字代码进行运算处理,以达到改变信号频谱的目的。
数字滤波器是一个离散系统,该系统能对输入的离散信号进行处理,从而获取所需的有用信息。
在数字信号处理中,FIR数字滤波器是最常用的单元之一。
它用于将输入信号x[n]的频率特性进行特定的修改,转换成另外的输出序列y[n]。
FIR(FiniteImpulseResponse)滤波器:
有限长单位冲激响应滤波器,是数字信号处理系统中最基本的元件,它可以在保证任意幅频特性的同时具有严格的线性相频特性,同时其单位抽样响应是有限长的,因而滤波器是稳定的系统。
因此,FIR滤波器在通信、图像处理、模式识别等领域都有着广泛的应用。
有限长脉冲响应(FIR)滤波器的系统函数只有零点,除原点外,没有极点,因而FIR滤波器总是稳定的。
如果他的单位脉冲响应是非因果的,总能够方便的通过适当的移位得到因果的单位脉冲响应,所以FIR滤波器不存在稳定性和是否可实现的问题。
它的另一个突出的优点是在满足一定的对称条件时,可以实现严格的线性相位。
由于线性相位滤波器不会改变输入信号的形状,而只是在时域上使信号延时,因此线性相位特性在工程实际中具有非常重要的意义,如在数据通信、图像处理等应用领域,往往要求信号在传输和处理过程中不能有明显的相位失真,因而线性相位FIR滤波器得到了广泛的应用。
长度为M的因果有限冲激响应滤波器由传输函数H(z)描述:
它是次数为M-1的z-1的一个多项式。
在时域中上述有限冲激响应输入输出关系为:
其中y(n)和x(n)分别是输出和输入序列。
有限冲激响应滤波器的一种直接型实现,如图所示。
通常一个长度为M的有限冲激响应滤波器由M个系数描述,并且需要M个乘法器和(M-1)个双输入加法器来实现。
直接型
寄存器模块
寄存器用于寄存一组二值代码,只要求它们具有置1、置0的功能即可。
在本设计中用D触发器组成寄存器,实现寄存功能。
本设计中使用带异步复位rst端的D触发器,当rst=1时,输出信号q=0,当rst=0且上升沿脉冲到达时q=d。
程序如下:
LIBRARYieee。
USEieee.std_logic_1164.all。
LIBRARYieee。
USEieee.std_logic_1164.all。
ARCHITECTUREdff16OFdff16IS
BEGIN
PROCESS(rst,clk)
BEGIN
IF(rst='1')THEN
q<=(OTHERS=>'0')。
ELSIF(clk'EVENTANDclk='1')THEN
q<=d。
ENDIF。
ENDPROCESS。
ENDdff16。
仿真结果如图所示:
图寄存器仿真结果
加法器模块
实现两个有符号数的相加运算。
即将输入的两数,在时钟脉冲到来时相加运算,输出结果。
在本设计中共有8个两个10位有符号数相加产生一个11位有符号数的加法器、一个18位和19位有符号数相加产生20位有符号数的加法器、一个两个20位有符号数相加产生一个21位有符号数的加法器、一个两个19位有符号数相加产生一个20位有符号位数的加法器、一个20位和21位有符号数相加产生22位有符号数的加法器,以及一个20位和22位有符号数相加产生23位有符号数的加法器电路。
其中一个20位和22位有符号数相加产生23位有符号数的加法器电路为最后一级,所以在加法器电路中在引入低位舍去功能只保留最终10位输出,最终保留10位输出采用了直接取输出23位数的高十位的方法,因此在输出中近似等于除掉了2^13即8192以后的结果。
10位有符号数相加产生一个11位有符号数的加法器设计:
LIBRARYieee。
USEieee.std_logic_1164.all。
USEieee.std_logic_arith.all。
ENTITYsum101011IS
PORT(a,b:
INSIGNED(9DOWNTO0)。
clk:
INSTD_LOGIC。
s:
OUTSIGNED(10DOWNTO0))。
ENDSUM101011。
ARCHITECTUREsum101011OFsum101011IS
BEGIN
PROCESS(clk)
BEGIN
IF(clk'EVENTANDclk='1')THEN
s<=(a(9)&a)+(b(9)&b)。
ENDIF。
ENDPROCESS。
ENDsum101011。
仿真结果如图15所示:
图15两10位相加产生11位加法器仿真结果
18位和19位有符号数相加产生20位有符号数的加法器设计:
LIBRARYieee。
USEieee.std_logic_1164.all。
USEieee.std_logic_arith.all。
ENTITYsum7023918IS
PORT(a:
INSIGNED(17DOWNTO0)。
b:
INSIGNED(18DOWNTO0)。
clk:
INSTD_LOGIC。
s:
OUTSIGNED(19DOWNTO0))。
ENDsum7023918。
ARCHITECTUREsum7023918OFsum7023918IS
BEGIN
PROCESS(clk)
BEGIN
IF(clk'EVENTANDclk='1')THEN
s<=(a(17)&a(17)&a)+(b(18)&b)。
ENDIF。
ENDPROCESS。
ENDsum7023918。
仿真结果如图16所示:
图1618位19位相加产生20位数仿真结果
减法器模块
实现零值减去两个有符号数的减法运算。
即用零值减去输入的两数,在时钟脉冲到来时做减法运算,输出结果。
-31和-88的乘结果都只包含了乘系数31和88的数值,并没有将两个负号代入,所以两乘法器后面的加法器运算改为减法器模块,采用0-31*累加结果-88*累加结果的方法,实现(-31)*累加结果+(-88)*累加结果的计算。
-106和-54后面的加法器采用同样的方式处理。
-31和-88的减法器设计:
LIBRARYieee。
USEieee.std_logic_1164.all。
USEieee.std_logic_arith.all。
ENTITYsub318817is
PORT(clk:
inSTD_LOGIC。
Din1:
insigned(15downto0)。
Din2:
insigned(17downto0)。
Dout:
outsigned(18downto0))。
ENDsub318817。
ARCHITECTUREsub318817ofsub318817IS
SIGNALs1:
signed(17downto0):
=(Din1(15)&Din1(15)&Din1)。
SIGNALs2:
signed(18downto0):
=(OTHERS=>'0')。
BEGIN
PROCESS(Din1,Din2,clk)
BEGIN
IFclk'eventandclk='1'THEN
Dout<=s2-Din2-s1。
ENDIF。
ENDPROCESS。
ENDsub318817。
仿真结果如图17所示:
图17-31和-88减法器的仿真结果
-106和-54的减法器的设计:
LIBRARYieee。
USEieee.std_logic_1164.all。
USEieee.std_logic_arith.all。
ENTITYsub1065417is
PORT(clk:
inSTD_LOGIC。
Din1:
insigned(17downto0)。
Din2:
insigned(16downto0)。
Dout:
outsigned(18downto0))。
ENDsub1065417。
ARCHITECTUREsub1065417ofsub1065417IS
SIGNALs1:
signed(17downto0):
=(Din2(16)&Din2)。
SIGNALs2:
signed(18downto0):
=(OTHERS=>'0')。
BEGIN
PROCESS(Din1,Din2,clk)
BEGIN
IFclk'eventandclk='1'THEN
Dout<=s2-Din1-s1。
ENDIF。
ENDPROCESS。
ENDsub1065417。
仿真结果如图18所示:
图18-106和-54减法器的仿真结果
乘法器模块
从资源和速度考虑,常系数乘法运算可用移位相加来实现。
将常系数分解成几个2的幂的和形式。
滤波器系数分别为-31、-88、-106、-54、70、239、401、499、499、401、239、70、-54、-106、-88、-31。
算法:
其中带负号数先乘去负号的整数部分,在后面的求和中做减法运算。
编码方式如下:
31被编码为2^5-2^0、88被编码为2^6+2^4+2^3、106被编码为2^6+2^5+2^3+2^1、54被编码为2^6-2^3-2^1、70被编码为2^6+2^2+2^1、239被编码为2^8-2^4-2^0、401被编码为2^9-2^7+2^4+2^0、499被编码为2^9-2^3-2^2-2^0。
实现输入带符号数据与固定数据两个二进制数的乘法运算。
当到达时钟上升沿时,将两数输入,运算并输出结果。
乘31电路设计:
LIBRARYieee。
USEieee.std_logic_1164.all。
USEieee.std_logic_arith.all。
ENTITYmult31IS
PORT(clk:
INSTD_LOGIC。
Din:
INSIGNED(10DOWNTO0)。
Dout:
OUTSIGNED(15DOWNTO0))。
ENDmult31。
ARCHITECTUREmult31OFmult31IS
SIGNALs1:
SIGNED(15DOWNTO0)。
SIGNALs2:
SIGNED(10DOWNTO0)。
SIGNALs3:
SIGNED(15DOWNTO0)。
BEGIN
A1:
PROCESS(Din,s1,s2,s3)
BEGIN
s1<=Din&"00000"。
s2<=Din。
IF(Din(10)='0')THEN
s3<=('0'&s1(14downto0))-("00000"&s2(10DOWNTO0))。
ELSE
s3<=('1'&s1(14downto0))-("11111"&s2(10DOWNTO0))。
ENDIF。
ENDPROCESS。
A2:
PROCESS(clk,s3)
BEGIN
IFclk'EVENTANDclk='1'THEN
Dout<=s3。
ENDIF。
ENDPROCESS。
ENDmult31。
仿真结果如图19所示:
图19乘31仿真结果
乘88电路设计程序:
LIBRARYieee。
USEieee.std_logic_1164.all。
USEieee.std_logic_arith.all。
ENTITYmult88IS
PORT(clk:
INSTD_LOGIC。
Din:
INSIGNED(10DOWNTO0)。
Dout:
OUTSIGNED(17DOWNTO0))。
ENDmult88。
ARCHITECTUREmult88OFmult88IS
SIGNALs1:
SIGNED(16DOWNTO0)。
SIGNALs2:
SIGNED(14DOWNTO0)。
SIGNALs3:
SIGNED(13DOWNTO0)。
SIGNALs4:
SIGNED(17DOWNTO0)。
BEGIN
A1:
PROCESS(Din,s1,s2,s3)
BEGIN
s1<=Din&"000000"。
s2<=Din&"0000"。
s3<=Din&"000"。
IF(Din(10)='0')THEN
s4<=('0'&s1(16downto0))+("000"&s2(14DOWNTO0))+("0000"&s3(13DOWNTO0))。
ELSE
s4<=('1'&s1(16downto0))+("111"&s2(14DOWNTO0))+("1111"&s3(13DOWNTO0))。
ENDIF。
ENDPROCESS。
A2:
PROCESS(clk,s4)
BEGIN
IFclk'EVENTANDclk='1'THEN
Dout<=s4。
ENDIF。
ENDPROCESS。
ENDmult88。
乘106电路设计:
LIBRARYieee。
USEieee.std_logic_1164.all。
USEieee.std_logic_arith.all。
ENTITYmult106IS
PORT(clk:
INSTD_LOGIC。
Din:
INSIGNED(10DOWNTO0)。
Dout:
OUTSIGNED(17DOWNTO0))。
ENDmult106。
ARCHITECTUREmult106OFmult106IS
SIGNALs1:
SIGNED(16DOWNTO0)。
SIGNALs2:
SIGNED(15DOWNTO0)。
SIGNALs3:
SIGNED(13DOWNTO0)。
SIGNALs4:
SIGNED(11DOWNTO0)。
SIGNALs5:
SIGNED(17DOWNTO0)。
BEGIN
A1:
PROCESS(Din,s1,s2,s3,s4)
BEGIN
s1<=Din&"000000"。
s2<=Din&"00000"。
s3<=Din&"000"。
s4<=Din&'0'。
IF(Din(10)='0')THEN
s5<=('0'&s1(16downto0))+("00"&s2(15DOWNTO0))+("0000"&s3(13DOWNTO0))+("000000"&s4(11DOWNTO0))。
ELSE
s5<=('1'&s1(16downto0))+("11"&s2(15DOWNTO0))+("1111"&s3(13DOWNTO0))+("111111"&s4(11DOWNTO0))。
ENDIF。
ENDPROCESS。
A2:
PROCESS(clk,s5)
BEGIN
IFclk'EVENTANDclk='1'THEN
Dout<=s5。
ENDIF。
ENDPROCESS。
ENDmult106。
乘54电路设计:
LIBRARYieee。
USEieee.std_logic_1164.all。
USEieee.std_logic_arith.all。
----------------------
ENTITYmult54IS
PORT(clk:
INSTD_LOGIC。
Din:
INSIGNED(10DOWNTO0)。
Dout:
OUTSIGNED(16DOWNTO0))。
ENDmult54。
ARCHITECTUREmult54OFmult54IS
SIGNALs1:
SIGNED(16DOWNTO0)。
SIGNALs2:
SIGNED(13DOWNTO0)。
SIGNALs3:
SIGNED(11DOWNTO0)。
SIGNALs4:
SIGNED(16DOWNTO0)。
BEGIN
A1:
PROCESS(Din,s1,s2,s3)
BEGIN
s1<=Din&"000000"。
s2<=Din&"000"。
s3<=Din&'0'。
IF(Din(10)='0')THEN
s4<=('0'&s1(15downto0))-("00"&s2(13DOWNTO0))-("0000"&s3(11DOWNTO0))。
ELSE
s4<=('1'&s1(15downto0))-("11"&s2(13DOWNTO0))-("1111"&s3(11DOWNTO0))。
ENDIF。
ENDPROCESS。
A2:
PROCESS(clk,s4)
BEGIN
IFclk'EVENTANDclk='1'THEN
Dout<=s4。
ENDIF。
ENDPROCESS。
ENDmult54。
乘70电路设计:
LIBRARYieee。
USEieee.std_logic_1164.all。
USEieee.std_logic_arith.all。
ENTITYmult70IS
PORT(clk:
INSTD_LOGIC。
Din:
INSIGNED(10DOWNTO0)。
Dout:
OUTSIGNED(17DOWNTO0))。
ENDmult70。
ARCHITECTUREmult70OFmult70IS
SIGNALs1:
SIGNED(16DOWNTO0)。
SIGNALs2:
SIGNED(12DOWNTO0)。
SIGNALs3:
SIGNED(11DOWNTO0)。
SIGNALs4:
SIGNED(17DOWNTO0)。
BEGIN
A1:
PROCESS(Din,s1,s2,s3)
BEGIN
s1<=Din&"000000"。
s2<=Din&"00"。
s3<=Din&'0'。
IF(Din(10)='0')THEN
s4<=('0'&s1(16downto0))+("00000"&s2(12DOWNTO0))+("000000"&s3(11DOWNTO0))。
ELSE
s4<=('1'&s1(16downto0))+("11111"&s2(12DOWNTO0))+("111111"&s3(11DOWNTO0))。
ENDIF。
ENDPROCESS。
A2:
PROCESS(clk,s4)
BEGIN
IFclk'EVENTANDclk='1'THEN
Dout<=s4。
ENDIF。
ENDPROCESS。
ENDmult70。
乘239电路设计:
LIBRARYieee。
USEieee.std_logic_1164.all。
USEieee.std_logic_arith.all。
ENTITYmult239IS
PORT(clk:
INSTD_LOGIC。
Din:
INSIGNED(10DOWNTO0)。
Dout:
OUTSIGNED(18DOWNTO0))。
ENDmult239。
ARCHITECTUREmult239OFmult239IS
SIGNALs1:
SIGNED(18DOWNTO0)。
SIGNALs2:
SIGNED(14DOWNTO0)。
SIGNALs3:
SIGNED(10DOWNTO0)。
SIGNALs4:
SIGNED(18DOWNTO0)。
BEGIN
A1:
PROCESS(Din,s1,s2,s3)
BEGIN
s1<=Din&"00000000"。
s2<=Din&"0000"。
s3<=Din。
IF(Din(10)='0')THEN
s4<=('0'&s1(17downto0))-("0000"&s2(14DOWNTO0))-("00000000"&s3(10DOWNTO0))。
ELSE
s4<=('1'&s1(17downto0))-("1111"&s2(14DOWNTO0))-("11111111"&s3(10DOWNTO0))。
ENDIF。
ENDPROCESS。
A2:
PROCESS(clk,s4)
BEGIN
IFclk'EVENTANDclk='1'THEN
Dout<=s4。
ENDIF。
ENDPROCESS。
ENDmult239。
仿真
我们任意设定输入信号为:
Din=[99,0,0,0,70,0,0,0,99,0,0,0,70,0,0,0,99,0,0,0,70,0,0,0,99,0,0,0,70,0,0,0]
图20滤波器仿真结果
版权申明
本文部分内容,包括文字、图片、以及设计等在网上搜集整理。
版权为潘宏亮个人所有
Thisarticleincludessomeparts,includingtext,pictures,anddesign.CopyrightisPanHongliang'spersonalownership.
用户可将本文的内容或服务用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯本网站及相关权利人的合法权利。
除此以外,将本文任何内容或服务用于其他用途时,须征得本人及相关权利人的书面许可,并支付报酬。
Usersmayusethecontentsorservicesofthisarticleforpersonalstudy,researchorappreciation,andothernon-commercialornon-profitpurposes,butatthesametime,theyshallabidebytheprovisionsofcopyrightlawandotherrelevantlaws,andshallnotinfringeuponthelegitimaterightsofthiswebsiteanditsrelevantobligees.Inaddition,whenanycontentorserviceofthisarticleisusedforotherpurpose
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- FPGAFIR 滤波器 设计方案