基于vivado的fir 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语言导出系数如下:

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. const int BL = 33;  
  2. const int16_T B[33] = {  
  3.       -90,      0,    148,    219,      0,   -467,   -658,      0,   1220,  
  4.      1626,      0,  -2875,  -3909,      0,   8719,  17911,  21851,  17911,  
  5.      8719,      0,  -3909,  -2875,      0,   1626,   1220,      0,   -658,  
  6.      -467,      0,    219,    148,      0,    -90  
  7. };  

COE导出的文件内容如下:

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. ; XILINX CORE Generator(tm)Distributed Arithmetic FIR filter coefficient (.COE) File  
  2. ; Generated by MATLAB(R) 8.6 and the DSP System Toolbox 9.1.  
  3. ; Generated on: 17-Feb-2016 09:57:13  
  4. Radix = 16;   
  5. Coefficient_Width = 16;   
  6. CoefData = ffa6,  
  7. 0000,  
  8. 0094,  
  9. 00db,  
  10. 0000,  
  11. fe2d,  
  12. fd6e,  
  13. 0000,  
  14. 04c4,  
  15. 065a,  
  16. 0000,  
  17. f4c5,  
  18. f0bb,  
  19. 0000,  
  20. 220f,  
  21. 45f7,  
  22. 555b,  
  23. 45f7,  
  24. 220f,  
  25. 0000,  
  26. f0bb,  
  27. f4c5,  
  28. 0000,  
  29. 065a,  
  30. 04c4,  
  31. 0000,  
  32. fd6e,  
  33. fe2d,  
  34. 0000,  
  35. 00db,  
  36. 0094,  
  37. 0000,  
  38. ffa6;  

FIR滤波实现

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. 新建fir_test.m文件,文件内容如下:  
  2.   
  3. 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 ];  
  4. a=1;  
  5. 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];  
  6. y=filter(B,a,x)  
执行该文件,文件输出如下:

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. y =  
  2.   
  3.   Columns 1 through 14  
  4.   
  5.           90        -360        -238        -347         934        1960         690       -3748       -5923       -1383        9253       14206        3326      -21802  
  6.   
  7.   Columns 15 through 28  
  8.   
  9.       -35693       -8499       63482      155587      219005      222924      174176      109373       73680      105663      192691      285199      320053      262058  
  10.   
  11.   Columns 29 through 34  
  12.   
  13.       167516      134487      244845      429404      550320      478771  


