def init_rf_clks(self, lmk_freq=122.88, lmx_freq=409.6): """Initialise the LMK and LMX clocks for the radio hierarchy. The radio clocks are required to talk to the RF-DCs and only need to be initialised once per session. """ if not self.rfclks_initialized: self.assert_lmk_reset() self.deassert_lmk_reset() if not self.i2c_initialized: self.init_i2c() xrfclk.set_ref_clks(lmk_freq=lmk_freq, lmx_freq=lmx_freq) self.rfclks_initialized = True
def __init__(self, bitfile_name=None, init_rf_clks=True, dark_theme=False, presentation_mode=False, **kwargs): """Construct a new QpskOverlay bitfile_name: Optional. If left None, the 'rfsoc_qpsk.bit' bundled with this rfsoc-qpsk package will be used. init_rf_clks: If true (default), the reference clocks are configured for all tiles. If the clocks are already configured, set to false for faster execution. dark_theme: Flat to enable a dark theme for plots presentation_mode: Flag to enable a dark theme with thick lines and bigger font """ # Generate default bitfile name if bitfile_name is None: this_dir = os.path.dirname(__file__) bitfile_name = os.path.join(this_dir, 'bitstream', 'rfsoc_qpsk.bit') # Set optional theming for dark mode if dark_theme: from IPython.display import display, HTML import plotly.io as pio # Apply plotly theming dark_template = pio.templates['plotly_dark'] dark_template.layout.paper_bgcolor = 'rgb(0,0,0,0)' dark_template.layout.plot_bgcolor = 'rgb(0,0,0,0)' dark_template.layout.legend.bgcolor = 'rgb(0,0,0,0)' pio.templates['dark_plot'] = dark_template pio.templates.default = 'dark_plot' # Set optional theming for presentation mode if presentation_mode: from IPython.display import display, HTML import plotly.io as pio # Apply plotly theming pio.templates.default = 'plotly_dark+presentation' # Force dark style for ipywidget tab background display( HTML(""" <style> .jupyter-widgets.widget-tab > .widget-tab-contents { background: inherit !important; } </style> """)) # Create Overlay super().__init__(bitfile_name, **kwargs) # Extact in-use dataconverter objects with friendly names self.rf = self.usp_rf_data_converter_0 self.adc_tile = self.rf.adc_tiles[0] self.adc_block = self.adc_tile.blocks[0] self.init_i2c() self.dac_tile = self.rf.dac_tiles[0] self.dac_block = self.dac_tile.blocks[0] # Start up LMX clock if init_rf_clks: xrfclk.set_ref_clks() # Set sane DAC defaults self.dac_tile.DynamicPLLConfig(1, 409.6, 1228.8) self.dac_block.NyquistZone = 2 self.dac_block.MixerSettings = { 'CoarseMixFreq': xrfdc.COARSE_MIX_BYPASS, 'EventSource': xrfdc.EVNT_SRC_IMMEDIATE, 'FineMixerScale': xrfdc.MIXER_SCALE_1P0, 'Freq': 1000, 'MixerMode': xrfdc.MIXER_MODE_C2R, 'MixerType': xrfdc.MIXER_TYPE_FINE, 'PhaseOffset': 0.0 } self.dac_block.UpdateEvent(xrfdc.EVENT_MIXER) self.dac_tile.SetupFIFO(True) # Set sane ADC defaults self.adc_tile.DynamicPLLConfig(1, 409.6, 1228.8) self.adc_block.NyquistZone = 2 self.adc_block.MixerSettings = { 'CoarseMixFreq': xrfdc.COARSE_MIX_BYPASS, 'EventSource': xrfdc.EVNT_SRC_TILE, 'FineMixerScale': xrfdc.MIXER_SCALE_1P0, 'Freq': 1000, 'MixerMode': xrfdc.MIXER_MODE_R2C, 'MixerType': xrfdc.MIXER_TYPE_FINE, 'PhaseOffset': 0.0 } self.adc_block.UpdateEvent(xrfdc.EVENT_MIXER) self.adc_tile.SetupFIFO(True) # Touch RX and TX drivers for strict evaluation self.qpsk_tx.qpsk_tx.enable = 1 self.qpsk_rx.qpsk_rx_dec.enable = 1 self.qpsk_rx.qpsk_rx_csync.enable = 1 self.qpsk_rx.qpsk_rx_rrc.enable = 1 self.qpsk_rx.qpsk_rx_tsync.enable = 1 self.timers = TimerRegistry()
def init_rf_clks(self, lmk_freq=122.88, lmx_freq=409.6): """Initialise the LMX and LMK clocks for RF-DC operation. """ xrfclk.set_ref_clks(lmk_freq=lmk_freq, lmx_freq=lmx_freq)
def __init__(self, bitfile_name=None, init_rf_clks=True, **kwargs): # Generate default bitfile name if bitfile_name is None: this_dir = os.path.dirname(__file__) bitfile_name = os.path.join(this_dir, 'bitstream', 'rfsoc_radio.bit') # Create Overlay super().__init__(bitfile_name, **kwargs) # Initialise I2C self.init_i2c() # Extract friendly dataconverter names self.rf = self.usp_rf_data_converter self.dac_tile = self.rf.dac_tiles[1] self.dac_block = self.dac_tile.blocks[0] self.adc_tile = self.rf.adc_tiles[2] self.adc_block = self.adc_tile.blocks[0] # Start up LMX clock if init_rf_clks: xrfclk.set_ref_clks() # Set DAC defaults self.dac_tile.DynamicPLLConfig(1, 409.6, 1024) self.dac_block.NyquistZone = 1 self.dac_block.MixerSettings = { 'CoarseMixFreq': xrfdc.COARSE_MIX_BYPASS, 'EventSource': xrfdc.EVNT_SRC_IMMEDIATE, 'FineMixerScale': xrfdc.MIXER_SCALE_1P0, 'Freq': 64, 'MixerMode': xrfdc.MIXER_MODE_C2R, 'MixerType': xrfdc.MIXER_TYPE_FINE, 'PhaseOffset': 0.0 } self.dac_block.UpdateEvent(xrfdc.EVENT_MIXER) self.dac_tile.SetupFIFO(True) # Set ADC defaults self.adc_tile.DynamicPLLConfig(1, 409.6, 1024) self.adc_block.NyquistZone = 1 self.adc_block.MixerSettings = { 'CoarseMixFreq': xrfdc.COARSE_MIX_BYPASS, 'EventSource': xrfdc.EVNT_SRC_TILE, 'FineMixerScale': xrfdc.MIXER_SCALE_1P0, 'Freq': 64, 'MixerMode': xrfdc.MIXER_MODE_R2C, 'MixerType': xrfdc.MIXER_TYPE_FINE, 'PhaseOffset': 0.0 } self.adc_block.UpdateEvent(xrfdc.EVENT_MIXER) self.adc_tile.SetupFIFO(True) # Obtain friendly names for IP Cores and associated drivers self.receiver = BpskReceiver( self.axi_dma_rx, self.bpsk_receiver, self.DataInspector) # The receiver is coupled with an inspector self.transmitter = BpskTransmitter(self.axi_dma_tx, self.bpsk_transmitter) # Receiver setup requirements - pull resets low self.receiver.controller.reset_time_sync = 0 self.receiver.controller.reset_phase_sync = 0 self.receiver.controller.reset_frame_sync = 0