基于vivado的fir ip核的重采样设计与实现

原创 2016年02月17日 11:27:46

本文基于xilinx 的IP核设计,源于音频下采样这一需求。

创建vivado工程

1. 首先打开vivado,创建一个新的project(勾选create project subdirectory选项),并将工程命填为firfilter。

2.选择工程创建的类型为RTL project。在设计PCB会用到I/Oplanning这种类型,用在原理图和封装兼容性设计。

3.选择芯片family和封装,这种基于芯片选型的工程,其能implement的资源量受芯片自身容量限制。


创建design文件

1.创建设计文件,在flow navigator栏里,选中project manager,其展开的子项中,单击Add Source,并在跳出的框中选择Add or create desigine sources

2 填写创建的文件名为fir,类型是verilog。

定制FIR IP 核

1.类似创建design source文件一样,单击Project Manager子菜单下的IP catalog,在软件的右侧工作栏显示一个IP catalog标签,在search过滤器中选择fir,双击FIR Compiler选项。

2 定制FIR参数第一页,

a:按如下方式填写,这里的fdacoe.coe文件由matlab生成,先参考matlab一节,生成该文件。

b:在Filter type中选择Decimation,抽取方式,抽取因子填3,即将48k采样率降采样到16k。


3 定制FIR IP,第二页

3.第三页

4.第四页

5 第五页

6 第六页

基于MATLAB的FIR滤波器设计

FIR滤波器设计

a.在command window敲fdatool命令

b.在弹出的窗口中,将Response Type选中Lowpass,Designed Method选中FIR,其后下拉窗口,选中Window,即基于窗函数法设计FIR滤波器。

c.在Filter Order中选中Specify Order,填32这个数字,即32阶,窗口设计方法

按如下窗口内容填写。


FIR滤波器系数量化

先点击图中1标号按钮,进入量化界面,由于FPGA实现,2标号选定点,3标号内容照抄,4在设计有误时,返回继续设计有用。

FIR滤波器系数导出

点击菜单栏上的Target按钮,有两个选项,一个是generate c header,一个是XILINX Coefficient (.COE) file。这两个选项导出的系数都可以使用在xilinx 的fpga上,它们导出的系数是相等的。C语言导出系数如下:

const int BL = 33;
const int16_T B[33] = {
      -90,      0,    148,    219,      0,   -467,   -658,      0,   1220,
     1626,      0,  -2875,  -3909,      0,   8719,  17911,  21851,  17911,
     8719,      0,  -3909,  -2875,      0,   1626,   1220,      0,   -658,
     -467,      0,    219,    148,      0,    -90
};

COE导出的文件内容如下:

; XILINX CORE Generator(tm)Distributed Arithmetic FIR filter coefficient (.COE) File
; Generated by MATLAB(R) 8.6 and the DSP System Toolbox 9.1.
; Generated on: 17-Feb-2016 09:57:13
Radix = 16; 
Coefficient_Width = 16; 
CoefData = ffa6,
0000,
0094,
00db,
0000,
fe2d,
fd6e,
0000,
04c4,
065a,
0000,
f4c5,
f0bb,
0000,
220f,
45f7,
555b,
45f7,
220f,
0000,
f0bb,
f4c5,
0000,
065a,
04c4,
0000,
fd6e,
fe2d,
0000,
00db,
0094,
0000,
ffa6;

FIR滤波实现

新建fir_test.m文件,文件内容如下:

B = [ -90 0 148 219 0 -467 -658 0 1220 1626 0 -2875 -3909 0 8719 17911 21851 17911 8719 0 -3909 -2875 0 1626 1220 0 -658 -467 0 219 148 0 -90 ];
a=1;
x=[ -1 4 1 8 1 -1 0 8 1 1 2 12 1 2 1 0 21 2 4 8 0 1 32 1 8 1 -35 2 1 65 2 75 0 1];
y=filter(B,a,x)
执行该文件,文件输出如下:

