0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于現(xiàn)場可編程門陣列(fpga)技術(shù)fir數(shù)字濾波器的設(shè)計

e9Zb_gh_8734352 ? 來源:未知 ? 作者:李倩 ? 2018-08-08 15:55 ? 次閱讀

在數(shù)字化技術(shù)在各個領(lǐng)域得到廣泛運用的今天,數(shù)字濾波器是數(shù)字系統(tǒng)中信號處理關(guān)鍵的一環(huán)。數(shù)字濾波在圖像處理、語音識別和模式識別等數(shù)字信號處理中占有重要地位。數(shù)字濾波器和模擬濾波器相比具有更高的精度、信噪比,以及不可比擬的可靠性。由于在性能、成本、靈活性和功耗等方面的優(yōu)勢,基于fpga的信號處理器已廣泛應(yīng)用于各種信號處理領(lǐng)域。

本文主要介紹了基于現(xiàn)場可編程門陣列(fpga)技術(shù)fir數(shù)字濾波器的設(shè)計,設(shè)計一個濾波器,其采樣率 fs=1MHz,通帶截止頻率 fpass=50KHz,歸一化表示fpass=0.1,阻帶起始頻率 fstop=200 KHz,歸一化表示為fstop=0.4,阻帶衰減 80dB。

設(shè)計實現(xiàn)

1. 打開 MATLAB 軟件,在命令行窗口輸入 fdatool 并回車,打開濾波器設(shè)計與分析工具窗口

2. 在 fda 工具中配置你需要的濾波器參數(shù)

圖片中頻率參數(shù)(frequency specifications)采用的歸一化表示方法,如果使用實際頻率表示,在 Units 框內(nèi)選擇“KHz”;

在 Fs 內(nèi)填寫 1000,即數(shù)字采樣頻率為1000KHz (1MHz);在 Fpass 內(nèi)填寫 50,即通帶截止頻率為 50KHz;在 Fstop內(nèi)填寫 200,即阻帶起始頻率為 200KHz,Astop 填 80,即為阻帶衰減 80dB。

點擊 Design Filter 后可以查看頻率及相位的響應(yīng)曲線

3.在“Filter Designer & Analysis Tool”界面中,打開 File—>Export…出現(xiàn)下圖

4.點擊“Export” 將系數(shù)導(dǎo)出到 MATLAB 工作區(qū)間

將 coefficients 系數(shù)保存到 txt 文件中,在 MATLAB 命令窗口輸入:

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

% txt 文件路徑根據(jù)實際情況修改

>> fprintf(fid,'%d,',Num); % 打印到 txt 文件中的相鄰系數(shù)由逗號隔開

>> fclose(fid);

這樣我們就得到了一組濾波器系數(shù),存在上圖路徑下的 coef.txt 文件中。

打開 quartus prime 17.0 軟件,新建工程:

5.工程名字:FIR_Fliter

6.選擇對應(yīng)的 FPGA 型號,10M08SCM153C8G

7.根據(jù)自己的情況選擇 EDA 工具,這里我們選擇 synplify pro 和 Modelsim-Altera

完成新建工程,進(jìn)入開發(fā)界面;

8.在開發(fā)界面選擇 tools—>IP Catalog,并在 IP Library 中找到 FIR II 的選項,雙加 FIR II 打開 QSYS 工具

9.填寫 IP 實例的名字,點擊 OK

10.在 Filter Specification 選項中配置參數(shù)如下圖

11.在 Coefficient Settings 選項中配置參數(shù)如下圖

Coefficient width 可以自行配置,一般值越高濾波效果也好,同時實現(xiàn)濾波器消耗的資源也越多

12.在 Coefficients 選項中需要將 Matlab 中導(dǎo)出的濾波系數(shù)導(dǎo)入

點擊 Import from file 按鈕,選擇之前從 Matlab 導(dǎo)出的 coef.txt 文件,點擊 import 導(dǎo)入;

