0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于现场可编程门阵列(fpga)技术fir数字滤波器的设计

e9Zb_gh_8734352 来源:未知 作者:李倩 2018-08-08 15:55 次阅读

在数字化技术在各个领域得到广泛运用的今天,数字滤波器是数字系统中信号处理关键的一环。数字滤波在图像处理、语音识别和模式识别等数字信号处理中占有重要地位。数字滤波器和模拟滤波器相比具有更高的精度、信噪比,以及不可比拟的可靠性。由于在性能、成本、灵活性和功耗等方面的优势,基于fpga的信号处理器已广泛应用于各种信号处理领域。

本文主要介绍了基于现场可编程门阵列(fpga)技术fir数字滤波器的设计,设计一个滤波器,其采样率 fs=1MHz,通带截止频率 fpass=50KHz,归一化表示fpass=0.1,阻带起始频率 fstop=200 KHz,归一化表示为fstop=0.4,阻带衰减 80dB。

设计实现

1. 打开 MATLAB 软件,在命令行窗口输入 fdatool 并回车,打开滤波器设计与分析工具窗口

2. 在 fda 工具中配置你需要的滤波器参数

图片中频率参数(frequency specifications)采用的归一化表示方法,如果使用实际频率表示,在 Units 框内选择“KHz”;

在 Fs 内填写 1000,即数字采样频率为1000KHz (1MHz);在 Fpass 内填写 50,即通带截止频率为 50KHz;在 Fstop内填写 200,即阻带起始频率为 200KHz,Astop 填 80,即为阻带衰减 80dB。

点击 Design Filter 后可以查看频率及相位的响应曲线

3.在“Filter Designer & Analysis Tool”界面中,打开 File—>Export…出现下图

4.点击“Export” 将系数导出到 MATLAB 工作区间

将 coefficients 系数保存到 txt 文件中,在 MATLAB 命令窗口输入:

>> fid=fopen('F:Fpga_ProjectFIR_Filtercoef.txt','w');

% txt 文件路径根据实际情况修改

>> fprintf(fid,'%d,',Num); % 打印到 txt 文件中的相邻系数由逗号隔开

>> fclose(fid);

这样我们就得到了一组滤波器系数,存在上图路径下的 coef.txt 文件中。

打开 quartus prime 17.0 软件,新建工程:

5.工程名字:FIR_Fliter

6.选择对应的 FPGA 型号,10M08SCM153C8G

7.根据自己的情况选择 EDA 工具,这里我们选择 synplify pro 和 Modelsim-Altera

完成新建工程,进入开发界面;

8.在开发界面选择 tools—>IP Catalog,并在 IP Library 中找到 FIR II 的选项,双加 FIR II 打开 QSYS 工具

9.填写 IP 实例的名字,点击 OK

10.在 Filter Specification 选项中配置参数如下图

11.在 Coefficient Settings 选项中配置参数如下图

Coefficient width 可以自行配置,一般值越高滤波效果也好,同时实现滤波器消耗的资源也越多

12.在 Coefficients 选项中需要将 Matlab 中导出的滤波系数导入

点击 Import from file 按钮,选择之前从 Matlab 导出的 coef.txt 文件,点击 import 导入;

软件会将导入的系数按照上图中设定的系数位宽调整到合适的值,并分别绘制响应曲线,原始数据 VS 修正数据

13.在 Input/Output Opetion 选项中配置参数

如下图,其中 Input width 根据采样数据的实际位宽填写,这里为 11 位有符号数

14.以上各项参数配置完成后,点击 Generate HDL..,弹出生成页面,点击 Generate,等待完成

通过以上操作完成了 IP 核的生成,点击 Finish 结束。

15.将 IP 核中的 qip 和 sip 文件添加到工程文件列表中

16.对工程进行综合,通过

17.将我们准备好的测试文件 FIR_filter_tb.v 和 DDS.v 拷贝至工程目录文件夹下

在 Quartus prime 17.0 软件中选择

Assignment —>settings.. —>EDA tool settings —>Simulation —>Test Benches 添加仿真文件

18.点击 Tools —>RUN Simulation Tool —>RTL Simulation

