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