创建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 plaincopy
  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 plaincopy
  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 plaincopy
  1. 新建fir_test.m文件,文件内容如下:
  2. 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 ];
  3. a=1;
  4. 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];
  5. y=filter(B,a,x)

执行该文件,文件输出如下:

[cpp] view plaincopy
  1. y =
  2. Columns 1 through 14
  3. 90        -360        -238        -347         934        1960         690       -3748       -5923       -1383        9253       14206        3326      -21802
  4. Columns 15 through 28
  5. -35693       -8499       63482      155587      219005      222924      174176      109373       73680      105663      192691      285199      320053      262058
  6. Columns 29 through 34
  7. 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 plaincopy
  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. module fir(aclk,s_axis_data_tready,s_axis_data_tvalid,m_axis_data_tvalid,s_axis_data_tdata,
  22. m_axis_data_tdata
  23. );
  24. output s_axis_data_tready;
  25. input aclk;
  26. input s_axis_data_tvalid;
  27. output m_axis_data_tvalid;
  28. output[39:0] m_axis_data_tdata;
  29. input[15:0] s_axis_data_tdata;
  30. //----------- Begin Cut here for INSTANTIATION Template ---// INST_TAG
  31. fir_compiler_0 fir_decimate_by_3 (
  32. .aclk(aclk),                              // input wire aclk
  33. .s_axis_data_tvalid(s_axis_data_tvalid),  // input wire s_axis_data_tvalid
  34. .s_axis_data_tready(s_axis_data_tready),  // output wire s_axis_data_tready
  35. .s_axis_data_tdata(s_axis_data_tdata),    // input wire [23 : 0] s_axis_data_tdata
  36. .m_axis_data_tvalid(m_axis_data_tvalid),  // output wire m_axis_data_tvalid
  37. .m_axis_data_tdata(m_axis_data_tdata)    // output wire [39 : 0] m_axis_data_tdata
  38. );
  39. endmodule

创建test bench 文件

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

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

[cpp] view plaincopy
  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. module fir_tb;
  22. //Inputs
  23. reg s_axis_data_tvalid;
  24. reg aclk;
  25. reg[15:0] s_axis_data_tdata;
  26. reg[15:0] Mem[37:0];
  27. //Outputs
  28. wire s_axis_data_tready;
  29. wire m_axis_data_tvalid;
  30. wire[39:0] m_axis_data_tdata;
  31. integer k,i;
  32. //Instantiate the Unit Under Test(UUT)
  33. fir uut(
  34. .aclk(aclk),
  35. .s_axis_data_tready(s_axis_data_tready),
  36. .s_axis_data_tvalid(s_axis_data_tvalid),
  37. .m_axis_data_tvalid(m_axis_data_tvalid),
  38. .s_axis_data_tdata(s_axis_data_tdata),
  39. .m_axis_data_tdata(m_axis_data_tdata)
  40. );
  41. initial begin
  42. //Initialize Inputs
  43. //  s_axis_data_tvalid = 1;
  44. s_axis_data_tvalid = 0;
  45. for(i=0;i<40;i=i+1)
  46. begin
  47. #90 s_axis_data_tvalid = 1;
  48. #10 s_axis_data_tvalid = 0;
  49. end
  50. end
  51. initial begin
  52. //clock generate
  53. aclk = 0;
  54. forever #5 aclk = !aclk;
  55. end
  56. initial $readmemh("/home/gsc/FIR_1/fir/fir.srcs/sim_1/new/data_in.txt", Mem);
  57. // Add stimulus here
  58. // Data input Generation
  59. initial begin
  60. s_axis_data_tdata = 0;
  61. for(k=0;k<=38;k=k+1)
  62. #100    s_axis_data_tdata = Mem[k];
  63. end
  64. endmodule

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

[cpp] view plaincopy
  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,至此验证了设计的正确性。