軟件會將導(dǎo)入的系數(shù)按照上圖中設(shè)定的系數(shù)位寬調(diào)整到合適的值,并分別繪制響應(yīng)曲線,原始數(shù)據(jù) VS 修正數(shù)據(jù)

13.在 Input/Output Opetion 選項中配置參數(shù)

如下圖,其中 Input width 根據(jù)采樣數(shù)據(jù)的實際位寬填寫,這里為 11 位有符號數(shù)

14.以上各項參數(shù)配置完成后,點擊 Generate HDL..,彈出生成頁面,點擊 Generate,等待完成

通過以上操作完成了 IP 核的生成,點擊 Finish 結(jié)束。

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

16.對工程進(jìn)行綜合,通過

17.將我們準(zhǔn)備好的測試文件 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,并顯示仿真波形數(shù)據(jù)(模擬形式顯示)

data1 信號為 24KHz 正弦波,量化位寬為 10bit

data2 信號為 240KHz 正弦波,量化位寬為 10bit

data_in 信號為 data1 和 data2 的疊加信號,量化位寬為 11bit

data_out 信號為 data_in 信號經(jīng)過 FIR 數(shù)字濾波后的輸出,量化位寬為 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

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • FPGA
    +關(guān)注

    關(guān)注

    1630

    文章

    21777

    瀏覽量

    604744
  • 濾波器
    +關(guān)注

    關(guān)注

    161

    文章

    7854

    瀏覽量

    178533
  • 信號處理器
    +關(guān)注

    關(guān)注

    1

    文章

    254

    瀏覽量

    25311

原文標(biāo)題:【FPGA信號處理一】5分鐘學(xué)會FIR 濾波器設(shè)計

