Hello, Is there any new idea on the topic? Is this a bug in the fir_filter RFNoC block? I haven't found a way to make it work yet...
Camille. On 1/14/22 10:41, Camille Moniere wrote: > Just a typo, I used firS in the file, and I change the first > occurrence while pasting the file, considering my use of fir0 in my > explanations. > There it is, with only fir0 (even if it does not change the initial > issue): > > # General parameters > # ----------------------------------------- > schema: rfnoc_imagebuilder_args# Identifier for the schema used to > validate this file > copyright: 'Camille Monière'# Copyright information used in file headers > license: 'SPDX-License-Identifier: LGPL-3.0-or-later'# License > information used in file headers > version: '1.0'# File version > rfnoc_version: '1.0'# RFNoC protocol version > chdr_width: 64# Bit width of the CHDR bus for this image > device: 'x310' > default_target: 'X310_HG' > # A list of all stream endpoints in design > # ---------------------------------------- > stream_endpoints: > ep0: # Stream endpoint name > ctrl: True# Endpoint passes control traffic > data: True# Endpoint passes data traffic > buff_size: 0# Ingress buffer size for data > # A list of all NoC blocks in design > # ---------------------------------- > noc_blocks: > ddc0: > block_desc: 'ddc.yml' > parameters: > NUM_PORTS: 1 > radio0: > block_desc: 'radio_2x64.yml' > parameters: > NUM_PORTS: 1 > fir0: > block_desc: 'fir_filter.yml' > parameters: > NUM_PORTS: 1 > COEFF_WIDTH: 16 > NUM_COEFFS: 21 > COEFFS_VEC: "{ 16'h7FFF, {320{1'b0}} }" > RELOADABLE_COEFFS: 1 > SYMMETRIC_COEFFS: 0 > SKIP_ZERO_COEFFS: 0 > USE_EMBEDDED_REGS_COEFFS: 1 > # A list of all static connections in design > # ------------------------------------------ > # Format: A list of connection maps (list of key-value pairs) with the > following keys > # - srcblk = Source block to connect > # - srcport = Port on the source block to connect > # - dstblk = Destination block to connect > # - dstport = Port on the destination block to connect > connections: > # radio0 to ep0 - RFA RX > - { srcblk: radio0, srcport: out_0, dstblk: ddc0, dstport: in_0} > - { srcblk: ddc0, srcport: out_0, dstblk: fir0, dstport: in_0} > - { srcblk: fir0, srcport: out_0, dstblk: ep0, dstport: in0} > # BSP Connections > - { srcblk: radio0, srcport: ctrl_port, dstblk: _device_, dstport: > ctrlport_radio0} > - { srcblk: _device_, srcport: x300_radio0, dstblk: radio0, dstport: > x300_radio} > - { srcblk: _device_, srcport: time_keeper, dstblk: radio0, dstport: > time_keeper} > # A list of all clock domain connections in design > # ------------------------------------------ > # Format: A list of connection maps (list of key-value pairs) with the > following keys > # - srcblk = Source block to connect (Always "_device"_) > # - srcport = Clock domain on the source block to connect > # - dstblk = Destination block to connect > # - dstport = Clock domain on the destination block to connect > clk_domains: > - { srcblk: _device_, srcport: radio, dstblk: radio0, dstport: radio} > - { srcblk: _device_, srcport: ce, dstblk: ddc0, dstport: ce} > - { srcblk: _device_, srcport: ce, dstblk: fir0, dstport: ce} > > On 1/13/22 18:30, Wade Fife wrote: >> At a glance, the YML has both firS and fir0. I was expecting just >> fir0. But I also would have expected rfnoc_image_builder to throw an >> error for that. >> >> Wade >> >> On Thu, Jan 13, 2022 at 11:19 AM Camille Moniere >> <camille.moni...@univ-ubs.fr> wrote: >> >> Hi wade, >> >> I had already linked the FIR ce to the ce of the _device_. >> >> Also, this custom image aims only to receive data (so no duc nor >> SEP for TX). I tried to free some space, considering only one >> UBX-160 is available (so only 1 radio). >> I have read in the RFNoC guide that, for a device to host >> communication, an ingress buffer of size 0 is possible, again to >> free resources. >> A big block is expected to be added in the future... >> >> Here the YAML file I use with rfnoc_image_builder: >> >> # General parameters >> # ----------------------------------------- >> schema: rfnoc_imagebuilder_args# Identifier for the schema used >> to validate this file >> copyright: 'Camille Monière'# Copyright information used in file >> headers >> license: 'SPDX-License-Identifier: LGPL-3.0-or-later'# License >> information used in file headers >> version: '1.0'# File version >> rfnoc_version: '1.0'# RFNoC protocol version >> chdr_width: 64# Bit width of the CHDR bus for this image >> device: 'x310' >> default_target: 'X310_HG' >> # A list of all stream endpoints in design >> # ---------------------------------------- >> stream_endpoints: >> ep0: # Stream endpoint name >> ctrl: True# Endpoint passes control traffic >> data: True# Endpoint passes data traffic >> buff_size: 0# Ingress buffer size for data >> # A list of all NoC blocks in design >> # ---------------------------------- >> noc_blocks: >> ddc0: >> block_desc: 'ddc.yml' >> parameters: >> NUM_PORTS: 1 >> radio0: >> block_desc: 'radio_2x64.yml' >> parameters: >> NUM_PORTS: 1 >> fir0: >> block_desc: 'fir_filter.yml' >> parameters: >> NUM_PORTS: 1 >> COEFF_WIDTH: 16 >> NUM_COEFFS: 21 >> COEFFS_VEC: "{ 16'h7FFF, {320{1'b0}} }" >> RELOADABLE_COEFFS: 1 >> SYMMETRIC_COEFFS: 0 >> SKIP_ZERO_COEFFS: 0 >> USE_EMBEDDED_REGS_COEFFS: 1 >> # A list of all static connections in design >> # ------------------------------------------ >> # Format: A list of connection maps (list of key-value pairs) >> with the following keys >> # - srcblk = Source block to connect >> # - srcport = Port on the source block to connect >> # - dstblk = Destination block to connect >> # - dstport = Port on the destination block to connect >> connections: >> # radio0 to ep0 - RFA RX >> - { srcblk: radio0, srcport: out_0, dstblk: ddc0, dstport: in_0} >> - { srcblk: ddc0, srcport: out_0, dstblk: firS, dstport: in_0} >> - { srcblk: firS, srcport: out_0, dstblk: ep0, dstport: in0} >> # BSP Connections >> - { srcblk: radio0, srcport: ctrl_port, dstblk: _device_, >> dstport: ctrlport_radio0} >> - { srcblk: _device_, srcport: x300_radio0, dstblk: radio0, >> dstport: x300_radio} >> - { srcblk: _device_, srcport: time_keeper, dstblk: radio0, >> dstport: time_keeper} >> # A list of all clock domain connections in design >> # ------------------------------------------ >> # Format: A list of connection maps (list of key-value pairs) >> with the following keys >> # - srcblk = Source block to connect (Always "_device"_) >> # - srcport = Clock domain on the source block to connect >> # - dstblk = Destination block to connect >> # - dstport = Clock domain on the destination block to connect >> clk_domains: >> - { srcblk: _device_, srcport: radio, dstblk: radio0, dstport: radio} >> - { srcblk: _device_, srcport: ce, dstblk: ddc0, dstport: ce} >> - { srcblk: _device_, srcport: ce, dstblk: firS, dstport: ce} >> >> >> I have tried in python and in C++, with UHD and directly with >> RFNoC API. None succeeded >> For instance, this is what I do in Python: >> >> importnumpy asnp >> importscipy assp >> importipywidgets aswidgets >> importmatplotlib.pyplot asplt >> importuhd >> graph = >> uhd.rfnoc.RfnocGraph("addr=192.168.10.2,dboard_clock_rate=20e6") >> radio_crtl = uhd.rfnoc.RadioControl(graph.get_block("0/Radio#0")) >> ddc_crtl = uhd.rfnoc.DdcBlockControl(graph.get_block("0/DDC#0")) >> target_freq = 433e6 >> target_gain = 25 >> target_rate = 1e6 >> radio_crtl.set_rx_antenna('RX2', 0) >> radio_crtl.get_rx_antenna(0) >> actual_gain = radio_crtl.set_rx_gain(target_gain, 0) >> actual_rf_freq = radio_crtl.set_rx_frequency(target_freq, 0) >> target_dsp_freq = actual_rf_freq - target_freq >> actual_dsp_freq = ddc_crtl.set_freq(target_dsp_freq, 0) >> clipped_rx_freq = actual_rf_freq - actual_dsp_freq >> actual_rate = ddc_crtl.set_output_rate(target_rate, 0) >> fir_static = >> uhd.rfnoc.FirFilterBlockControl(graph.get_block("0/FIR#0")) >> coefficients = fir_static.get_coefficients() >> fir_static.set_coefficients(coefficients) >> coefficients = fir_static.get_coefficients() >> plt.stem(coefficients) >> plt.show() >> stream_args = uhd.usrp.StreamArgs("fc32", "sc16") >> recv_stream = graph.create_rx_streamer(1, stream_args) >> graph.connect(radio_crtl.get_block_id(), 0, >> ddc_crtl.get_block_id(), 0, False) >> graph.connect(ddc_crtl.get_block_id(), 0, >> fir_static.get_block_id(), 0, False) >> graph.connect(fir_static.get_block_id(), 0, recv_stream, 0) >> graph.commit() >> num_samps = int(1e6) # 1 MB of data, be aware. >> data = np.empty((num_samps), dtype=np.complex64) >> md = uhd.types.RXMetadata() >> stream_cmd = uhd.types.StreamCMD(uhd.types.StreamMode.num_done) >> stream_cmd.stream_now = True >> stream_cmd.num_samps = num_samps >> stream_cmd.time_spec = uhd.types.TimeSpec(1, 0) # Wait 1s before >> reception >> recv_stream.issue_stream_cmd(stream_cmd) >> received_spls = recv_stream.recv(data, md, 3.) >> print(f'Received {float(received_spls):.2e}samples') >> ifmd.error_code != md.error_code.none: >> print(f'\033[1;31m[ERROR]\033[0m {md.strerror()}') >> else: >> print(f'Everything went well.') >> >> Without the Fir (and adapting the code of course), I get my 1e6 >> data buffer. >> >> Is there an error I miss, or have I made too much space, deleting >> important part in the process? >> >> On 1/13/22 17:08, Wade Fife wrote: >>> In particular, make sure you have a clock connected to the CE >>> input of the FIR filter. Something like this in your clk_domains >>> section: >>> >>> clk_domains: >>> - { srcblk: _device_, srcport: ce, dstblk: fir0, dstport: ce } >>> >>> Wade >>> >>> On Thu, Jan 13, 2022 at 10:04 AM Wade Fife <wade.f...@ettus.com> >>> wrote: >>> >>> Hi Camille, >>> >>> Maybe you could share your RFNoC YML file and someone could >>> take a look? There might be something wrong there. >>> >>> Wade >>> >>> On Thu, Jan 13, 2022 at 8:32 AM Camille Moniere >>> <camille.moni...@univ-ubs.fr> wrote: >>> >>> Hello everyone, >>> >>> I unsuccessfully try to use the FIR Filter RFNoC block >>> in reception, in >>> an USRP X310 with a UBX-160 daughterboard on-board. >>> I have tested several topology for the custom image >>> (radio0 - > ddc0 -> >>> fir0 -> ep0 || radio0 -> ddc0 -> ep0 + ep1 -> fir0 + >>> fir0 -> ep1, for >>> example), >>> with several parameter for the filter (With or without >>> re-loadable >>> coefficients, with or without embedded DSP registers, 21 >>> coef' instead >>> of 41 ...) but it ultimately >>> always fails the same way. >>> When the FIR is used, I can't retrieve any data. I got >>> an Overflow >>> error, without receiving any samples. Sometimes, I even >>> got a "Late >>> Command" error, even when using RFNoC in C++ >>> (graph committed immediately before the stream now >>> stream_cmd). >>> >>> For the record, the center frequency is 433 MHz for a >>> sampling rate of 1 >>> Msps. >>> >>> I assumed the filter output one complex sample (sc16) >>> for each new input >>> (sc16 too). Am I wrong? Or is there specific setup I >>> have forgotten? >>> Has someone successfully used this block, and can >>> provide an example or >>> tutorial? >>> >>> Regards, >>> >>> Camille >>> _______________________________________________ >>> USRP-users mailing list -- usrp-users@lists.ettus.com >>> To unsubscribe send an email to >>> usrp-users-le...@lists.ettus.com >>> >> >
_______________________________________________ USRP-users mailing list -- usrp-users@lists.ettus.com To unsubscribe send an email to usrp-users-le...@lists.ettus.com