目录

1.FIR数字滤波器实现原理

2.FPGA实现

2.1全串行FIR滤波器

2.1.1 原理图

2.1.2 Verilog代码

2.1.3 仿真测试代码

2.1.4 仿真结果图


1.FIR数字滤波器实现原理

一个 N 阶的 FIR 滤波器输出公式 y(n) 如下:

式1中 h(k)为滤波器的系数,x(n-k)为x(n)延时k个周期。系统的传输函数H(z)可表示成公式2:

从式1看出:滤波过程主要是一组特定的系数与信号完成卷积的过程。从式2看出,在有限的Z平面内它有N-1个零点,同时其 N-1个极点全部位于 z=0 中,因此 FIR 滤波器也被称为全零点滤波器,是一个单位脉冲响应有限长的稳定系统。
FIR滤波器在系数满足一定条件的情况下,它的相频特性是线性的,可以有效的保留信号的相位信息,因此线性相位的 FIR 滤波器在实际工程中有着较为广泛的应用。

2.FPGA实现

Fir滤波器的结构形式分为直接型、级联型、频率取样型、快速卷积型四种,其中最常用,最简单的是直接型。FPGA实现直接型Fir滤波器时,可有采用串行结构、并行结构、分布式结构,以及直接使用器件提供的ip核,下面对每种结构的实现方法进行介绍,代码实现以及仿真测试。

2.1全串行FIR滤波器

2.1.1 原理图

2.1.2 Verilog代码

//这是FirFullSerial.v文件的程序清单
module fir_filter(rst,clk,Xin,Yout);input       rst;   //复位信号,高电平有效input     clk;   //FPGA系统时钟,频率为16kHzinput   signed [11:0]  Xin;  //数据输入频率为2khZoutput signed [28:0] Yout; //滤波后的输出数据//实例化有符号数乘法器IP核multreg  signed [11:0] coe;   //滤波器为12比特量化数据wire signed [12:0] add_s; //输入为12比特量化数据,两个对称系数相加需要13比特存储wire signed [24:0] Mout;  mult_ip Umult (.clock (clk),.dataa (coe),.datab (add_s),.result (Mout));//实例化有符号数加法器IP核,对输入数据进行1位符号位扩展,输出结果为13比特数据reg signed [12:0] add_a;reg signed [12:0] add_b;add_ip Uadder (.dataa (add_a),.datab (add_b),.result (add_s));             //3位计数器,计数周期为8,为输入数据速率reg [2:0] count;always @(posedge clk or posedge rst)if (rst)count = 3'd0;elsecount = count + 1;//将数据存入移位寄存器Xin_Reg中reg [11:0] Xin_Reg[15:0];reg [3:0] i,j; always @(posedge clk or posedge rst)if (rst)//初始化寄存器值为0begin for (i=0; i<15; i=i+1)Xin_Reg[i]=12'd0;endelsebeginif (count==7)beginfor (j=0; j<15; j=j+1)Xin_Reg[j+1] <= Xin_Reg[j];Xin_Reg[0] <= Xin;endend//将对称系数的输入数据相加,同时将对应的滤波器系数送入乘法器//需要注意的是,下面程序只使用了一个加法器及一个乘法器资源//以8倍数据速率调用乘法器IP核,由于滤波器长度为16,系数具有对称性,故可在一个数据//周期内完成所有8个滤波器系数与数据的乘法运算//为了保证加法运算不溢出,输入输出数据均扩展为13比特。always @(posedge clk or posedge rst)if (rst)beginadd_a <= 13'd0;add_b <= 13'd0;coe <= 12'd0;endelsebeginif (count==3'd0)beginadd_a <= {Xin_Reg[0][11],Xin_Reg[0]};add_b <= {Xin_Reg[15][11],Xin_Reg[15]};coe <= 12'h000;//c0endelse if (count==3'd1)beginadd_a <= {Xin_Reg[1][11],Xin_Reg[1]};add_b <= {Xin_Reg[14][11],Xin_Reg[14]};                   coe <= 12'hffd; //c1endelse if (count==3'd2)beginadd_a <= {Xin_Reg[2][11],Xin_Reg[2]};add_b <= {Xin_Reg[13][11],Xin_Reg[13]};                       coe <= 12'h00f; //c2endelse if (count==3'd3)beginadd_a <= {Xin_Reg[3][11],Xin_Reg[3]};add_b <= {Xin_Reg[12][11],Xin_Reg[12]};coe <= 12'h02e; //c3endelse if (count==3'd4)beginadd_a <= {Xin_Reg[4][11],Xin_Reg[4]};add_b <= {Xin_Reg[11][11],Xin_Reg[11]};                      coe <= 12'hf8b; //c4endelse if (count==3'd5)beginadd_a <= {Xin_Reg[5][11],Xin_Reg[5]};add_b <= {Xin_Reg[10][11],Xin_Reg[10]};               coe <= 12'hef9; //c5end                    else if (count==3'd6)beginadd_a <= {Xin_Reg[6][11],Xin_Reg[6]};add_b <= {Xin_Reg[9][11],Xin_Reg[9]};                     coe <= 12'h24e; //c6endelsebeginadd_a <= {Xin_Reg[7][11],Xin_Reg[7]};add_b <= {Xin_Reg[8][11],Xin_Reg[8]};                     coe <= 12'h7ff; //c7endend//对滤波器系数与输入数据的乘法结果进行累加,并输出滤波后的数据//考虑到乘法器及累加器的延时,需要计数器为2时对累加器清零,同时输出滤波器结果数据。//类似的时延长度一方面可通过精确计算获取,但更好的方法是通过行为仿真查看reg signed [28:0] sum;reg signed [28:0] yout;always @(posedge clk or posedge rst)if (rst)begin sum = 29'd0; yout <= 29'd0;endelsebeginif (count==2)beginyout <= sum;sum = 29'd0;sum =sum + Mout;endelsesum = sum + Mout;endassign Yout = yout;endmodule

