宽带低通滤波器的FPGA设计

好久没有写博文了,记录一下对于大带宽信号的低通滤波器的设计

宽带信号采样

对于大带宽信号,需要用极高的采样率对信号进行采样,那么采样后的数字信号数据速率极高,FPGA无法运行在如此高的频率下对高速率数字信号进行处理,所以对于宽带信号,采样后会分为多路并行的低速数据流进入FPGA,如下图所示:
在这里插入图片描述

宽带低通滤波器结构

以输入宽带信号为8路并行的形式为例,讨论宽带滤波器结构。我们以FIR滤波器为基础来设计宽带低通滤波器,并采用并行计算的方式实现高速信号处理。所以本例的宽带滤波器以多相滤波的形式,采用8个FIR滤波器,对8路输入信号进行并行计算。
在此例中,系统时钟频率设置为采样频率的1/8,所以输入信号延时一个系统时钟周期相当于延时了8个采样周期,所以用8个N-1阶的FIR滤波器并行滤波时,需要每一个滤波器的输入信号相位各自相差一个采样周期,这样既可得到滤波后相位也各自相差一个采样周期的并行输出信号。这8个FIR滤波器的并行计算公式如下:
在这里插入图片描述
根据上式设计的结构框图如下:
在这里插入图片描述

宽带低通滤波器的实现与仿真

根据上图滤波器结构实现的HDL核心代码如下:

assign din={data_in1,data_in2,data_in3,data_in4,data_in5,data_in6,data_in7,data_in8};
always @(posedge clk)
 begin
    if(en&nd)
     begin 
        din_d0 <= din;
        din_d1 <= din_d0;
        din_d2 <= din_d1;
        din_d3 <= din_d2;
        din_d4 <= din_d3;
        nd_d0 <= 1'b1;
     end
    else if(en)
     begin 
        din_d0 <= din_d0;
        din_d1 <= din_d1;
        din_d2 <= din_d2;
        din_d3 <= din_d3;
        din_d4 <= din_d4;
        nd_d0 <= 1'b0;
     end        
    else
     begin 
        din_d0 <= 'H0;
        din_d1 <= 'H0;
        din_d2 <= 'H0;
        din_d3 <= 'H0;
        din_d4 <= 'H0;
        nd_d0 <= 1'b0;
     end
end

always @(posedge clk)
 begin
    if(nd_d0)//
     begin 
        data00 <= din_d0[ 159:140]; //x7(n)
        data01 <= din_d0[ 139:120]; //x6(n)
        data02 <= din_d0[ 119:100]; //x5(n)
        data03 <= din_d0[ 99:  80]; //x4(n)
        data04 <= din_d0[ 79:  60]; //x3(n)
        data05 <= din_d0[ 59:  40]; //x2(n)
        data06 <= din_d0[ 39:  20]; //x1(n)
        data07 <= din_d0[ 19:   0]; //x0(n)
        
        data10 <= din_d1[ 159:140]; //x7(n-1)
        data11 <= din_d1[ 139:120]; //x6(n-1)
        data12 <= din_d1[ 119:100]; //x5(n-1)
        data13 <= din_d1[ 99:  80]; //x4(n-1)
        data14 <= din_d1[ 79:  60]; //x3(n-1)
        data15 <= din_d1[ 59:  40]; //x2(n-1)
        data16 <= din_d1[ 39:  20]; //x1(n-1)
        data17 <= din_d1[ 19:   0]; //x0(n-1)
        
        data20 <= din_d2[ 159:140]; //x7(n-2)
        data21 <= din_d2[ 139:120]; //x6(n-2)
        data22 <= din_d2[ 119:100]; //x5(n-2)
        data23 <= din_d2[ 99:  80]; //x4(n-2)            
        data24 <= din_d2[ 79:  60]; //x3(n-2)
        data25 <= din_d2[ 59:  40]; //x2(n-2)
        data26 <= din_d2[ 39:  20]; //x1(n-2)
        data27 <= din_d2[ 19:   0]; //x0(n-2)
        
        data30 <= din_d3[ 159:140]; //x7(n-3)
        data31 <= din_d3[ 139:120]; //x6(n-3)
        data32 <= din_d3[ 119:100]; //x5(n-3)
        data33 <= din_d3[ 99:  80]; //x4(n-3)        
        data34 <= din_d3[ 79:  60]; //x3(n-3)
        data35 <= din_d3[ 59:  40]; //x2(n-3)
        data36 <= din_d3[ 39:  20]; //x1(n-3)
        data37 <= din_d3[ 19:   0]; //x0(n-3)
        
        data40 <= din_d4[ 159:140]; //x7(n-4)
        data41 <= din_d4[ 139:120]; //x6(n-4)
        data42 <= din_d4[ 119:100]; //x5(n-4)
        data43 <= din_d4[ 99:  80]; //x4(n-4)                  
        data44 <= din_d4[ 79:  60]; //x3(n-4)
        data45 <= din_d4[ 59:  40]; //x2(n-4)
        data46 <= din_d4[ 39:  20]; //x1(n-4)
        data47 <= din_d4[ 19:   0]; //x0(n-4)        
        nd_d1 <= 1'b1;
     end
    else 
     begin 
        data00 <= 20'H0;
        data01 <= 20'H0;
        data02 <= 20'H0;
        data03 <= 20'H0;
        data04 <= 20'H0;
        data05 <= 20'H0;
        data06 <= 20'H0;
        data07 <= 20'H0;
        
        data10 <= 20'H0;
        data11 <= 20'H0;
        data12 <= 20'H0;
        data13 <= 20'H0;
        data14 <= 20'H0;
        data15 <= 20'H0;
        data16 <= 20'H0;
        data17 <= 20'H0;
        
        data20 <= 20'H0;
        data21 <= 20'H0;
        data22 <= 20'H0;
        data23 <= 20'H0;
        data24 <= 20'H0;
        data25 <= 20'H0;
        data26 <= 20'H0;
        data27 <= 20'H0;
        
        data30 <= 20'H0;
        data31 <= 20'H0;
        data32 <= 20'H0;
        data33 <= 20'H0;
        data34 <= 20'H0;
        data35 <= 20'H0;
        data36 <= 20'H0;
        data37 <= 20'H0;
        
         data40 <= 20'H0;
         data41 <= 20'H0;
         data42 <= 20'H0;
         data43 <= 20'H0;
         data44 <= 20'H0;
         data45 <= 20'H0;
         data46 <= 20'H0;
         data47 <= 20'H0;
        
        nd_d1 <= 1'b0;
     end
 end