y =

  Columns 1 through 14

          90        -360        -238        -347         934        1960         690       -3748       -5923       -1383        9253       14206        3326      -21802

  Columns 15 through 28

      -35693       -8499       63482      155587      219005      222924      174176      109373       73680      105663      192691      285199      320053      262058

  Columns 29 through 34

      167516      134487      244845      429404      550320      478771


例化FIR滤波器

依次点击图中,1,2,3,4,然后可见窗口5显示的内容,该内容适用verilog来instanceFIR的template

2.将template内容粘贴到前面创建的Design file,.v文件。

3.添加应有的端口信息:

4,最终的fir.v文件内容如下:

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 02/16/2016 04:31:37 PM
// Design Name: 
// Module Name: fir
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////


module fir(aclk,s_axis_data_tready,s_axis_data_tvalid,m_axis_data_tvalid,s_axis_data_tdata,
    m_axis_data_tdata
    );
    output s_axis_data_tready;
    input aclk;
    input s_axis_data_tvalid;
    output m_axis_data_tvalid;
    output[39:0] m_axis_data_tdata;
    input[15:0] s_axis_data_tdata;
    
    //----------- Begin Cut here for INSTANTIATION Template ---// INST_TAG
    fir_compiler_0 fir_decimate_by_3 (
      .aclk(aclk),                              // input wire aclk
      .s_axis_data_tvalid(s_axis_data_tvalid),  // input wire s_axis_data_tvalid
      .s_axis_data_tready(s_axis_data_tready),  // output wire s_axis_data_tready
      .s_axis_data_tdata(s_axis_data_tdata),    // input wire [23 : 0] s_axis_data_tdata
      .m_axis_data_tvalid(m_axis_data_tvalid),  // output wire m_axis_data_tvalid
      .m_axis_data_tdata(m_axis_data_tdata)    // output wire [39 : 0] m_axis_data_tdata
    );

endmodule

创建test bench 文件

创建文件过程类似Design file,但文件类型要选择simulation类型,名称填为fir_tb,并在弹出的窗口中选择其为顶层module。



2.fir_tb.v文件的内容如下:

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 02/16/2016 04:40:22 PM
// Design Name: 
// Module Name: fir_tb
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////


module fir_tb;
    //Inputs
    reg s_axis_data_tvalid;
    reg aclk;
    reg[15:0] s_axis_data_tdata;
    reg[15:0] Mem[37:0];
    
    //Outputs
    wire s_axis_data_tready;
    wire m_axis_data_tvalid;
    wire[39:0] m_axis_data_tdata;
    integer k,i;
    
    //Instantiate the Unit Under Test(UUT)
   fir uut(
   .aclk(aclk),
   .s_axis_data_tready(s_axis_data_tready),
   .s_axis_data_tvalid(s_axis_data_tvalid),
   .m_axis_data_tvalid(m_axis_data_tvalid),
   .s_axis_data_tdata(s_axis_data_tdata),
   .m_axis_data_tdata(m_axis_data_tdata)
    );
    
    initial begin
        //Initialize Inputs
      //  s_axis_data_tvalid = 1;
      s_axis_data_tvalid = 0;
        for(i=0;i<40;i=i+1)
        begin
        #90 s_axis_data_tvalid = 1;
        #10 s_axis_data_tvalid = 0;
        end
    end
      
    initial begin
        //clock generate
        aclk = 0;
        forever #5 aclk = !aclk;
    end
    
    initial $readmemh("/home/gsc/FIR_1/fir/fir.srcs/sim_1/new/data_in.txt", Mem);
        // Add stimulus here
        // Data input Generation
        initial begin
        s_axis_data_tdata = 0;
            for(k=0;k<=38;k=k+1)
            #100    s_axis_data_tdata = Mem[k];
        end
    
endmodule

