FIR滤波器的verilog实现方法

  FIR滤波器,即有限脉冲响应滤波器,指单位脉冲响应h(n)是有限长的。滤波器的输出y(n)可表示为输入序列x(n)与单位脉冲响应h(n)

的线性卷积。通过公式可以看出,每一个滤波器的输出需要M个乘法器和M- 1个加法器,由于滤波器的

系数h(n)具有对称性,这样又可以减少一部分的运算量。

/*-----------------------------------------------------------------------

Date                :        2017-07-26
Description            :        Design for FIR.

-----------------------------------------------------------------------*/

module my_fir
(
    //global clock
    input                    clk,            //system clock
    input                    rst_n,             //sync reset

    //ad        interface
    input        [9:0]        ad_data,

    //lpf        interface

    output    reg    [24:0]        lpf_wave,
    output        [9:0]        lpf_1
); 

//--------------------------------
//Funtion :   定义抽头系数  12阶  放大100倍
parameter        C0        =        12‘d1;
parameter        C1        =        12‘d2;
parameter        C2        =        12‘d6;
parameter        C3        =        12‘d10;
parameter        C4        =        12‘d14;
parameter        C5        =        12‘d16;
//--------------------------------
//Funtion :      移位
reg            [9:0]        x0;
reg            [9:0]        x1;
reg            [9:0]        x2;
reg            [9:0]        x3;
reg            [9:0]        x4;
reg            [9:0]        x5;
reg            [9:0]        x6;
reg            [9:0]        x7;
reg            [9:0]        x8;
reg            [9:0]        x9;
reg            [9:0]        x10;
reg            [9:0]        x11;
//reg            [9:0]        x8;
always @(posedge clk or negedge rst_n)
begin
    if(!rst_n)
    begin
        x0 <= ad_data;
        x1 <= 10‘d0;
        x2 <= 10‘d0;
        x3 <= 10‘d0;
        x4 <= 10‘d0;
        x5 <= 10‘d0;
        x6 <= 10‘d0;
        x7 <= 10‘d0;
        x8 <= 10‘d0;
        x9 <= 10‘d0;
        x10<= 10‘d0;
        x11<= 10‘d0;
    end
    else
    begin
        x0 <= ad_data;
        x1 <= x0;
        x2 <= x1;
        x3 <= x2;
        x4 <= x3;
        x5 <= x4;
        x6 <= x5;
        x7 <= x6;
        x8 <= x7;
        x9 <= x8;
        x10<= x9;
        x11<= x10;
    end
end

//--------------------------------
//Funtion :     求和

reg            [10:0]        add_one;
reg            [10:0]        add_two;
reg            [10:0]        add_three;
reg            [10:0]        add_four;
reg            [10:0]        add_five;
reg            [10:0]        add_six;

always @(posedge clk or negedge rst_n)
begin
    if(!rst_n)
    begin
        add_one   <= 11‘d0;
        add_two   <= 11‘d0;
        add_three <= 11‘d0;
        add_four  <= 11‘d0;
        add_five  <= 11‘d0;
        add_six   <= 11‘d0;
    end
    else
    begin
        add_one   <= {1‘b0,x0} + {1‘b0,x11};
        add_two   <= {1‘b0,x1} + {1‘b0,x10};
        add_three <= {1‘b0,x2} + {1‘b0,x9};
        add_four  <= {1‘b0,x3} + {1‘b0,x8};
        add_five  <= {1‘b0,x4} + {1‘b0,x7};
        add_six   <= {1‘b0,x5} + {1‘b0,x6};
    end
end

//--------------------------------
//Funtion :     相乘

wire        [22:0]        mul_one;
wire        [22:0]        mul_two;
wire        [22:0]        mul_three;
wire        [22:0]        mul_four;
wire        [22:0]        mul_five;
wire        [22:0]        mul_six;
mul_12x11    mul_12x11_inst0 (
    .dataa ( C0 ),        //12 bit
    .datab ( add_one ),        //11 bit
    .result ( mul_one )        //23 bit
    );

mul_12x11    mul_12x11_inst1 (
    .dataa ( C1 ),        //12 bit
    .datab ( add_two ),        //11 bit
    .result ( mul_two )        //23 bit
    );

mul_12x11    mul_12x11_inst2 (
    .dataa ( C2 ),        //12 bit
    .datab ( add_three ),        //11 bit
    .result ( mul_three )        //23 bit
    );

mul_12x11    mul_12x11_inst3 (
    .dataa ( C3 ),        //12 bit
    .datab ( add_four ),        //11 bit
    .result ( mul_four )        //23 bit
    );

 mul_12x11    mul_12x11_inst5 (
    .dataa ( C4 ),        //12 bit
    .datab ( add_five ),        //11 bit
    .result ( mul_six )        //23 bit
    );

 mul_12x11    mul_12x11_inst6 (
    .dataa ( C5 ),        //12 bit
    .datab ( add_six ),        //11 bit
    .result ( mul_five )        //23 bit
    );
//--------------------------------
//Funtion :     求和

always @(posedge clk or negedge rst_n)
begin
    if(!rst_n)
        lpf_wave <= 0;
    else
        lpf_wave <= mul_one + mul_two + mul_three + mul_four + mul_five ;
end

assign    lpf_1 = lpf_wave[24:15];

endmodule
    
