AD9371 / AD9375 External LO limitations

Hi,

We are planning to use AD9371 or AD9375 for our application with fast settling external LO signal instead of internal LO. 

Our frequency range is 4.3GHz to 5.0GHz, But in the AD9371 datasheet given as " operation for the external LO option is limited to a maximum of 4000 MHz".


1. What is the exact limitation of using external LO at our maximum frequency of 5.0GHz?

 

2. Why we need to give external LO inputs must be 2× the desired LO frequency?


3. Is it same for AD9375 or it will have better specs?

 

Regards,

Sugumar K

  • 1. Using External LO for our Actual carrier frequency of 5GHz what is the expected degradation expected?

    2. Is it possible to use 10GHz external LO with divide by 2 for our 5GHz carrier with some minor performance degradation?

    3. Is there any test data available for the external LO with upto 10GHz for RF carrier upto 5GHz.

    We are looking to use external LO upto 5GHz because of internal PLL settling time is more for our hopping application.

    Regards,

    Sugumar K

    •  Analog Employees 
    on Apr 6, 2018 1:22 PM

    1. LOL calibration does not provide good performance if an external LO is provided as the TxLO. In such cases, LO leakage performance is reliant solely on the initialization calibration, and subsequently degrades.

    2. The signal is divided internally by 2 to generate the required LO quadrature relationship

    3. Both AD9371 and AD9375 has same EXT LO requirement.

    •  Analog Employees 
    on Apr 6, 2018 3:19 PM

    Recommended configuration for Ext_Lo is given below

    Actual EXT_LO frequency can be higher or lower but in terms of quadrature phase error and phase noise are not guaranteed. 

    We dont have any test data for the frequency range you have requested. 

    Note: We won't be able to support for the requirement which are not recommended in datasheet or user guide.

    •  Analog Employees 
    on Apr 17, 2019 10:34 AM in reply to hahou

    ext_lo.txt
    ########################
    #ADI Demo Python Script
    ########################
    #Gui Version:2.0.68	DLL Version:1.5.2.3566	Fpga Version:46000200 ArmVersion: 5.2.2
    
    #Import Reference to the DLL
    import System
    from System import Array
    from System import Int16
    from System import UInt32
    from System import Byte
    from System import SByte
    import time
    import clr
    clr.AddReferenceToFileAndPath("C:\\Program Files (x86)\\Analog Devices\\AD9371 Transceiver Evaluation Software\\AdiCmdServerClient.dll")
    from AdiCmdServerClient import AdiCommandServerClient
    from AdiCmdServerClient import Enums
    from AdiCmdServerClient import MykDpdConfig
    from AdiCmdServerClient import MykClgcConfig
    from AdiCmdServerClient import MykVswrConfig
    from AdiCmdServerClient import TddFsmParameters_us
    from AdiCmdServerClient import MykonosProfileData
    from AdiCmdServerClient.AD9528 import AD9528Settings
    
    #Create an Instance of the Class
    Link = AdiCommandServerClient.Instance
    Mykonos = AdiCommandServerClient.Instance.Mykonos
    FpgaMykonos = AdiCommandServerClient.Instance.FpgaMykonos
    
    #Connect to the Zynq Platform
    #Connect to the Zynq Platform
    if(Link.hw.Connected == 1):
        Connect = 1
    else:
    	Connect = 0
    	Link.hw.Connect("192.168.1.10", 55555)
       
    
    ############################################################
    #                      initStructures                      #
    ############################################################
    fpgaId = Link.identify()
    cmdSrvVersion = Link.version()
    Link.Mykonos.init_clearProfiles()
    Link.Mykonos.init_clocks(122880, 9830400, Link.Mykonos.VCODIV.VCODIV_2, 4)
    
    
    ############################################################
    #       Rx Profile Rx 20MHz, IQrate 30.72MSPS, Dec5        #
    ############################################################
    Link.Mykonos.init_rxsettings(1, Mykonos.RXCHANNEL.RX1_RX2, 0, 2550000000, 0)
    Link.Mykonos.init_rxProfiles(1, 1, 4, 5, 1, 2, 30720, 20000000, 20000)
    Link.Mykonos.init_firfilters(1, Mykonos.FILTERNAME.RX, 'C:\\Program Files (x86)\\Analog Devices\\AD9371 Transceiver Evaluation Software\\Resources\\DigitalFilters\\RxApp1_BW20_ADC1228p8_OR30p72.ftr')
    
    
    ############################################################
    #     Tx Profile Tx 20/100MHz, IQrate 122.88MSPS, Dec5     #
    ############################################################
    Link.Mykonos.init_txsettings(1, Mykonos.TXATTENSTEPSIZE.TXATTEN_0P05_DB, Mykonos.TXCHANNEL.TX1_TX2, 0, 2500000000, 10000, 10000)
    Link.Mykonos.init_txProfiles(1, Mykonos.DACDIV.DACDIV_2p5, 2, 2, 1, 1, 122880, 20000000, 100000000, 710539, 50000)
    Link.Mykonos.init_firfilters(1, Mykonos.FILTERNAME.TX, 'C:\\Program Files (x86)\\Analog Devices\\AD9371 Transceiver Evaluation Software\\Resources\\DigitalFilters\\TxApp42_122p88_BW100_PriSigBW20.ftr')
    
    
    ############################################################
    #     Snf rx Profile SRx 20MHz, IQrate 30.72MSPS, Dec5     #
    ############################################################
    Link.Mykonos.init_snifferProfiles(1, 1, 4, 5, 2, 30720, 20000000, 100000)
    Link.Mykonos.init_firfilters(1, Mykonos.FILTERNAME.SNIFFER, 'C:\\Program Files (x86)\\Analog Devices\\AD9371 Transceiver Evaluation Software\\Resources\\DigitalFilters\\RxApp201_BW20_ADC1228p8_OR30p72.ftr')
    
    
    ############################################################
    #    Obs rx Profile ORX 100MHz, IQrate 122.88MSPS, Dec5    #
    ############################################################
    Link.Mykonos.init_obsrxsettings(1, 31, Mykonos.OBSRX_LO_SOURCE.OBSLO_TX_PLL, 2600000000, 0, Mykonos.OBSRXCHANNEL.OBS_RXOFF)
    Link.Mykonos.init_obsProfiles(1, 1, 2, 5, 1, 122880, 100000000, 100000)
    Link.Mykonos.init_firfilters(1, Mykonos.FILTERNAME.ORX, 'C:\\Program Files (x86)\\Analog Devices\\AD9371 Transceiver Evaluation Software\\Resources\\DigitalFilters\\RxApp301_BW100_ADC1228p8_OR122p88.ftr')
    
    
    ############################################################
    #                        initAD9528                        #
    ############################################################
    Link.Ad9528.initDeviceDataStructure(122880000, 30720000, 122880000)
    Link.Ad9528.resetDevice()
    Link.Ad9528.initialize()
    time.sleep (0.5)
    
    arePllsLocked = Link.Ad9528.waitForPllLock()
    print 'Ad9528 arePllsLocked =', hex(arePllsLocked)
    
    Link.Ad9528.enableClockOutputs(0x300A)
    
    pllStatus = Link.Ad9528.readPllStatus()
    print 'Ad9528 pllStatus =', hex(pllStatus)
    Link.Mykonos.init_armGpioStructure(1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
    
    ############################################################
    #                         initJESD                         #
    ############################################################
    Link.Mykonos.init_jesd204bdeframer(1, 0, 0, 0, 4, 32, 1, 1, 15, 228, 1, 0, 0, 0, 0)
    Link.Mykonos.init_jesd204bframer(1, 0, 0, 0, 4, 32, 1, 1, 3, 228, 22, 4, 0, 0, 0, 0, 0, 0)
    Link.Mykonos.init_obsRxFramer(1, 0, 0, 0, 2, 32, 1, 1, 12, 228, 22, 4, 0, 0, 0, 0, 1, 1)
    
    ############################################################
    #                       init Mykonos                       #
    ############################################################
    Link.FpgaMykonos.resetFPGAIP(0x7)
    Link.FpgaMykonos.resetFPGAIP(0x0)
    Link.FpgaMykonos.resetFpgaRegisters()
    
    Link.Mykonos.resetDevice()
    Link.Mykonos.initialize()
    
    Link.fpgaWrite(0x40, 0x1)
    pllStatus = Link.Mykonos.checkPllsLockStatus()
    print 'Mykonos pllStatus =', hex(pllStatus)
    if not (pllStatus & 0x01):print 'Error pllStatus = ' + System.String(pllStatus)
    
    mcsStatus = Link.Mykonos.enableMultichipSync(1, 0)
    Link.Ad9528.requestSysref(True)
    Link.Ad9528.requestSysref(True)
    mcsStatus = Link.Mykonos.enableMultichipSync(0, 0)
    print 'MCS Status = ', hex(mcsStatus)
    
    Link.Mykonos.initArm()
    Link.SetLogLevel(0)
    Link.Mykonos.loadArm('C:\\Program Files (x86)\\Analog Devices\\AD9371 Transceiver Evaluation Software\\Resources\\Mykonos_M3.bin')
    Link.SetLogLevel(63)
    
    ArmStatus = Link.Mykonos.verifyArmChecksum()
    print 'ArmStatus =', hex(ArmStatus)
    if not (ArmStatus & 0x01):print 'Error ArmStatus  = ' + System.String(ArmStatus)
    Link.hw.ReceiveTimeout =3000
    time.sleep (0.2)
    
    pllStatus = Link.Mykonos.checkPllsLockStatus()
    print 'pllStatus = ', hex(pllStatus)
    if not (pllStatus & 0x01):print 'Error pllStatus  = ' + System.String(pllStatus)
    
    time.sleep (0.01)
    Link.hw.ReceiveTimeout =0
    Link.FpgaMykonos.setupJesd204(122880, 30720, 4, 3, 32, 1, 122880, 4, 15, 32, 1, 122880, 30720, 12, 32, 1)
    Link.fpgaWrite(0x540, 0xE4)
    Link.fpgaWrite(0x544, 0xE4)
    
    ############################################################
    #                       Set RF plls                        #
    ############################################################
    Link.Mykonos.setRfPllFrequency(Mykonos.PLLNAME.RX_PLL, 2550000000)
    Link.Mykonos.setRfPllFrequency(Mykonos.PLLNAME.TX_PLL, 2500000000)
    Link.Mykonos.setRfPllFrequency(Mykonos.PLLNAME.SNIFFER_PLL, 2600000000)
    pllStatus = Link.Mykonos.checkPllsLockStatus()
    print 'pllStatus = ', hex(pllStatus)
    
    
    ############################################################
    #                        Setup GPIO                        #
    ############################################################
    Link.Mykonos.setRx1GainCtrlPin(0, 0, 0, 0, 0)
    Link.Mykonos.setRx2GainCtrlPin(0, 0, 0, 0, 0)
    Link.Mykonos.setTx1AttenCtrlPin(0, 0, 0, 0, 0)
    Link.Mykonos.setTx2AttenCtrlPin(0, 0, 0, 0)
    Link.Mykonos.setupGpio(0, Mykonos.GPIO_MODE.GPIO_MONITOR_MODE, Mykonos.GPIO_MODE.GPIO_MONITOR_MODE, Mykonos.GPIO_MODE.GPIO_MONITOR_MODE, Mykonos.GPIO_MODE.GPIO_MONITOR_MODE, Mykonos.GPIO_MODE.GPIO_MONITOR_MODE)
    
    ############################################################
    #                     Set MANUAL Gains                     #
    ############################################################
    Link.Mykonos.setRx1ManualGain(255)
    Link.Mykonos.setRx2ManualGain(255)
    Link.Mykonos.setObsRxManualGain(Mykonos.OBSRXCHANNEL.OBS_RX1_TXLO, 255)
    Link.Mykonos.setObsRxManualGain(Mykonos.OBSRXCHANNEL.OBS_RX2_TXLO, 255)
    Link.Mykonos.setObsRxManualGain(Mykonos.OBSRXCHANNEL.OBS_SNIFFER_A, 255)
    Link.Mykonos.setObsRxManualGain(Mykonos.OBSRXCHANNEL.OBS_SNIFFER_B, 255)
    Link.Mykonos.setObsRxManualGain(Mykonos.OBSRXCHANNEL.OBS_SNIFFER_C, 255)
    
    ############################################################
    #                 Initialize attenuations                  #
    ############################################################
    Link.Mykonos.setTx1Attenuation(0)
    Link.Mykonos.setTx2Attenuation(0)
    
    ############################################################
    #    Setting BBP overSampling For Observation Channels     #
    ############################################################
    Link.FpgaMykonos.setupJesd204bObsRxOversampler(FpgaMykonos.FPGA_SAMPLE_DECIMATION.DECIMATE_BY_4, 0)
    
    ############################################################
    #                        DoInitCals                        #
    ############################################################
    calMask = 0
    calMask |= (int(Link.Mykonos.CALMASK.TX_BB_FILTER))
    calMask |= (int(Link.Mykonos.CALMASK.ADC_TUNER))
    calMask |= (int(Link.Mykonos.CALMASK.TIA_3DB_CORNER))
    calMask |= (int(Link.Mykonos.CALMASK.DC_OFFSET))
    calMask |= (int(Link.Mykonos.CALMASK.TX_ATTENUATION_DELAY))
    calMask |= (int(Link.Mykonos.CALMASK.RX_GAIN_DELAY))
    calMask |= (int(Link.Mykonos.CALMASK.FLASH_CAL))
    calMask |= (int(Link.Mykonos.CALMASK.RX_LO_DELAY))
    calMask |= (int(Link.Mykonos.CALMASK.RX_QEC_INIT))
    #CalMask = 0x607F
    Link.hw.ReceiveTimeout =0
    Link.Mykonos.runInitCals(calMask)
    Link.hw.ReceiveTimeout =0
    Link.Mykonos.waitInitCals(15000, 0, 0)
    Link.Mykonos.readArmCmdStatus(0, 0)
    Link.Mykonos.readArmCmdStatByte(2, 0)
    Link.hw.ReceiveTimeout =5000
    
    ############################################################
    #                    EnableTrackingCals                    #
    ############################################################
    calMask = (int(Link.Mykonos.TRACKING_CALMASK.NO_CALS_ENABLED))
    calMask |= (int(Link.Mykonos.TRACKING_CALMASK.ORX1_QEC))
    calMask |= (int(Link.Mykonos.TRACKING_CALMASK.ORX2_QEC))
    #CalMask = 0xC
    Link.hw.ReceiveTimeout =0
    Link.Mykonos.enableTrackingCals(calMask)
    Link.Mykonos.radioOn()
    Link.Mykonos.setObsRxPathSource(Mykonos.OBSRXCHANNEL.OBS_RXOFF)
    Link.Mykonos.setObsRxPathSource(Mykonos.OBSRXCHANNEL.OBS_INTERNALCALS)
    Link.Mykonos.radioOff()
    
    ############################################################
    #                    EnableRxFramerLink                    #
    ############################################################
    Link.FpgaMykonos.resetFPGAIP(0x6)
    Link.FpgaMykonos.resetFPGAIP(0x0)
    Link.FpgaMykonos.enableJesd204bRxDeframer(False)
    Link.FpgaMykonos.enableJesd204bObsRxDeframer(False)
    
    Link.Mykonos.enableSysrefToRxFramer(1)
    Link.Mykonos.enableSysrefToObsRxFramer(1)
    Link.FpgaMykonos.enableJesd204bRxDeframer(True)
    Link.FpgaMykonos.enableJesd204bObsRxDeframer(True)
    
    
    ############################################################
    #                       EnableTxLink                       #
    ############################################################
    Link.FpgaMykonos.resetFPGAIP(0x1)
    Link.FpgaMykonos.enableJesd204bFramer(False)
    Link.FpgaMykonos.resetFPGAIP(0x0)
    
    Link.Mykonos.enableSysrefToDeframer(0)
    Link.Mykonos.resetDeframer()
    
    Link.FpgaMykonos.enableJesd204bFramer(True)
    
    Link.Mykonos.enableSysrefToDeframer(1)
    
    
    ############################################################
    #                      Bring up Links                      #
    ############################################################
    Link.Ad9528.requestSysref(True)
    
    ############################################################
    #                       Status Check                       #
    ############################################################
    status = Link.Mykonos.readRxFramerStatus()
    print 'readRxFramerStatus= ', hex(status)
    
    status = Link.Mykonos.readOrxFramerStatus()
    print 'readOrxFramerStatus= ', hex(status)
    
    status = Link.Mykonos.readDeframerStatus()
    print 'readDeframerStatus= ', hex(status)
    
    status = Link.Mykonos.jesd204bIlasCheck(0)
    print 'jesd204bIlasCheck = ', hex(status)
    
    syncStatus = Link.FpgaMykonos.readSyncbStatus()
    print 'readSyncbStatus= ', hex(syncStatus)
    
    mcsStatus = Link.Mykonos.enableMultichipSync(0, 0)
    #MCS Status = 0
    print 'MCS Status = ', hex(mcsStatus)
    
    ############################################################
    #                         Radio On                         #
    ############################################################
    Link.Mykonos.radioOn()
    
    
    RadioState = Link.Mykonos.getRadioState(0)
    print 'Radio State = ', hex(RadioState)
    
    
    #Read the Version
    print Link.version()
    
    #Disconnect from the Zynq Platform
    if(Connect == 0):
        Link.hw.Disconnect()

    You can load the attached script into the TES GUI to use external LO.