数字信号处理——多速率信号处理(5)
发布时间
阅读量:
阅读量
本文介绍了抽取滤波器设计的顶层封装及联合仿真,并提供了Verilog HDL代码实现。该设计基于多相滤波器结构,使用FPGA进行实现,并详细描述了触发器和查找表等主要逻辑资源的消耗情况。同时,文章提到了后续计划继续更新关于内插器和其他多相滤波器的内容。

目录
引言
顶层设计文件
资源分析
后续计划和安排
引言
本文将对抽取滤波器的设计例程做顶层封装以及联合仿真。
前文🔗:
数字信号处理——多速率信号处理(1)
Digital Signal Processing (DSP) —— Multirate Signal Processing (1)
数字域中的信号处理——多速率系统中的信号处理(第二部分)
本节深入探讨了数字信号处理技术中的多速率信号处理第3讲
顶层设计文件
Verilog HDL 源代码:
> 1.
>
> 2. // |------------------------------------------------------------------------------
>
> 3. // |---------------- Decimator Design Base On Mult-Phase Filter ------------------
>
> 4. // |------------------------------------------------------------------------------
>
> 5. // |
>
> 6. // |********* Basic Information Specify *********
>
> 7. // |Author : Xu Y.B. ( 昵称:在路上,正出发)
>
> 8. // |Abstract :
>
> 9. // | -1- Example Design:Decimator Factor = 4 (100MHz/25MHz);
>
> 10. // | -2- Filter Length = 32;(if you want to change the parameters of the
>
> 11. // | design ,you should change some logic of the design ! ! ! )
>
> 12. // | -3- Mult-Phase Filter Strcture.
>
> 13. // |FPGA Chirp Model : xc7a35tfgg484-2
>
> 14. // |Vivado Version : 2018.3
>
> 15. // |File Create Time : 2022-09-25
>
> 16. // |Advice : This is a example design source.
>
> 17. // | It is better to understand and improve the source code!
>
> 18. // |
>
> 19. // |********* Version Change History *********
>
> 20. // |
>
> 21. // |
>
> 22.
>
> 23. `timescale 1ns / 1ps
>
> 24. module TOP_MP_D_FILTER(
>
> 25. // ------------------------- Input/Output Ports -------------------------
>
> 26. input I_CLK_50M,
>
> 27. input I_SYS_RST
>
> 28. );
>
> 29.
>
> 30. // -------------------------- Local Parameters ---------------------------
>
> 31. localparam P_DATA_IN_WIDTH = 8; // Input Data Width
>
> 32. localparam P_DATA_OUT_WIDTH = 24; // Output Data Width
>
> 33. localparam P_DCMT_FACTOR = 4; // Decimator Factor
>
> 34. localparam P_FILTER_LENGTH = 32; // FIR Filter Length
>
> 35. localparam P_FILTER_COEF_WIDTH = 16; // FIR Filter Tap Coefficient Width // Notes:This Parameter Must Be the Integer Power of 2
>
> 36. localparam P_PHASE_OFFSET = 0; //
>
> 37.
>
> 38.
>
> 39. // ---------------------- Module Internal Signals ------------------------
>
> 40. wire W_SYS_CLK_100M;
>
> 41. wire W_CLK_25M;
>
> 42. wire W_RSTN;
>
> 43.
>
> 44. wire [15:0] W_DDS_DATA;
>
> 45. wire W_DDS_VAL;
>
> 46.
>
> 47. reg [15:0] R_DDS_DATA;
>
> 48. reg R_DDS_VAL;
>
> 49.
>
> 50. wire W_OPR_RDY;
>
> 51. wire [63:0] W_FILTER_COEF;
>
> 52. wire W_FILTER_COEF_VAL;
>
> 53. wire [P_DATA_OUT_WIDTH-1:0] W_FILTER_OUT_DATA;
>
> 54. wire W_FILTER_OUT_DATA_VAL;
>
> 55.
>
> 56. // ------------------------ Module Logic Design --------------------------
>
> 57. always @ (posedge W_SYS_CLK_100M)
>
> 58. begin
>
> 59. if(~W_RSTN)
>
> 60. begin
>
> 61. R_DDS_VAL <= 0;
>
> 62. R_DDS_DATA <= 0;
>
> 63. end
>
> 64. else
>
> 65. begin
>
> 66. if(W_DDS_VAL & W_OPR_RDY)
>
> 67. begin
>
> 68. R_DDS_VAL <= W_DDS_VAL;
>
> 69. R_DDS_DATA <= W_DDS_DATA ;
>
> 70. end
>
> 71. else
>
> 72. begin
>
> 73. R_DDS_VAL <= 1'b0;
>
> 74. R_DDS_DATA <= 0;
>
> 75. end
>
> 76. end
>
> 77. end
>
> 78.
>
> 79. // -------------------------- Module instantiation -------------------------
>
> 80. MP_D_FILTER #(
>
> 81. .P_DATA_IN_WIDTH (P_DATA_IN_WIDTH),
>
> 82. .P_DATA_OUT_WIDTH (P_DATA_OUT_WIDTH),
>
> 83. .P_DCMT_FACTOR (P_DCMT_FACTOR),
>
> 84. .P_FILTER_LENGTH (P_FILTER_LENGTH),
>
> 85. .P_FILTER_COEF_WIDTH (P_FILTER_COEF_WIDTH),
>
> 86. .P_PHASE_OFFSET (P_PHASE_OFFSET)
>
> 87. ) INST_MP_D_FILTER (
>
> 88. .I_INT_SAMP_CLK (W_SYS_CLK_100M),
>
> 89. .I_RSTN (W_RSTN),
>
> 90. .I_INT_SAMP_DATA (R_DDS_DATA[7:0]),
>
> 91. .I_INT_SAMP_DATA_VAL (R_DDS_VAL),
>
> 92. .O_OPR_RDY (W_OPR_RDY),
>
> 93. .I_DCMT_OPR_CLK (W_CLK_25M),
>
> 94. .I_FILTER_COEF (W_FILTER_COEF),
>
> 95. .I_FILTER_COEF_VAL (W_FILTER_COEF_VAL),
>
> 96. .O_FILTER_OUT_DATA (W_FILTER_OUT_DATA),
>
> 97. .O_FILTER_OUT_DATA_VAL (W_FILTER_OUT_DATA_VAL)
>
> 98. );
>
> 99. COEF_READ_MDL INST_COEF_READ_MDL
>
> 100. (
>
> 101. .I_OPR_CLK (W_CLK_25M),
>
> 102. .I_OPR_RSTN (W_RSTN),
>
> 103. .O_COEF_VAL (W_FILTER_COEF_VAL),
>
> 104. .O_COEF_DATA (W_FILTER_COEF)
>
> 105. );
>
> 106. DDS INST_DDS (
>
> 107. .aclk(W_SYS_CLK_100M), // input wire aclk
>
> 108. .m_axis_data_tvalid(W_DDS_VAL), // output wire m_axis_data_tvalid
>
> 109. .m_axis_data_tdata(W_DDS_DATA), // output wire [15 : 0] m_axis_data_tdata
>
> 110. .m_axis_phase_tvalid(), // output wire m_axis_phase_tvalid
>
> 111. .m_axis_phase_tdata() // output wire [31 : 0] m_axis_phase_tdata
>
> 112. );
>
> 113. SYS_MMCM INST_SYS_MMCM
>
> 114. (
>
> 115. // Clock out ports
>
> 116. .CLK_100M(W_SYS_CLK_100M), // output CLK_100M
>
> 117. .CLK_25M(W_CLK_25M), // output CLK_25M
>
> 118. // Status and control signals
>
> 119. .reset(I_SYS_RST), // input reset
>
> 120. .locked(W_RSTN), // output locked
>
> 121. // Clock in ports
>
> 122. .CLK_IN_50M(I_CLK_50M)); // input CLK_IN_50M
>
> 123.
>
> 124. endmodule
>
>
>
>
> AI助手
仿真文件:
> 1. `timescale 1ns / 1ps
>
> 2. 3. module TB_TOP_MP_D_FILTER(
>
> 4. 5. );
>
> 6. reg I_CLK_50M;
>
> 7. reg I_SYS_RST;
>
> 8.
>
> 9. TOP_MP_D_FILTER INST_TOP_MP_D_FILTER (.I_CLK_50M(I_CLK_50M), .I_SYS_RST(I_SYS_RST));
>
> 10. initial I_CLK_50M = 0;
>
> 11. always #10 I_CLK_50M = ~I_CLK_50M;
>
> 12. initial
>
> 13. begin
>
> 14. I_SYS_RST = 1;
>
> 15. #1000;
>
> 16. I_SYS_RST = 0;
>
> 17. end
>
> 18. endmodule
>
>
>
>
> AI助手
结果验证:

资源分析
对顶层设计综合实现:


主要的逻辑资源消耗集中在触发器以及查找表中。当然地,在并行处理的分支数量增加的情况下(目前并行4路),相应的地,处理器所需的逻辑资源也将随之按比例增长。
后续计划和安排
关于基于FPGA的多相滤波设计专题的内容,请期待后续更新。具体来说,在实现这些多相滤波器结构时,我们可能会采用功能模块化的方式而非全例程架构。如需更多更新,请持续关注
全部评论 (0)
还没有任何评论哟~
