基于FPGA的FIR滤波器设计.docx

上传人:b****8 文档编号:30769813 上传时间:2023-08-23 格式:DOCX 页数:16 大小:116.76KB
下载 相关 举报
基于FPGA的FIR滤波器设计.docx_第1页
第1页 / 共16页
基于FPGA的FIR滤波器设计.docx_第2页
第2页 / 共16页
基于FPGA的FIR滤波器设计.docx_第3页
第3页 / 共16页
基于FPGA的FIR滤波器设计.docx_第4页
第4页 / 共16页
基于FPGA的FIR滤波器设计.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

基于FPGA的FIR滤波器设计.docx

《基于FPGA的FIR滤波器设计.docx》由会员分享,可在线阅读,更多相关《基于FPGA的FIR滤波器设计.docx(16页珍藏版)》请在冰豆网上搜索。

基于FPGA的FIR滤波器设计.docx

基于FPGA的FIR滤波器设计

本报告分两部分:

1由matlab计算FIR数字滤波器的滤波系数;

2用VHDL语言设计逻辑电路,再通过QUARTUSII软件,将各个模块的电路封装成期间,在顶层设计中通过连线,完成整个系统。

所有源程序在本文档同一文件夹下的fir文件中。

FIR数字滤波器的系数计算。

这里通过MATLAB的Fdatool软件实现。

输入数据S(n)为9位,输出y(n)为10位的低通滤波器

数据:

各个参数如下:

LilterTyperlowpassFIRWindowkaiser

阶数:

15,Beta=0.5,Fs=48kHz,Fc=10.8kHZ

滤波类型为:

直接型FIR

FIR滤波器的幅频响应

相频响应

FIR滤波器的冲击响应

滤波器系数

对系数进行调整,整数化:

Num=

-0.07420.02340.11330.0117-0.1758-1.0977

0.35940.82810.82810.35940.0977-0.1758

0.01170.11330.0234-0.0742

Num*(2^8)

ans=

Columns1through10

-18.99525.990429.00482.9952-45.0048-281.011292.0064211.9936211.993692.0064

Columns11through16

25.0112-45.00482.995229.00485.9904-18.9952

FIR数字滤波器的VHDL实现

根据作业要求,S(n)为9位,y(n)为10位的低通滤波器。

数据:

-19,6,29,3,-45,-25,92,212,212,92,-25,-45,3,29,6,-19

阶数:

15,Beta=0.5,Fs=48kHz,Fc=10.8kHZ

滤波类型为:

直接型FIR

FIR滤波器的原理图设计如下:

设计原理:

一概要

我的原理说明是根据上面原理图的设计顺序逐步进行的。

1寄存器(延时器)。

原理图上标有dff9的器件。

输入9位数据,通过dff9的D触发寄存器,达到延时的作用。

2第一级加法器

数据通过add9910,就是9位数字输入,10位数字输出加法器,完成第一级相加运算,因为本题是16阶FIR数字滤波器,它的滤波系数有对称的关系,所以采用上面的第一级加法器,达到简化运算的效果。

3乘法器

乘法器用来将数据乘以由matlab计算得到的滤波系数,本题的系数分别为:

-19,6,29,3,-45,-25,92,212。

在乘法器设计时暂时没有考虑符号,符号问题由下面的减法器实现。

即:

若系数符号为负,那么在下一级用减法器减去乘法器所得的数据。

所有的乘法器为:

mult19,multmult6,mult29,mult3,mult45,mult25,mult92,mult212。

4第二级加,减法器

第二级加法器主要有add111414,add151415,add161717。

add111414就是说11位数据加14位数据输出14位数据,说有的都是相同的命名规则。

减法器的作用是反映乘法器的负号的,对于负的滤波系数,在此相当于经过减法器相减。

5第三级加,减法器

与上一级大体相同的原理。

6输出

输出通过add141710,将上一级得到的14位和17位数据相加,再拿出相加结果的高十位作为输出。