文章出處:【微信號:gh_873435264fd4,微信公眾號:FPGA技術(shù)聯(lián)盟】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    使用FPGA構(gòu)建的數(shù)字濾波器設(shè)計方案

    本文簡要介紹了FIR數(shù)字濾波器的結(jié)構(gòu)特點和基本原理,提出基于FPGA和DSP Builder的FIR數(shù)字濾波器的基本設(shè)計流程和實現(xiàn)方案。##
    發(fā)表于 07-24 15:30 ?8879次閱讀
    使用<b class='flag-5'>FPGA</b>構(gòu)建的<b class='flag-5'>數(shù)字濾波器</b>設(shè)計方案

    基于FPGAFIR數(shù)字濾波器的優(yōu)化設(shè)計

    基于FPGAFIR數(shù)字濾波器的優(yōu)化設(shè)計
    發(fā)表于 08-17 23:55

    現(xiàn)場可編程門陣列有哪些應(yīng)用?

    現(xiàn)場可編程門陣列(FPGA)是一種可編程邏輯器件,由成千上萬個完全相同的可編程邏輯單元組成,周圍
    發(fā)表于 08-06 08:27

    基于IP核的FIR低通濾波器該怎么設(shè)計?

    Programmable Gate Array,現(xiàn)場可編程門陣列)基于查找表的結(jié)構(gòu)和全硬件并行執(zhí)行的特性,如何用FPGA 來實現(xiàn)高速FIR
    發(fā)表于 09-05 07:21

    如何優(yōu)化FIR數(shù)字濾波器

    相頻特性。而現(xiàn)場可編程門陣列(Field Programmable Gate Array,FPGA)可并行執(zhí)行的特點決定它更加廣泛地應(yīng)用于實時數(shù)字
    發(fā)表于 10-16 07:02

    FPGA設(shè)計的四階IIR數(shù)字濾波器

    FPGA設(shè)計的四階IIR數(shù)字濾波器 常用的數(shù)字濾波器FIR數(shù)字濾波器和IIR數(shù)字濾波器?
    發(fā)表于 01-16 18:15 ?1453次閱讀
    用<b class='flag-5'>FPGA</b>設(shè)計的四階IIR<b class='flag-5'>數(shù)字濾波器</b>

    基于FPGA流水線分布式算法的FIR濾波器的實現(xiàn)

    摘要: 提出了一種采用現(xiàn)場可編門陣列器件(FPGA)并利用窗函數(shù)法實現(xiàn)線性FIR數(shù)字濾波器
    發(fā)表于 06-20 14:05 ?1325次閱讀
    基于<b class='flag-5'>FPGA</b>流水線分布式算法的<b class='flag-5'>FIR</b><b class='flag-5'>濾波器</b>的實現(xiàn)

    用CPLD實現(xiàn)FIR數(shù)字濾波器的設(shè)計

    ?摘 要:介紹了一種利用ALTERA公司的復(fù)雜可編程邏輯器件(CPLD)快速卷積法實現(xiàn)數(shù)字濾波器的設(shè)計??? 關(guān)鍵詞:CPLD 數(shù)字濾波器 信號處理
    發(fā)表于 06-20 14:23 ?1106次閱讀
    用CPLD實現(xiàn)<b class='flag-5'>FIR</b><b class='flag-5'>數(shù)字濾波器</b>的設(shè)計

    基于LabVIEW的FIR數(shù)字濾波器設(shè)計

    基于LabVIEW的FIR數(shù)字濾波器設(shè)計 介紹一種基于LabVIEW快速有效地設(shè)計常規(guī)FIR數(shù)字濾波器的方法,并給出了設(shè)計實例。因可以隨時對比設(shè)計要求調(diào)整參數(shù)
    發(fā)表于 10-16 09:24 ?5990次閱讀
    基于LabVIEW的<b class='flag-5'>FIR</b><b class='flag-5'>數(shù)字濾波器</b>設(shè)計

    基于MATLAB及FPGAFIR低通濾波器的設(shè)計

    充分利用有限沖擊響應(yīng)數(shù)字濾波器(Finite Impulse Response digital filter ,FIR)系數(shù)的對稱特性,借助于MATLAB語言和現(xiàn)場可編程
    發(fā)表于 08-05 14:23 ?82次下載
    基于MATLAB及<b class='flag-5'>FPGA</b>的<b class='flag-5'>FIR</b>低通<b class='flag-5'>濾波器</b>的設(shè)計

    基于FPGAFIR數(shù)字濾波器的優(yōu)化設(shè)計

    目前數(shù)字濾波器的硬件實現(xiàn)方法通常采用專用DSP芯片或FPGA,本文從FIR濾波器的系數(shù)考慮,采用CSD編碼,對FIR
    發(fā)表于 08-16 10:54 ?3870次閱讀
    基于<b class='flag-5'>FPGA</b>的<b class='flag-5'>FIR</b><b class='flag-5'>數(shù)字濾波器</b>的優(yōu)化設(shè)計

    基于Matlab/Simulink的FIR數(shù)字濾波器的設(shè)計與實現(xiàn)

    基于Matlab/Simulink的FIR數(shù)字濾波器的設(shè)計與實現(xiàn)。
    發(fā)表于 01-15 15:16 ?39次下載

    基于LabVIEW的FIR數(shù)字濾波器設(shè)計

    基于LabVIEW的FIR數(shù)字濾波器設(shè)計。
    發(fā)表于 01-20 16:30 ?54次下載

    如何使用FPGA實現(xiàn)IIR數(shù)字濾波器的設(shè)計

    數(shù)字濾波器、DSP器件或可編程邏輯器件(如FPGA)實現(xiàn)。因為,用FPGA實現(xiàn)數(shù)字濾波器具有實時性強、靈活性高、處理速度快以及小批量生產(chǎn)成本
    發(fā)表于 08-06 18:50 ?3次下載
    如何使用<b class='flag-5'>FPGA</b>實現(xiàn)IIR<b class='flag-5'>數(shù)字濾波器</b>的設(shè)計

    FIR數(shù)字濾波器設(shè)計

    數(shù)字濾波器的輸入輸出均為數(shù)字信號,信號通過數(shù)字濾波器后,可以改變頻率成分的相對比例或濾除某些頻率成分。數(shù)字濾波器可以分為IIR數(shù)字濾波器
    的頭像 發(fā)表于 04-05 09:47 ?5717次閱讀