2.1.3 仿真测试代码

`timescale 1 ns/ 1 ns //设置仿真时间单位:ns
module fir_filter_tb();
// constants
// general purpose registers
reg eachvec;
// test vector input registers
reg [11:0] Xin;
reg clk;
reg rst;
wire clk_data; //数据时钟,速率为系统时钟clk的1/8;
// wires
wire [28:0]  Yout;// assign statements (if any)
fir_filter i1 (
// port map - connection between master ports and signals/registers   .Xin(Xin),.Yout(Yout),.clk(clk),.rst(rst)
);parameter clk_period=62500; //设置时钟信号周期(频率):16kHz
parameter clk_period_data=clk_period*8;
parameter clk_half_period=clk_period/2;
parameter clk_half_period_data=clk_half_period*8;
parameter data_num=2000;  //仿真数据长度
parameter time_sim=data_num*clk_period; //仿真时间initial
begin//设置时钟信号初值clk=1;//clk_data=1;//设置复位信号rst=1;#200000 rst=0;//设置仿真时间#time_sim $finish;//设置输入信号初值Xin=12'd10;
end//产生时钟信号
always                                                 #clk_half_period clk=~clk;reg [2:0] cn_clk=3'd0;
always @(posedge clk) cn_clk <= cn_clk + 3'd1;
assign clk_data = cn_clk[2];//从外部TX文件(SinIn.txt)读入数据作为测试激励
integer Pattern;
reg [11:0] stimulus[1:data_num];
initialbegin//文件必须放置在"工程目录\simulation\modelsim"路径下//$readmemb("E4_7_Bin_noise.txt",stimulus);$readmemb("E4_7_Bin_s.txt",stimulus);Pattern=0;repeat(data_num)begin @(posedge clk_data);Pattern=Pattern+1;Xin=stimulus[Pattern];endend//将仿真数据dout写入外部TXT文件中(out.txt)
integer file_out;
initial
begin//文件放置在"工程目录\simulation\modelsim"路径下                                                  //file_out = $fopen("E4_7_Noiseout.txt");file_out = $fopen("E4_7_Sout.txt");if(!file_out)begin$display("could not open file!");$finish;end
end
wire rst_write;
wire signed [28:0] dout_s;
assign dout_s = Yout;                //将dout转换成有符号数据
assign rst_write = clk_data & (!rst);//产生写入时钟信号,复位状态时不写入数据
always @(posedge rst_write )$fdisplay(file_out,"%d",dout_s);endmodule

2.1.4 仿真结果图

可见,输出结果dout_a,与输入数据的时钟上升沿clk_data差两个时钟周期(输入数据的时钟上升沿输入数据),正如代码中所写,考虑到加法器和乘法器的延时,所以延迟两个时钟周期读输出数据,及cn_clk=2时输出。

持续更新中

FIR数字滤波器的FPGA实现相关推荐

  1. FIR数字滤波器的FPGA实现(一)-FIR滤波器基本原理

    (一)FIR数字滤波器的FPGA实现-FIR滤波器基本原理 文章目录 (一)FIR数字滤波器的FPGA实现-FIR滤波器基本原理 1 FIR滤波器基本原理 1.1 FIR滤波器的结构及设计 1.1.1 ...

  2. FIR数字滤波器的FPGA实现(二)-串行FIR滤波器设计(1)

    (二)FIR数字滤波器的FPGA实现-串行FIR滤波器设计 文章目录 (二)FIR数字滤波器的FPGA实现-串行FIR滤波器设计 0 串行FIR滤波器基本原理 1 基于移位寄存器的串行 FIR 滤波器 ...

  3. FIR数字滤波器的FPGA实现(三)-并行FIR滤波器设计

    (三)FIR数字滤波器的FPGA实现-并行FIR滤波器设计 文章目录 (三)FIR数字滤波器的FPGA实现-并行FIR滤波器设计 0 并行FIR滤波器基本原理 1 基于直接型结构的全并行 FIR 滤波 ...

  4. FIR数字滤波器的FPGA实现(二)-串行FIR滤波器设计(2)

    (二)FIR数字滤波器的FPGA实现-串行FIR滤波器设计 文章目录 (二)FIR数字滤波器的FPGA实现-串行FIR滤波器设计 0 串行FIR滤波器基本原理 1 基于移位寄存器的串行 FIR 滤波器 ...

  5. (多图) 基于Verilog HDL的FIR数字滤波器设计与仿真

    引言:数字滤波器是语音与图像处理.模式识别.雷达信号处理.频谱分析等应用中的一种基本的处理部件,它能满足波器对幅度和相位特性的严格要求,避免模拟滤波器所无法克服的电压漂移.温度漂移和噪声等问题.有限冲 ...

  6. 信号处理之FIR数字滤波器(Matlab仿真)

    数字滤波器的作用是滤除不感兴趣的信号,留下想要的信号.数字滤波器可分为无限脉冲响应(IIR)数字滤波器.有限脉冲响应(FIR)数字滤波器两种,两者各有优缺点,其中FIR数字滤波器因其具有良好的线性相位 ...

  7. FIR数字滤波器设计(中)

    今天给大侠带来FIR数字滤波器设计,由于篇幅较长,分三篇.今天带来第二篇,FIR数字滤波器设计基础,包括FIR数字滤波器的特点.线性相位条件以及基本结构.话不多说,上货. 数字滤波器的输入输出均为数字 ...

  8. 用MATLAB设计FIR数字滤波器实验,基于Matlab的FIR数字滤波器设计

    摘要:提出FIR敷字滤波器的设计方案,并基于Matlab实现滤波仿真.通过使用Matlab信号处理工具箱提供的函数,选择适当的窗函数编写程序,其中窗函数按照实际信号的处理需求,参数折中选择.实验获得了 ...

  9. 基于matlab数字滤波器设计,基于MATLAB的FIR数字滤波器的设计

    摘 要 传统的数字滤波器的设计过程复杂,计算工作量大,滤波特性调整困难,影响了它的应用.本文介绍了一种利用MATLAB信号处理工具箱(Signal Processing Toolbox)快速有效的设计 ...

  10. FIR数字滤波器设计_窗函数法

    1.前言 在数字信号处理中 ,由于信号中经常混有各种复杂成分,所以很多信号分析都是基于滤波器而进行的, 因此数字滤波器占有极其重要的地位 .数字滤波器是具有一定传输选择特性的数字信号处理装置,其输入与 ...

最新文章

  1. jsp教学网站百度文库_基于JSP的精品课程网站设计与实现
  2. acess dao示例
  3. cv2.waitKey(x)解析
  4. mysql下载备份数据库命令行,如何从MariaDB数据库备份和还原命令行
  5. 20165310java_blog_week6
  6. GNU __attribute 详解
  7. 前端学习(2526):Vuex成果和展示
  8. java math max_Java Math类静态double max(double d1,double d2)示例
  9. 深度学习实战 | 使用Kera预测人物年龄
  10. override和overload
  11. react字符串转html函数,react 字符串强转为html标签
  12. 运筹优化(七)--动态规划解析
  13. *第十三周*数据结构实践项目一【验证Prim算法】
  14. «构建并破坏它»:某些算法如何生成验证码,而另一些则如何破解
  15. CCF201903-2 二十四点游戏(JAVA版)
  16. java 怎么去JTF边框_求助 java 如何编写JFrame窗体右上角红色打叉关闭按钮的事件?...
  17. NXP S32K146 CAN通讯 TJA1043(一)
  18. python画实心圆_任意空实心圆形打印|Python练习系列[8]
  19. 永中office linux卸载,永中office2012forLinux的安装卸载
  20. dlclose隐藏的秘密!

热门文章

  1. 黑色精美大气DJ音乐歌曲网站源码+带WAP手机端
  2. 一场暴雨引发的装机日记
  3. Unicode字符编码
  4. java web导出excel_javaweb导出excel文件的简单步骤
  5. 基于Springboot的景区旅游管理系统 JAVA MySQL
  6. java 8 官网下载地址
  7. html实现输入框扫码录入,使用这个工具,可以让你一行代码生成登录表单
  8. html转义字符表(转)
  9. matlab求带参数二重定积分,matlab二重定积分
  10. Axure工具概述以及Axure RP9的安装汉化和授权