Hi Ofer,
Considering just a single port replay block, it seems that you want to do
the following:
Step 1: Populate Tx samples: Configure tx_streamer->Replay graph and
populate Mem block A with Tx waveform
Step 2: Transmit/Receive samples: Change graph to Radio->Replay->Radio  and
"play" from Mem block A while recording to Mem block B
Step 3: Download Rx samples: Change graph to Radio->rx_streamer and play
samples from Mem block B

This seems doable to me, but you may want to start with a simpler approach
(such as separate ports that don't require reconfiguring graphs). Also,
regarding your question about a fixed number of samples, I think that the
limit is 2^28 samples in the NUM_SAMPS_AND_DONE option. If you need more
than that, I think you are out of luck (I don't think there is a timed
radio command to tell it to stop streaming on a given sample).
Rob

On Tue, Feb 1, 2022 at 12:18 AM Ofer Saferman <o...@navigicom.com> wrote:

> Hello Wade,
>
> Thank you for your prompt response.
> A few more questions please:
> 1. I am not sure that when we say bi-directional we mean the same thing.
> The record and playback functions derive their function to some extent from
> the graph connectivity. I would like, for the *same port* of Replay, to
> make 2 graphs: tx_stream --> Replay --> Radio, Radio --> Replay -->
> rx_stream. When I do record or playback, which of the graphs is active?
> Both of them? In both directions? Can I control it to activate only one
> direction? For Tx I want to use the record function only once to get the
> samples into the buffer and playback them periodically (same as in the
> rfnoc_replay_samples_from_file example) but for the other direction of Rx I
> want to use the record function all the time. When I issue the record
> command, which graph is active? The Tx graph? The Rx graph? Will it allow
> me to make the 2 graphs at all using the same port? It is my understanding
> that for the 2 graphs I mentioned I need two ports of replay, one for each
> graph. Please correct me if I am wrong.
> 4. I would like to use two ports of Replay to record 2 Rx channels. One
> replay port for each Rx channel. How do I issue a record command that will
> cause both channels (ports) to record at the same time instant? I know we
> can do timed commands for streams but how to do it for replay ? My use of
> the rx streams is done later in an offline fashion and can be done in
> series for each of the Rx channels but the recording of samples itself to
> DRAM has to be simultaneous.
>
> Thanks,
> Ofer Saferman
>
> ---------- Forwarded message ----------
>> From: Wade Fife <wade.f...@ettus.com>
>> To: Ofer Saferman <o...@navigicom.com>
>> Cc: usrp-users <usrp-users@lists.ettus.com>
>> Bcc:
>> Date: Mon, 31 Jan 2022 16:52:41 -0600
>> Subject: [USRP-users] Re: Questions about replay block
>> Hi Ofer,
>>
>> 1. It is bidirectional. You can think of the "record" and the "play"
>> components as independent, but connected to the same memory. So be careful
>> not to read/write to the same memory space and be aware that reading and
>> writing simultaneously slows down the DRAM making under/overflow more
>> likely. But I think the E320 DRAM should be fast enough for your use case.
>>
>> 2. The number of ports on the Replay block doesn't have any restrictions
>> that I know of. Any positive integer should be fine. You could also leave
>> ports unused/unconnected if it was somehow a problem.
>>
>> 3. To record at a predetermined time for a fixed amount of data, you
>> should be able to issue a stream command with the time and the number of
>> samples you want.
>> a. Yes.
>> b. Yes. The first time you want to record data, you call record(). To
>> record to the same buffer again, call record_restart(). Make sure num_samps
>> for your stream command does not exceed the size of your record buffer, or
>> else the radio will overflow.
>> c. Yes, you need to play back the buffer. Since the output is connected
>> to the rx streamer, it'll stream to the host. So you can call recv() on
>> your rx streamer to capture the data. Something like this (in Python):
>> replay.play(0, num_bytes, port, uhd.libpyuhd.types.time_spec(0.0), False)
>> rx_md = uhd.types.RXMetadata()
>> num_rx = rx_streamer.recv(output_data, rx_md, timeout)
>>
>> Happy coding!
>>
>> Wade
>>
>>
>> On Mon, Jan 31, 2022 at 9:45 AM Ofer Saferman <o...@navigicom.com> wrote:
>>
>>> Hello,
>>>
>>> I am working on a E320 USRP unit and using UHD-4.1.0.5.
>>> I prepared my own FPGA image that has 1 radio block and 1 replay block
>>> with 2 ports (channels)
>>> I would like to be able to simultaneously perform playback of 1 Tx
>>> channel and recording of 2 Rx channels (to/from different memory locations)
>>> The example rfnoc_replay_samples_from_file.cpp is only helpful to some
>>> extent because it shows only the playback path and I am having some
>>> difficulty setting up the recording path.
>>>
>>> I have a few questions about the replay block functionality and
>>> connectivity that I hope you may be able to resolve.
>>>
>>> 1. Is the replay block bi-directional? If I have a replay block with 1
>>> channel, can it be used for both playback of samples and recording of
>>> samples (from/to different memory locations) simultaneously ? or does each
>>> operation require one channel?
>>> 2. If the answer to question (1) is no then I guess I need at least 3
>>> replay channels. Is it possible to define in the FPGA image (in the yml
>>> file) a replay block with 3 channels (ports) or does it have to be a power
>>> of 2? a multiple of 2? I didn't want to try and see what happens because it
>>> takes a while to compile the FPGA image and I would rather get it right on
>>> the 1st try.
>>> 3. I would like to issue samples recording at a predetermined time for a
>>> fixed size data chunk and then at my own leisure dump the memory buffer
>>> that was recorded to a file. Since I don't have a working example I am
>>> having some difficulty getting it right.
>>> a. The graph should be Radio -->  Replay --> rx_stream. Is this correct?
>>> b. I should start my recording with replay_ctrl->record_restart and
>>> check for fullness, right?
>>> c. Then how do I get the rx_stream to dump it to file? Do I need to do
>>> playback for this to happen, mirroring what is going on in the
>>> rfnoc_replay_samples_from_file example?
>>> If someone has a working code snippet I would appreciate it if they can
>>> share it.
>>>
>>> Thanks,
>>> Ofer Saferman
>>>
>>> --
>>> This message has been scanned for viruses and
>>> dangerous content by *MailScanner* <http://www.mailscanner.info/>, and
>>> is
>>> believed to be clean. _______________________________________________
>>> 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
>>
>
> --
> This message has been scanned for viruses and
> dangerous content by *MailScanner* <http://www.mailscanner.info/>, and is
> believed to be clean. _______________________________________________
> 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

Reply via email to