## 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 中运行以下行: