Advertisement

数字信号处理——多速率信号处理(5)

阅读量:

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



目录

引言

顶层设计文件

资源分析

后续计划和安排



引言

本文将对抽取滤波器的设计例程做顶层封装以及联合仿真。

前文🔗:

数字信号处理——多速率信号处理(1)

Digital Signal Processing (DSP) —— Multirate Signal Processing (1)

数字域中的信号处理——多速率系统中的信号处理(第二部分)

本节深入探讨了数字信号处理技术中的多速率信号处理第3讲

数字信号处理——多重抽样率(4)


顶层设计文件

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)

还没有任何评论哟~