diff options
| author | michael-west <michael.west@ettus.com> | 2020-07-20 10:15:12 -0700 | 
|---|---|---|
| committer | Wade Fife <wade.fife@ettus.com> | 2021-04-08 08:48:18 -0500 | 
| commit | ad533eb6416c76d2a986c97fff846785ee56567e (patch) | |
| tree | 169c3a354f2bc808158a4f3b772dbaa47c1d3070 /fpga/usrp3/lib | |
| parent | 3b3d3b6f9efb0fe685d9fabc8bdaca813549d9e3 (diff) | |
| download | uhd-ad533eb6416c76d2a986c97fff846785ee56567e.tar.gz uhd-ad533eb6416c76d2a986c97fff846785ee56567e.tar.bz2 uhd-ad533eb6416c76d2a986c97fff846785ee56567e.zip | |
TwinRX: Remove frontend filter
Removing the FIR filter in the frontend to reclaim resources and remove
redundancy when using a DDC block.  The default image has a DDC block,
so only users making custom RFNoC images and using TwinRX will need to
take care to properly downconvert the full bandwidth coming from the
radio block.
Signed-off-by: michael-west <michael.west@ettus.com>
Diffstat (limited to 'fpga/usrp3/lib')
| -rw-r--r-- | fpga/usrp3/lib/rfnoc/blocks/rfnoc_block_radio/rx_frontend_gen3.v | 67 | 
1 files changed, 8 insertions, 59 deletions
| diff --git a/fpga/usrp3/lib/rfnoc/blocks/rfnoc_block_radio/rx_frontend_gen3.v b/fpga/usrp3/lib/rfnoc/blocks/rfnoc_block_radio/rx_frontend_gen3.v index c11f174e5..841bffaa9 100644 --- a/fpga/usrp3/lib/rfnoc/blocks/rfnoc_block_radio/rx_frontend_gen3.v +++ b/fpga/usrp3/lib/rfnoc/blocks/rfnoc_block_radio/rx_frontend_gen3.v @@ -39,10 +39,11 @@  //  //   3) IQ imbalance correction. This implements a simple, one-shot IQ imbalance  //      correction. It will modify the I and Q signals as follows: -//           _  _     _          _   _   _ -//          | I' |   |  A/64+1  0 | |  I  | -//          |    | = |            | |     | -//          |_Q'_|   |_ B/64    1_| |_ Q _| +//           _  _     _         _   _   _ +//          | I' |   | A/64+1  0 | |  I  | +//          |    | = |           | |     | +//          | Q' |   | B/64    1 | |  Q  | +//           ‾  ‾     ‾         ‾   ‾   ‾  //  //      Here, A is the value written to the register at SR_MAG_CORRECTION, and  //      B is the value written to the register at SR_PHASE_CORRECTION. @@ -54,8 +55,6 @@  //      controlled by the SR_HET_PHASE_INCR register (a 0 in this register  //      rotates by pi/2 every clock cycle, a 1 in this register rotates by -pi/2).  // -//      The mixer is followed by a non-decimating half-band filter. -//  //      Set BYPASS_REALMODE_DSP to 1 to not synthesize this step.  //  // @@ -252,9 +251,7 @@ module rx_frontend_gen3 #(      if (BYPASS_REALMODE_DSP == 0) begin        wire [23:0] adc_i_dsp_cout, adc_q_dsp_cout; -      wire [23:0] adc_i_filt, adc_q_filt;        wire        adc_dsp_cout_stb; -      wire        adc_filt_stb;        // 90 degree mixer        quarter_rate_downconverter #(.WIDTH(24)) qr_dc_i( @@ -263,57 +260,9 @@ module rx_frontend_gen3 #(          .o_tdata({adc_i_dsp_cout, adc_q_dsp_cout}), .o_tlast(), .o_tvalid(adc_dsp_cout_stb), .o_tready(1'b1),          .dirctn(phase_dir)); -      // Double FIR and decimator block -      localparam HB_COEFS = {-18'd62, 18'd0, 18'd194, 18'd0, -18'd440, 18'd0, 18'd855, 18'd0, -18'd1505, 18'd0, 18'd2478, 18'd0, -        -18'd3900, 18'd0, 18'd5990, 18'd0, -18'd9187, 18'd0, 18'd14632, 18'd0, -18'd26536, 18'd0, 18'd83009, 18'd131071, 18'd83009, -        18'd0, -18'd26536, 18'd0, 18'd14632, 18'd0, -18'd9187, 18'd0, 18'd5990, 18'd0, -18'd3900, 18'd0, 18'd2478, 18'd0, -18'd1505, -        18'd0, 18'd855, 18'd0, -18'd440, 18'd0, 18'd194, 18'd0, -18'd62}; - -      // FIR filter for real part -      axi_fir_filter #(.IN_WIDTH(24), .COEFF_WIDTH(18), .OUT_WIDTH(24), .NUM_COEFFS(47), .COEFFS_VEC(HB_COEFS), -        .RELOADABLE_COEFFS(0), .BLANK_OUTPUT(0), .SYMMETRIC_COEFFS(1), .SKIP_ZERO_COEFFS(1), .USE_EMBEDDED_REGS_COEFFS(0) -      ) hbfir0( -        .clk(clk), -        .reset(reset), -        .clear(reset), -        .s_axis_data_tdata(adc_i_dsp_cout), -        .s_axis_data_tlast(1'b1), -        .s_axis_data_tvalid(adc_dsp_cout_stb), -        .s_axis_data_tready(), -        .m_axis_data_tdata(adc_i_filt), -        .m_axis_data_tlast(), -        .m_axis_data_tvalid(adc_filt_stb), -        .m_axis_data_tready(1'b1), -        .s_axis_reload_tdata(18'd0), -        .s_axis_reload_tvalid(1'b0), -        .s_axis_reload_tlast(1'b0), -        .s_axis_reload_tready() -      ); - -      // FIR filter for imag. part -      axi_fir_filter #(.IN_WIDTH(24), .COEFF_WIDTH(18), .OUT_WIDTH(24), .NUM_COEFFS(47), .COEFFS_VEC(HB_COEFS), -        .RELOADABLE_COEFFS(0), .BLANK_OUTPUT(0), .SYMMETRIC_COEFFS(1), .SKIP_ZERO_COEFFS(1), .USE_EMBEDDED_REGS_COEFFS(0) -      ) hbfir1( -        .clk(clk), -        .reset(reset), -        .clear(reset), -        .s_axis_data_tdata(adc_q_dsp_cout), -        .s_axis_data_tlast(1'b1), -        .s_axis_data_tvalid(adc_dsp_cout_stb), -        .s_axis_data_tready(), -        .m_axis_data_tdata(adc_q_filt), -        .m_axis_data_tlast(), -        .m_axis_data_tvalid(), -        .m_axis_data_tready(1'b1), -        .s_axis_reload_tdata(18'd0), -        .s_axis_reload_tvalid(1'b0), -        .s_axis_reload_tlast(1'b0), -        .s_axis_reload_tready() -      ); - -      assign adc_dsp_stb = downconvert ? adc_filt_stb : adc_comp_stb; -      assign adc_i_dsp   = downconvert ? adc_i_filt : adc_i_comp; -      assign adc_q_dsp   = downconvert ? adc_q_filt : adc_q_comp; +      assign adc_dsp_stb = downconvert ? adc_dsp_cout_stb : adc_comp_stb; +      assign adc_i_dsp   = downconvert ? adc_i_dsp_cout : adc_i_comp; +      assign adc_q_dsp   = downconvert ? adc_q_dsp_cout : adc_q_comp;      end else begin        assign adc_dsp_stb = adc_comp_stb; | 