3仿真时用到一个输入文件,data_in.txt,,其文件内容如下,该文件内容就是matlab一节中的x的十六进方式制表示,由于开发基于linux,所以readmemh的路径是linux下的表示方式。

FFFF
0004
0001
0008
0001
FFFF
0000
0008
0001
0001
0002
000c
0001
0002
0001
0000
0015
0002
0004
0008
0000
0001
0020
0001
0008
0001
FFDD
0002
0001
0041
0002
004B
0000
0001
4 完成后如下图,注意红框内文件目录结构是否和图中一直。

前仿真

依次点击1,2,在跳出的窗口中,双击类似4的窗口,注意观察3那行。

0x5a是十进制的90,ffea5是十进制的-347,可以观察matlab FIR设计输出结果,90之后的3个就是-347,至此验证了设计的正确性。


VIVADO FIR IP使用方法

在matlab中使用fdatool设计自己想要的数字滤波器,然后保存文件为.coe文件。 在vivado中调用FIR IP核,在Select Source处,选择COE File。 在Filter T...
  • LovingDuo
  • LovingDuo
  • 2016年12月19日 11:31
  • 2913

Vivado FIR core修改系数

看到这个标题大部分人都会想到系数重载。我一开始也是这么理解的,这个让我在读Vivado提供的FIR compiler的文档时犯了极大错误。我有一个module需要在运行的过程根据输入信号来调整系数。我...
  • muyiwushui
  • muyiwushui
  • 2016年12月10日 18:22
  • 923

Xilinx Vivado的使用详细介绍(3):使用IP核

IP核(IP Core) Vivado中有很多IP核可以直接使用,例如数学运算(乘法器、除法器、浮点运算器等)、信号处理(FFT、DFT、DDS等)。IP核类似编程中的函数库(例如C语言中的prin...
  • jzj1993
  • jzj1993
  • 2015年05月06日 11:26
  • 2919

Vivado HLS之Fir滤波器实现

  • 2014年09月06日 19:41
  • 1.24MB
  • 下载

Xilinx FIR IP核的的使用及延时问题

前一段时间一直在研究通信系统,必然就会和各种滤波器打交道,同样也遇到了一些问题。比如说本文的主要内容,滤波器的延时问题。 在生成滤波器IP核之前需要产生抽头系数,这个抽头系数的阶数是自己设定的,阶数...
  • Next_FSE
  • Next_FSE
  • 2017年07月01日 10:15
  • 2402

Vivado IP核生成设置

vivado中design with ip相比于ise感觉还是改进了。     首先我们简单介绍一下vivado中design with ip的设计过程:     (1)打开IP Catl...
  • u010830004
  • u010830004
  • 2016年11月17日 16:59
  • 1352

Vivado IP核生成设置

vivado中design with ip相比于ise感觉还是改进了。     首先我们简单介绍一下vivado中design with ip的设计过程:     (1)打开IP Catl...
  • wordwarwordwar
  • wordwarwordwar
  • 2016年10月26日 00:00
  • 6798

xilinx fir滤波器IP

1、 系数由matlab中的
  • weiweiliulu
  • weiweiliulu
  • 2014年10月16日 18:05
  • 5783

基于matlab FPGA verilog的FIR滤波器设计

FIR滤波器说明 FPGA verilog的FIR滤波器设计(原创)" title="基于matlab FPGA verilog的FIR滤波器设计(原创)" style="margin:0px;...
  • avrmcu1
  • avrmcu1
  • 2014年03月13日 17:01
  • 1384

信号的采样

降采样: 2048HZ对信号来说是过采样了,事实上只要信号不混叠就好(满足尼奎斯特采样定理),所以可以对过采样的信号作抽取,即是所谓的“降采样”。在现场中采样往往受具体条件的限止,或者不存在30...
  • yangjianqiao0
  • yangjianqiao0
  • 2014年09月16日 15:22
  • 1588
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:基于vivado的fir ip核的重采样设计与实现
举报原因:
原因补充:

(最多只允许输入30个字)