到此,整个FIR数字滤波器设计完毕,下面详细说明各个部分的具体实现。

二详细说明

我的说明是根据上面的概要逐一展开的。

我的设计是先编写各个功能的vhdl源文件,再生成功能模块,最后在顶层用原理图的设计方法连线,组成整个系统。

1寄存器(延时器)

设计中用D触发器组成寄存器,实现寄存功能。

这里用来寄存一组9位的二进制数据。

实现功能:

在CP正跳沿前接受输入信号,正跳沿时触发翻转,正跳沿后输入即被封锁。

源文件:

ENTITYdff9IS

PORT(clk:

INSTD_LOGIC;

clear:

INSTD_LOGIC;

Din:

INSTD_LOGIC_VECTOR(8DOWNTO0);

Dout:

OUTSTD_LOGIC_VECTOR(8DOWNTO0));

ENDdff9;

ARCHITECTUREaOFdff9IS

BEGIN

PROCESS(clk,clear)

BEGIN

IFclear='1'THEN

Dout<="000000000";

ELSIFclear='0'THEN

IF(clk'EVENTANDclk='1')THEN

Dout<=Din;

ENDIF;

ENDIF;

ENDPROCESS;

ENDa;

2第一级加法器

实现两个二进制数字的相加运算。

当到达时钟上升沿时,将两数输入,运算,输出结果。

源文件:

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_arith.ALL;

ENTITYadd9910is

PORT(clk:

inSTD_LOGIC;

Din1,Din2:

insigned(8downto0);

Dout:

outsigned(9downto0));

ENDadd9910;

ARCHITECTUREaofadd9910is

SIGNALs1:

signed(9downto0);

SIGNALs2:

signed(9downto0);

BEGIN

s1<=(Din1(8)&Din1);

s2<=(Din2(8)&Din2);

PROCESS(Din1,Din2,clk)

BEGIN

ifclk'eventandclk='1'then

Dout<=s1+s2;

endif;

endprocess;

enda;

3乘法器

功能:

将数据乘以由matlab计算得到的滤波系数。

总共有8个乘法器。

源文件(以mult19为例):

LIBRARYieee;

USEieee.std_logic_1164.all;

USEieee.std_logic_arith.all;

ENTITYmult19is

PORT

(clk:

INSTD_LOGIC;

Din:

INSIGNED(9DOWNTO0);

Dout:

OUTSIGNED(13DOWNTO0));

ENDmult19;

ARCHITECTUREaOFmult19IS

SIGNALs1:

SIGNED(13DOWNTO0);

SIGNALs2:

SIGNED(10DOWNTO0);

SIGNALs3:

SIGNED(13DOWNTO0);

BEGIN

P1:

process(Din)

BEGIN

s1(13DOWNTO4)<=Din;

s1(3DOWNTO0)<="0000";

s2(10DOWNTO1)<=Din;

s2(0)<='0';

ifDin(9)='0'then

s3<=('0'&s1(13downto1))+("0000"&s2(10DOWNTO1))+("00000"&Din(9DOWNTO1));

else

s3<=('1'&s1(13downto1))+("1111"&s2(10DOWNTO1))+("11111"&Din(9DOWNTO1));

endif;

endprocess;

P2:

PROCESS(clk)

BEGIN

ifclk'eventandclk='1'then

Dout<=s3;

endif;

ENDPROCESS;

ENDa;

4第二级加,减法器

对于乘了滤波系数的数据,进行第二次的加和,由于上面有的滤波系数是负的,所以这里用减法器对上一面的负系数做减法运算。

源程序:

减法器--sub121414

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_arith.ALL;

ENTITYsub121414is

PORT(clk:

inSTD_LOGIC;

Din1:

insigned(13downto0);

Din2:

insigned(11downto0);

Dout:

outsigned(13downto0));

ENDsub121414;

ARCHITECTUREaofsub121414is

SIGNALs1:

signed(13downto0);

BEGIN

s1<=(Din2(11)&Din2(11)&Din2);

PROCESS(Din1,Din2,clk)

BEGIN

ifclk'eventandclk='1'then

Dout<=s1-Din1;

endif;

endprocess;

enda;

加法器--add111414

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_arith.ALL;

ENTITYadd111414is

PORT(clk:

inSTD_LOGIC;

Din1:

insigned(10downto0);

Din2:

insigned(13downto0);

Dout:

outsigned(13downto0));

ENDadd111414;

ARCHITECTUREaofadd111414is

SIGNALs1:

signed(13downto0);

BEGIN

s1<=(Din1(11)&Din1(11)&Din1(11)&Din1);

PROCESS(Din1,Din2,clk)

BEGIN

ifclk'eventandclk='1'then

Dout<=s1+Din2;

endif;

endprocess;

enda;

还有add151415,add161717(略)

5第三级加,减法器

功能同上:

加法器--add141415

源代码:

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_arith.ALL;

ENTITYadd141415is

PORT(clk:

inSTD_LOGIC;

Din1:

insigned(13downto0);

Din2:

insigned(13downto0);

Dout:

outsigned(14downto0));

ENDadd141415;

ARCHITECTUREaofadd141415is

SIGNALs1:

signed(14downto0);

SIGNALs2:

signed(14downto0);

BEGIN

s1<=(Din1(13)&Din1);

s2<=(Din1(13)&Din1);

PROCESS(Din1,Din2,clk)

BEGIN

ifclk'eventandclk='1'then

Dout<=s1+s2;

endif;

endprocess;

enda;

减法器—sub171517

源代码:

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_arith.ALL;

ENTITYsub171517is

PORT(clk:

inSTD_LOGIC;

Din1:

insigned(14downto0);

Din2:

insigned(16downto0);

Dout:

outsigned(16downto0));

ENDsub171517;

ARCHITECTUREaofsub171517is

SIGNALs1:

signed(16downto0);

BEGIN

s1<=(Din1(14)&Din1(14)&Din1);

PROCESS(Din1,Din2,clk)

BEGIN

ifclk'eventandclk='1'then

Dout<=Din2-s1;

endif;

endprocess;

enda;

6输出级

输出通过一个加法器add151710完成10位数据的输出,通过一个15位与一个17位数据相加得到的数据取高10为作为最终结果。

源程序:

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_arith.ALL;

ENTITYadd151710is

PORT(clk:

inSTD_LOGIC;

Din1:

insigned(14downto0);

Din2:

insigned(16downto0);

Dout:

outsigned(9downto0));

ENDadd151710;

ARCHITECTUREaofadd151710is

SIGNALs1:

signed(9downto0);

SIGNALs2:

signed(9downto0);

BEGIN

s1<=(Din1(13)&Din1(13)&Din1(14downto7));

s2<=(Din2(16downto7));

PROCESS(Din1,Din2,clk)

BEGIN

ifclk'eventandclk='1'then

Dout<=s1+s2;

endif;

endprocess;

enda;

三输出数据分析

任意输入一组信号:

Din=[96,0,0,0,48,0,0,0,96,0,0,0,48,0,0,0,96,0,0,0,48,0,0,0,96,0,0,0,48,0,0,0]

由quartusII仿真结果如下:

整理数据如下:

输出

Dout=[212-17-104480712928242428397272392824242839727239282424283972723928]

卷积结果:

h=[-19,6,29,3,-45,-25,92,212,212,92,-25,-45,3,29,6,-19];

y=conv(h,Din)/2^7

=

Columns1through10

-14.25004.500021.75002.2500-40.8750-16.500079.8750160.1250127.875064.1250

Columns11through20

37.500048.000040.875039.750075.0000129.0000129.000075.000039.750040.8750

Columns21through30

40.875039.750075.0000129.0000129.000075.000039.750040.875040.875039.7500

Columns31through40

75.0000129.0000143.250070.500018.000038.625081.750056.2500-4.8750-31.1250

Columns41through47

1.125010.87502.2500-7.1250000

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1