## sigSource2.frequency = 5.0e9
## sigSource2.amplitude = 10
## sigSource2.on = True
## LmkClkSrc.frequency = 1.0e9
## LmkClkSrc.amplitude = 10
## LmkClkSrc.on = True
sysParams=AFE.systemParams
sysParams.__init__();sysParams.chipVersion=chipVersion
setupParams.skipFpga = 1
sysParams = AFE.systemParams
setupParams.fpgaRefClk = 250
AFE.systemStatus.loadTrims = 1
sysParams.FRef = 5000
sysParams.FadcRx = 2500
sysParams.FadcFb = 2500
sysParams.Fdac = 2500*2
sysParams.rxEnable = [True]*4
sysParams.txEnable = [True]*4
sysParams.fbEnable = [False]*2
sysParams.externalClockTx = True
sysParams.externalClockRx = True
sysParams.enableDacInterleavedMode = False #DAC interleave mode to save power consumption. Fs/2 - Fin spur occurs
sysParams.modeTdd = 0
# 0- Single TDD Pin for all Channels
# 1- Separate Control for 2T/2R/1F
# 2- Separate Control for 1T/1R/1F
sysParams.RRFMode = 0 #4T4R2F FDD mode
sysParams.jesdSystemMode = [1,1]
#SystemMode 0: 2R1F-FDD ; rx1-rx2-fb-fb
#SystemMode 1: 1R1F-FDD ; rx1-rx1-fb-fb
#SystemMode 2: 2R-FDD ; rx1-rx1-rx2-rx2
#SystemMode 3: 1R ; rx1-rx1-rx1-rx1
#SystemMode 4: 1F ; fb-fb-fb-fb
#SystemMode 5: 1R1F-TDD ; rx1/fb-rx1/fb-rx1/fb-rx1/fb
#SystemMode 8: 1R1F-TDD 1R-FDD (FB-2Lanes)(RX1 RX2 interchanged) ; rx2/fb-rx2/fb-rx1-rx1
sysParams.jesdLoopbackEn = 0 #Make it 1 to Enable the JESDTX to JESDRX internal loopback
sysParams.LMFSHdRx = ['181610']*4
# The 2nd and 4th are valid only for jesdSystemMode values in (2,6,7,8). For other modes, select 4 converter modes for 1st and 3rd.
sysParams.LMFSHdFb = ['24410']*4
sysParams.LMFSHdTx = ['14810']*4
sysParams.jesdTxProtocol = [0,0]
sysParams.jesdRxProtocol = [0,0]
sysParams.serdesFirmware = True # If you want to lead any firmware, please speify the path here. Otherwise it will not write any firmware
#sysParams.jesdTxLaneMux = [0,1,2,3,4,5,6,7] #orj
sysParams.jesdTxLaneMux = [0,1,2,3,4,5,6,7] #OUR CONFIGURATION STx1 and SRx5 & SRx6
# Enter which lanes you want in each location.
# Note that across 2T Mux is not possible in 0.5.
# For example, if you want to exchange the first two lines of each 2T, this should be [[1,0,2,3],[5,4,6,7]]
#sysParams.jesdRxLaneMux = [0,4,2,3,1,5,6,7] #orj
sysParams.jesdRxLaneMux = [4,1,2,3,5,0,6,7] #OUR CONFIGURATION STx1 and SRx5 & SRx6
# Enter which lanes you want in each location.
# Note that across 2R Mux is not possible in 0.5.
# For example, if you want to exchange the first two lines of each 2R, this should be [[1,0,2,3],[5,4,6,7]]
sysParams.jesdRxRbd = [3, 3]
sysParams.rxJesdTxScr = [True,True,True,True]
sysParams.fbJesdTxScr = [True,True]
sysParams.jesdRxScr = [True,True,True,True]
sysParams.rxJesdTxK = [4]*4
sysParams.fbJesdTxK = [4]*2
sysParams.jesdRxK = [4]*4
sysParams.ncoFreqMode = "FCW"
sysParams.txNco0 = [[3100,2800], #Band0, Band1 for TxA for NCO0
[3100,2800], #Band0, Band1 for TxB for NCO0
[3100,2800], #Band0, Band1 for TxC for NCO0
[3100,2800]] #Band0, Band1 for TxD for NCO0
sysParams.rxNco0 = [[3100,2800], #Band0, Band1 for RxA for NCO0
[3100,2800], #Band0, Band1 for RxB for NCO0
[3100,2800], #Band0, Band1 for RxC for NCO0
[3100,2800]] #Band0, Band1 for RxD for NCO0
sysParams.fbNco0 = [3100,2800] #FBA, FBC for NCO0
sysParams.fbNco1 = [3100,2800] #FBA, FBC for NCO1
sysParams.fbNco2 = [3100,2800] #FBA, FBC for NCO2
sysParams.fbNco3 = [3100,2800] #FBA, FBC for NCO3
sysParams.numBandsRx = [0]*4 # 0 for single, 1 for dual
sysParams.numBandsFb = [0,0]
sysParams.numBandsTx = [0,0,0,0]
sysParams.ddcFactorRx = [40]*4 # DDC decimation factor for RX A, B, C and D
sysParams.ddcFactorFb = [10]*2
sysParams.ducFactorTx = [40]*4
## The following parameters sets up the LMK04828 clocking schemes
lmkParams.pllEn = False#True#
lmkParams.inputClk = 1000#1000 di
lmkParams.sysrefFreq = 2500./768
lmkParams.lmkFrefClk = False
## The following parameters sets up the register and macro dumps
logDumpInst.setFileName(ASTERIX_DIR+DEVICES_DIR+r"\Afe79xxPg1.txt")
logDumpInst.logFormat = 0x01
logDumpInst.rewriteFile = 1
logDumpInst.rewriteFileFormat4 = 1
device.optimizeWrites = 0
device.rawWriteLogEn = 1
## The following parameters sets up the SYNCIN and SYNCOUT to interface with the TSW14J57
sysParams.jesdABLvdsSync = 1
sysParams.jesdCDLvdsSync = 1
sysParams.rxJesdTxSyncMux = [0,0,0,0]
sysParams.fbJesdTxSyncMux = [0,0]
sysParams.jesdRxSyncMux = [0,0,0,0] #[0,0,1,1]
sysParams.syncLoopBack = True
# ## The following parameters sets up the AGC
# sysParams.agcParams[0].agcMode = 1 ##internal AGC
# sysParams.agcParams[0].gpioRstEnable = 0 ##disable GPIO based reset to AGC detector
# sysParams.agcParams[0].atken = [0, 1, 0] ##enable big and small step attack
# sysParams.agcParams[0].decayen = [0,1,0] ##enable big and small step decay
# sysParams.agcParams[0].atksize = [2,1,0] ## bigs step = 2dB, small step = 1dB
# sysParams.agcParams[0].decaysize = [2,1,0] ##big step = 2dB, small step = 1dB
# sysParams.agcParams[0].atkthreshold = [-1, -2, -14] ##attack threshold
# sysParams.agcParams[0].decaythreshold = [-14, -6, -20] ##decay threshold
# sysParams.agcParams[0].atkwinlength = [170, 170] ## detector time constant expressed inn absolute time in ns.
# sysParams.agcParams[0].decaywinlength = 87380 ##detector time constant expressed in absolute time in ns. All detectors use the same value for decay time constant
# sysParams.agcParams[0].atkNumHitsAbs = [8,8] ##absolute number of times signal crosses threshold. These crossing are with respect to the FADC/8 clock
# sysParams.agcParams[0].decayNumHitsAbs = [100,100] ##absolute number of times signal crosses threshold. These crossing are with respect to the FADC/8 clock
# sysParams.agcParams[0].minDsaAttn = 0 ##minimum DSA attenuation used by AGC
# sysParams.agcParams[0].maxDsaAttn = 22 ##maximum DSA attenuation used by AGC
# sysParams.agcParams[0].totalGainRange = 22 ##total gain range used by ALC for gain compensation
# sysParams.agcParams[0].minAttnAlc = 0 ##minimum attenuation used by ALC for compensation when useMinAttnAgc = 0
# sysParams.agcParams[0].useMinAttnAgc = 1 ##enable ALC to use minimum attenuation from AGC for which compensation is required.
# sysParams.agcParams[0].alcEn = 1
# sysParams.agcParams[0].alcMode = 0 ##floating point DGC
# sysParams.agcParams[0].fltPtMode = 0 ##if exponent > 0, dont send MSB
# sysParams.agcParams[0].fltPtFmt = 1 ##3 bit exponent
## The following parameters sets up the GPIOs
sysParams.gpioMapping={
'H8': 'ADC_SYNC0',
'H7': 'ADC_SYNC1',
'N8': 'ADC_SYNC2',
'N7': 'ADC_SYNC3',
'H9': 'DAC_SYNC2',
'G9': 'DAC_SYNC3',
'N9': 'DAC_SYNC0',
'P9': 'DAC_SYNC1',
'P14': 'GLOBAL_PDN',
'K14': 'FBABTDD',
'R6': 'FBCDTDD',
'H15': ['TXATDD','TXBTDD'],
'V5': ['TXCTDD','TXDTDD'],
'E7': ['RXATDD','RXBTDD'],
'R15': ['RXCTDD','RXDTDD']}
#AFE.systemParams.papParams[0]['enable'] = True
#AFE.systemParams.papParams[1]['enable'] = True
#AFE.systemParams.papParams[2]['enable'] = True
#AFE.systemParams.papParams[3]['enable'] = True
device.delay_time = 0
## Initiates LMK04828 and AFE79xx Bring-up
AFE.deviceBringup()
AFE.TOP.overrideTdd(15,3,15)
设计概述
该系统具有与 AFE7900进行通信的双链路10Gbps 通道速率和 LMFS=14810通道配置。 对于本规范、FPGA 设计有两个 Xilinx RX JESD204 IP、两个 Xilinx TX JESD204 IP 和两个 JESD204 PHY、用于16个 AFE。 图1显示了 设计中的 FPGA-AFE 连接。 SYSREF 由 FPGA 创建、FPGA 具有与 AFE REFCLK 相同的时钟域。