基于vivado的fir ip核的重采样设计与实现相关推荐

  1. verilog实现汉明权重_(学习Verilog)6. FIR IP核的基础功能使用总结

    滤波器是信号处理技术绕不过的内容,而在BSPK的实现框图(见 BPSK的Simulink仿真实现)中,也需要用到滤波器. m序列的时域波形是一个矩形,矩形在频谱上是所有奇次谐波之和,为了节省带宽资源, ...

  2. ISE的FIR IP核实现

    IP核参数设置 滤波器系数产生 和Quartus不一样,Vivado的FIR Compiler没有提供设计FIR滤波器和生成滤波器系数的功能,因此需要使用MATLAB等其它工具设计好滤波器再将系数导入 ...

  3. Vivado定制DDR3 IP核注意事项

    1.1 Vivado定制DDR3 IP核注意事项 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)Vivado定制DDR3 IP核注意事项: 5)结束语. 1.1.2 本 ...

  4. VIVADO 自定义封装ip核(超详细)

    版本:vivado 2018.3 vivado 自定义封装ip核,可以将ip核封装成带AXI总线,也可将ip核封装成不带AXI总线. 本次设计介绍,如何将当前工程封装成ip核(不带AXI总线) 目录 ...

  5. FPGA(五):Quartus II 调用Fir IP核使用说明

    这几天在忙着写通信原理的项目,其中用到了fir滤波器的部分,从最初的一脸懵逼到初步理解了该怎么去调用ip核以及参数设置,这其中的过程着实不易.这篇博客主要是为了记录自己的学习过程以便日后也可以回想起来 ...

  6. FPGA数字信号处理(四)Quartus FIR IP核实现

    该篇是FPGA数字信号处理的第四篇,选题为DSP系统中极其常用的FIR滤波器.本文将在前两篇的基础上,继续介绍在Quartus开发环境下使用Altera(或者叫Intel)提供的FIR IP核进行FI ...

  7. Xilinx的FIR IP核使用方法(参数重构改变滤波器形式)

    FIR IP核可配置为极点系数为0的横向滤波器结构 IP 核配置 Filter coefficients 这里配置滤波器的类型,在Filter type中可将滤波器配置为单比率.抽取.插值滤波器.对于 ...

  8. 基于ISE的QDR IP核调用与硬件自检

    平台:ISE(IP核用法同VIVADO) 语言:VHDL(Verilog用法类似) FPGA型号:V6-315T,ffg1156-1 QDR型号:GS8342D08GE-300I(类似) XILINX ...

  9. 手撕IP核系列——Xilinx FIR IP核之一

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 手撕IP核系列--Xilinx FIR IP核之一 前言 FIR 滤波器模块的设置 实现分析 前言 在Xilinx和Intel平台的F ...

最新文章

  1. NDKJNI Android 相关资料整理(四)
  2. WF4.0入门系列1——创建一个简单的工作流
  3. 网络:HTTP报文格式
  4. Create Tables and Build inserts from Tables by using Mygeneration Templates(Sql Server)
  5. 通信网络基础实验报告_建设亚太信息枢纽港、实现5G网络全覆盖!临港新片区通信基础设施规划发布...
  6. tplink连接服务器失败_管家婆财贸双全连接失败,服务器端没有找到加密狗
  7. 乘法更新规则对于并发的非负矩阵分解和最大间隔分类
  8. 关于HTTPS认证,这里解决你所有疑惑
  9. 【Elasticsearch】中文分词器比对表
  10. Servlet和JSP学习指南
  11. Atitit 二进制数据字节转字符串 base64 base16 Quoted-printable BINHEX
  12. ai人工智能的本质和未来_什么是人工智能,它将如何塑造我们的未来?
  13. MySql常用函数大全
  14. SQL处理表结构的基本方法整理(创建表,关联表,复制表)
  15. 大牛直播SDK-Windows RTMP/RTSP/本地FLV播放器使用说明
  16. 博科300 java配置,博科300 光纤交换机如何设置为SSH登录?
  17. oem13c安装参考
  18. C++二维数组的定义及理解
  19. creat是什么意思中文翻译_CREAT是什么意思中文翻译
  20. 《Loy解说SpringCloud之Zuul》

热门文章

  1. 测量音叉153kHz谐振器的幅频特性
  2. 国赛来咯!智能车竞赛-百度赛道开始报名啦!
  3. 第十六届全国大学生智能车竞赛创意组-讯飞智慧餐厅
  4. 7 开机启动文件路径_为什么当我登录的时候,总有一些文件会被打开
  5. vc 文本框 只显示下划线_【Axure9百例】36.文本框搜索自动匹配
  6. ubuntu下php服务器搭建_Ubuntu服务器下搭建php运行环境的方法
  7. swing中怎么在原来图片的基础上切换第二张图片_狂戳痛点!毕业论文图片和公式排版!...
  8. php 最大数字,PHP 计算至少是其他数字两倍的最大数的实现代码
  9. java 4d_GitHub - wm3445/Java-concurrency at 4d10ae51a9deec37340fc40d03f205cfbe8de43b
  10. java命名$_java命名规范