filter_paral filter_paral_ch8(
    .clk    (clk),
    .en        (en    ),
//    .fir_coe_sel(fir_coe_sel),
    .din00    (data07),    .fir_coe00(fir_coe00),
    .din01    (data06),   .fir_coe01(fir_coe01),
    .din02    (data05),   .fir_coe02(fir_coe02),
    .din03    (data04),   .fir_coe03(fir_coe03),
    .din04    (data03),   .fir_coe04(fir_coe04),
    .din05    (data02),   .fir_coe05(fir_coe05),
    .din06    (data01),   .fir_coe06(fir_coe06),
    .din07    (data00),   .fir_coe07(fir_coe07),
    .din08    (data17),   .fir_coe08(fir_coe08),
    .din09    (data16),   .fir_coe09(fir_coe09),
    .din10    (data15),   .fir_coe10(fir_coe10),
    .din11    (data14),   .fir_coe11(fir_coe11),
    .din12    (data13),   .fir_coe12(fir_coe12),
    .din13    (data12),   .fir_coe13(fir_coe13),
    .din14    (data11),   .fir_coe14(fir_coe14),
    .din15    (data10),   .fir_coe15(fir_coe15),
    .din16    (data27),   .fir_coe16(fir_coe16),
    .din17    (data26),   .fir_coe17(fir_coe17),
    .din18    (data25),   .fir_coe18(fir_coe18),
    .din19    (data24),   .fir_coe19(fir_coe19),
    .din20    (data23),   .fir_coe20(fir_coe20),
    .din21    (data22),   .fir_coe21(fir_coe21),
    .din22    (data21),   .fir_coe22(fir_coe22),
    .din23    (data20),   .fir_coe23(fir_coe23),
    .din24    (data37),   .fir_coe24(fir_coe24),
    .din25    (data36),   .fir_coe25(fir_coe25),
    .din26    (data35),   .fir_coe26(fir_coe26),
    .din27    (data34),   .fir_coe27(fir_coe27),
    .din28    (data33),   .fir_coe28(fir_coe28),
    .din29    (data32),   .fir_coe29(fir_coe29),
    .din30    (data31),   .fir_coe30(fir_coe30),
    .din31    (data30),   .fir_coe31(fir_coe31),
    .din32    (data47),   .fir_coe32(fir_coe32),
    .nd       (nd_d1),

    .dout(data_out8),
    .drdy()
);

filter_paral filter_paral_ch7(
);

filter_paral filter_paral_ch6(
);

....
filter_paral filter_paral_ch1(
);


其中模块filter_paral为常见的FIR滤波器,FIR滤波器为32阶对称型滤波器,滤波器系数由matlab Filter Design工具箱辅助设计,截止频率为500MHz。
Vivado完整代码与工程可在该链接中下载:
链接: https://download.csdn.net/download/wnazhe45/85740354
为了验证该滤波器能滤除高频信号,所以我们将输入信号设置为5MHz的正弦信号与550MHz的正弦信号叠加而成的信号,采样率为1.25GHz,并将信号以8*Ts为周期进行抽取,得到数据速率为156.25MHz的8路并行数据。然后对滤波后的8路并行信号合并为1路进行频谱分析,得到滤波前与滤波后的输入输出信号波形图与频谱图如下:
在这里插入图片描述

可见该宽带低通滤波器已经滤除了550MHz的高频分量,验证了设计的正确性。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值