基于FPGA的FIR数字滤波器设计.docx
《基于FPGA的FIR数字滤波器设计.docx》由会员分享,可在线阅读,更多相关《基于FPGA的FIR数字滤波器设计.docx(13页珍藏版)》请在冰豆网上搜索。
基于FPGA的FIR数字滤波器设计
1、FPGA技术简介
现场可编程门阵列FPGA是80年代末开始使用的大规模可编程数字IC器件,它充分利用EDA技术进行器件的开发与应用。
用户借助于计算机不仅能自行设计自己的专用集成电路芯片,还可在计算机上进行功能仿真和时序仿真,及时发现问题,调整电路,改进设计方案。
这样,设计者不必动手搭接电路、调试验证,只需短时间内在计算机上操作即可设计出与实际系统相差无几的理想电路。
而且,FPGA器件采用标准化结构,体积小、集成度高、功耗低、速度快,可无限次反复编程,因此成为科研产品开发及其小型化的首选器件,其应用极为广泛。
3.1FPGA工作原理
FPGA采用了逻辑单元阵列LCA(LogicCellArray)这样一个概念,内部包括可配置逻辑模块CLB(ConfigurableLogicBlock)、输入输出模块IOB(InputOutputBlock)和内部连线(Interconnect)三个部分。
现场可编程门阵列(FPGA)是可编程器件,与传统逻辑电路和门阵列(如PAL,GAL及CPLD器件)相比,FPGA具有不同的结构。
FPGA利用小型查找表(16×1RAM)来实现组合逻辑,每个查找表连接到一个D触发器的输入端,触发器再来驱动其他逻辑电路或驱动I/O,由此构成了既可实现组合逻辑功能又可实现时序逻辑功能的基本逻辑单元模块,这些模块间利用金属连线互相连接或连接到I/O模块。
FPGA的逻辑是通过向内部静态存储单元加载编程数据来实现的,存储在存储器单元中的值决定了逻辑单元的逻辑功能以及各模块之间或模块与I/O间的联接方式,并最终决定了FPGA所能实现的功能,FPGA允许无限次的编程。
3.2FIR滤波器特点
1)采用FPGA设计ASIC电路(专用集成电路),用户不需要投片生产,就能得到合用的芯片。
2)FPGA可做其它全定制或半定制ASIC电路的中试样片。
3)FPGA内部有丰富的触发器和I/O引脚。
4)FPGA是ASIC电路中设计周期最短、开发费用最低、风险最小的器件之一。
5)FPGA采用高速CMOS工艺,功耗低,可以与CMOS、TTL电平兼容。
同时,FPGA还存在以下五大优势。
1)性能:
利用硬件并行的优势,FPGA打破了顺序执行的模式,在每个时钟周期内完成更多的处理任务,超越了数字信号处理器(DSP)的运算能力。
著名的分析与基准测试公司BDTI,发布基准表明在某些应用方面,FPGA每美元的处理能力是DSP解决方案的多倍。
2在硬件层面控制输入和输出(I/O)为满足应用需求提供了更快速的响应时间和专业化的功能。
2)上市时间:
尽管上市的限制条件越来越多,FPGA技术仍提供了灵活性和快速原型的能力。
用户可以测试一个想法或概念,并在硬件中完成验证,而无需经过自定制ASIC设计漫长的制造过程。
3由此用户就可在数小时内完成逐步的修改并进行FPGA设计迭代,省去了几周的时间。
商用现成(COTS)硬件可提供连接至用户可编程FPGA芯片的不同类型的I/O。
高层次的软件工具的日益普及降低了学习曲线与抽象层,并经常提供有用的IP核(预置功能)来实现高级控制与信号处理。
3)成本:
自定制ASIC设计的非经常性工程(NRE)费用远远超过基于FPGA的硬件解决方案所产生的费用。
ASIC设计初期的巨大投资表明了原始设备制造商每年需要运输数千种芯片,但更多的最终用户需要的是自定义硬件功能,从而实现数十至数百种系统的开发。
可编程芯片的特性意味着用户可以节省制造成本以及漫长的交货组装时间。
系统的需求时时都会发生改变,但改变FPGA设计所产生的成本相对ASCI的巨额费用来说是微不足道的。
4)稳定性:
软件工具提供了编程环境,FPGA电路是真正的编程“硬”执行过程。
基于处理器的系统往往包含了多个抽象层,可在多个进程之间计划任务、共享资源。
驱动层控制着硬件资源,而操作系统管理内存和处理器的带宽。
对于任何给定的处理器内核,一次只能执行一个指令,且基于处理器的系统时刻面临着严格限时的任务相互取占的风险。
而FPGA不使用操作系统,拥有真正的并行执行和专注于每一项任务的确定性硬件,可减少稳定性方面出现问题的可能。
5)长期维护:
正如上文所提到的,FPGA芯片是现场可升级的,无需重新设计ASIC所涉及的时间与费用投入。
举例来说,数字通信协议包含了可随时间改变的规范,而基于ASIC的接口可能会造成维护和向前兼容方面的困难。
可重新配置的FPGA芯片能够适应未来需要作出的修改。
随着产品或系统成熟起来,用户无需花费时间重新设计硬件或修改电路板布局就能增强功能。
可以说,FPGA芯片是小批量系统提高系统集成度、可靠性的最佳选择之一。
2、FIR数字滤波器实验结果
之前的simulink仿真与matlab程序仿真仅仅是证明了算法是正确的,接下来我们需要把这个算法用VerilogHDL语言写出来,用modelsim仿真程序,用SignaltapII看输出波形。
该部分的verilogHDL代码如下:
moduleFIR(
inputclk_1M,
inputreset_n,
input[7:
0]datain,//ADC的采样数据,无符号
output[7:
0]dataout//滤波后给DAC的数据
);
parametersignedCOEF0=12'd3;
parametersignedCOEF1=-12'd2;
parametersignedCOEF2=-12'd11;
parametersignedCOEF3=12'd23;
parametersignedCOEF4=12'd17;
parametersignedCOEF5=-12'd100;
parametersignedCOEF6=12'd61;
parametersignedCOEF7=12'd520;
parametersignedCOEF8=12'd520;
parametersignedCOEF9=12'd61;
parametersignedCOEF10=-12'd100;
parametersignedCOEF11=12'd17;
parametersignedCOEF12=12'd23;
parametersignedCOEF13=-12'd11;
parametersignedCOEF14=-12'd2;
parametersignedCOEF15=12'd3;
regsigned[8:
0]shift_buf0;//第一级延时寄存器
regsigned[8:
0]shift_buf1;//第二级延时寄存器
regsigned[8:
0]shift_buf2;//第三级延时寄存器
regsigned[8:
0]shift_buf3;//第四级延时寄存器
regsigned[8:
0]shift_buf4;//第五级延时寄存器
regsigned[8:
0]shift_buf5;//第六级延时寄存器
regsigned[8:
0]shift_buf6;//第七级延时寄存器
regsigned[8:
0]shift_buf7;//第八级延时寄存器
regsigned[8:
0]shift_buf8;//第九级延时寄存器
regsigned[8:
0]shift_buf9;//第十级延时寄存器
regsigned[8:
0]shift_buf10;//第十一级延时寄存器
regsigned[8:
0]shift_buf11;//第十二级延时寄存器
regsigned[8:
0]shift_buf12;//第十三级延时寄存器
regsigned[8:
0]shift_buf13;//第十四级延时寄存器
regsigned[8:
0]shift_buf14;//第十五级延时寄存器
regsigned[8:
0]shift_buf15;//第十六级延时寄存器
regsigned[9:
0]add_0_15;
regsigned[9:
0]add_1_14;
regsigned[9:
0]add_2_13;
regsigned[9:
0]add_3_12;
regsigned[9:
0]add_4_11;
regsigned[9:
0]add_5_10;
regsigned[9:
0]add_6_9;
regsigned[9:
0]add_7_8;
regsigned[21:
0]mul1;
regsigned[21:
0]mul2;
regsigned[21:
0]mul3;
regsigned[21:
0]mul4;
regsigned[21:
0]mul5;
regsigned[21:
0]mul6;
regsigned[21:
0]mul7;
regsigned[21:
0]mul8;
regsigned[29:
0]add;
always@(posedgeclk_1Mornegedgereset_n)
begin
if(!
reset_n)
begin
shift_buf0<=9'd0;
shift_buf1<=9'd0;
shift_buf2<=9'd0;
shift_buf3<=9'd0;
shift_buf4<=9'd0;
shift_buf5<=9'd0;
shift_buf6<=9'd0;
shift_buf7<=9'd0;
shift_buf8<=9'd0;
shift_buf9<=9'd0;
shift_buf10<=9'd0;
shift_buf11<=9'd0;
shift_buf12<=9'd0;
shift_buf13<=9'd0;
shift_buf14<=9'd0;
shift_buf15<=9'd0;
end
else
begin
shift_buf0<={1'b0,datain};
shift_buf1<=shift_buf0;
shift_buf2<=shift_buf1;
shift_buf3<=shift_buf2;
shift_buf4<=shift_buf3;
shift_buf5<=shift_buf4;
shift_buf6<=shift_buf5;
shift_buf7<=shift_buf6;
shift_buf8<=shift_buf7;
shift_buf9<=shift_buf8;
shift_buf10<=shift_buf9;
shift_buf11<=shift_buf10;
shift_buf12<=shift_buf11;
shift_buf13<=shift_buf12;
shift_buf14<=shift_buf13;
shift_buf15<=shift_buf14;
end
end
always@(posedgeclk_1Mornegedgereset_n)
begin
if(!
reset_n)
begin
add_0_15<=10'd0;
add_1_14<=10'd0;
add_2_13<=10'd0;
add_3_12<=10'd0;
add_4_11<=10'd0;
add_5_10<=10'd0;
add_6_9<=10'd0;
add_7_8<=10'd0;
end
else
begin
add_0_15<=shift_buf0+shift_buf15;
add_1_14<=shift_buf1+shift_buf14;
add_2_13<=shift_buf2+shift_buf13;
add_3_12<=shift_buf3+shift_buf12;
add_4_11<=shift_buf4+shift_buf11;
add_5_10<=shift_buf5+shift_buf10;
add_6_9<=shift_buf6+shift_buf9;
add_7_8<=shift_buf7+shift_buf8;
end
end
always@(posedgeclk_1Mornegedgereset_n)
begin
if(!
reset_n)
begin
mul1<=22'd0;
mul2<=22'd0;
mul3<=22'd0;
mul4<=22'd0;
mul5<=22'd0;
mul6<=22'd0;
mul7<=22'd0;
mul8<=22'd0;
end
else
begin
mul1<=COEF0*add_0_15;
mul2<=COEF1*add_1_14;
mul3<=COEF2*add_2_13;
mul4<=COEF3*add_3_12;
mul5<=COEF4*add_4_11;
mul6<=COEF5*add_5_10;
mul7<=COEF6*add_6_9;
mul8<=COEF7*add_7_8;
end
end
always@(posedgeclk_1Mornegedgereset_n)
begin
if(!
reset_n)
add<=30'd0;
else
add<=mul1+mul2+mul3+mul4+mul5+mul6+mul7+mul8;
end
assigndataout=(add>=0)?
add>>10:
0;
endmodule
同时,通过modelsim来仿真最终的结果,Mentor公司的ModelSim是业界最优秀的HDL语言仿真软件,它能提供友好的仿真环境,是业界唯一的单内核支持VHDL和Verilog混合仿真的仿真器。
它采用直接优化的编译技术、Tcl/Tk技术、和单一内核仿真技术,编译仿真速度快,编译的代码与平台无关,便于保护IP核,个性化的图形界面和用户接口,为用户加快调试提供强有力的手段,是FPGA/ASIC设计的首选仿真软件。
Modelsim软件中用来编写代码的工具是Testbench,Testbench本身可以看做一个模块或者设备,和你用户编写的模块进行通信。
通过Testbench模块向待测模块输出信号作为激励,同时接收从待测模块输出的信号来查看结果。
依照上述的Verilog代码,编写Testbench,基本代码如下:
`timescale1ns/1ps
moduleFIR_TB;
regclk_1M;
regreset_n;
reg[7:
0]datain;
reg[7:
0]memery[8191:
0];
wire[7:
0]dataout;
integerj;
FIRu1(
.clk_1M(clk_1M),
.reset_n(reset_n),
.datain(datain),
.dataout(dataout)
);
initial
begin
reset_n=0;
clk_1M=0;
#100
reset_n=1;
end
always#50clk_1M=~clk_1M;
initial
begin
$readmemh("original.dat",memery);
for(j=0;j<8192;j=j+1)
begin
datain=memery[j];
@(posedgeclk_1M);
if(j==8191)
j=0;
end
end
endmodule
最终仿真出来的波形如下:
图2.11仿真结果
最终的仿真结果与前面matlab的结果一样,这也就验证了整体方案的成熟度。
3、总结与展望
本系统介绍了基于FPGA的FIR数字滤波器的基本原理以及实现,明确好所需要设计的FIR数字滤波器滤波器后,首先对其进行性能需求分析,明确FIR数字滤波器系统应该达到的各种性能指标,其次,拟定多种滤波器类型,对这些方案采用Matlab进行仿真,在这个过程中我们有许多的窗函数选择和设计方法选择,进行综合分析和比较,选择出最佳的滤波器类型作为本设计方案,然后依据其性能指标编写Matlab程序,确定二阶节系数。
或者直接进行Verilog语言的编写。
最终结果显示,整体系统已经正常运行。
4、参考文献
[1]RyszardBis,DorotaDobrowolska.Diameterincrementofsilverfir(AbiesalbaMill.)intheIłżeckaForest[J].ForestResearchPapers,2012,73(3).
[2]MaciejPach.Theinfluenceofadmixtureandco-dominantspeciesontheheightandDBHofsilverfir(AbiesalbaMill.)andonthegrowingstockoffirstandsintheCarpathianForest-NaturalRegion[J].ForestResearchPapers,2010,71(3).
[3]SzabolcsHajdu,SándorTihamérBrassai,IuliuSzekely.FPGAbasedangularstabilizationofaquadcopter[J].MACRo2015,2017,2
(1).
[4]仲玲利,周晓波.基于FPGA的SDRAM控制器设计开发[J].电路与系统,2014,03(01).
[5]张春龙,李德超,张玉环.基于BP神经网络的高阶FIR多阻带滤波器优化设计[J].电力与能源进展,2014,02(01).
[6]石兰洁,高诗简,黄曦,原豪杰,周铁戈.基于FPGA的Logistic方程混沌信号加密实现[J].电路与系统,2013,02(03).
[7]付国新,侍昌江.基于FPGA数据采集与共享的两种记录方式并存的电力系统录波器研制[J].输配电工程与技术,2012,01(02).
[8]任小强,陈金鹰,吴蓉,李文彬.基于FPGA和WiFi技术的电子鞭炮系统设计[J].软件工程与应用,2014,03(04).
[9]李俊.FIR数字滤波器的设计与实现[J].建模与仿真,2013,02(04).
[10]Ying-ShiehKung,NguyenVuQuynh,NguyenTrungHieu,Chung-ChunHuang,Liang-ChiaoHuang.Simulink/ModelsimCo-SimulationandFPGARealizationofSpeedControlICforPMSMDrive[J].ProcediaEngineering,2011,23.
[11]Das,Li,Nayak,Assaf,Petriu,Biswas.CircuitArchitectureTestVerificationBasedonHardwareSoftwareCo-designwithModelSim[J].IETEJournalofResearch,2013,59
(2).
[12]SunilDas,Jun-FengLi,AmiyaNayak,MansourAssaf,EmilPetriu,SatyendraBiswas.CircuitArchitectureTestVerificationBasedonHardwareSoftwareCo-designwithModelSim[J].IETEJournalofResearch,2013,59
(2).
[13]赵庆亮.基于DSP的自动平衡控制理论与方法研究[D].北京化工大学,2012.
[14]孙科林.基于多核DSP的实时图像处理平台研究[D].电子科技大学,2012.
[15]张方正.高速光通信中数字信号处理(DSP)与波形产生技术研究[D].北京邮电大学,2013.
[16]李振涛.高性能DSP关键电路及EDA技术研究[D].国防科学技术大学,2007.
[17]董秀洁,杨艳,周游.FPGA/CPLD选型与设计优化[J].化工自动化及仪表,2009,36(03):
60-63.
[18]屈星,唐宁,严舒,杨白.基于FPGA的IIR数字滤波器的设计与仿真[J].计算机仿真,2009,26(08):
304-307+348.
[19]耶晓东.基于Matlab的IIR数字滤波器设计及DSP实现[J].电子设计工程,2011,19(09):
175-177.
[20]周耀辉,王芸波,朱维新,张玉仲,武焕舟.IIR数字滤波器设计[J].电力自动化设备,2010,30(09):
129-131.
[21]王春玲,吴顺伟.FPGA/CPLD选型及与其他技术的融合[J].现代电子技术,2007(16):
30-33+40.