当前位置:文档之家› 基于FPGA的FIR数字滤波器设计

基于FPGA的FIR数字滤波器设计

1、F PGA技术简介现场可编程门阵列FPGA是80年代末开始使用的大规模可编程数字IC器件,它充分利用EDA技术进行器件的开发与应用。

用户借助于计算机不仅能自行设计自己的专用集成电路芯片,还可在计算机上进行功能仿真和时序仿真,及时发现问题,调整电路,改进设计方案。

这样,设计者不必动手搭接电路、调试验证,只需短时间内在计算机上操作即可设计出与实际系统相差无几的理想电路。

而且,FPGA器件采用标准化结构,体积小、集成度高、功耗低、速度快,可无限次反复编程,因此成为科研产品开发及其小型化的首选器件,其应用极为广泛。

3.1 FPGA工作原理FPGA采用了逻辑单元阵列LCA(Logic Cell Array)这样一个概念,内部包括可配置逻辑模块CLB(Configurable Logic Block)、输入输出模块IOB(Input Output Block)和内部连线(Interconnect)三个部分。

现场可编程门阵列(FPGA)是可编程器件,与传统逻辑电路和门阵列(如PAL,GAL及CPLD器件)相比,FPGA具有不同的结构。

FPGA利用小型查找表(16×1RAM)来实现组合逻辑,每个查找表连接到一个D触发器的输入端,触发器再来驱动其他逻辑电路或驱动I/O,由此构成了既可实现组合逻辑功能又可实现时序逻辑功能的基本逻辑单元模块,这些模块间利用金属连线互相连接或连接到I/O模块。

FPGA的逻辑是通过向内部静态存储单元加载编程数据来实现的,存储在存储器单元中的值决定了逻辑单元的逻辑功能以及各模块之间或模块与I/O间的联接方式,并最终决定了FPGA所能实现的功能,FPGA允许无限次的编程。

3.2 FIR滤波器特点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、F IR数字滤波器实验结果之前的simulink仿真与matlab程序仿真仅仅是证明了算法是正确的,接下来我们需要把这个算法用Verilog HDL语言写出来,用modelsim仿真程序,用Signaltap II看输出波形。

该部分的verilog HDL代码如下:module FIR (input clk_1M,input reset_n,input[7:0]datain,//ADC的采样数据,无符号output[7:0]dataout//滤波后给DAC的数据);parameter signed COEF0 =12'd3;parameter signed COEF1 =-12'd2;parameter signed COEF2 =-12'd11;parameter signed COEF3 =12'd23;parameter signed COEF4 =12'd17;parameter signed COEF5 =-12'd100;parameter signed COEF6 =12'd61;parameter signed COEF7 =12'd520;parameter signed COEF8 =12'd520;parameter signed COEF9 =12'd61;parameter signed COEF10 = -12'd100;parameter signed COEF11 = 12'd17;parameter signed COEF12 = 12'd23;parameter signed COEF13 = -12'd11;parameter signed COEF14 = -12'd2;parameter signed COEF15 = 12'd3;reg signed[8:0] shift_buf0;//第一级延时寄存器reg signed [8:0] shift_buf1;//第二级延时寄存器reg signed [8:0] shift_buf2;//第三级延时寄存器reg signed [8:0] shift_buf3;//第四级延时寄存器reg signed [8:0] shift_buf4;//第五级延时寄存器reg signed [8:0] shift_buf5;//第六级延时寄存器reg signed [8:0] shift_buf6;//第七级延时寄存器reg signed [8:0] shift_buf7;//第八级延时寄存器reg signed [8:0] shift_buf8;//第九级延时寄存器reg signed [8:0] shift_buf9;//第十级延时寄存器reg signed [8:0] shift_buf10;//第十一级延时寄存器reg signed [8:0] shift_buf11;//第十二级延时寄存器reg signed [8:0] shift_buf12;//第十三级延时寄存器reg signed [8:0] shift_buf13;//第十四级延时寄存器reg signed [8:0] shift_buf14;//第十五级延时寄存器reg signed [8:0] shift_buf15;//第十六级延时寄存器reg signed [9:0] add_0_15;reg signed [9:0] add_1_14;reg signed [9:0] add_2_13;reg signed [9:0] add_3_12;reg signed [9:0] add_4_11;reg signed [9:0] add_5_10;reg signed [9:0] add_6_9;reg signed [9:0] add_7_8;reg signed [21:0] mul1;reg signed [21:0] mul2;reg signed[21:0] mul3;reg signed [21:0] mul4;reg signed [21:0] mul5;reg signed [21:0] mul6;reg signed [21:0] mul7;reg signed [21:0] mul8;reg signed [29:0] add;always@ (posedge clk_1M or negedge reset_n) beginif (!reset_n)beginshift_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;endelsebeginshift_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;endendalways@ (posedge clk_1M or negedge reset_n) beginif (!reset_n)beginadd_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;endelsebeginadd_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;endendalways@ (posedge clk_1M or negedge reset_n) beginif (!reset_n)beginmul1 <= 22'd0;mul2 <= 22'd0;mul3 <= 22'd0;mul4 <= 22'd0;mul5 <= 22'd0;mul6 <= 22'd0;mul7 <= 22'd0;mul8 <= 22'd0;endelsebeginmul1 <= 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;endendalways@ (posedge clk_1M or negedge reset_n)beginif (!reset_n)add <= 30'd0;elseadd <= mul1+mul2+mul3+mul4+mul5+mul6+mul7+mul8;endassign dataout = (add >=0)?add>>10 :0;endmodule同时,通过modelsim来仿真最终的结果,Mentor公司的ModelSim是业界最优秀的HDL语言仿真软件,它能提供友好的仿真环境,是业界唯一的单内核支持VHDL和Verilog混合仿真的仿真器。

相关主题