图1 - AFE-FPGA 连接方案
问题
1) 1) 我们正在使用通过 Latte Python 脚本创建的配置集 和我们在前面提到的设计、对 FPGA 进行开发。 在我们的测试期间、我们没有稳定的链路。 有时我们可以看到某些 AFE 的 SYNC_IN 和 SYNC_OUT 信号为高电平、但我们大部分时间都看不到。 下面介绍了一些 SPI 错误。 这些错误的含义是什么? 我们可以做什么来调试和修复这些错误?
我们有7个错误。 其中1个来自 ADC JESD 寄存器页面、其他来自 DAC JESD 寄存器页面(3个来自 DAC AB 页面、3个来自 DAC CD 页面)
ADC JESD 寄存器映射
- 寄存器12Ch 预计为0x08、但具有0xF7。 此寄存器的含义是什么?为什么会出现此错误?

DAC JESD 寄存器映射 (AB 页和 CD 页)
此页面上有3+3错误、如下所示。 为什么我们会遇到这些错误,我们可以如何修复这些错误?
- 寄存器 A2h、预期值为0x02、但我们得到的是0x00。

- 寄存器11CH、预期值为0x00、我们得到0x00、但在此地址出现错误。 我们不知道为什么、但原因可以是超时的。

- 寄存器 EEh、预期值为0x01、但得到了0x00。

