Post Go back to editing

No Output from TPL DAC IP core Channel

Category: Software
Product Number: AD9174
Software Version: Xilinx Vivado 2019.1

Hi,

I am using AD9174 DAC.I am trying to validate the entire data flow path from FPGA to AD9174, and observe the output signal using spectrum analyzer. I am trying to produce 1 GHz sine wave from DDS which is present inside the TPL DAC(dac_jesd204_transport) IP. JESD link is established successfully.

From the DAC device point of view, I have followed the Start-Up Sequence mentioned in the datasheet of AD9174, and using that I am enabling both the Main Datapath, and paging to both links as per sequence(Dual link). I am using the software driver code(of AD917x) provided by AD and using axi_dac_dds_set_frequency function. I am setting the required frequency I want to generate using DDS. I am using all the 8 channels since I want to generate dual tone per core.

With the above setup,I am able to observe sine wave peak in the analyzer for DAC1 core(channel B), However I am not getting any peak for DAC0 core(channel A), but just noise.We checked the Physical to Logical Lanes Mapping & found that it is set to default. When we tried to swap the lanes(0->4,1->5,2->6,3->7,4->0,5->1,6->2,7->3), then we were able to observe sine wave peak in DAC0 (channel A),but now not in DAC1. I was suspecting if the first 4 Physical lanes(0 to 3) are working properly or not. 

So we performed a few deterministic experiments, and found that all the Physical lanes were working properly.Next,I wanted to check the data coming out of fpga,and put chipscope(ILA) into the data lines coming out from Link,Transport,cpack & FIFO IP  of the AD RTL JESD Datapath for DAC.The 256 bits data bus is segregated into 16 bits each for the debug core so that it would be easy to debug & also to find out the I & Q data.I observed that there was data(sine wave) coming for pair of 16 bits & the corresponding pair of 16 bits was having some definitive pattern(may be a kind of sine wave) mixed with noise.

Also when I tried to read the tpl_dac channel register 0x400 to 0x5c0(since I have kept num_of_channels = 8 in software code), but I am getting read status(values) only for first 4 tpl_dac channels(0x400-0x4c0), & getting DEADEAD for 0x500 to 0x5co(which represents channel 4 to 8).I am not sure if the channels are disabled which is why I am not getting data on all the 256 bits.

In order to be sure if DDS is not working properly, we used axi_dac_load_custom_data (sine_lut_iq_array) function(provided in the AD driver code of AD917x), and feed it to DDR and through DMA tried to access that data and give it to DAC.We observed the same thing for this data too, so now we know that data is not coming out of fpga itself properly & since we have already got output on both the DAC channels(by swapping), so it seems the issue lies within the TPL IP core, & not with the chip.

I am not sure how the 256 bit data is concatenated or mapped to the xcvr(phy) layer and send out from FPGA.But I am able to get data for 128 bits & some noise for the remaining.Is the issue something to do with hdl branch repo or there might be any possible bug in the tpl_dac ip of this version.

Need some support & solution from the AD team on the same asap. 

HDL Repo branch: hdl_2019_r1

JESD Mode:8(Dual link)

Main path Interpolation = 12 (Bypass Channel datapath)

Using DAC Internal NCO.

Input clock = 3Ghz (Using DAC PLL converting to 12 GHz)

Ref_clk = 250 Mhz

lane rate = 10Gbps

Using SDK 2019.1

I have attached a few snapshot of the data I have observed.Each data represented is 16 bits.

1. DDS data observation for TPL output

2. .DDR DMA sine lut iq array data observation for TPL output

Regards,