Quartus prime 17.0 支持一键式仿真,直接启动仿真软件 Modelsim-Altera,并显示仿真波形数据(模拟形式显示)

data1 信号为 24KHz 正弦波,量化位宽为 10bit

data2 信号为 240KHz 正弦波,量化位宽为 10bit

data_in 信号为 data1 和 data2 的叠加信号,量化位宽为 11bit

data_out 信号为 data_in 信号经过 FIR 数字滤波后的输出,量化位宽为 28bit

附件一:FIR_filter_tb.v

// --------------------------------------------------------------------

// >>>>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<< 

// --------------------------------------------------------------------

// Module: FIR_filter_tb

//

// Author: Step

//

// Description: FIR_filter_tb

//

// Web: www.stepfpga.com

//

// --------------------------------------------------------------------

// Code Revision History :

// --------------------------------------------------------------------

// Version: |Mod. Date: |Changes Made:

// V1.1 |2016/10/30 |Initial ver

// --------------------------------------------------------------------

`timescale 1ps/1ps

module FIR_filter_tb;

parameter PERIOD = 20;

reg clk, rst_n;

wire signed [26:0] data_out;

initial begin

clk = 0;

rst_n = 0;

#100;

rst_n = 1;

#6000;

$stop;

end

always #10 clk = ~clk;

wire signed[9:0] data1;

DDS dds_24k

(

.clk_in(clk), //clock in

.rst_n_in(rst_n), //reset, active low

.dds_en_in(1), //dds work enable

.f_increment(24'h60000), //frequency increment

.p_increment(0), //phase increment

.dac_data_out(data1) //data out

);

wire signed[9:0] data2;

DDS dds_240k

(

.clk_in(clk), //clock in

.rst_n_in(rst_n), //reset, active low

.dds_en_in(1), //dds work enable

.f_increment(24'h3c0000), //frequency increment

.p_increment(0), //phase increment

.dac_data_out(data2) //data out

);

wire signed[10:0] data_in = data1 + data2;

FIR_Filter u0 (

.ast_sink_data (data_in), // avalon_streaming_sink.data

.ast_sink_valid (1), // .valid

.ast_sink_error (0), // .error

.ast_source_data (data_out), // avalon_streaming_source.data

.ast_source_valid (), // .valid

.ast_source_error (), // .error

.clk (clk), // clk.clk

.reset_n (rst_n) // rst.reset_n

);

endmodule

附件二:DDS.v

// --------------------------------------------------------------------

// >>>>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<< 

// --------------------------------------------------------------------

// Module: DDS

//

// Author: Step

//

// Description: DDS

//

// Web: www.stepfpga.com

//

// --------------------------------------------------------------------

// Code Revision History :

// --------------------------------------------------------------------

// Version: |Mod. Date: |Changes Made:

// V1.1 |2016/10/30 |Initial ver

// --------------------------------------------------------------------

module DDS

(

input clk_in, //clock in

input rst_n_in, //reset, active low

input dds_en_in, //dds work enable

input [23:0] f_increment, //frequency increment

input [23:0] p_increment, //phase increment

output dac_clk_out, //clock out

output [9:0] dac_data_out //data out

);

reg [23:0] phase_accumulator;

wire [23:0] phase;

//wire [9:0] dac_data_out;

assign dac_clk_out = clk_in;

//next_phase = phase_accumulator + f_increment;

always @(posedge clk_in or negedge rst_n_in)

begin

if(!rst_n_in) phase_accumulator <= 23'b0;

else if(dds_en_in) phase_accumulator <= phase_accumulator + f_increment;

end

assign phase = phase_accumulator + p_increment; // phase is the high 8 bits

lookup_table lookup_table_uut

(

.phase(phase[23:16]),

.dac_data_out(dac_data_out)

);

endmodule

/**************************************************

module: lookup_table

**************************************************/

module lookup_table

(

input [7:0] phase,

output reg [9:0] dac_data_out

);

wire [5:0] address = phase[5:0];

wire [1:0] sel = phase[7:6];

wire [9:0] sine;

always@(sel or sine)

case (sel)

2'b00 : dac_data_out = {1'b0, sine[9:1]};

2'b01 : dac_data_out = {1'b0, sine[9:1]};

2'b10 : dac_data_out = {1'b1, 9'h1ff-sine[9:1]};

2'b11 : dac_data_out = {1'b1, 9'h1ff-sine[9:1]};

endcase

sine_table sine_table_uut

(

.sel(sel),

.address(address),

.sine(sine)

);

endmodule

/**************************************************

module: sine_table

**************************************************/

module sine_table

(

input [1:0] sel,

input [5:0] address,

output reg [9:0] sine

);

reg [5:0] table_addr;

always @(sel or address)

case (sel)

2'b00: table_addr = address;

2'b01: table_addr = 6'h3f - address;

2'b10: table_addr = address;

2'b11: table_addr = 6'h3f - address;

endcase

always @(table_addr)

case(table_addr)

6'h0: sine=10'h000;

6'h1: sine=10'h019;

6'h2: sine=10'h032;

6'h3: sine=10'h04B;

6'h4: sine=10'h064;

6'h5: sine=10'h07D;

6'h6: sine=10'h096;

6'h7: sine=10'h0AF;

6'h8: sine=10'h0C4;

6'h9: sine=10'h0E0;

6'ha: sine=10'h0F9;

6'hb: sine=10'h111;

6'hc: sine=10'h128;

6'hd: sine=10'h141;

6'he: sine=10'h159;

6'hf: sine=10'h170;

6'h10: sine=10'h187;

6'h11: sine=10'h19F;

6'h12: sine=10'h1B5;

6'h13: sine=10'h1CC;

6'h14: sine=10'h1E2;

6'h15: sine=10'h1F8;

6'h16: sine=10'h20E;

6'h17: sine=10'h223;

6'h18: sine=10'h238;

6'h19: sine=10'h24D;

6'h1a: sine=10'h261;

6'h1b: sine=10'h275;

6'h1c: sine=10'h289;

6'h1d: sine=10'h29C;

6'h1e: sine=10'h2AF;

6'h1f: sine=10'h2C1;

6'h20: sine=10'h2D3;

6'h21: sine=10'h2E5;

6'h22: sine=10'h2F6;

6'h23: sine=10'h307;

6'h24: sine=10'h317;

6'h25: sine=10'h326;

6'h26: sine=10'h336;

6'h27: sine=10'h344;

6'h28: sine=10'h353;

6'h29: sine=10'h360;

6'h2a: sine=10'h36D;

6'h2b: sine=10'h37A;

6'h2c: sine=10'h386;

6'h2d: sine=10'h392;

6'h2e: sine=10'h39C;

6'h2f: sine=10'h3A7;

6'h30: sine=10'h3B1;

6'h31: sine=10'h3BA;

6'h32: sine=10'h3C3;

6'h33: sine=10'h3CB;

6'h34: sine=10'h3D3;

6'h35: sine=10'h3DA;

6'h36: sine=10'h3E0;

6'h37: sine=10'h3E6;

6'h38: sine=10'h3EB;

6'h39: sine=10'h3F0;

6'h3a: sine=10'h3F3;

6'h3b: sine=10'h3F7;

6'h3c: sine=10'h3FA;

6'h3d: sine=10'h3FC;

6'h3e: sine=10'h3FE;

6'h3f: sine=10'h3FF;

endcase

endmodule

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1630

    文章

    21782

    浏览量

    604982
  • 滤波器
    +关注

    关注

    161

    文章

    7857

    浏览量

    178611
  • 信号处理器
    +关注

    关注

    1

    文章

    254

    浏览量

    25314

原文标题:【FPGA信号处理一】5分钟学会FIR 滤波器设计

文章出处:【微信号:gh_873435264fd4,微信公众号:FPGA技术联盟】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    相关推荐

    使用FPGA构建的数字滤波器设计方案

    本文简要介绍了FIR数字滤波器的结构特点和基本原理,提出基于FPGA和DSP Builder的FIR数字滤波器的基本设计流程和实现方案。##
    发表于 07-24 15:30 8884次阅读
    使用<b class='flag-5'>FPGA</b>构建的<b class='flag-5'>数字滤波器</b>设计方案

    基于FPGAFIR数字滤波器的优化设计

    基于FPGAFIR数字滤波器的优化设计
    发表于 08-17 23:55

    现场可编程门阵列有哪些应用?

    现场可编程门阵列(FPGA)是一种可编程逻辑器件,由成千上万个完全相同的可编程逻辑单元组成,周围
    发表于 08-06 08:27

    基于IP核的FIR低通滤波器该怎么设计?

    Programmable Gate Array,现场可编程门阵列)基于查找表的结构和全硬件并行执行的特性,如何用FPGA 来实现高速FIR
    发表于 09-05 07:21

    如何优化FIR数字滤波器

    相频特性。而现场可编程门阵列(Field Programmable Gate Array,FPGA)可并行执行的特点决定它更加广泛地应用于实时数字
    发表于 10-16 07:02

    FPGA设计的四阶IIR数字滤波器

    FPGA设计的四阶IIR数字滤波器 常用的数字滤波器FIR数字滤波器和IIR数字滤波器
    发表于 01-16 18:15 1459次阅读
    用<b class='flag-5'>FPGA</b>设计的四阶IIR<b class='flag-5'>数字滤波器</b>

    基于FPGA流水线分布式算法的FIR滤波器的实现

    摘要: 提出了一种采用现场可编门阵列器件(FPGA)并利用窗函数法实现线性FIR数字滤波器
    发表于 06-20 14:05 1327次阅读
    基于<b class='flag-5'>FPGA</b>流水线分布式算法的<b class='flag-5'>FIR</b><b class='flag-5'>滤波器</b>的实现

    用CPLD实现FIR数字滤波器的设计

     摘 要:介绍了一种利用ALTERA公司的复杂可编程逻辑器件(CPLD)快速卷积法实现数字滤波器的设计    关键词:CPLD 数字滤波器 信号处理
    发表于 06-20 14:23 1106次阅读
    用CPLD实现<b class='flag-5'>FIR</b><b class='flag-5'>数字滤波器</b>的设计

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

    基于LabVIEW的FIR数字滤波器设计 介绍一种基于LabVIEW快速有效地设计常规FIR数字滤波器的方法,并给出了设计实例。因可以随时对比设计要求调整参数
    发表于 10-16 09:24 5997次阅读
    基于LabVIEW的<b class='flag-5'>FIR</b><b class='flag-5'>数字滤波器</b>设计

    基于MATLAB及FPGAFIR低通滤波器的设计

    充分利用有限冲击响应数字滤波器(Finite Impulse Response digital filter ,FIR)系数的对称特性,借助于MATLAB语言和现场可编程
    发表于 08-05 14:23 82次下载
    基于MATLAB及<b class='flag-5'>FPGA</b>的<b class='flag-5'>FIR</b>低通<b class='flag-5'>滤波器</b>的设计

    基于FPGAFIR数字滤波器的优化设计

    目前数字滤波器的硬件实现方法通常采用专用DSP芯片或FPGA,本文从FIR滤波器的系数考虑,采用CSD编码,对FIR
    发表于 08-16 10:54 3871次阅读
    基于<b class='flag-5'>FPGA</b>的<b class='flag-5'>FIR</b><b class='flag-5'>数字滤波器</b>的优化设计

    基于Matlab/Simulink的FIR数字滤波器的设计与实现

    基于Matlab/Simulink的FIR数字滤波器的设计与实现。
    发表于 01-15 15:16 39次下载

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

    基于LabVIEW的FIR数字滤波器设计。
    发表于 01-20 16:30 54次下载

    如何使用FPGA实现IIR数字滤波器的设计

    数字滤波器、DSP器件或可编程逻辑器件(如FPGA)实现。因为,用FPGA实现数字滤波器具有实时性强、灵活性高、处理速度快以及小批量生产成本
    发表于 08-06 18:50 3次下载
    如何使用<b class='flag-5'>FPGA</b>实现IIR<b class='flag-5'>数字滤波器</b>的设计

    FIR数字滤波器设计

    数字滤波器的输入输出均为数字信号,信号通过数字滤波器后,可以改变频率成分的相对比例或滤除某些频率成分。数字滤波器可以分为IIR数字滤波器
    的头像 发表于 04-05 09:47 5724次阅读