2) 2) 我们向 TI 提出了以下问题、他们回答如下。 我们尝试使用恒定测试模式(使用 DAC JESD 页面中的 B7h)测试 DAC。 但我们已经看到、只有可以同步的 AFE 可以输出信号。 由于我们没有稳定链路、因此无法以这种方式执行正确的测试。 执行此测试是否需要同步 AFE? 下面分享了我们的测试模式。
测试图案:
寄存器18 -> 00
寄存器15 -> 00
寄存器16 -> 04
寄存器 B7 -> 01
寄存器16 -> 08
寄存器 B7 -> 01
我们的问题和 TI 的回复在下方分享。
问:我们怀疑电路板的时钟源、所以我们要检查一下。 我们的电路板具有5GHz 时钟源(信号发生器)。 我们使用频谱分析仪检查此时钟、时钟源似乎正常。 但是、当我在 JESD_SUBCHIP 页面上读取寄存器0x15F 时、AFE 返回0x03。 指示 SerdesAB 和 SerdesCD PLL 失锁的寄存器。 我们应该如何理解这一点呢? 是否设置了任何 SPI 寄存器和/或命令来决定时钟源是否正常?
DC:使用外部时钟时、我们没有可读取的寄存器来检查时钟是否存在。 可以完成的一项操作是将 AFE DAC 通道编程为恒定输出测试模式。 这种模式将使 DAC 能够仅输出 NCO 频率、而不管其接收的数据如何。 如果 DAC 输出在此模式下看起来良好、那么我们可以验证 AFE 是否正在接收外部时钟。 要将 AFE 置于此模式、您可以在 Latte 中运行以下行: