• 数字信号处理——直接型FIR滤波器设计(2)



    目录

    引言

    设计说明

    1、模块顶层封装

    2、仿真验证

    3、上板验证

    4、经验说明




    引言

    接续上篇,进行FIR 滤波器的板级验证调试。

    设计说明

    FPGA设计平台:VIVADO IDE 2018.3 (WIN10 操作系统)

    FPGA芯片型号:xc7a35tfgg484-2

    MATLAB验证平台:MATLAB R2022a



    1、模块顶层封装

    将上篇所编写的 FIR 模块和 DDS 模块,封装至顶层。

    1. `timescale 1ns / 1ps
    2. // 备注:FIR 滤波器顶层
    3. // BY :Xu Y. B.
    4. module FIR_FILTER_TOP(
    5. // ---------------------------------输入
    6. input I_CLK_50M,//系统时钟 50M
    7. input I_RST, //系统复位信号 高有效
    8. // ---------------------------------输出
    9. output O_RES_VAL //由FPGA外部LED灯指示
    10. );
    11. // ---------------------------------内部信号
    12. // 时钟
    13. wire W_CLK_10M;
    14. wire W_CLK_20M;
    15. (*mark_debug = "true"*)wire W_LOCKED;
    16. // DDS
    17. (*mark_debug = "true"*)wire W_TRDY;
    18. (*mark_debug = "true"*)wire W_DATA_VAL;
    19. (*mark_debug = "true"*)wire [15:0] W_DATA;
    20. // FIR
    21. (*mark_debug = "true"*)wire [31:0] W_RES_DATA;
    22. (*mark_debug = "true"*)wire W_RES_VAL;
    23. reg R_OPR_EN; //运算使能信号 高有效
    24. reg [15:0] R_DATA;
    25. reg [15:0] RR_DATA;
    26. reg R_DATA_VAL;
    27. reg RR_DATA_VAL;
    28. // ---------------------------------实现
    29. // ----时钟域跨越处理(此部分也可以在模块内部实现)
    30. // 20——>10M
    31. always @ (posedge W_CLK_10M)
    32. begin
    33. if(W_LOCKED == 1'b0)
    34. begin
    35. R_DATA <= 0;
    36. RR_DATA <= 0;
    37. R_DATA_VAL <= 0;
    38. RR_DATA_VAL <= 0;
    39. end
    40. else
    41. begin
    42. R_DATA <= W_DATA;
    43. RR_DATA <= R_DATA;
    44. R_DATA_VAL <= W_DATA_VAL;
    45. RR_DATA_VAL <= R_DATA_VAL;
    46. end
    47. end
    48. // 10——>20M
    49. // 此处的时钟跨越安全
    50. // 系统复位后 1个 CLK延迟 拉高运算使能
    51. always @ (posedge W_CLK_10M)
    52. begin
    53. if(W_LOCKED == 1'b0)
    54. begin
    55. R_OPR_EN <= 0;
    56. end
    57. else
    58. begin
    59. R_OPR_EN <= 1;
    60. end
    61. end
    62. // 结果
    63. assign O_RES_VAL = W_RES_VAL;
    64. // ---------------------------------例化模块
    65. // MMCM
    66. MMCM_IP MMCM_INST
    67. (
    68. // Clock out ports
    69. .CLK_10M(W_CLK_10M), // output CLK_10M
    70. .CLK_20M(W_CLK_20M), // output CLK_20M
    71. // Status and control signals
    72. .reset(I_RST), // input reset
    73. .locked(W_LOCKED), // output locked
    74. // Clock in ports
    75. .clk_in1(I_CLK_50M)); // input clk_in1
    76. // DDS
    77. DDS_IP_WRAP #(
    78. .P_OUT_WIDTH(16)
    79. ) inst_DDS_IP_WRAP (
    80. .I_CLK (W_CLK_20M),
    81. .I_RSTN (W_LOCKED),
    82. .I_TRDY (W_TRDY),
    83. .O_DATA (W_DATA),
    84. .O_VAL (W_DATA_VAL)
    85. );
    86. // FIR
    87. DIRECT_FIR #(
    88. .P_FILTER_LEN(32),
    89. .P_FILTER_WIDTH(16),
    90. .P_DATA_IN_WIDTH(16),
    91. .P_DATA_OUT_WIDTH(32)
    92. ) inst_DIRECT_FIR (
    93. .I_CLK (W_CLK_10M),
    94. .I_RSTN (W_LOCKED),
    95. .I_OPR_EN (R_OPR_EN),
    96. .I_DATA_VAL (RR_DATA_VAL),
    97. .I_DATA (RR_DATA),
    98. .O_RES_VAL (W_RES_VAL),
    99. .O_RES_DATA (W_RES_DATA),
    100. .O_TRDY (W_TRDY)
    101. );
    102. endmodule

    2、仿真验证

    编写 testbench :

    1. `timescale 1ns / 1ps
    2. // 备注:顶层文件测试
    3. // BY: 在路上,正出发
    4. module TB_TOP();
    5. // ---------------------------------输入
    6. reg I_CLK_50M;//系统时钟 50M
    7. reg I_RST; //系统复位信号 高有效
    8. // ---------------------------------输出
    9. wire O_RES_VAL;
    10. // 时钟
    11. `define CLK_PERIOD 20
    12. initial I_CLK_50M = 0;
    13. always #(`CLK_PERIOD/2) I_CLK_50M = ~I_CLK_50M;
    14. // 控制信号
    15. initial
    16. begin
    17. I_RST = 1;
    18. #(`CLK_PERIOD * 10 +1);
    19. I_RST = 0;
    20. end
    21. // 例化
    22. FIR_FILTER_TOP inst_FIR_FILTER_TOP
    23. (
    24. .I_CLK_50M (I_CLK_50M),
    25. .I_RST (I_RST),
    26. .O_RES_VAL (O_RES_VAL)
    27. );
    28. endmodule

    仿真波形 :

    3、上板验证

    对设计文件进行约束、综合、实现、生成比特流后下载验证。

    对引脚进行约束:

    综合实现情况:

     上板测试:

    4、经验说明

    1. 功能仿真没问题,不能完全代表板级调试没问题;
    2. 用Generate for 写移位寄存器切记避免寄存器多驱动;
    3. Critical Warning 不可忽视。
    4. ILA IP核的时钟速率要大于等于2倍 JTAG 速率

     有问题可以留言交流~

  • 相关阅读:
    基于微信小程序的智能停车场管理系统设计与实现-计算机毕业设计源码+LW文档
    Prism进入视图时导航的三种方式
    麒麟移动运行环境(KMRE)——国内首个开源的商用移固融合“Android生态兼容环境”正式开源
    实现图像处理和分析的关键技术
    【论文&模型讲解】多模态对话 Multimodal Dialogue Response Generation
    计算机毕业论文java毕业设计成品源码网站strust2+mybatis新能源汽车车辆采购系统[包运行成功]
    花好月圆│以代码寄相思,绘嫦娥之奔月
    猿创征文 | 如何使用原生AJAX请求数据
    微服务学习(七):docker安装Mysql
    【C++】双指针算法:和为s的两个数字
  • 原文地址:https://blog.csdn.net/qq_43045275/article/details/124557742