基于FPGA的FIR数字滤波器设计(源码+万字报告+实物)

1、FPGA技术简介
现场可编程门阵列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、FIR数字滤波器实验结果
之前的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)
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@ (posedge clk_1M or negedge reset_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@ (posedge clk_1M or negedge reset_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@ (posedge clk_1M or negedge reset_n)
begin
if (!reset_n)
add <= 30’d0;
else
add <= mul1+mul2+mul3+mul4+mul5+mul6+mul7+mul8;
end
assign dataout = (add >=0) ? add>>10 :0;
endmodule
同时,通过modelsim来仿真最终的结果,Mentor公司的ModelSim是业界最优秀的HDL语言仿真软件,它能提供友好的仿真环境,是业界唯一的单内核支持VHDL和Verilog混合仿真的仿真器。它采用直接优化的编译技术、Tcl/Tk技术、和单一内核仿真技术,编译仿真速度快,编译的代码与平台无关,便于保护IP核,个性化的图形界面和用户接口,为用户加快调试提供强有力的手段,是FPGA/ASIC设计的首选仿真软件。
Modelsim软件中用来编写代码的工具是Testbench, Testbench本身可以看做一个模块或者设备,和你用户编写的模块进行通信。通过Testbench模块向待测模块输出信号作为激励,同时接收从待测模块输出的信号来查看结果。
依照上述的Verilog代码,编写Testbench,基本代码如下:
`timescale 1ns/1ps
module FIR_TB;
reg clk_1M;
reg reset_n;
reg [7:0] datain;
reg [7:0] memery[8191:0];
wire [7:0] dataout;
integer j;

FIR u1(
.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 #50 clk_1M=~clk_1M;

initial
begin
$readmemh(“original.dat”,memery);
for(j=0;j<8192;j=j+1)
begin
datain=memery[j];
@(posedge clk_1M);
if (j == 8191)
j=0;
end
end
endmodule
最终仿真出来的波形如下:

图2.11 仿真结果
最终的仿真结果与前面matlab的结果一样,这也就验证了整体方案的成熟度。
3、总结与展望
本系统介绍了基于FPGA的FIR数字滤波器的基本原理以及实现,明确好所需要设计的FIR数字滤波器滤波器后,首先对其进行性能需求分析,明确FIR数字滤波器系统应该达到的各种性能指标,其次,拟定多种滤波器类型,对这些方案采用Matlab进行仿真,在这个过程中我们有许多的窗函数选择和设计方法选择,进行综合分析和比较,选择出最佳的滤波器类型作为本设计方案,然后依据其性能指标编写Matlab程序,确定二阶节系数。或者直接进行Verilog语言的编写。最终结果显示,整体系统已经正常运行。
4、参考文献
[1]Ryszard Bis,Dorota Dobrowolska. Diameter increment of silver fir ( Abies alba Mill.) in the Iłżecka Forest[J]. Forest Research Papers,2012,73(3).
[2]Maciej Pach. The influence of admixture and co-dominant species on the height and DBH of silver fir ( Abies alba Mill.) and on the growing stock of fir stands in the Carpathian Forest-Natural Region[J]. Forest Research Papers,2010,71(3).
[3]Szabolcs Hajdu,Sándor Tihamér Brassai,Iuliu Szekely. FPGA based angular stabilization of a quadcopter[J]. MACRo 2015,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-Shieh Kung,Nguyen Vu Quynh,Nguyen Trung Hieu,Chung-Chun Huang,Liang-Chiao Huang. Simulink/Modelsim Co-Simulation and FPGA Realization of Speed Control IC for PMSM Drive[J]. Procedia Engineering,2011,23.
[11]Das,Li,Nayak,Assaf,Petriu,Biswas. Circuit Architecture Test Verification Based on Hardware Software Co-design with ModelSim[J]. IETE Journal of Research,2013,59(2).
[12]Sunil Das,Jun-Feng Li,Amiya Nayak,Mansour Assaf,Emil Petriu,Satyendra Biswas. Circuit Architecture Test Verification Based on Hardware Software Co-design with ModelSim[J]. IETE Journal of Research,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.

### FPGA 实现 FIR 滤波器设计与实现 #### 设计原理 FIR(有限脉冲响应)滤波器是一种线性相位滤波器,在数字信号处理领域广泛应用。其主要特点是具有稳定的频率特性以及易于硬件实现的特点。对于基于FPGAFIR滤波器而言,利用并行计算能力能够显著提高数据吞吐量和实时性能[^1]。 #### MATLAB代码实现 为了便于理解和测试,通常先在MATLAB环境中完成算法级建模。下面是一个简单的低通FIR滤波器的设计示例: ```matlab % 参数设置 Fs = 8000; % 采样率 (Hz) Fc = 1000; % 截止频率 (Hz) % 使用fdesign函数创建一个低通滤波器对象 d = fdesign.lowpass('N,F3dB', 50, Fc/(Fs/2)); % 设计滤波器系数 Hd = design(d); % 显示滤波器信息 fvtool(Hd); ``` 此段代码展示了如何定义基本参数并通过`fdesign`工具箱来构建所需的滤波器模型。之后可以通过调用`fvtool()`查看所得到的幅度响应曲线等重要特征。 #### VHDL/HDL编码转换 当确认了软件平台上的设计方案后,则需将其转化为适合于特定目标器件的语言描述形式——VHDL或Verilog HDL。这里给出一段简化版的VHDL代码片段用于说明这一过程中的关键部分: ```vhdl library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL; entity fir_filter is Port ( clk : in STD_LOGIC; reset_n : in STD_LOGIC; din : in SIGNED(7 downto 0); -- 输入样本宽度为8bit有符号数 dout : out SIGNED(15 downto 0)-- 输出结果宽度为16bit有符号数 ); end entity; architecture Behavioral of fir_filter is -- 定义内部寄存器和其他必要的组件... begin process(clk,reset_n) variable acc : signed(23 downto 0):=(others=>'0'); begin if(reset_n='0')then acc := (others => '0'); elsif(rising_edge(clk)) then -- 进行乘积累加运算... end if; end process; end architecture; ``` 上述代码框架仅作为示意用途,并未包含完整的逻辑细节;实际项目中还需要考虑更多因素如优化资源利用率、降低功耗等问题。 #### 仿真验证 最后一步是在选定的目标平台上运行综合后的网表文件来进行功能性和时序性的双重检验。这不仅有助于发现潜在错误还能评估最终产品的性能指标是否满足预期要求。现代EDA工具链提供了丰富的调试手段支持开发者高效地完成这项工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值