Post Go back to editing

ADRV9026 Built In PRBS support

Category: Hardware
Product Number: ADRV9026

Hi,

I aa using a ADRV9026 transciever currently. I want to validate my gigabit lanes by conducting PRBS test. Following is my initialize sequence;

1. Init clock source that provides required sysref and clocks to adrv and fpga

2. Init adrv9026 with respect to sample application

3. Init fpga jesd204b support

4. init adrv9026 jesd204b

5. get link up

6. conduct two ways prbs test

I am following sequence given below to conduct prbs test from adrv to fpga but I see all data is zero reaching to fpga jesd204b core. I can not produce prbs9 and prbs23 datas but when I choose prbs7 I can see produced data. I am not sure about whether I skip any required step or my init sequence wrong. Thank you for your help in advance.

  • Can you please cross check with the sequence provided with the attached script and see if you are able to verify PRBS . Please let me know if you have any other questions.

    #################################################################################
    #GUI Version: 4.1.0.12
    #DLL Version: 4.1.0.6
    #Cmd Server Version: 4.1.0.6
    #FPGA Version: 0xD9000007
    #ARM Version: 4.1.0.3(ADI_ADRV9025_ARMBUILD_TESTOBJ)
    #StreamVersion: 7.1.0.2
    #################################################################################
    
    #Import Reference to the DLL
    import System
    import clr
    import time
    from System import Array
    clr.AddReferenceToFileAndPath("C:\\Program Files\\Analog Devices\\ADRV9025 Transceiver Evaluation Software_x64_FULL\\adrvtrx_dll.dll")
    #clr.AddReferenceToFileAndPath("C:\\Program Files (x86)\\Analog Devices\\ADRV9025 Transceiver Evaluation Software_x86_FULL\\adrvtrx_dll.dll")
    from adrv9010_dll import AdiEvaluationSystem
    from adrv9010_dll import Types
    from adrv9010_dll import Ad9528Types
    
    def spiRead(address):
        data = adrv9010.Hal.SpiByteRead(address, 0)
        print "SPI Read Address " + hex(address) + ": " + hex(data[1])
    
    def spiWrite(address, data):
        adrv9010.Hal.SpiByteWrite(address, data)
        print "SPI Write Address " + hex(address) + ": " + hex(data)
    
    #Create an Instance of the Class
    link = AdiEvaluationSystem.Instance	
    connect = False
    
    if (link.IsConnected() == False):
        connect = True
        link.platform.board.Client.Connect("192.168.1.145", 55556) 
        print "Connecting"
    
    if (link.IsConnected()):
        adrv9010 = link.Adrv9010Get(1)
        print "Connected"
        ##### YOUR CODE GOES HERE #####
    
            
        FrmTestDataCfg=Types.adi_adrv9010_FrmTestDataCfg_t()
        FrmTestDataCfg.framerSelMask=int(Types.adi_adrv9010_FramerSel_e.ADI_ADRV9010_FRAMER_0)
        print FrmTestDataCfg.framerSelMask
        FrmTestDataCfg.testDataSource=Types.adi_adrv9010_FramerDataSource_e.ADI_ADRV9010_FTD_PRBS7
        FrmTestDataCfg.injectPoint=Types.adi_adrv9010_FramerDataInjectPoint_e.ADI_ADRV9010_FTD_SERIALIZER
        adrv9010.DataInterface.FramerTestDataSet(FrmTestDataCfg)
        #Enable Deserializer
    	#If same PRBS order no error should be there
        link.platform.board.Fpga.Prbs.PrbsDeserializerEnable(0x3,0x1) #1:PRBS7;2:PRBS9;3:PRBS15;5:PRBS31
    	#If using different order error will be present
        #link.platform.board.Fpga.Prbs.PrbsDeserializerEnable(0xF,0x5) #1:PRBS7;2:PRBS9;3:PRBS15;5:PRBS31
        #clear PRBS error
        link.platform.board.Fpga.Prbs.PrbsErrorClear(0xF)
        #Read PRBS error
        adrv9010.DataInterface.FramerTestDataInjectError(Types.adi_adrv9010_FramerSel_e.ADI_ADRV9010_FRAMER_0,0xF)
        time.sleep(1)
        errCounts=Array[System.UInt32]([0,0,0,0,0,0,0,0])
        errCounts=link.platform.board.Fpga.Prbs.PrbsErrorCountsRead(errCounts)[1]
        errCounts=[int(data) for data in errCounts]
        print errCounts #[0,0,0,0,0,0,0,0]_0,0x0)
        time.sleep(1)
        
        errCounts=Array[System.UInt32]([0,0,0,0,0,0,0,0])
        errCounts=link.platform.board.Fpga.Prbs.PrbsErrorCountsRead(errCounts)[1]
        errCounts=[int(data) for data in errCounts]
        print errCounts #[0,0,0,0,0,0,0,0]
    
    else:
        print "Not Connected"
    
    if (connect):
        link.platform.board.Client.Disconnect()
        print "Disconnected"
    #################################################################################
    #GUI Version: 0.0.0.891
    #DLL Version: 0.0.0.813
    #Cmd Server Version: 2.0.0.9
    #FPGA Version: 0xD9000007
    #ARM Version: 0.0.0.471(ADI_ADRV9025_ARMBUILD_TESTOBJ)
    #StreamVersion: 0.0.0.71
    #################################################################################
    
    #Import Reference to the DLL
    import System
    import clr
    import time
    
    from System import Array
    clr.AddReferenceToFileAndPath("C:\\Program Files\\Analog Devices\\ADRV9025 Transceiver Evaluation Software_x64_FULL\\adrvtrx_dll.dll")
    #clr.AddReferenceToFileAndPath("C:\\Program Files (x86)\\Analog Devices\\ADRV9025 Transceiver Evaluation Software_x86_FULL\\adrvtrx_dll.dll")
    from adrv9010_dll import AdiEvaluationSystem
    from adrv9010_dll import Types
    from adrv9010_dll import Ad9528Types
    
    def spiRead(address):
        data = adrv9010.Hal.SpiByteRead(address, 0)
        print "SPI Read Address " + hex(address) + ": " + hex(data[1])
    
    def spiWrite(address, data):
        adrv9010.Hal.SpiByteWrite(address, data)
        print "SPI Write Address " + hex(address) + ": " + hex(data)
    
    #Create an Instance of the Class
    link = AdiEvaluationSystem.Instance	
    connect = False
    
    if (link.IsConnected() == False):
        connect = True
        link.platform.board.Client.Connect("192.168.1.10", 55556) 
        print "Connecting"
    
    if (link.IsConnected()):
        adrv9010 = link.Adrv9010Get(1)
        print "Connected"
        ##### YOUR CODE GOES HERE #####
        #######################################
        # step 1 :Configure the PRBS checker on FPGA
        #######################################
        channel_mask = 0xF            # D1:Lane0 D2:Lane1 D3:Lane2 D4:Lane3             
        polyorder = 1                 # 0:normal operation, 1:PRBS7, 2:PRBS9, 3:PRBS15, 4:PRBS23, 5:PRBS31
        link.platform.board.Fpga.Prbs.PrbsSerializerEnable(channel_mask,polyorder) 
    
        #######################################
        #step 2: Check deframer link status, link will be down 
        #######################################
        dfrmStatus = Types.adi_adrv9010_DeframerStatus_t()
        link.platform.board.Adrv9010Device.DataInterface.DeframerStatusGet(Types.adi_adrv9010_DeframerSel_e.ADI_ADRV9010_DEFRAMER_0,dfrmStatus)
        print "deframer status = ", hex(dfrmStatus.status)
    
        #######################################
        #step 3 : Configure the PRBS checker on Tokelau
        #######################################
        DFRMPRBS_cfg = Types.adi_adrv9010_DfrmPrbsCfg_t()
        DFRMPRBS_cfg.deframerSel = Types.adi_adrv9010_DeframerSel_e.ADI_ADRV9010_DEFRAMER_0
        DFRMPRBS_cfg.polyOrder = Types.adi_adrv9010_DeframerPrbsOrder_e.ADI_ADRV9010_PRBS7  # correction PRBS7 : PRBS7 , PRBS9:PRBS15 , PRBS15 : PRBS31
        DFRMPRBS_cfg.checkerLocation = Types.adi_adrv9010_DeframerPrbsCheckLoc_e.ADI_ADRV9010_PRBSCHECK_LANEDATA
    
        link.platform.board.Adrv9010Device.DataInterface.DfrmPrbsCheckerStateSet(DFRMPRBS_cfg)
    
        #######################################
        #step4: Read the error status and counters
        #######################################
        link.platform.board.Adrv9010Device.DataInterface.DfrmPrbsCountReset()                              
        errCnt = Types.adi_adrv9025_DfrmPrbsErrCounters_t()
        link.platform.board.Adrv9010Device.DataInterface.DfrmPrbsErrCountGet(errCnt)
        print "PRBS sample source =", errCnt.sampleSource
        print errCnt.getNumLanes()
        #error ststus flags D0 = Lane inverted, D1 = invalid data flag, D2 = sample/lane error flag 
        for i in range(0,errCnt.getNumLanes(),1):
            print "lane"+str(i)+'\t'+"error status = "+ hex(errCnt.errorStatus[i])+'\t' +"error count ="  + str(errCnt.laneErrors[i])
          
    if (connect):
        link.platform.board.Client.Disconnect()
        print "Disconnected"
    
    else:
        print "Not Connected"
    
    if (connect):
        link.platform.board.Client.Disconnect()
        print "Disconnected"

  • High, I am trying same sequence but I still cannot verify generated prbs on fpga at adrv prbschecker. Also I cannot generate prbs9 and prbs23 at adrv prbs generator. Can it be any bug related with these things. 

  • Is this still open? What is the latest update?