Sourav

  • Hi Sourav,

    A few questions on this setup:

    1) Are you using an ad917x eval board?

    2) You say you want to "generate dual tone per core" -- do you mean 1 tone for each core (2 total tones) or do you mean two tones for each dac (4 total tones)? With mode 8 dual link you have M=2 for each core (i.e. one complex path), so you would only be able to have 1 tone coming out of each dac. 

    3) There are only 3 channels available per dac link, so I think by 8 channels you mean 8 lanes? Channels are bypassed in mode 8.

    4) Can you clarify your clock distribution? If the 3GHz input clock is fed directly to the DAC clkin pins then you are not using the HMC, correct? In the software the num_channels parameter is part of the hmc7044_init_param struct. If you are referring to another num_channels parameter can you point me to it? I don't think you should be setting channels to 8 anywhere. I suspect this may be part of the issue, if the JESD IP is set for 8 channels somehow, when in fact you should only be set for 2 channels (M=2) per link. 

    5) You should not be checking registers 0x500+, these are BIST registers. 0x400-0x40c are the received ILAS configuration parameters on lane 0. In dual link, the ILAS configuration parameters are the same for both links. 0x40d-0x446 are lane ID, checksum received, and checksum computed per lane, and 0x450-0x45c are the local ILS copies based on your programmed jesd configuration that are used for the computed checksum (checked against received checksum from the link). When you say the jesd link is established successfully that should mean that CGS, FS, ILS, and checksum pass for all 8 lanes in use, i.e. you see all 1s in 0x470 (CGS), 0x471 (FS), 0x472 (CS), and 0x473 (ILS). Is this the case? If so, then all 8 lanes on the dac side are receiving the expected information from the FPGA. However that seems to not be what you're seeing?

    If you are using the no-OS code can you send me your jesd204_tx_init struct values? You should have converters_per_device = 2, for M=2 in mode 8 for each link.

    Thanks,

    KB

  • 1.We are using custom board having AD9174  on it.

    2. Dual tone as per software it says I & Q per core will have 2 tones so total 4 tones from each DAC core output.I have attached the snap of that portion, can you help me to know how many time we should call based on the jesd mode we r using.When you say 1 tone coming out of each DAC, it will basically combine the I & Q tones & send it out of DAC as one..did u meant this? 

    3. As per the sw code,struct axi_dac_init tx_dac_init function have used num_channels = 8, based on the snap, so my assumption was we have 1 I & Q per DAC core(M=2), so if we generate dual tones then for both the DAC cores,I have to use num_of_ch parameter = 8, so I didn't changed it.I didn't meant 8 lanes as channels.Yes We are bypassing channels.

    4. We are using HMC7044 to feed 3G input clock & using internal DAC PLL we are obtaining 12G.axi_dac_init tx_dac_init function has a parameter num_channels. We are calling axi_dac_channel channel_data[8] function in array to generate dual tones.

    5.Ok,so u mean reg 0x400 to 0x4c0 will only be available, which points to first 4 channel related register of DAC TPL core.We are getting 0F on the above mentioned reg(0x470,0x471,0x472,0x473).We are getting the status as 0F from lanes 0-3, since we are using dual link so per link at a time only 4 lanes will be active is what my assumption.Is this correct?

    In point 5 you had mentioned about BIST registers( 0x500+), did you meant for AD9174 registers? since I was talking about jesd204_tpl_dac register and not DAC register.Please Clarify.

    6. I have attached the snapshot below.

    My requirement is using both the DAC core simultaneously with different frequencies at output. Need your suggestion to corner the issue. Is it related to configuration or something in tpl_dac core IP.

    1. jesd204_tx_init struct 

    2. channel_data[] continues from 0 to 7

    3. tx_dac_init

    4. axi_dac_dds_set_freqeuncy, axi_dac_dds_set_scale,axi_dac_dds_set_phase(currently I am not using & so I have removed NULL from tx_dac_init and want to manually call axi_dac_channel channel_data in main.c) 

    5. In axi_dac_data_setup function, num_channels is same parameter as called in tx_dac_init function.According to you what value should I set it to use both the cores,is it num_channels = 4?

    6. TPL DAC IP configuration

    I have attached the spi start up sequence which I have implemented in pl_spi.c

    // -----------------------------------------------------------------
    	// Table 51. Power-Up and Required Register Writes
    	// -----------------------------------------------------------------
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x000, 0x81);
    	err = PL_SPIReadByte(PL_AD9174_SPI_BASE_ADDR, 0x000, &tmp_reg);
    	xil_printf("\r\nExpecting 0\n0x000 : 0x%x\n", tmp_reg);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x091, 0x00);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x206, 0x01);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x705, 0x01);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x090, 0x00);
    	usleep(1000);
    	// -----------------------------------------------------------------
    	// Table 52. DAC PLL Configuration
    	// -----------------------------------------------------------------
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x095, 0x00);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x790, 0x00);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x791, 0x00);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x796, 0xE5);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x7A0, 0xBC);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x794, 0x08);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x797, 0x10);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x797, 0x20);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x798, 0x10);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x7A2, 0x7F);
    	usleep(100000);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x799, 0x02);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x793, 0x1B);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x094, 0x00);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x792, 0x02);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x792, 0x00);
    	usleep(100000);
    	err = PL_SPIReadByte(PL_AD9174_SPI_BASE_ADDR, 0x7B5, &tmp_reg);
    	xil_printf("\r\nExpecting 1\n0x7B5 : 0x%x\n", tmp_reg);
    	usleep(1000);
    	// -----------------------------------------------------------------
    	// Table 53. Delay Lock Loop (DLL) Configuration
    	// -----------------------------------------------------------------
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x0C0, 0x00);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x0DB, 0x00);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x0DB, 0x01);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x0DB, 0x00);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x0C1, 0x68);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x0C1, 0x69);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x0C7, 0x01);
    	err = PL_SPIReadByte(PL_AD9174_SPI_BASE_ADDR, 0x0C3, &tmp_reg);
    	xil_printf("\r\nExpecting 1\n0x0C3 : 0x%x\n", tmp_reg);
    	usleep(1000);
    	// -----------------------------------------------------------------
    	// Table 54. Calibration
    	// -----------------------------------------------------------------
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x050, 0x2A);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x061, 0x68);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x051, 0x82);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x051, 0x83);
    	usleep(1000);
    	err = PL_SPIReadByte(PL_AD9174_SPI_BASE_ADDR, 0x052, &tmp_reg);
    	xil_printf("\r\nExpecting 1\n0x052 : 0x%x\n", tmp_reg);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x081, 0x03);
    	usleep(1000);
    	// -----------------------------------------------------------------
    	// Table 55. JESD204B Mode Setup
    	// -----------------------------------------------------------------
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x100, 0x00);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x110, 0x28);
    	err = PL_SPIReadByte(PL_AD9174_SPI_BASE_ADDR, 0x110, &tmp_reg);
    	xil_printf("\r\nExpecting 0x28\n0x110 : 0x%x\n", tmp_reg);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x111, 0xC1);
    	err = PL_SPIReadByte(PL_AD9174_SPI_BASE_ADDR, 0x110, &tmp_reg);
    	xil_printf("\r\nExpecting 0x28\n0x110 : 0x%x\n", tmp_reg);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x084, 0x01);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x312, 0x00);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x300, 0x0b); //0b
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x475, 0x09);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x453, 0x84);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x458, 0x0F);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x475, 0x01);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x300, 0x0C);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x475, 0x09);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x453, 0x84);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x458, 0x0F);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x475, 0x01);
    	usleep(1000);
    	// -----------------------------------------------------------------
    	// Table 56. Channel Datapath Setup: Digital Gain and Channel NCOs
    	// -----------------------------------------------------------------
    	// -----------------------------------------------------------------
    	// Table 57. Main DAC Datapath Setup: PA Protect and Main NCOs
    	// -----------------------------------------------------------------
    	//Independent NCO configuration for DAC0 & DAC1
    	//set NCO freq to 800 Mhz for DAC0
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x008, 0x40);
    	// Integer FTW
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x112, 0x08);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x114, 0x11);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x115, 0x11);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x116, 0x11);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x117, 0x11);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x118, 0x11);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x119, 0x11);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x11C, 0x00);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x11D, 0x00);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x113, 0x01);
    	//set NCO freq to 1000 Mhz for DAC1
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x008, 0x80);
    	// Integer FTW
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x112, 0x08);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x114, 0x55);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x115, 0x55);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x116, 0x55);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x117, 0x55);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x118, 0x55);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x119, 0x15);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x11C, 0x00);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x11D, 0x00);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x113, 0x01);
    	//NCO only mode
    	/* err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x1E6, 0x02);
        err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x148, 0xFF);
        err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x149, 0x50);
        err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x03F, 0x00);
        err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x596, 0x0C);
    	 */
    	usleep(1000);
    	// -----------------------------------------------------------------
    	// Table 58. JESD204B SERDES Required Interface Setup
    	// -----------------------------------------------------------------
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x240, 0xAA);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x241, 0xAA);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x242, 0x55);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x243, 0x55);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x244, 0x1F);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x245, 0x1F);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x246, 0x1F);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x247, 0x1F);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x248, 0x1F);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x249, 0x1F);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x24A, 0x1F);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x24B, 0x1F);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x201, 0x00);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x203, 0x00);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x253, 0x01);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x254, 0x01);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x210, 0x16);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x216, 0x11);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x212, 0xFF);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x212, 0x00);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x210, 0x87);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x216, 0x11);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x213, 0x01);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x213, 0x00);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x200, 0x00);
    	usleep(100000);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x210, 0x86);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x216, 0x40);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x213, 0x01);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x213, 0x00);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x210, 0x86);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x216, 0x00);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x213, 0x01);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x213, 0x00);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x210, 0x87);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x216, 0x01);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x213, 0x01);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x213, 0x00);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x280, 0x05);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x280, 0x01);
    	err = PL_SPIReadByte(PL_AD9174_SPI_BASE_ADDR, 0x281, &tmp_reg);
    	xil_printf("\r\nExpecting 1\n0x281 : 0x%x\n", tmp_reg);
    	usleep(1000);
    	// -----------------------------------------------------------------
    	// Table 59. Transport Layer Setup, Synchronization, and Enable Links
    	// -----------------------------------------------------------------
    	xil_printf("Original Logical to Physical Lane Mapping\n");
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x308, 0x08);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x309, 0x1A);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x30A, 0x2C);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x30B, 0x3E);
    //	xil_printf("Swapped Logical to Physical Lane Mapping\n");
    //	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x308, 0x2C);
    //	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x309, 0x3E);
    //	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x30A, 0x08);
    //	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x30B, 0x1A);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x03B, 0xF1);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x03A, 0x02);
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x300, 0x0f);
    	usleep(1000);
    
    	xil_printf("\r\nLink 1\n");
    	err = PL_SPIReadByte(PL_AD9174_SPI_BASE_ADDR, 0x470, &tmp_reg);
    	xil_printf("\r\nExpecting F\n0x470 : 0x%x\n", tmp_reg);
    	err = PL_SPIReadByte(PL_AD9174_SPI_BASE_ADDR, 0x471, &tmp_reg);
    	xil_printf("\r\nExpecting F\n0x471 : 0x%x\n", tmp_reg);
    	err = PL_SPIReadByte(PL_AD9174_SPI_BASE_ADDR, 0x472, &tmp_reg);
    	xil_printf("\r\nExpecting F\n0x472 : 0x%x\n", tmp_reg);
    	err = PL_SPIReadByte(PL_AD9174_SPI_BASE_ADDR, 0x473, &tmp_reg);
    	xil_printf("\r\nExpecting F\n0x473 : 0x%x\n", tmp_reg);
    	//err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x300, 0x0f); //0b
    	xil_printf("\r\nLink 0\n");
    	err = PL_SPIReadByte(PL_AD9174_SPI_BASE_ADDR, 0x470, &tmp_reg);
    	xil_printf("\r\nExpecting F\n0x470 : 0x%x\n", tmp_reg);
    	err = PL_SPIReadByte(PL_AD9174_SPI_BASE_ADDR, 0x471, &tmp_reg);
    	xil_printf("\r\nExpecting F\n0x471 : 0x%x\n", tmp_reg);
    	err = PL_SPIReadByte(PL_AD9174_SPI_BASE_ADDR, 0x472, &tmp_reg);
    	xil_printf("\r\nExpecting F\n0x472 : 0x%x\n", tmp_reg);
    	err = PL_SPIReadByte(PL_AD9174_SPI_BASE_ADDR, 0x473, &tmp_reg);
    	xil_printf("\r\nExpecting F\n0x473 : 0x%x\n", tmp_reg);
    	usleep(1000);
    
    	// -----------------------------------------------------------------
    	// Table 60. Cleanup Registers
    	// -----------------------------------------------------------------
    	/* // Set to the default register value.
    err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x085, 0x13);
    // Disable analog SPI. To debug and continue readback capability, write 0x03.
    err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x1DE, 0x00);
    	 */
    	// Page all main DACs for TXEN control update.
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x008, 0xC0);
    	// SPI turn on TXENx feature.
    	err = PL_SPI_WRITE(PL_AD9174_SPI_BASE_ADDR, 0x596, 0x0C);
    }

    Regards,

    Sourav

  • Hello,

    We'll try to reproduce your setup locally.

    Is it possible to update to newer releases for both HDL and No-OS ?

    Can you post a snapshot of your HDL block diagram?

    Regards,

    Adrian

  • Hi Adrian,

    We will try to source the same setup in some updated releases( 2020_r2 or above) that we have.

    Since we are working on some integrated setup which comprises of ADC also, so we need to parallelly check if ADC supports that particular release or not, so if you can share the results with us asap it would be of much help, so that we can approach with newer versions, knowing that there would have been a possible RTL bug in the current release(2019_r1).

    The current project has been taken from the below mentioned GitHub repo.

    https://github.com/analogdevicesinc/hdl/tree/hdl_2019_r1/projects/dac_fmc_ebz/zcu102

    I have attached a few snaps of the Block diagram below.

    Closer view of the HDL BD.

    Broader view of HDL BD.

    Thanks,

    Sourav

  • Did you tried replicating the experiment with Evaluation board. Is there any update on the same?

  • Hello,

    We are replicating the experiment, but we are having some issues with No-OS so we're currently debugging. Will reply as soon as we find a solution.

    Regards,

    Adrian

  • Okay, you can send us the no-OS code if you perform any modifications on it and got results there after.

  • Hello Sourav,

    I modified the No-OS project to work with dual link and JESD mode 08, you can find the branch here: ad9174_dual_link_mode08. I built the HDL from the latest master branch using num_links=2 and mode=08 and I was able to get outputs on both DAC0 and DAC1.

    dac_outputs

    The JESD status is as follows:

    Please let me know if this is of any help to you and if not I will investigate more.

    Regards,

    Bogdan

  • Hi Bogdan,

    Can you please clarify me what JESD mode you used while testing? Because for Mode 8 Dual Link we should get link clock = 250 MHz, instead of 245.7 Mhz.

    Given our Input clock to DAC = 3G, so divider values for HMC should be set accordingly.

    Thanks

  • Hi,

    On our evaluation board for the AD9174 the input clock to the HMC7044 has a frequency of 122.88 MHz and I could only test it for a line clock of 245.7 MHz. However, if you can generate 250 MHz out of the HMC it should work with lane rate = 10 GSPS and link clock = 250MHz.

    You mentioned that you are using a 3 GHz clock for the DAC but how are you clocking the FPGA side of the design?

    Regards,
    Bogdan