例化FIR滤波器

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

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

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

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

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. `timescale 1ns / 1ps  
  2. //  
  3. // Company:   
  4. // Engineer:   
  5. //   
  6. // Create Date: 02/16/2016 04:31:37 PM  
  7. // Design Name:   
  8. // Module Name: fir  
  9. // Project Name:   
  10. // Target Devices:   
  11. // Tool Versions:   
  12. // Description:   
  13. //   
  14. // Dependencies:   
  15. //   
  16. // Revision:  
  17. // Revision 0.01 - File Created  
  18. // Additional Comments:  
  19. //   
  20. //  
  21.   
  22.   
  23. module fir(aclk,s_axis_data_tready,s_axis_data_tvalid,m_axis_data_tvalid,s_axis_data_tdata,  
  24.     m_axis_data_tdata  
  25.     );  
  26.     output s_axis_data_tready;  
  27.     input aclk;  
  28.     input s_axis_data_tvalid;  
  29.     output m_axis_data_tvalid;  
  30.     output[39:0] m_axis_data_tdata;  
  31.     input[15:0] s_axis_data_tdata;  
  32.       
  33.     //----------- Begin Cut here for INSTANTIATION Template ---// INST_TAG  
  34.     fir_compiler_0 fir_decimate_by_3 (  
  35.       .aclk(aclk),                              // input wire aclk  
  36.       .s_axis_data_tvalid(s_axis_data_tvalid),  // input wire s_axis_data_tvalid  
  37.       .s_axis_data_tready(s_axis_data_tready),  // output wire s_axis_data_tready  
  38.       .s_axis_data_tdata(s_axis_data_tdata),    // input wire [23 : 0] s_axis_data_tdata  
  39.       .m_axis_data_tvalid(m_axis_data_tvalid),  // output wire m_axis_data_tvalid  
  40.       .m_axis_data_tdata(m_axis_data_tdata)    // output wire [39 : 0] m_axis_data_tdata  
  41.     );  
  42.   
  43. endmodule  

创建test bench 文件

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



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

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. `timescale 1ns / 1ps  
  2. //  
  3. // Company:   
  4. // Engineer:   
  5. //   
  6. // Create Date: 02/16/2016 04:40:22 PM  
  7. // Design Name:   
  8. // Module Name: fir_tb  
  9. // Project Name:   
  10. // Target Devices:   
  11. // Tool Versions:   
  12. // Description:   
  13. //   
  14. // Dependencies:   
  15. //   
  16. // Revision:  
  17. // Revision 0.01 - File Created  
  18. // Additional Comments:  
  19. //   
  20. //  
  21.   
  22.   
  23. module fir_tb;  
  24.     //Inputs  
  25.     reg s_axis_data_tvalid;  
  26.     reg aclk;  
  27.     reg[15:0] s_axis_data_tdata;  
  28.     reg[15:0] Mem[37:0];  
  29.       
  30.     //Outputs  
  31.     wire s_axis_data_tready;  
  32.     wire m_axis_data_tvalid;  
  33.     wire[39:0] m_axis_data_tdata;  
  34.     integer k,i;  
  35.       
  36.     //Instantiate the Unit Under Test(UUT)  
  37.    fir uut(  
  38.    .aclk(aclk),  
  39.    .s_axis_data_tready(s_axis_data_tready),  
  40.    .s_axis_data_tvalid(s_axis_data_tvalid),  
  41.    .m_axis_data_tvalid(m_axis_data_tvalid),  
  42.    .s_axis_data_tdata(s_axis_data_tdata),  
  43.    .m_axis_data_tdata(m_axis_data_tdata)  
  44.     );  
  45.       
  46.     initial begin  
  47.         //Initialize Inputs  
  48.       //  s_axis_data_tvalid = 1;  
  49.       s_axis_data_tvalid = 0;  
  50.         for(i=0;i<40;i=i+1)  
  51.         begin  
  52.         #90 s_axis_data_tvalid = 1;  
  53.         #10 s_axis_data_tvalid = 0;  
  54.         end  
  55.     end  
  56.         
  57.     initial begin  
  58.         //clock generate  
  59.         aclk = 0;  
  60.         forever #5 aclk = !aclk;  
  61.     end  
  62.       
  63.     initial $readmemh("/home/gsc/FIR_1/fir/fir.srcs/sim_1/new/data_in.txt", Mem);  
  64.         // Add stimulus here  
  65.         // Data input Generation  
  66.         initial begin  
  67.         s_axis_data_tdata = 0;  
  68.             for(k=0;k<=38;k=k+1)  
  69.             #100    s_axis_data_tdata = Mem[k];  
  70.         end  
  71.       
  72. endmodule  

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

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. FFFF  
  2. 0004  
  3. 0001  
  4. 0008  
  5. 0001  
  6. FFFF  
  7. 0000  
  8. 0008  
  9. 0001  
  10. 0001  
  11. 0002  
  12. 000c  
  13. 0001  
  14. 0002  
  15. 0001  
  16. 0000  
  17. 0015  
  18. 0002  
  19. 0004  
  20. 0008  
  21. 0000  
  22. 0001  
  23. 0020  
  24. 0001  
  25. 0008  
  26. 0001  
  27. FFDD  
  28. 0002  
  29. 0001  
  30. 0041  
  31. 0002  
  32. 004B  
  33. 0000  
  34. 0001  
4 完成后如下图,注意红框内文件目录结构是否和图中一直。

前仿真

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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值