Post Go back to editing

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

  • 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.

  • 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.

  • Hi PVALAVAN,

    thanks. 

    I tried to configure the ADRV9371-N to external LO in TES GUI by connecting the pure single tone of 6G Hz from the R&S SG and increase power to 10 dBm. 

    But it seems no function. 

    Would you show me how to make the external LO for ADRV9371-N work with TES? 

    thanks 

    H.A. 

  • ########################
    #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. 

  • Hi srimoyi,

    I applied the script the TES Version 2.0.67, but it failed to load waveform to transmit. 

    Alternative, I find to make tx use external LO by changing configure in no-OS driver and it works. 

    Even I replace a quasi disciplined OCXO or instrument-graded clock source like R&S, the EVM has no obvious improvement, limited to 1.5 % or -36 dB. 

    Before closing this issue, what is the limitation of Tx EVM? 

    Is Tx LO synthesizer ?

    Sincerely 

    H.A. 

  • Script failing to load. It could be that the DLL location is different in your installation.

    Create a new python script and replace below in code with the DLL location that you generate.

    clr.AddReferenceToFileAndPath("C:\\Program Files (x86)\\Analog Devices\\AD9371 Transceiver Evaluation Software\\AdiCmdServerClient.dll

    The limitation in EVM is because of phase noise. For lower frequencies as we use a divided LO phase noise in improved and hence EVM.

    Reference frequency impact is minimal and improving reference will not help much. You need to use external LO (at twice RF) limited to max 8000MHz for improving EVM further.

  • Hi Vinod, 

    As you mentioned, 

    The limitation in EVM is because of phase noise. For lower frequencies as we use a divided LO phase noise in improved and hence EVM.

    may I realize as the EVM is limited by internal LO synthesizer, and there is no impact even if we use the disciplined OCXO as the reference clock and/or device clock? 

    As phase noise of the synthesizer is concerned, would you kindly reveal some specification for our information when designing the system ? 

    Thanks 

    Sincerely 

    H.A. 

  • Hi Vinod, 

    according to your comments and  

    Reference frequency impact is minimal and improving reference will not help much. You need to use external LO (at twice RF) limited to max 8000MHz for improving EVM further.

    and UG-992 

    , it seems AD937x could support 300~4000 MHz LO. 

    But in another paragraph in  the same page, 

    it points out the external LO could cover 600MHz~12GHz, e.g. 300MHz ~ 6 GHz. 

    Would your clear the conflict for us ? 

    thanks 

    Sincerely 

    H.A. 

  • Please refer to the information in the datasheet as below:

    Performance is guaranteed only till a LO of 4GHz.