时间: 2024-10-08 02:59:35

FIR滤波器的verilog实现方法的相关文章

FIR滤波器的FPGA实现方法

FIR滤波器的FPGA实现方法 2011-02-21 23:34:15   来源:互联网    非常重要的基本单元.近年来,由于FPGA具有高速度.高集成度和高可靠性的特点而得到快速发展.随着现代数字通信系统对于高精度.高处理速度的需求,越来越多的研究转向采用FPGA来实现FIR滤波器.而对于FIR滤波器要充分考虑其资源与运行速度的合理优化,各种不同的FIR滤波结构各具优缺点,在了解各种结构优缺点后才能更好地选择合适结构来实现FIR滤波. 1 FIR数字滤波器    FIR数字滤波器由有限个采样

FIR滤波器的实现方法(转)

源:http://blog.sina.com.cn/s/blog_493520900102uy26.html 内容来自于上篇博文,第七章,FIR滤波器 http://blog.sina.com.cn/s/blog_493520900102uxzu.html 使用 FDATool工具,构建一个Kaiser窗低通滤波器,采样频率8kHz,生成滤波器系数: 1)例程1 文件 fir_fltcoeff.h,以浮点形式表示的量化后的滤波器系数 //define the   FIR  filter  len

转载论文关于fir滤波器的fpga实现

摘 要 本文讨论的FIR滤波器因其具有严格的线性相位特性而得到广泛的应用.在工程实践中,往往要求信号处理具有实时性和灵活性,本论文研究FIR的FPGA解决方案正体现了电子系统的微型化和单片化. 本论文主要讨论了以下的问题: 首先,以FIR滤波器的基本理论为依据,研究适应工程实际的数字滤波器的设计方法,确定了直接型网络结构.窗函数设计法的设计方案: 然后,讨论了FPGA的原理与结构特点,总结FPGA的设计流程与设计原则,并用Verilog HDL语言根据设计方案编写出FIR滤波器程序: 接着,采用

数字信号处理实验(六)&mdash;&mdash;FIR滤波器的设计

一.四种线性相位FIR滤波器的振幅响应 1.自编函数 [Hr,w,a,L]=hr_type1(h)(P256) % h偶对称,N为奇数,h(n)=h(N-1-n) [Hr,w,a,L]=hr_type2(h) (P257) % h偶对称,N为偶数,h(n)=h(N-1-n) [Hr,w,a,L]=hr_type3(h) (P257) % h奇对称,N为奇数,h(n)=-h(N-1-n) [Hr,w,a,L]=hr_type4(h) (P257) % h奇对称,N为偶数,h(n)=-h(N-1-n

FIR滤波器设计

FIR滤波器的优越性: 相位相应为严格的线性,不存在延迟失真,只有固定的时间延迟: 由于不存在稳定性问题,设计相对简单: 只包含实数算法,不涉及复数算法,不需要递推运算,长度为M,阶数为M-1,计算值约为M/2. 关于FIR滤波器的幅频特性和相频特性.在人们不关心相位时,可以让幅频特性常为正,原来为负的部分只需相位加上pi来补偿. 但当相位很重要,不允许随便增减时,幅频特性就必须区分正负.我们这里称为符幅特性. 符幅特性负值部分向上反褶就和我们平时看到的幅频特性一样,还是满足对称性的. 4类FI

IIR滤波器和FIR滤波器的区别与联系zz

  -------------------------------------------------------------------------------------------------- 1.两种滤波器都是数字滤波器.根据冲激响应的不同,将数字滤波器分为有限冲激响应(FIR)滤波器和无限冲激响应(IIR)滤波器.对于FIR滤波器,冲激响应在有限时间内衰减为零,其输出仅取决于当前和过去的输入信号值.对于IIR滤波器,冲激响应理论上应会无限持续,其输出不仅取决于当前和过去的输入信号值,

记录。8,23之fir滤波器设计。

尝试设计FIR滤波器(低通,高通,带通),由5种频率组成的信号,傅里叶变换后的频谱上看,这个滤波器貌似很好. 滤波前信号频谱 低通滤波 高通滤波 带通滤波

基于DSP的C语言来实现FIR滤波器

首先,FIR滤波器的输出公式为: (具体的话可以查看数字信号处理书籍,都忘得差不多了...) 假设:输入的信号是x(n) = sin(2*pi*f1*n/fs) + sin(2*pi*f2*n/fs)    所设计的滤波器是一个低通FIR滤波器,使用的是hamming窗,阶数为10 则可以使用MATLAB 的滤波器设计工具来设计滤波器: 然后可以通过设计滤波器,生成C头文件来获取所需要的数值: FIR滤波器的C程序如下: #include <stdio.h> #include <math

VIVADO FIR滤波器设计与仿真(二)

VIVADO FIR滤波器设计与仿真(二) 在VIVADO FIR滤波器设计与仿真(一)中产生了两路正弦信号,频率分别为4MHz和5MHz,今天要进行FIR滤波器设计,在进行滤波器设计之前,需要对滤波器的参数进行设置,需要借助MATLAB软件或者Filter Solutions软件,这次使用Filter Solutions来进行参数设定. 关于Filter Solutions软件的使用,这里有一篇博客比较详细的介绍了它的用法,可以作为参考: Filter Solutions之滤波器设计 滤波器参