Vivado_FIR滤波器_编程实现与IP核仿真与Matlab设计

FIR 滤波器

FIR滤波器表达式为
Vivado_FIR滤波器_编程实现与IP核仿真与Matlab设计_第1张图片

Verilog编程实现

具体参考菜鸟教程的Veilog并行FIR滤波器设计。链接如下。
7.2Verilog并行FIR滤波器设计
本文着重介绍使用Vivado中的FIR IP核设计滤波器并补充一下其他知识。

IP核实现

使用IP核设计实现一下上述滤波器。
打开FIR Compiler,进入如下界面。
Vivado_FIR滤波器_编程实现与IP核仿真与Matlab设计_第2张图片
在Select Source选项中选择COE File,并选择COE文件。(也可以选择Vector后,直接将数据复制到Coefficient Vector框中)
Vivado_FIR滤波器_编程实现与IP核仿真与Matlab设计_第3张图片
设置输入采样频率和时钟频率。
Vivado_FIR滤波器_编程实现与IP核仿真与Matlab设计_第4张图片
设置系数类型、量化方式、位宽,以及输入数据类型、位宽、小数位。
Vivado_FIR滤波器_编程实现与IP核仿真与Matlab设计_第5张图片
设置接口,可取消勾选左上角Show disabled ports,即可在左侧看到该模块接口示意图,可以根据左侧选项添加其他控制接口,详情见AXI4-Stream接口协议。这里先生成一个最简单的模块用于仿真测试。
Vivado_FIR滤波器_编程实现与IP核仿真与Matlab设计_第6张图片
在Sources窗口中IP Sources中找到fir_compiler.evo文件,可看到该模块例化模板。
Vivado_FIR滤波器_编程实现与IP核仿真与Matlab设计_第7张图片
新建仿真文件,其内容如下。为了便于对比,其中输入数据文件直接使用了菜鸟教程中7.2Veilog并行FIR滤波器设计的文件。

`timescale 1ns / 1ps
module FIR_sim;
//input
reg clk;
reg s_tvalid;
reg [15:0] s_tdata;
//output
wire m_tvalid;
wire [31:0] m_tdata;
     
initial begin
    clk = 1'b0;
    forever begin
        # 10;
        clk = ~clk;
    end
end

reg [11:0] data_in[0:200-1];
integer i;
initial begin
    $readmemh("C:/Xilinx/Vivado/project/FIR/fir_para/cosx0p25m7p5m12bit.txt",data_in);
    i = 0;
    s_tvalid = 1'b1;
    s_tdata = 0;
    # 5;         
    forever begin
        @(negedge clk) begin
            s_tdata = data_in[i];
            if (i == 200-1) begin
                i = 0;
            end
            else begin
                i = i + 1;
            end
        end
    end 
end

fir_compiler_0 your_instance_name (
  .aclk(clk),                     // input wire aclk
  .s_axis_data_tvalid(s_tvalid),  // input wire s_axis_data_tvalid
  .s_axis_data_tready(),  // output wire s_axis_data_tready
  .s_axis_data_tdata(s_tdata),    // input wire [15 : 0] s_axis_data_tdata
  .m_axis_data_tvalid(m_tvalid),  // output wire m_axis_data_tvalid
  .m_axis_data_tdata(m_tdata)     // output wire [31 : 0] m_axis_data_tdata
);
endmodule

保存文件后,点击Run Simulation,其仿真结果如下。
Vivado_FIR滤波器_编程实现与IP核仿真与Matlab设计_第8张图片
右键变量名字,点击Waveform Style->Analog,可将数据显示为模拟波形。
点击Waveform->Analog Settings,更改Interpolation style为Hold。可将波形显示为阶梯状。效果如下。
Vivado_FIR滤波器_编程实现与IP核仿真与Matlab设计_第9张图片
至此,可以看到使用IP核设计的FIR低通滤波器成功实现了功能。

Matalb设计滤波器

在Matlab的工具箱找到Filter Designer,并打开后界面如下。
Vivado_FIR滤波器_编程实现与IP核仿真与Matlab设计_第10张图片
根据滤波器设计需求,设置相应的参数。更改参数后,点击Design Filter生成滤波器。
如设计15阶FIR滤波器,实现方法选择Least-squares,设置采样频率为50MHz,通带起始频率为1MHz,阻带起始频率为6MHz。
Vivado_FIR滤波器_编程实现与IP核仿真与Matlab设计_第11张图片
导出用于Xilinx FIR IP核所需滤波器系数,有两种方法。
方法一,在上图页面中点击File->Export,进入如下界面。
Vivado_FIR滤波器_编程实现与IP核仿真与Matlab设计_第12张图片
默认导出到工作区,默认变量名为Num。点击Export后查看该变量为
在这里插入图片描述
接下来可以使用如下Matlab代码对系数矩阵进行量化并写入coe文件。

%Matlab
q_width = 12;%量化位宽
fid = fopen('FIR_coe.coe','w');
coe_data = round(Num/max(abs(Num))*(2^(q_width-1)));
fprintf(fid,'Radix = 16;\r\n');%十六进制
fprintf(fid,'Coefficient_Width = %d;\r\n',q_width);
fprintf(fid,'CoefData = \r\n');
fprintf(fid,'%x,\r\n',coe_data);
fclose(fid);

运行上述代码即可得到如下文件内容。
Vivado_FIR滤波器_编程实现与IP核仿真与Matlab设计_第13张图片
将19行处数据末尾逗号替换成分号,即可得到可使用的coe文件,同方法二生成的一样。

方法二,点击在Filter Designer主页面点击Set quantization parameters按钮(其位置如下图箭头所指)进入如下界面。
Vivado_FIR滤波器_编程实现与IP核仿真与Matlab设计_第14张图片
选择Fixed-point,并设置字长为12位后,点击Apply。
Vivado_FIR滤波器_编程实现与IP核仿真与Matlab设计_第15张图片
接着点击Targets->Xilinx Coefficient,设置好coe文件名并保存。该文件打开后内容如下。
Vivado_FIR滤波器_编程实现与IP核仿真与Matlab设计_第16张图片
以第一个CoefData数据0x056为例,对应上面生成的Num(1) = 0.0053。通过以下Matlab程序代码可验证其量化方式。中间有一些数据使用该方法量化和生成的coe文件数据有一些小误差。
Vivado_FIR滤波器_编程实现与IP核仿真与Matlab设计_第17张图片

你可能感兴趣的:(FPGA,matlab,Verilog,Vivado,FIR,IP核)