主题中讨论的其他器件: AFE7950EVM
大家好、
在我的设置中(正弦信号发生器连接到 AFE7920EVM 的 ADC A、Kintex 7 FPGA+AFE7920EVM、外部时钟参考为163.68MHz、AFE7920EVM A 和 B DAC 输出连接到频谱分析仪)、AFE79xx 软件(最新的 Latte 软件迭代)产生了一些错误。
设置的启动过程分6步进行(请参阅本文底部的脚本)、如下所示:
- 第0步-运行强制的 AFE79xx 脚本(setup.py 和 devInit.py)
- 第1步-定义系统属性(外部时钟频率、NCO 频率等)并存储在局部变量中
- 步骤2 -应用用户选择的射频 AFE 属性
- 第3步-应用用户设置的 JESD AFE 属性
- 第4步-应用用户设置的 LMK 设置
- 步骤5 -按照 AFE7920EVM TI 安全文件夹中的参考设计文档所述初始化 FPGA (在适用于 Latte 的 Python 中没有专用脚本、这在 Vivado 中手动完成)
- 这里还确认 FPGA 中的 PLL 时钟存在
- FPGA 确认复位后有高 Rx 同步信号
- FPGA 确认复位后有高 Tx 同步信号(值 f 对应于来自 AFE 的4个同步、均为高值)、但在下一步调用 AFE.deviceBringup ()后、该值更改为较低的一个(值 c、对应于来自 AFE 的2个高同步和2个低同步)
- FPGA 通过 JESD 向 AFE DAC 发送 BOC 信号
- 步骤6 -执行 AFE 启动、然后调用 AFE.TOP.overrideTdd (15、3、15)
~30-40s 后、因错误(如下所示的日志)中断步骤6。
在频谱分析仪上、我看到 DAC A 和 B 在出现错误(可能是由于我们收到的 JESD 错误)后发送无效数据。
为了确保 AFE 和 FPGA 之间存在某种通信、我将重复步骤0-5的过程、而不是步骤6、我从 ADC 向 FPGA 发送斜坡信号、并斜坡到 DAC 输出。
通过读取 FPGA 中传入 ADC 数据的内容、我们可以看到类似斜坡的样本值(相邻样本按 AFE.JEST.ADCJESD[topNr].adcRampTestPattern (chnnlNo、TxRampEnable、rampStepSize-1)中指定的值递增)、这可以确认 FPGA 可以获取 ADC 数据(不过仍然没有外部正弦波)。 不过、ADC 斜坡在 FPGA 中似乎有点错位、但这可能是 FPGA 延迟对齐导致的(希望不是 Latte 脚本引起的问题)。
另一方面、频谱分析仪可确认 DAC A 和 B 输出端类似斜坡的频谱、这一情况也很好。 AFE 似乎可以发送数据并可以将接收到的数据从 JESD Rx 传播到 DAC、但由于我们看到的错误、它无法通过 JESD 接口从 FPGA 接收数据。
您能对此提供一些见解并帮助我们解决问题吗? 使这个设置正常工作对我们来说非常关键。
完整的 AFE79xx 软件日志记录如下所示:
工作区被清除
AFE79xxLibraryPG1p0
SPI -已创建 USB 仪器。
复位设备
清除
Kintex RegProgrammer - USB Instrument created。
Kintex RegProgrammer - USB Instrument created。
Kintex RegProgrammer - USB Instrument created。
##==================== 错误:0,警告:0=================== #
电源卡- USB 仪器已创建。
重置 FPGA、然后重试。
已加载的库
更新了 GUI
##==================== 错误:1,警告:0=================== #
**
强制 AFE 初始化完成
**
#DONE 正在执行... AFE79xx/bringup/AWS_step0_EVMsetup.py
#结束时间2023-03-16 12:23:08.208000
#执行时间= 28.9049999714 s
##==================== 错误:0,警告:0=================== #
#====
#正在执行.. AFE79xx/bringup/AWS_step1_ParsDefine.py
#开始时间2023-03-16 12:23:19.864000
TX 和 RX LMFSHd 设置:44210
-------------------------------------------------------
用户配置:
中继器
禁用 X 带中的 DAC 采样
LVDS SYNC 禁用- ADC 和 DAC SYNC 启用
使用的外部时钟参考频率:163.68MHz
-------------------------------------------------------
**
用户参数化完成
**
#DONE 正在执行... AFE79xx/bringup/AWS_step1_ParsDefine.py
#结束时间2023-03-16 12:23:19.873000
#执行时间= 0.00899982452393 s
##==================== 错误:0,警告:0=================== #
#====
#正在执行.. AFE79xx/bringup/AWS_step2_AFEsetup.py
#开始时间2023-03-16 12:23:37.507000
ADC 采样率:1964.16MHz
ADC 降频转换因子:[6、6、6]
ADC NCO:500.0MHz、870.0MHz、637.5MHz、637.5MHz
FB ADC 采样率:1964.16MHz
FB ADC 降频转换因子:[6、6]
FB ADC NCO:1000MHz、1000MHz
DAC 采样率:5892.48MHz
DAC 上变频因子:[18、18、18]
DAC NCO:2245.0MHz、5020.0MHz、8212.5MHz、6812.5MHz
**
模拟前端设置完成
**
#DONE 正在执行... AFE79xx/bringup/AWS_step2_AFEsetup.py
#结束时间2023-03-16 12:23:37.517000
#执行时间= 0.009999046326秒
##==================== 错误:0,警告:0=================== #
#====
#正在执行.. AFE79xx/bringup/AWS_step3_JESDsetup.py
#Start time 2023-03-16 12:23:45.539000
**
JESD 设置完成
**
#DONE 正在执行... AFE79xx/bringup/AWS_step3_JESDsetup.py
#end time 2023-03-16 12:23:45.555000
#执行时间= 0.0160000324249秒
##==================== 错误:0,警告:0=================== #
#====
#正在执行.. AFE79xx/bringup/AWS_step4_LMKsetup.py
#开始时间2023-03-16 12:23:48.729000
外部 Sysref 频率应是一个整数因子:5.115MHz
2T2R1F 编号:0
有效配置:true
laneRateRx:6547.2.
laneRateFb:6547.2.
laneRateTx:6547.2.
2T2R1F 编号:1.
有效配置:true
laneRateRx:6547.2.
laneRateFb:6547.2.
laneRateTx:6547.2.
LMK 时钟分频器-器件寄存器复位。
LMK 时钟分频器-器件寄存器复位。
**
LMK 设置完成
**
#DONE 正在执行... AFE79xx/bringup/AWS_step4_LMKsetup.py
#结束时间2023-03-16 12:23:49.844000
#Execution time = 1.11500000954秒
##==================== 错误:0,警告:0=================== #
#====
#正在执行.. AFE79xx/bringup/AWS_step6_AFEbringup.py
#开始时间2023-03-16 12:24:36.659000
外部 Sysref 频率应是一个整数因子:5.115MHz
2T2R1F 编号:0
有效配置:true
laneRateRx:6547.2.
laneRateFb:6547.2.
laneRateTx:6547.2.
2T2R1F 编号:1.
有效配置:true
laneRateRx:6547.2.
laneRateFb:6547.2.
laneRateTx:6547.2.
已配置 LMK 和 FPGA。
donot_open_Atharv_full -器件寄存器复位。
芯片类型:0xA
芯片号:0x78
芯片版本:0x11
AFE 复位完成
熔丝组负载自动加载成功完成
无自动加载错误
熔丝组负载自动加载成功完成
无自动加载错误
//固件版本= 11000
//PG 版本= 1.
//发布日期[dd/mm/yy]= 10/7/19
patchSize=11697
//修补程序版本= 165
//PG 版本= 0
//发布日期[dd/mm/yy]= 27/11/21
AFE MCU 唤醒完成并加载补丁。
PLL 被锁定
AFE PLL 已配置。
已配置 AFE 串行器/解串器。
配置了 AFE 数字链。
已配置 AFE TX 模拟。
已配置 AFE RX 模拟。
已配置 AFE FB 模拟。
配置了 AFE JESD。
已配置 AFE AGC。
已配置 AFE GPIO。
Sysref 按预期读取
###################### 设备 DAC JESD-RX 0链路状态#######
通道0:1的 SERDES-FIFO 错误
通道0:1的帧同步错误(意外的 k28.5)
通道1:1的 SERDES-FIFO 错误
通道1:1的帧同步错误(意外的 k28.5)
通道2:1的 SERDES-FIFO 错误
通道2:1的帧同步错误(意外的 k28.5)
通道3:1的 SERDES-FIFO 错误
通道3:1的帧同步错误(意外的 k28.5)
lane0 Error=0b11001111;GOT 错误:8b/10b 分解错误;8b/10b 不在表中的代码错误;代码同步错误;弹性缓冲区匹配错误。 第一个 NO-/K/与"match _Ctrl"和"match _data"编程值不匹配;帧对齐错误;多帧对齐错误;
lane1 Error=0b11001111;GOT 错误:8b/10b 分解错误;8b/10b 不在表中的代码错误;代码同步错误;弹性缓冲区匹配错误。 第一个 NO-/K/与"match _Ctrl"和"match _data"编程值不匹配;帧对齐错误;多帧对齐错误;
Lane2 Errors=0b11001111;GOT 错误:8b/10b 分解错误;8b/10b 不在表中的代码错误;代码同步错误;弹性缓冲区匹配错误。 第一个 NO-/K/与"match _Ctrl"和"match _data"编程值不匹配;帧对齐错误;多帧对齐错误;
lane3 Error=0b11001111;GOT 错误:8b/10b 分解错误;8b/10b 不在表中的代码错误;代码同步错误;弹性缓冲区匹配错误。 第一个 NO-/K/与"match _Ctrl"和"match _data"编程值不匹配;帧对齐错误;多帧对齐错误;
CS State TX0: 0b00000000。 预计为0b10101010
FS 状态 TX0: 0b01010101。 预计为0b01010101
无法建立设备 RX 的链接:0;警报:0xcfcfcfcfcfcff000f000L
########################################################
###################### 设备 DAC JESD-RX 1链路状态##############
lane0 Error=0b1111;GOT 错误:8b/10b 分解错误;8b/10b 不在表中的代码错误;代码同步错误;弹性缓冲区匹配错误。 第一个 NO-/K/与"match_ctrl"和"match_data"编程值不匹配;
lane1 Error=0b0111;got errors: 8b/10b disparty 错误;8b/10b 不在表中的代码错误;代码同步错误;
Lane2 Error=0b0111;GOT errors: 8b/10b disparty 错误;8b/10b 不在表中的代码错误;代码同步错误;
lane3 Error=0b0111;got error:8b/10b disparty error;8b/10b 不在表中的代码错误;code synchronization error;
CS 状态 TX0:0b10101010。 预计为0b10101010
FS 状态 TX0: 0b01010101。 预计为0b01010101
无法为器件 RX 建立链路:1;警报:0x7070f00000000L
########################################################
AFE 配置完成
**
AFE 启动完成
**
#DONE 正在执行... AFE79xx/bringup/AWS_step6_AFEbringup.py
#结束时间2023-03-16 12:25:15.228000
#Execution time = 38.5690000057秒
##==================== 错误:18,警告:0=========== #
此致、
Zeljko.
步骤0脚本
########## Board initialization procedure ##########
mainWindow.clearSession()
base_directory = "C:\\Users\\laboadmin\\Documents\\Texas Instruments\\Afe79xxLatte\\projects\\AFE79xx\\bringup\\"
mainWindow.runFile(base_directory + r"setup.py")
mainWindow.runFile(base_directory + r"devInit.py")
info('')
info('************************************************************')
info(' Mandatory AFE initialization complete')
info('************************************************************')
info('')
步骤1脚本
########## General settings: ##########
# VLBI Tx frequency plan details:
custom_clk = 2 # Pick AFE scenario.
separate_runtime = 1 # Pick bringup staging scenario.
enableAnalogRepeater = False # Enable/disable AFE in analog loopback configuration (DACs transmitting from ADCs).
XbandEnable = False#True # Enable/disable DAC sampling rate in X band.
dualLanePerSignal = False#True # 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.
ncoFreqModes = ["1KHz", "FCW"]
Fnco_tx1 = 2245.0
Fnco_rx1 = 500.0
syncLoopBack = bool(1-enableAnalogRepeater)
jesdLoopbackEn = bool(enableAnalogRepeater)
enableLVDSsync = bool(1-enableAdcDacSync)
fbJesdTxSyncMux = 3 if enableLVDSsync else 1
if enableAnalogRepeater:
separate_runtime = 0
if custom_clk == 0:
# TI template configuration at different clock reference
f0 = 122.88
Nrx = 24
Nddc = 12
Ntx = 3
NFRef = 4
NfpgaRefClk = 2
NinputClk = 12
LMFSHdRx = ['24410', '24410', '24410', '24410']
LMFSHdFb = ['24410', '24410']
LMFSHdTx = ['24410', '24410', '24410', '24410']
jesdSystemMode = [3, 3]
elif (custom_clk == 1):
# Desired configuration with proper data rates, sampling rates, and bandwidths
f0 = 163.68
Nrx = 18
Nddc = 6
Ntx = 4
NFRef = 1
NfpgaRefClk = 1
NinputClk = 1
LMFSHdRx = ['22210', '22210', '22210', '22210']
LMFSHdFb = ['22210', '22210']
LMFSHdTx = ['22210', '22210', '22210', '22210']
jesdSystemMode = [3, 3]
elif custom_clk == 2:
# Symmetric JESD configuration
f0 = 163.68
Nrx = 12
Nddc = 6
NFRef = 1
NfpgaRefClk = 1
NinputClk = 1
LMFSHdFb = ['22210', '22210']
Ntx = 5 if XbandEnable else 3
Nlanes = '2' if dualLanePerSignal else '4'
Nconv = Nlanes
LMFSHdTx = [Nlanes+Nconv+'210']*4
LMFSHdRx = LMFSHdTx
jesdSystemMode = [3, 3]
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 XbandEnable:
info(' DAC sampling in X band enabled')
else:
info(' DAC sampling in X band disabled')
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('')
步骤2脚本
# AFE general settings
AFE.systemStatus.loadTrims = 1
setupParams.skipFpga = 1
setupParams.fpgaRefClk = f0*NfpgaRefClk
sysParams = AFE.systemParams
sysParams.FRef = f0*NFRef
########## 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 = 0
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 = [1, 1, 1, 1]
sysParams.externalClockRx = 0
sysParams.halfRateModeRx = [0, 0]
sysParams.ddcFactorRx = [Nddc, Nddc, Nddc, Nddc]
info('ADC down-conversion factors: '+str(sysParams.ddcFactorRx))
sysParams.numBandsRx = [0, 0, 0, 0]
sysParams.numRxNCO = 1
sysParams.ncoRxMode = [0, 0]
sysParams.broadcastRxNcoSel = 0
sysParams.rxNco0 = [ [Fnco_rx1, Fnco_rx1],
[870.0, 870.0],
[637.5, 637.5],
[637.5, 637.5]]
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')
sysParams.rxNco1 = [ [Fnco_rx1, Fnco_rx1],
[870.0, 870.0],
[637.5, 637.5],
[637.5, 637.5]]
# 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, Nddc]
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
# 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, Nduc, Nduc, Nduc]
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, Fnco_tx1],
[5020.0, 5020.0],
[8212.5, 8212.5],
[6812.5, 6812.5]]
sysParams.txNco1 = [ [Fnco_tx1, Fnco_tx1],
[5020.0, 5020.0],
[8212.5, 8212.5],
[6812.5, 6812.5]]
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('')
步骤3脚本
########## JESD204 settings AFE 79XX EVM ##########
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, 0]
sysParams.jesdRxLaneMux = [0, 1, 2, 3, 4, 5, 6, 7]
sysParams.jesdRxRbd = [4, 4]
sysParams.rxJesdTxScr = [1, 1, 1, 1]
sysParams.rxJesdTxK = [16, 16, 16, 16]
sysParams.rxJesdTxSyncMux = [0, 0, 0, 0]
sysParams.rxDataMux = [0, 1, 2, 3, 4, 5, 6, 7]
sysParams.serdesRxLanePolarity = [0, 0, 0, 0, 0, 0, 0, 0]
sysParams.adcDataMuxEn = 0
sysParams.LMFSHdFb = LMFSHdFb
sysParams.fbJesdTxScr = [1, 1]
sysParams.fbJesdTxK = [16, 16]
sysParams.fbJesdTxSyncMux = [fbJesdTxSyncMux, fbJesdTxSyncMux]
sysParams.fbDataMux = [0, 1]
sysParams.LMFSHdTx = LMFSHdTx
sysParams.jesdTxProtocol = [0, 0]
sysParams.jesdTxLaneMux = [0, 1, 2, 3, 4, 5, 6, 7]
#sysParams.jesdTxRbd = [4, 4]
sysParams.jesdRxScr = [1, 1, 1, 1]
sysParams.jesdRxK = [16, 16, 16, 16]
sysParams.jesdRxSyncMux = [0, 0, 0, 0]
sysParams.txDataMux = [0, 1, 2, 3, 4, 5, 6, 7]
sysParams.serdesTxLanePolarity = [0, 0, 0, 0, 0, 0, 0, 0]
#sysParams.dacDataMuxEn = 0
#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]
########## Dummy txt ##########
sysParams.gpioMapping={ 'H8': 'ADC_SYNC0',
'H7': 'ADC_SYNC1',
'N8': 'ADC_SYNC2',
'N7': 'ADC_SYNC3',
'H9': 'DAC_SYNC0',
'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']}
info('')
info('************************************************************')
info(' JESD setup complete')
info('************************************************************')
info('')
步骤4脚本
########## Clock distribution mode setting ##########
setupParams.skipLmk = 0
lmkParams.pllEn = (custom_clk == 0)
lmkParams.inputClk = f0*NinputClk
lmkParams.sysrefFreq = lmkParams.inputClk#f0*Nrx/1024
lmkParams.lmkFrefClk = 1
lmkParams.lmkPulseSysrefMode = 0
#AFE.systemStatus.sysrefFreq = lmkParams.inputClk
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
if separate_runtime == 1:
setupParams.skipLmk = False
AFE.initializeConfig()
lmkParams.sysrefFreq = AFE.systemStatus.sysrefFreq
lmkParams.lmkPulseSysrefMode = 0
AFE.LMK.lmkConfig()
# Force Latte to program the LMK outputs (relevant to the FPGA) in bypass/distribution mode
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.DCLK12_SDCLK13_controls.Analog_Dig_Delay.dclk_mux_lt_1_0_gt_=2
setupParams.skipLmk = True
info('')
info('************************************************************')
info(' LMK setup complete')
info('************************************************************')
info('')
步骤6脚本
AFE.deviceBringup()
AFE.TOP.overrideTdd(15,3,15)
info('')
info('************************************************************')
info(' AFE bringup complete')
info('************************************************************')
info('')