当前位置:   article > 正文

FPGA实现并行低通FIR滤波器_并行fir滤波器

并行fir滤波器

FPGA实现并行低通FIR滤波器

设计一个15阶(长度为16)的具有线性相位低通FIR滤波器,采用布拉克曼窗函数设计,截止频率为500HZ,抽样频率为2000HZ;采用FPGA实现并行低通FIR滤波器,系数的量化位数为12比特,输入数据位数为12比特,输出数据位数为29比特,系统时钟为2000HZ。

设计思路:本例与上一例参数相同,所采用的数据、MATLAB程序及仿真方式并没有差别。因此此章只给出FPGA实现滤波器的方法。其它设计思路相同,详情参考利用FPGA实现全串行低通FIR滤波器_小小低头哥的博客-CSDN博客

1.采用Verilog HDL语言设计并行低通FIR滤波器

module My_FirFullSerial(
    input   clk,    //输入时钟  频率为2KHZ
    input   rst,    //复位信号   
    input   signed[11:0]  Xin,  //输入数据,频率为2KHZ
    output  signed[28:0] Yout   //输出数据
);

//将各个寄存器清零
reg signed [11:0] Xin_reg[15:0];
reg [ 3:0] i;
always @(posedge clk or negedge rst)
    if(!rst) begin
       for(i=0;i<15;i=i+1)
            Xin_reg[i] <= 12'd0;
    end
    else begin
        for(i=0;i<15;i=i+1)
            Xin_reg[i+1] <= Xin_reg[i];
        Xin_reg[0] <= Xin;
    end

//将对称系数的输入数据相加,同时将对应的滤波器系数送入乘法器
//为了进一步提高运算速度,零外增加了一级寄存器
reg signed [12:0] Add_reg[7:0];   //长度为滤波器长度的一半 因为是两个系数相加,所以位宽增加了一位
reg [3:0]  j;
always @(posedge clk or negedge rst)
    if(!rst) begin
        for(j=0;j<8;j=j+1)
            Add_reg[j] <= 12'd0;  
    end
    else begin
        for(j=0;j<8;j=j+1)
            Add_reg[j] <= {Xin_reg[j][11],Xin_reg[j]} + {Xin_reg[15-j][11],Xin_reg[15-j]};
    end
    
//得出结果,简便起见就直接用✖,不用乘法器IP核了 不过实际过程中推荐使用IP核
reg signed[24:0] Mout[7:0];
reg [ 3:0] k;
wire signed[11:0] coe[7:0];

assign coe[0] = 12'h000;
assign coe[1] = 12'hffd;
assign coe[2] = 12'h00f;
assign coe[3] = 12'h02e;
assign coe[4] = 12'hf8b;
assign coe[5] = 12'hef9;
assign coe[6] = 12'h24e;
assign coe[7] = 12'h7ff;

always @(posedge clk or negedge rst)
    if(!rst) begin
        for(k=0;k<8;k=k+1)
            Mout[k] <= 12'd0;  
    end
    else begin
        for(k=0;k<8;k=k+1)
            Mout[k] <= Add_reg[k] * coe[k];
    end

//将滤波器系数与输入数据的乘法结果累加,并输出滤波后的结果
//与串行结构不同,此处在一个时钟周期内直接将所有乘法器结果相加
reg signed [28:0] sum;
reg signed [28:0] yout;
reg [ 3:0] L;
always @(posedge clk or negedge rst)
    if(!rst) begin
        sum <= 29'd0;
        yout <= 29'd0;
    end
    else begin
        yout <= sum;
        sum = 29'd0;
        for(L=0;L<8;L=L+1)
            sum = sum + Mout[L];
    end
assign Yout = yout;
endmodule 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77

2.总结

  并行结构是指并行的实现滤波器的累计运算,具体来讲,就是并行的将具有对称系数的输入数据进行相加,然后采用多个乘法器并行地实现系数与数据的乘法运算,最后将所有的乘积结果相加输出。这种结构具有最高的运行速率,由于不需要累加运算,因此系数时钟频率可以与数据输出的时钟频率一致。但是代价确实使用到了成倍的硬件资源。

  另外,参考了这篇文章Quartus II13.0设置Testbench步骤 实现了上个例子没有理解的.vt文件,自己创建了.vt文件并利用modesim仿真成功。最终使用MATLAB仿真FPGA滤波后的输出数据,如图1所示,只剩下200HZ频率的信号。因此FPGA程序应该是编译成功。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QVDV0Cwb-1687596398183)(C:/Users/lenovo/AppData/Roaming/Typora/typora-user-images/image-20230624164512906.png)]

图1 MATLAB 仿真FPGA滤波后的输出数据
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/运维做开发/article/detail/819553
推荐阅读
相关标签
  

闽ICP备14008679号