I am using the ZCU208 with the base design and the ‘rf data convertor introduction’ notebook to try and read from ADC Ch0. I need to look at a raw time domain signal with 0MHz input mixer frequency (I need to detect very short pulses from a detector). I can’t get information on the low frequency performance of the xRFDC in AC and DC coupling modes. I am currently injecting a 30MHz test sinewave, but am not seeing anything with the last cell of the notebook that shows the time domain signals. If I did need to go to DC-coupling - how do I do that from the notebook? The documentation (though lots scattered across the web) doesn’t seem to give much away concerning analog configuration:
https://xilinx.github.io/embeddedsw.github.io/rfdc/doc/html/api/struct_x_r_fdc___a_d_c_block___analog_data_path.html#details
Hi,
What is this ‘rf data convertor introduction’ notebook? Are you talking about these MTS notebooks (RFSoC-MTS/boards/ZCU208/notebooks at main · Xilinx/RFSoC-MTS · GitHub)?
Did you do the correct wiring for your loop observation?
Hi,
I am using an injected signal of 30MHz going in to a 180 degree splitter to feed anti-phase signals at around -15dBm into the right two inputs of JC5 corresponding to ADC0 I believe. I have also connected C1 ( the next two cables to the left of the Carlisle connector) as loop-back from DAC channel 0. I then checked the output from the DACs (I had executed all the cells in the notebook) on an oscilloscope, but see no output. Thinking the RF analog stage was in a bad state I rebooted the system and tried to repeat, but now get an error on the call to base.radio:
The full error message:
RuntimeError Traceback (most recent call last)
Input In [4], in <cell line: 1>()
----> 1 base.radio
File /usr/local/share/pynq-venv/lib/python3.10/site-packages/pynq/overlay.py:363, in Overlay.getattr(self, key)
358 “”“Overload of getattr to return a driver for an IP or
359 hierarchy. Throws an RuntimeError
if the overlay is not loaded.
360
361 “””
362 if self.is_loaded():
→ 363 return getattr(self._ip_map, key)
364 else:
365 raise RuntimeError(“Overlay not currently loaded”)
File /usr/local/share/pynq-venv/lib/python3.10/site-packages/pynq/overlay.py:898, in _IPMap.getattr(self, key)
896 if key in self._description[“hierarchies”]:
897 hierdescription = self._description[“hierarchies”][key]
→ 898 hierarchy = hierdescription"driver"
899 setattr(self, key, hierarchy)
900 return hierarchy
File /usr/local/share/pynq-venv/lib/python3.10/site-packages/rfsystem/hierarchies.py:350, in RadioWrapper.init(self, description)
347 getattr(self, rx_pipeline)._adc_tiles = getattr(self, rfdc).adc_tiles
349 getattr(self, tx_pipeline)._initialise_dacs()
→ 350 getattr(self, rx_pipeline)._initialise_adcs()
File /usr/local/share/pynq-venv/lib/python3.10/site-packages/rfsystem/hierarchies.py:151, in Receiver._initialise_adcs(self)
148 self.channel[i].adc_tile = self._adc_tiles[self._adc_list[i][0]]
149 self.channel[i].adc_block = self.channel[i].adc_tile.blocks[
150 self._adc_list[i][1]]
→ 151 self._setup_adc(self.channel[i].adc_tile,
152 self.channel[i].adc_block)
File /usr/local/share/pynq-venv/lib/python3.10/site-packages/rfsystem/hierarchies.py:161, in Receiver._setup_adc(self, adc_tile, adc_block)
154 def _setup_adc(self, adc_tile, adc_block):
155 “”“Configure the adc block with default parameters.
156
157 The ADCs operate at 4096MHz with decimation factor of 2. Just
158 set the mixer frequency to 1024. Negative fc because first nyquist
159 zone is set for RF-ADC.
160 “””
→ 161 adc_tile.DynamicPLLConfig(1, 491.52, 4915.2)
162 adc_block.NyquistZone = 1
163 adc_block.MixerSettings = {
164 ‘CoarseMixFreq’: xrfdc.COARSE_MIX_BYPASS,
165 ‘EventSource’: xrfdc.EVNT_SRC_TILE,
(…)
170 ‘PhaseOffset’: 0.0
171 }
File /usr/local/share/pynq-venv/lib/python3.10/site-packages/xrfdc/init.py:325, in RFdcTile.DynamicPLLConfig(self, source, ref_clk_freq, samp_rate)
324 def DynamicPLLConfig(self, source, ref_clk_freq, samp_rate):
→ 325 self._call_function(“DynamicPLLConfig”, source, ref_clk_freq, samp_rate)
File /usr/local/share/pynq-venv/lib/python3.10/site-packages/xrfdc/init.py:304, in RFdcTile._call_function(self, name, *args)
303 def _call_function(self, name, *args):
→ 304 return self._parent._call_function(name, self._type, self._index, *args)
File /usr/local/share/pynq-venv/lib/python3.10/site-packages/xrfdc/init.py:383, in RFdc._call_function(self, name, *args)
382 def _call_function(self, name, *args):
→ 383 safe_wrapper(f"XRFdc{name}", self._instance, *args)
File /usr/local/share/pynq-venv/lib/python3.10/site-packages/xrfdc/init.py:42, in _safe_wrapper(name, *args, **kwargs)
40 if stderr:
41 message += f"\nstderr: {stderr}"
—> 42 raise RuntimeError(message)
RuntimeError: Function XRFdc_DynamicPLLConfig call failed
stdout: metal: error:
ADC 0 timed out at state 12 in XRFdc_WaitForRestartClr
The board definitively does not seem to like the signal from the external sig gen, however in certain mysterious circumstances I can see a complex signal with an amplitude that varies at 50MHz with a 50MHz signal from one of the DACs set to 50MHz (but seems to depend on the type of low pass + DC-blocking filter I use), but the Real component seems to oscillate close to 1GHz. Seems as though a receive mixer frequency of zero doesn’t really hold I and Q values constant?
Thanks for sharing, I am very impressed with your post.
The ADC inputs seem to require a bias away from zero, so DC blocks are needed if the DC bias is not correctly set (I had been using a 180 degree splitter that would hold the DC bias at zero). I am now getting sinewave signal using the notbook example from Strathclyde and the base design, however I do not understand the MixerSttings. Does anyone have a link to documentation on these. I would like to get to baseband detection, but I seem to be stuck with a down-conversion of 1/4 the sample frequency and changing the receive frequency using base.radio.receiver.channel[i].adc_block.MixerSettings[‘Freq’]=xxxx doesn’t seem to make any difference to the acquisition whatever frequency value for xxxx I give. I am particularly interested in setting it to zero. Several of the MixerMode and MixerType settings seem to be invalid, but do not know what these should be. It would seem that I should select ‘ByPass’ mode, but it is not clear how to do that, or whether the design has to be rebuilt to do that. Perhaps this is obvious for some people, but I can’t find where the documentation is :-(.
Thanks for your help
Sorry, I hadn’t answered this question.
I am using the notebook provided for the base overlay on the ZCU208 board. Its name is ‘01_rf_dataconvertor_introduction.ipynb’ in /notebooks/base/rfdc/
I have the base design working OK with loopback from DACs to ADCs, but the mixer seems to be stuck at 1228.8, ie fs/4 and changing …MixerSettings[‘Freq’] has no effect.
Well I found the solution via another support issue (RFSoC 4x2 ADC mixer mode and type) the base model will not support baseband operation, but by building another design using the RFDC block set up correctly then it is entirely possible to work at 0MHz in the time domain
This topic was automatically closed 3 days after the last reply. New replies are no longer allowed.