电子科大毕设基于FPGA的FIR滤波器的设计第四章.docx
- 文档编号:7649269
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:12
- 大小:109.59KB
电子科大毕设基于FPGA的FIR滤波器的设计第四章.docx
《电子科大毕设基于FPGA的FIR滤波器的设计第四章.docx》由会员分享,可在线阅读,更多相关《电子科大毕设基于FPGA的FIR滤波器的设计第四章.docx(12页珍藏版)》请在冰豆网上搜索。
电子科大毕设基于FPGA的FIR滤波器的设计第四章
第4章FIR滤波器的VHDL描述及仿真
描述一个FIR滤波器最简单的方法,就是用卷积和表示[20]:
(4.1)
N阶FIR直接型结构如图4.1所示:
图4.1N阶FIR直接型结构图
而线性FIR滤波器的实现结构可进一步简化为图4.2所示模型(以N=6阶为例)
图4.2FIR滤波器简化模型
VHDL源程序如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityadd4is
port(a,b:
instd_logic_vector(11downto0);
ci:
instd_logic;
co:
outstd_logic;
sum:
outstd_logic_vector(11downto0));
endadd4;
architecturebehavofadd4is
signalsint:
std_logic_vector(12downto0);
signalaa,bb:
std_logic_vector(12downto0);
begin
aa<='0'&a;--将4位加数矢量扩为5位,为进位提供空间
bb<='0'&b;--将4位被加数矢量扩为5位,为进位提供空间
sint<=aa+bb+ci;--std_logic_unsigned包定义了“+”运算
sum<=sint(11downto0);
co<=sint(12);--最高位形成进位
endbehav;
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityadd12is--端口说明
port(a,b:
instd_logic_vector(11downto0);
ci:
instd_logic;
co:
outstd_logic;
sum:
outstd_logic_vector(11downto0));
endadd12;
architecturestruofadd12is
Componentadd4
port(a,b:
instd_logic_vector(11downto0);
ci:
instd_logic;
co:
outstd_logic;
sum:
outstd_logic_vector(11downto0));
endcomponent;--也可以放在程序包中定义
signalcarry_out1,carry_out2:
std_logic;
begin--用元件例化语句级联4位加法器
u1:
add4portmap(a(3downto0),b(3downto0),ci,carry_out1,sum(3downto0));
u2:
add4portmap(a(7downto4),b(7downto4),carry_out1,carry_out2,sum(7downto4));
u3:
add4portmap(a(11downto8),b(11downto8),carry_out2,co,sum(11downto8));
endstru;生成的原理图如图4.3所示:
图4.312位加法器原理图
通过仿真得到12位加法器波形如下图4.4所示:
图4.412位加法器波形图
4.1.224位加法器的实现
在12位加法器的基础上,我们可以直接将两个12位加法器级联,得到24位加法器,VHDL源程序如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityadd24is
port(a,b:
instd_logic_vector(23downto0);--端口说明
ci:
instd_logic;
co:
outstd_logic;
sum:
outstd_logic_vector(23downto0));
endadd24;
architecturestruofadd24is
componentadd12
port(a,b:
instd_logic_vector(11downto0);
ci:
instd_logic;
co:
outstd_logic;
sum:
outstd_logic_vector(11downto0));
endcomponent;
signalcarry_out:
std_logic;
begin--元件例化级联两个12位加法器
U1:
add12portmap(a(11downto0),b(11downto0),ci,carry_out,sum(11downto0));
U2:
add12portmap(a(23downto12),b(23downto12),carry_out,co,sum(23downto12));
endstru;
24位加法器生成的原理图如下图4.5所示:
图4.524位加法器原理图
通过仿真得到24位加法器波形如下图4.6所示:
图4.624位加法器波形图
4.1.312位乘法器的实现
为了实现两个用12位二进制补码表示的有符号的相乘,可以仿效布斯(Booth)乘法器的原理,用移位相加的方式实现。
VHDL源程序如下:
libraryieee;
useieee.std_logic_1164.all,
useieee.numeric_std.all;
entitymul12is
port(ain:
instd_logic_vector(11downto0);
bin:
instd_logic_vector(11downto0);
qout:
outstd_logic_vector(23downto0));
endmul12;
architecturertlofmul12is
begin
process(ain,bin)
variablepa:
signed(24downto0);
variablea_1:
std_logic;
aliasp:
signed(12downto0)ispa(24downto12);
begin
p:
=(others=>'0');
pa(11downto0):
=signed(ain);
a_1:
='0';
foriin1to12loop
casestd_logic_vector'(pa(0),a_1)is
when"01"=>p:
=p+signed(bin);
when"10"=>p:
=p-signed(bin);
whenothers=>null;
endcase;
a_1:
=pa(0);
pa:
=shift_right(pa,1);
endloop;
qout<=std_logic_vector(pa(23downto0));
endprocess;
endrtl;
该乘法器的原理图如图4.7:
图4.712位乘法器原理图
通过仿真得到12位乘法器波形如下图4.8所示:
图4.8乘法器仿真图
此时,ain=-1,bin=-1,输出qout=1,显然是正确的。
4.1.4延时器的实现
延时器可以用寄存器实现,VHDL源程序如下:
libraryieee;
useieee.std_logic_1164.all;
entitydelayeris
port(a:
instd_logic_vector(11downto0);
clk:
instd_logic;
reset:
instd_logic;
b:
outstd_logic_vector(11downto0));
endentitydelayer;
architecturertlofdelayeris
begin
process(clk,reset)
begin
ifreset='1'thenb<="000000000000";--异步复位
elsifclk'eventandclk='1'then--时钟上升沿
b<=a;
endif;
endprocess;
endarchitecturertl;
延时器的基本逻辑单元是上升沿触发的D触发器,其原理图如下图4.9所示:
图4.9延时器原理图
仿真波形如4.10所示:
图4.10延时器仿真图
4.2FIR带通滤波器的顶层实现
利用上面所编写的12位加法器,24位加法器,12位乘法器及延时器,我们可以组合出所需的FIR带通滤波器。
程序中主要是运用元件例化语句来实现一个结构化的描述,系统函数通过调用12位加法器,24位加法器,12位乘法器及延时器等模块来FIR带通滤波器。
具体的调用层次见图4.11所示。
图4.11FIR滤波器的结构图
滤波器顶层源程序如下。
顶层源程序;
libraryieee;--库包说明
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
useieee.numeric_std.all;
entityfilteris
port(x:
instd_logic_vector(11downto0);--端口说明
clk:
instd_logic;
reset:
instd_logic;
y:
outstd_logic_vector(23downto0));
endentityfilter;
architecturestruoffilteris
componentadd12is--12位加法器
port(a,b:
instd_logic_vector(11downto0);
ci:
instd_logic;
co:
outstd_logic;
sum:
outstd_logic_vector(11downto0));
endcomponentadd12;
componentadd24is--24位加法器
port(a,b:
instd_logic_vector(23downto0);
ci:
instd_logic;
co:
outstd_logic;
sum:
outstd_logic_vector(23downto0));
endcomponentadd24;
componentmul12is--12位乘法器
port(ain:
instd_logic_vector(11downto0);
bin:
instd_logic_vector(11downto0);
qout:
outstd_logic_vector(23downto0));
endcomponentmul12;
componentdelayeris--延时器
port(a:
instd_logic_vector(11downto0);
clk:
instd_logic;
reset:
instd_logic;
b:
outstd_logic_vector(11downto0));
endcomponentdelayer;
typedelaytypeisarray(0to21)ofstd_logic_vector(11downto0);--自定义数据类型
typesumtypeisarray(0to10)ofstd_logic_vector(11downto0);
typemultypeisarray(0to10)ofstd_logic_vector(23downto0);
signaldelay:
delaytype;--定义信号
signalsum:
sumtype;
signalmul,sum2:
multype;
constanth:
sumtype:
=("000000100011",--系统函数
"111111010010",
"111111110011",
"111111011000",
"000000110110",
"001100010110",
"111110101010",
"000110101110",
"111111101000",
"110000011100",
"110011100100");
begin
delay(0)<=x;
g1:
foriin0to20generate
de:
delayerportmap(delay(i),clk,reset,delay(i+1));
endgenerateg1;
g2:
foriin0to10generate
ad12:
add12portmap(delay(i),delay(21-i),'0',open,sum(i));
endgenerateg2;
g3:
foriin0to10generate
mu:
mul12portmap(sum(i),h(i),mul(i));
endgenerateg3;
sum2(0)<=mul(0);
g4:
foriin0to9generate
ad24:
add24portmap(sum2(i),mul(i+1),'0',open,sum2(i+1));
endgenerateg4;
y<=sum2(10);
endarchitecturestru;
点击Files下的Create/Update→CreateSymbolFilesforCurrentFile,可以生成滤波器模块及各独立元件(加法器,乘法器,延时器等)的模块。
可建立模型如图4.12所示:
图4.12FIR滤波器模型图
为了验证生成的模型是否满足设计的性能指标,必须进行时序仿真,而其中最有效最全面的方法就是加入一个冲激信号,看滤波器的单位冲激响应。
让输入x在第一个时钟有效沿为12位的二进制脉冲,即冲激信号。
编辑波形文件,进行仿真,得到仿真报告如图4.13下:
图4.13仿真报告
当输入为任意值时仿真波形图如4.14所示:
图4.14总仿真波形图
当输入为高电平或低电平时仿真波形图如4.15所示:
图4.15总仿真波形图
从波形可以看出:
当输入为任意值时,有选择性的输出。
当为输入为高电平时输出为高电平:
当输入为低电平时输出为低电平。
可以看出符合设计要求。
在进行系统仿真时,有以下几点体会:
(1)系统模块化分的重要性
对于一个系统的开发,最初的模块划分是非常重要的。
随着系统的复杂度的增大,模块划分对于系统的后续开发显示出越来越大的重要性。
随着自顶向下设计方法的广泛采用,把一个系统划分为几个子模块,然后各个子模块分别设计的方法也越来越多的被广大设计者所使用。
一个系统模块划分的好坏,模块间接口设计得是否合理,将直接影响到整个系统的开发,甚至会决定系统开发的成功与否。
一个良好的系统模块划分,合理的模块间接口设计会使后续的系统开发事半功倍。
反之则使得后续的系统开发步履艰难。
因而,系统开发人员把越来越多的时间和精力投入到系统的模块划分和接口设计当中。
具体到本设计的开发,由于开发的经验不足,模块间的接口设计不是很合理,等到开发到具体的子模块时,才发现了问题,使得系统综合与仿真无法进行下去,从而不得不重新设计模块间的接口,耽误了整个系统开发的速度。
(2)器件延时对系统实现的影响
器件延时对一个实际系统来说是客观存在的,它对系统实现的影响是不可避免的,同时也是很难预测的。
因而在实现系统时,要想把器件对系统实现的影响完全消除)L乎是不可能的。
如果完全忽视它,很可能会导致系统无法正确实现。
比较好的做法是把器件延时的影响控制在一个系统可以允许的范围内,使得它不至于对系统实现产生决定性的影响。
在本系统的开发过程当中,刚开始由于对器件延时的影响考虑不足,所以导致了程序仿真结果与预先设想的不一致,使得系统仿真无法实现预定的功能。
后经过修改程序,考虑了器件延时对同步的影响,才最终实现了系统预定的功能。
可见,考虑器件延时的影响对一个系统设计者来说是非常重要的。
4.3硬件下载
将编译产生的SOF格式配置文件配置进FPGA中。
硬件测试步骤如下:
(1)打开编译好的文件,将实验系统和并口通信线接好,打开电源。
先对引脚进行锁定。
再选择Tool—Programmer命令,在Mode列表中选JTAG,单击左侧的AddFile按钮,手动选择配置文件。
(2)设置编程器。
单击HardwareSetup按钮在弹出的HardwareSetup对话框中双击ByteBlasterMV,单击Close即可。
(3)选择编程器。
根据试验箱选择编程口。
本次设计选择ByBtII,最后单击Start即可,当Programme显示出100%时,编译成功。
(4)硬件测试。
根据仿真结果输入脉冲。
观察结果正确。
下载成功。
联想商务网cjb13x
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电子科 大毕设 基于 FPGA FIR 滤波器 设计 第四