Other Parts Discussed in Thread: AFE7920
Hi Team,
I recently did an experiment with AFE7920EVM, where at the input of it's ADC A I bring 0 dBm signal @ 600 MHz, and then I measure the signal at the DAC A output.
DAC A NCO frequency is set to 2245 MHz.
Weirdly, I recorded at the output a signal that is slightly higher than what input is providing (0.82 dBm).
To be sure, I also measured input of the ADC A, and with all the cable and connector losses, input signal RF power adds up to -0.1 dBm (i.e., loss of 0.1 dB).
I wanted to know if the DSAs on-board AFE7920 can actually provide in anyway an active gain, or did I somehow miss anything.
If not DSA, could you provide any insight on what could cause more power on output than on input?
Please find attached bellow the code I used for this.
Kind regards,
Željko
Step 0 -> initialization and setup
########## AFE79xx mandatory initialization procedure ##########
# Clear previous sessions:
mainWindow.clearSession()
base_directory = "C:\\Users\\laboadmin\\Documents\\Texas Instruments\\Afe79xxLatte\\projects\\AFE79xx\\digitalBoardVLBI_flex\\"
# Initialize AFE board:
mainWindow.runFile(base_directory + r"setup.py")
mainWindow.runFile(base_directory + r"devInit.py")
# Perform device reset:
AFE.deviceSoftReset()
info('')
info('************************************************************')
info(' Mandatory AFE initialization complete')
info('************************************************************')
info('')
Step 1 -> parameter selection
########## General settings: ##########
# VLBI Tx frequency plan details:
custom_clk = 3 # Pick AFE frequency plan scenario.
enableAnalogRepeater = True # Enable/disable AFE in analog loopback configuration (DACs transmitting from ADCs).
dualLanePerSignal = False # Pick 2 lanes (True) or 4 lanes (False) to transmit signal via JESD lines.
enableAdcDacSync = True # Enable sync signal between ADCs and DACs and FPGA by disabling LVDS sync that fixes GPIO pins.
ADCenable = { "A": 1, # Select which ADCs are enabled during AFE operation.
"B": 1,
"C": 1,
"D": 1}
enableTxRxScrambling = True
setTxRxFbK = 16
separateLinks = False
jesdSystemMode = [3, 3]
enableMux = {'Tx': False, 'Rx': False}
useSpiSysref = True # Enable (when debugging)/disable (in real operation) internal SYSREF signal.
Fnco_tx1 = 2245.0
Fnco_tx4 = 6812.5
ncoFreqModes = ["1KHz", "FCW"]
syncLoopBack = bool(1-enableAnalogRepeater)
jesdLoopbackEn = bool(enableAnalogRepeater)
enableLVDSsync = bool(1-enableAdcDacSync)
fbJesdTxSyncMux = 3 if enableLVDSsync else 1
gpioMapping = { 'H8': 'ADC_SYNC0',
'H7': 'DAC_SYNC0',
'N8': 'ADC_SYNC2',
'N7': 'ADC_SYNC3',
'H9': 'ADC_SYNC1',
'G9': 'DAC_SYNC1',
'N9': 'DAC_SYNC2',
'P9': 'DAC_SYNC3',
'P14': 'GLOBAL_PDN',
'K14': 'FBABTDD',
'R6': 'FBCDTDD',
'H15': ['TXATDD','TXBTDD'],
'V5': ['TXCTDD','TXDTDD'],
'E7': ['RXATDD','RXBTDD'],
'R15': ['RXCTDD','RXDTDD']}
if custom_clk == 0:
# TI template configuration at TI clock reference
f0 = 122.88
Nrx = 24
Nddc = 6
Ntx = 4
NFRef = 4
NfpgaRefClk = 1#2
NinputClk = 8#12
LMFSHdTx = ['44210', '44210', '44210', '44210']
warning("TI reference design selected! Make sure FPGA and clock reference are properly set up")
elif custom_clk == 3:
# Forked VLBI setup
f0 = 122.76
Nrx = 24
Nddc = 6
Ntx = 4
NFRef = 1
NfpgaRefClk = 1
NinputClk = 1
Nlanes = '2' if dualLanePerSignal else '4'
Nconv = Nlanes
LMFSHdTx = [Nlanes+Nconv+'210']*4
if custom_clk != 0: warning("Custom configuration selected! Make sure FPGA and external clock reference are properly connected and set up")
LMFSHdRx = LMFSHdTx
LMFSHdFb = ['22210', '22210']
Nduc = Nddc*Ntx
info('Tx & Rx LMFSHd settings: '+LMFSHdTx[0])
info('')
info('------------------------------------------------------------')
info('User configuration:')
if enableAnalogRepeater:
info(' Analog repeater')
else:
info(' Digital repeater')
if enableAdcDacSync:
info(' LVDS sync disabled - ADC and DAC sync enabled')
else:
info(' LVDS sync enabled - ADC and DAC sync disabled')
if custom_clk:
info(' External clock reference used: '+str(f0)+'MHz')
else:
info(' Internal AFE clock reference used: '+str(f0)+'MHz')
info('------------------------------------------------------------')
info('')
info('************************************************************')
info(' User parametrization complete')
info('************************************************************')
info('')
Step 2 -> AFE setup
########## AFE79xx analog front-end setup ##########
# AFE general settings
AFE.systemStatus.loadTrims = 1
setupParams.skipFpga = 1
setupParams.fpgaRefClk = f0*NfpgaRefClk
sysParams = AFE.systemParams
sysParams.__init__()
sysParams.chipVersion = chipVersion
sysParams.FRef = f0*NFRef
##sysParams.executeLinkUpSequenceSeparately = separateLinks
########## Analog settings: AFE 79XX EVM ##########
# General system settings
sysParams.RRFMode = 0
sysParams.modeTdd = 0
##sysParams.adcSelect0 = [0, 1, 2]
##sysParams.adcSelect1 = [0, 1, 2]
sysParams.useSpiSysref = useSpiSysref
##sysParams.sysrefTermination = 0
sysParams.ncoFreqMode = ncoFreqModes[custom_clk != 0]
sysParams.spiMode = 1
# ADC settings
sysParams.FadcRx = f0*Nrx
info('ADC sampling rate: '+str(sysParams.FadcRx)+'MHz')
sysParams.rxEnable = [ ADCenable["A"],
ADCenable["B"],
ADCenable["C"],
ADCenable["D"]]
sysParams.externalClockRx = 0
##sysParams.halfRateModeRx = [0, 0]
sysParams.ddcFactorRx = [Nddc]*4
info('ADC down-conversion factors: '+str(sysParams.ddcFactorRx))
sysParams.numBandsRx = [0]*4
##sysParams.numRxNCO = 1
##sysParams.ncoRxMode = [0, 0]
##sysParams.broadcastRxNcoSel = 0
sysParams.rxNco0 = [[600.0]*2,
[600.0]*2,
[600.0]*2,
[600.0]*2]
info('ADC NCOs: '+str(sysParams.rxNco0[0][0])+'MHz, '+str(sysParams.rxNco0[1][0])+'MHz, '+str(sysParams.rxNco0[2][0])+'MHz, '+str(sysParams.rxNco0[3][0])+'MHz')
# FB settings
sysParams.FadcFb = sysParams.FadcRx
info('FB ADC sampling rate: '+str(sysParams.FadcFb)+'MHz')
sysParams.fbEnable = [0, 0]
##sysParams.halfRateModeFb = [0, 0]
sysParams.ddcFactorFb = [Nddc]*2
info('FB ADC down-conversion factors: '+str(sysParams.ddcFactorFb))
sysParams.numBandsFb = [0, 0]
##sysParams.numFbNCO = 1
##sysParams.ncoFbMode = 0
sysParams.fbNco0 = [1000, 1000]
sysParams.fbNco1 = [1000, 1000]
sysParams.fbNco2 = [1000, 1000]
sysParams.fbNco3 = [1000, 1000]
info('FB ADC NCOs: '+str(sysParams.fbNco0[0])+'MHz, '+str(sysParams.fbNco1[0])+'MHz')
# DAC settings
# AFE7920 DAC sampling rate must fall into one of the following frequency ranges (due to pll restrictions): [7.2 GHz, 7.68 GHz] or [8.8 GHz, 9.1 GHz] or [9.7 GHz, 10.24 GHz] or [11.6 GHz, 12.08 GHz]
sysParams.Fdac = sysParams.FadcRx*Ntx
info('DAC sampling rate: '+str(sysParams.Fdac)+'MHz')
sysParams.txEnable = [1, 1, 1, 1]
sysParams.externalClockTx = 0
##sysParams.halfRateModeTx = [0, 0]
sysParams.ducFactorTx = [Nduc]*4
info('DAC up-conversion factors: '+str(sysParams.ducFactorTx))
sysParams.numBandsTx = [0, 0, 0, 0]
##sysParams.numTxNCO = 1
##sysParams.combineDucMode = [0, 0]
sysParams.enableDacInterleavedMode = 0
##sysParams.ncoTxMode = [0, 0]
##sysParams.broadcastTxNcoSel = 0
sysParams.txNco0 = [[Fnco_tx1]*2,
[5020.0]*2,
[8212.5]*2,
[Fnco_tx4]*2]
info('DAC NCOs: '+str(sysParams.txNco0[0][0])+'MHz, '+str(sysParams.txNco0[1][0])+'MHz, '+str(sysParams.txNco0[2][0])+'MHz, '+str(sysParams.txNco0[3][0])+'MHz')
info('')
info('************************************************************')
info(' Analog front end setup complete')
info('************************************************************')
info('')
Step 3 -> JESD setup
########## AFE79xx EVM JESD204b settings ##########
sysParams.topLevelSystemMode = 'StaticTDDMode'
sysParams.jesdSystemMode = jesdSystemMode
sysParams.serdesFirmware = 1
sysParams.jesdABLvdsSync = enableLVDSsync
sysParams.jesdCDLvdsSync = enableLVDSsync
sysParams.syncLoopBack = syncLoopBack
sysParams.jesdLoopbackEn = jesdLoopbackEn
sysParams.LMFSHdRx = LMFSHdRx
sysParams.jesdRxProtocol = [0]*2
sysParams.jesdRxLaneMux = [0, 1, 2, 3, 4, 5, 6, 7]
sysParams.jesdRxRbd = [4]*2
sysParams.rxJesdTxScr = [enableTxRxScrambling]*4
sysParams.rxJesdTxK = [setTxRxFbK]*4
##sysParams.rxJesdTxSyncMux = [0]*4
##sysParams.rxDataMux = [0, 1, 2, 3, 4, 5, 6, 7]
##sysParams.serdesRxLanePolarity = [0]*8
##sysParams.adcDataMuxEn = enableMux['Tx']
sysParams.LMFSHdFb = LMFSHdFb
sysParams.fbJesdTxScr = [enableTxRxScrambling]*2
sysParams.fbJesdTxK = [setTxRxFbK]*2
##sysParams.fbJesdTxSyncMux = [fbJesdTxSyncMux, fbJesdTxSyncMux]
##sysParams.fbDataMux = [0, 1]
sysParams.LMFSHdTx = LMFSHdTx
sysParams.jesdTxProtocol = [0]*2
sysParams.jesdTxLaneMux = [0, 1, 2, 3, 4, 5, 6, 7]
#sysParams.jesdTxRbd = [4, 4]
sysParams.jesdRxScr = [enableTxRxScrambling]*4
sysParams.jesdRxK = [setTxRxFbK]*4
##sysParams.jesdRxSyncMux = [0]*4
##sysParams.txDataMux = [0, 1, 2, 3, 4, 5, 6, 7]
##sysParams.serdesTxLanePolarity = [0]*8
##sysParams.dacDataMuxEn = enableMux['Rx']
#sysParams.serdesTxPreCursor = [6, 6, 6, 6, 6, 6, 6, 6]
#sysParams.serdesTxPostCursor = [0, 0, 0, 0, 0, 0, 0, 0]
#sysParams.serdesTxMainCursor = [3, 0, 0, 0, 0, 0, 0, 3]
##sysParams.setIlaParams = 1
##sysParams.jesdTxIlaM = [8, 8, 2, 8, 8, 2]
##sysParams.jesdTxIlaLid = [0, 1, 2, 3, 4, 5, 6, 7]
##sysParams.jesdTxIlaL = [4, 4, 2, 4, 4, 2]
########## Remap AFE pins to adjust for the FW/FPGA design ##########
sysParams.gpioMapping = gpioMapping
info('')
info('************************************************************')
info(' JESD setup complete')
info('************************************************************')
info('')
Step 4 -> LMK setup
########## Clock distribution mode and LMK setup ##########
lmkParams.pllEn = (custom_clk == 0)
lmkParams.inputClk = f0*NinputClk
lmkParams.lmkFrefClk = True
lmkParams.lmkPulseSysrefMode = False
lmk.rawWriteLogEn = 1
lmk.logEn = 1
logDumpInst.setFileName(ASTERIX_DIR+DEVICES_DIR+r"\Afe79xxPg1.txt")
logDumpInst.logFormat = 0x01
logDumpInst.rewriteFile = 1
logDumpInst.rewriteFileFormat4 = 1
device.optimizeWrites = 0
device.rawWriteLogEn = 1
device.delay_time = 0
setupParams.skipLmk = False
AFE.initializeConfig()
lmkParams.sysrefFreq = AFE.systemStatus.sysrefFreq
AFE.LMK.lmkConfig()
# Force Latte to program the LMK outputs (relevant to the FPGA) in bypass/distribution mode when external reference clock is applied:
if custom_clk != 0:
lmk.head.page.DCLK0_SDCLK1_controls.Analog_Dig_Delay.dclk_mux_lt_1_0_gt_ = 2
lmk.head.page.DCLK8_SDCLK9_controls.Analog_Dig_Delay.dclk_mux_lt_1_0_gt_ = 2
lmk.head.page.DCLK8_SDCLK9_controls.Analog_Dig_Delay.sdclk_mux = 1
lmk.head.page.DCLK12_SDCLK13_controls.Analog_Dig_Delay.dclk_mux_lt_1_0_gt_ = 2
setupParams.skipLmk = True
info('')
info('************************************************************')
info(' LMK setup complete')
info('************************************************************')
info('')
Step 5 -> AFE7920 bringup
########## AFE79xx device bring-up ##########
AFE.deviceBringup()
AFE.TOP.overrideTdd(15, 3, 15)
#AFE.TOP.overrideTdd(15, 0, 15)
info('')
info('************************************************************')
info(' AFE bringup complete')
info('************************************************************')
info('')