滤波器

最开始学习FPGA的时候会知道FPGA除了一些普通硬件单元外还有一些IP核,这里我们用部分软核来实现滤波。滤波器的参数来着于MATLAB的工具箱。

软核的调用

如何建立一个IP核:在VIVADO的左边菜单种点击Create Block Design(实际也可以编写对应的HDL语句来实现这些软核)

cubemx添加滤波_参数设置


之后在右边的Diagram中点击中间的加号或者在空白出右击Add ip… 然后在搜索框选择DDS软核:

cubemx添加滤波_cubemx添加滤波_02

出现的软核应该如图所示。同样再建立同样的一个DDS软核。

cubemx添加滤波_乘法器_03

之和需要点击对应软核选择部分参数(双击)。需要将输出频率选择为5。另一个软核就选4.(后期会用他们进行信号相乘)

cubemx添加滤波_cubemx添加滤波_04


其他参数设置如下

cubemx添加滤波_右键_05

cubemx添加滤波_右键_06

cubemx添加滤波_cubemx添加滤波_07

同样的方法调用一个乘法器。

cubemx添加滤波_右键_08


参数设置如下:

cubemx添加滤波_右键_09


设置好这些之后要把两个DDS的输出连接到乘法器上面。但是对于开始的输入和最后的输出是没有对于连线的,要建立额外的管脚。

cubemx添加滤波_参数设置_10


就可以引入管脚,如图:

cubemx添加滤波_cubemx添加滤波_11

完成连线后就可以进行相乘之后的显示。连好的图为:

cubemx添加滤波_fpga_12

(不用管aclk连上去的线和出界的线,另外再乘法器的输出make external)。连好后右击空白处,单击valid design。如果出现

cubemx添加滤波_参数设置_13

说明没有什么错误了。保存工程后,在diagram左边的source框中有

cubemx添加滤波_cubemx添加滤波_14

这个就是工程的BD文件,右键点击,选择create a HDL wapper,生成一个顶层文件。

cubemx添加滤波_乘法器_15

建立好工程后添加一个测试文件。选中Design Sources后点那个加号,选择仿真文件,建立空文件。

cubemx添加滤波_乘法器_16

点击Create File。

cubemx添加滤波_右键_17

cubemx添加滤波_fpga_18

注意这个文件名要和模块一致。(tb_top)然后一值往后点即可。

在该仿真文件(点source中的simulation找到这个仿真文件)中的代码如下:

module tb_top(
    );
    reg aclk_0  ;
    initial
        begin
            aclk_0  =   1;
        end

    always  #5  aclk_0  =   ~aclk_0    ;

    DSP_TEST_wrapper DSP_TEST_wrapper_i
       (.aclk_0(aclk_0));
endmodule

点左边菜单栏中的run simulation。

cubemx添加滤波_参数设置_19

左边Scope可以选择输出的是哪些接口的波形。右击可以添加到波形中。要注意在波形显示的时候要改两个东西,改成显示的那个。(右键单击要修改的参数)

cubemx添加滤波_参数设置_20

cubemx添加滤波_乘法器_21

到这里,波形的混合就完成了,下一步主要是通过FIR的软核来实现频率的滤除。

cubemx添加滤波_fpga_22

首先介绍一下,FIR滤波器中需要添加滤波器参数,市面上有很多软件可以实现,我选择的是matlab中的滤波器工具箱。

cubemx添加滤波_cubemx添加滤波_23


cubemx添加滤波_cubemx添加滤波_24


根据设计要求设置好对应参数后,从菜单栏中的目标导出coe文件(可以看到还能导出HDL文件哦,小伙伴可以试一试)。在VIVADO中添加软核filter并连续,如图:(tdata\tvalid都是AXI通讯的内容,各位可以自己学习)

cubemx添加滤波_参数设置_25


双击filter,添加coe文件

cubemx添加滤波_乘法器_26


(默认是向量文件)返回source框中,右键生成输出产品更新顶层top文件

cubemx添加滤波_cubemx添加滤波_27


更新后

output [31:0]M_AXIS_DATA_0_tdata;
  output M_AXIS_DATA_0_tvalid;
  input aclk_0;

可以看见多了个tdata的量。

这样就可以在top文件中修改代码为

module tb_top(
    );
    reg aclk_0  ;
    wire[39:0]  M_AXIS_DATA_0_tdata;
    initial
        begin
            aclk_0  =   1;
        end

    always  #5  aclk_0  =   ~aclk_0    ;

    DSP_TEST_wrapper DSP_TEST_wrapper_i
       (.M_AXIS_DATA_0_tdata(M_AXIS_DATA_0_tdata),
       .aclk_0(aclk_0));
endmodule

这样就可以来进行仿真来查看滤波器的仿真效果。