HMC7044
Recommended for New Designs
The HMC7044 is a high performance, dual-loop, integer-N jitter attenuator capable of performing reference selection and generation of ultralow phase noise...
Datasheet
HMC7044 on Analog.com
AD9081
Recommended for New Designs
The AD9081 mixed signal front end (MxFE®) is a highly integrated device with four 16-bit, 12 GSPS maximum sample rate, RF digital-to-analog converter...
Datasheet
AD9081 on Analog.com
Hi everyone,
we have a setup with a ZCU102 board and an AD9081-EBZ board.
We are trying a configuration with DAC clock at 12 GHz and ADC clock at 3 GHz. Interpolation is 8x1 and decimation is 4x8. From mxFE JESD204x Mode Selector tool we found that suitable JESD204B modes are Mode 62 for tx and mode 3.00 for rx:
Tx Mode: JESD Mode Number 62 txBW 1200.0 Total Int 8 Coarse Int 8 Fine Int 1 Dual Link False JESD Deframer JESD204B L 4 M 2 F 1 S 1 K 32 N 16 NP 16 LaneRate 15.0 Rx Mode: JESD Mode Number 3.00 rxBW 76.31 Total Dec 32 Coarse Dec 4 Fine Dec 8 Dual Link False JESD Framer JESD204B Async False L 1 M 2 F 4 S 1 K 32 NP 16 LaneRate 3.75
make JESD_MODE=8B10B RX_LANE_RATE=3 RX_JESD_L=1 RX_JESD_M=2 RX_JESD_S=1 TX_LANE_RATE=15 TX_JESD_L=4 TX_JESD_M=2 TX_JESD_S=1
// SPDX-License-Identifier: GPL-2.0 // AUTOGENERATED BY PYADI-DT <date> /* * Analog Devices AD9081-FMC-EBZ * https://wiki.analog.com/resources/eval/user-guides/quadmxfe/quick-start * https://wiki.analog.com/resources/tools-software/linux-drivers/iio-mxfe/ad9081 * * hdl_project: <ad9081_fmca_ebz/zcu102> * board_revision: <> * * Copyright (C) 2021 Analog Devices Inc. */ #include "zynqmp-zcu102-rev10-ad9081.dts" #define CDDC_I 0 #define CDDC_Q 1 &axi_ad9081_rx_jesd { clocks = <&zynqmp_clk 71>, <&hmc7044 10>, <&axi_ad9081_adxcvr_rx 1>, <&axi_ad9081_adxcvr_rx 0>; clock-names = "s_axi_aclk", "device_clk", "link_clk", "lane_clk"; }; &axi_ad9081_tx_jesd { clocks = <&zynqmp_clk 71>, <&hmc7044 6>, <&axi_ad9081_adxcvr_tx 1>, <&axi_ad9081_adxcvr_tx 0>; clock-names = "s_axi_aclk", "device_clk", "link_clk", "lane_clk"; }; &axi_ad9081_adxcvr_rx { adi,sys-clk-select = <XCVR_QPLL>; adi,out-clk-select = <XCVR_PROGDIV_CLK>; }; &axi_ad9081_adxcvr_tx { adi,sys-clk-select = <XCVR_QPLL>; adi,out-clk-select = <XCVR_PROGDIV_CLK>; }; // &axi_ad9081_adxcvr_tx: axi-adxcvr-tx { // adi,sys-clk-select = <XCVR_QPLL>; // adi,out-clk-select = <XCVR_REFCLK_DIV2>; // }; // &axi_ad9081_adxcvr_tx: axi-adxcvr-tx@84b60000 { // adi,sys-clk-select = <XCVR_QPLL>; // adi,out-clk-select = <XCVR_PROGDIV_CLK>; // }; &spi1 { status = "okay"; hmc7044: hmc7044@0 { #address-cells = <1>; #size-cells = <0>; #clock-cells = <1>; compatible = "adi,hmc7044"; reg = <0>; spi-max-frequency = <1000000>; jesd204-device; #jesd204-cells = <2>; jesd204-sysref-provider; adi,jesd204-max-sysref-frequency-hz = <2000000>; /* 2 MHz */ /* * There are different versions of the AD9081-FMCA-EBZ & AD9082-FMCA-EBZ * VCXO = 122.880 MHz, XO = 122.880MHz (AD9081-FMC-EBZ & AD9082-FMC-EBZ) * VCXO = 100.000 MHz, XO = 100.000MHz (AD9081-FMC-EBZ-A2 & AD9082-FMC-EBZ-A2) * To determine which board is which, read the freqency printed on the VCXO * or use the fru-dump utility: * #fru-dump -b /sys/bus/i2c/devices/15-0050/eeprom */ //adi,pll1-clkin-frequencies = <122880000 30720000 0 0>; //adi,vcxo-frequency = <122880000>; adi,pll1-clkin-frequencies = <100000000 10000000 0 0>; adi,vcxo-frequency = <100000000>; adi,pll1-loop-bandwidth-hz = <200>; adi,pll2-output-frequency = <3000000000>; adi,sysref-timer-divider = <1024>; adi,pulse-generator-mode = <0>; adi,clkin0-buffer-mode = <0x07>; adi,clkin1-buffer-mode = <0x07>; adi,oscin-buffer-mode = <0x15>; adi,gpi-controls = <0x00 0x00 0x00 0x00>; adi,gpo-controls = <0x37 0x33 0x00 0x00>; clock-output-names = "hmc7044_out0", "hmc7044_out1", "hmc7044_out2", "hmc7044_out3", "hmc7044_out4", "hmc7044_out5", "hmc7044_out6", "hmc7044_out7", "hmc7044_out8", "hmc7044_out9", "hmc7044_out10", "hmc7044_out11", "hmc7044_out12", "hmc7044_out13"; hmc7044_c02:channel@2 { reg = <2>; adi,extended-name = "DEV_REFCLK"; adi,divider = <16>; adi,driver-mode = <HMC7044_DRIVER_MODE_LVDS>; }; hmc7044_c03:channel@3 { reg = <3>; adi,extended-name = "DEV_SYSREF"; adi,divider = <2048>; adi,driver-mode = <HMC7044_DRIVER_MODE_LVDS>; }; hmc7044_c013:channel@13 { reg = <13>; adi,extended-name = "FPGA_SYSREF"; adi,divider = <2048>; adi,driver-mode = <HMC7044_DRIVER_MODE_LVDS>; }; hmc7044_c00:channel@0 { reg = <0>; adi,extended-name = "CORE_CLK_RX"; adi,divider = <32>; adi,driver-mode = <HMC7044_DRIVER_MODE_LVDS>; }; hmc7044_c010:channel@10 { reg = <10>; adi,extended-name = "CORE_CLK_RX_ALT"; adi,divider = <32>; adi,driver-mode = <HMC7044_DRIVER_MODE_LVDS>; }; hmc7044_c08:channel@8 { reg = <8>; adi,extended-name = "FPGA_REFCLK1"; adi,divider = <32>; adi,driver-mode = <HMC7044_DRIVER_MODE_LVDS>; }; hmc7044_c06:channel@6 { reg = <6>; adi,extended-name = "CORE_CLK_TX"; adi,divider = <8>; adi,driver-mode = <HMC7044_DRIVER_MODE_LVDS>; }; hmc7044_c012:channel@12 { reg = <12>; adi,extended-name = "FPGA_REFCLK2"; adi,divider = <32>; adi,driver-mode = <HMC7044_DRIVER_MODE_LVDS>; }; }; }; &fmc_spi { trx0_ad9081: ad9081@0 { #address-cells = <1>; #size-cells = <0>; compatible = "adi,ad9081"; reg = <0>; spi-max-frequency = <5000000>; /* Clocks */ clocks = <&hmc7044 2>; clock-names = "dev_clk"; clock-output-names = "rx_sampl_clk", "tx_sampl_clk"; #clock-cells = <1>; jesd204-device; #jesd204-cells = <2>; jesd204-top-device = <0>; /* This is the TOP device */ jesd204-link-ids = <FRAMER_LINK0_RX DEFRAMER_LINK0_TX>; jesd204-ignore-errors;//DEBUG ONLY REMOVE LATER!! jesd204-inputs = <&axi_ad9081_core_rx 0 FRAMER_LINK0_RX>, <&axi_ad9081_core_tx 0 DEFRAMER_LINK0_TX>; adi,tx-dacs { #size-cells = <0>; #address-cells = <1>; adi,dac-frequency-hz = /bits/ 64 <12000000000>; adi,main-data-paths { #address-cells = <1>; #size-cells = <0>; adi,interpolation = <8>; ad9081_dac0: dac@0 { reg = <0>; adi,nco-frequency-shift-hz = /bits/ 64 <0>; }; ad9081_dac1: dac@1 { reg = <1>; adi,nco-frequency-shift-hz = /bits/ 64 <0>; }; ad9081_dac2: dac@2 { reg = <2>; adi,nco-frequency-shift-hz = /bits/ 64 <0>; }; ad9081_dac3: dac@3 { reg = <3>; adi,nco-frequency-shift-hz = /bits/ 64 <0>; }; }; adi,channelizer-paths { #address-cells = <1>; #size-cells = <0>; adi,interpolation = <1>; }; adi,jesd-links { #size-cells = <0>; #address-cells = <1>; ad9081_tx_jesd_l0: link@0 { #address-cells = <1>; #size-cells = <0>; reg = <0>; adi,logical-lane-mapping = /bits/ 8 <0 2 7 7 1 7 7 3>; adi,link-mode = <62>; /* JESD Quick Configuration Mode */ adi,subclass = <1>; /* JESD SUBCLASS 0,1,2 */ adi,version = <1>; /* JESD VERSION 0=204A,1=204B,2=204C */ adi,dual-link = <0>; /* JESD Dual Link Mode */ adi,converters-per-device = <2>; /* JESD M */ adi,octets-per-frame = <1>; /* JESD F */ adi,frames-per-multiframe = <32>; /* JESD K */ adi,converter-resolution = <16>; /* JESD N */ adi,bits-per-sample = <16>; /* JESD NP' */ adi,control-bits-per-sample = <0>; /* JESD CS */ adi,lanes-per-device = <4>; /* JESD L */ adi,samples-per-converter-per-frame = <1>; /* JESD S */ adi,high-density = <0>; /* JESD HD */ adi,tpl-phase-adjust = <13>; }; }; }; adi,rx-adcs { #size-cells = <0>; #address-cells = <1>; adi,adc-frequency-hz = /bits/ 64 <3000000000>; adi,main-data-paths { #address-cells = <1>; #size-cells = <0>; ad9081_adc0:adc@0 { reg = <0>; adi,decimation = <4>; adi,nco-frequency-shift-hz = /bits/ 64 <0>; adi,nco-mixer-mode = <AD9081_ADC_NCO_VIF>; //adi,crossbar-select = <&ad9081_rx_fddc_chan0>, <&ad9081_rx_fddc_chan2>; /* Static for now */ }; }; adi,channelizer-paths { #address-cells = <1>; #size-cells = <0>; ad9081_rx_fddc_chan0:channel@0 { reg = <0>; adi,decimation = <8>; adi,gain = <2048>; /* 2048 * 10^(gain_dB/20) */ adi,nco-frequency-shift-hz = /bits/ 64 <0>; }; }; adi,jesd-links { #size-cells = <0>; #address-cells = <1>; ad9081_rx_jesd_l0: link@0 { reg = <0>; adi,converter-select = <&ad9081_rx_fddc_chan0 FDDC_I>, <&ad9081_rx_fddc_chan0 FDDC_Q>; adi,logical-lane-mapping = /bits/ 8 <2 0 7 7 7 7 3 1>; adi,link-mode = <3>; /* JESD Quick Configuration Mode */ adi,subclass = <1>; /* JESD SUBCLASS 0,1,2 */ adi,version = <1>; /* JESD VERSION 0=204A,1=204B,2=204C */ adi,dual-link = <0>; /* JESD Dual Link Mode */ adi,converters-per-device = <2>; /* JESD M */ adi,octets-per-frame = <4>; /* JESD F */ adi,frames-per-multiframe = <32>; /* JESD K */ adi,converter-resolution = <16>; /* JESD N */ adi,bits-per-sample = <16>; /* JESD NP' */ adi,control-bits-per-sample = <0>; /* JESD CS */ adi,lanes-per-device = <1>; /* JESD L */ adi,samples-per-converter-per-frame = <1>; /* JESD S */ adi,high-density = <0>; /* JESD HD */ }; }; }; }; }; &axi_ad9081_core_tx { single-shot-output-gpios = <&gpio 139 0>; };
[ 6.758776] jesd204: /axi/spi@ff040000/ad9081@0,jesd204:0,parent=spi1.0: JESD204[0:2] transition initialized -> probed [ 6.769475] jesd204: /axi/spi@ff040000/ad9081@0,jesd204:0,parent=spi1.0: JESD204[0:0] transition initialized -> probed [ 6.780172] jesd204: /axi/spi@ff040000/ad9081@0,jesd204:0,parent=spi1.0: JESD204[0:2] transition probed -> idle [ 6.790252] jesd204: /axi/spi@ff040000/ad9081@0,jesd204:0,parent=spi1.0: JESD204[0:0] transition probed -> idle [ 6.800344] jesd204: /axi/spi@ff040000/ad9081@0,jesd204:0,parent=spi1.0: JESD204[0:2] transition idle -> device_init [ 6.810858] jesd204: /axi/spi@ff040000/ad9081@0,jesd204:0,parent=spi1.0: JESD204[0:0] transition idle -> device_init [ 6.821384] jesd204: /axi/spi@ff040000/ad9081@0,jesd204:0,parent=spi1.0: JESD204[0:2] transition device_init -> link_init [ 6.832332] jesd204: /axi/spi@ff040000/ad9081@0,jesd204:0,parent=spi1.0: JESD204[0:0] transition device_init -> link_init [ 6.843297] jesd204: /axi/spi@ff050000/hmc7044@0,jesd204:1,parent=spi2.0: JESD204[0:0] In link_supported got error from cb: -22 (ignoring!) [ 6.855821] jesd204: /axi/spi@ff040000/ad9081@0,jesd204:0,parent=spi1.0: JESD204[0:2] transition link_init -> link_supported [ 6.867040] jesd204: /axi/spi@ff040000/ad9081@0,jesd204:0,parent=spi1.0: JESD204[0:0] transition link_init -> link_supported [ 6.878252] hmc7044 spi2.0: hmc7044_jesd204_link_pre_setup: Link2 setting SYSREF rate 2929687 failed (-22) [ 6.887899] hmc7044 spi2.0: hmc7044_jesd204_link_pre_setup: Link2 setting SYSREF rate 2929687 failed (-22) [ 6.897712] hmc7044 spi2.0: hmc7044_jesd204_link_pre_setup: Link2 forcing continuous SYSREF mode [ 6.906572] hmc7044 spi2.0: hmc7044_jesd204_link_pre_setup: Link0 setting SYSREF rate 2929687 failed (-22) [ 6.916224] hmc7044 spi2.0: hmc7044_jesd204_link_pre_setup: Link0 setting SYSREF rate 2929687 failed (-22) [ 6.926074] jesd204: /axi/spi@ff040000/ad9081@0,jesd204:0,parent=spi1.0: JESD204[0:2] transition link_supported -> link_pre_setup [ 6.937722] jesd204: /axi/spi@ff040000/ad9081@0,jesd204:0,parent=spi1.0: JESD204[0:0] transition link_supported -> link_pre_setup [ 6.961722] jesd204: /axi/spi@ff040000/ad9081@0,jesd204:0,parent=spi1.0: JESD204[0:2] transition link_pre_setup -> clk_sync_stage1 [ 6.973455] jesd204: /axi/spi@ff040000/ad9081@0,jesd204:0,parent=spi1.0: JESD204[0:0] transition link_pre_setup -> clk_sync_stage1 [ 6.985191] jesd204: /axi/spi@ff040000/ad9081@0,jesd204:0,parent=spi1.0: JESD204[0:2] transition clk_sync_stage1 -> clk_sync_stage2 [ 6.997013] jesd204: /axi/spi@ff040000/ad9081@0,jesd204:0,parent=spi1.0: JESD204[0:0] transition clk_sync_stage1 -> clk_sync_stage2 [ 7.008839] jesd204: /axi/spi@ff040000/ad9081@0,jesd204:0,parent=spi1.0: JESD204[0:2] transition clk_sync_stage2 -> clk_sync_stage3 [ 7.020664] jesd204: /axi/spi@ff040000/ad9081@0,jesd204:0,parent=spi1.0: JESD204[0:0] transition clk_sync_stage2 -> clk_sync_stage3 [ 7.034527] jesd204: /axi/spi@ff040000/ad9081@0,jesd204:0,parent=spi1.0: JESD204[0:2] transition clk_sync_stage3 -> link_setup [ 7.045913] jesd204: /axi/spi@ff040000/ad9081@0,jesd204:0,parent=spi1.0: JESD204[0:0] transition clk_sync_stage3 -> link_setup [ 7.062314] jesd204: /axi/spi@ff040000/ad9081@0,jesd204:0,parent=spi1.0: JESD204[0:2] transition link_setup -> opt_setup_stage1 [ 7.073786] jesd204: /axi/spi@ff040000/ad9081@0,jesd204:0,parent=spi1.0: JESD204[0:0] transition link_setup -> opt_setup_stage1 [ 7.090354] jesd204: /axi/spi@ff040000/ad9081@0,jesd204:0,parent=spi1.0: JESD204[0:2] transition opt_setup_stage1 -> opt_setup_stage2 [ 7.102353] jesd204: /axi/spi@ff040000/ad9081@0,jesd204:0,parent=spi1.0: JESD204[0:0] transition opt_setup_stage1 -> opt_setup_stage2 [ 7.114638] jesd204: /axi/spi@ff040000/ad9081@0,jesd204:0,parent=spi1.0: JESD204[0:2] transition opt_setup_stage2 -> opt_setup_stage3 [ 7.126633] jesd204: /axi/spi@ff040000/ad9081@0,jesd204:0,parent=spi1.0: JESD204[0:0] transition opt_setup_stage2 -> opt_setup_stage3 [ 7.138629] jesd204: /axi/spi@ff040000/ad9081@0,jesd204:0,parent=spi1.0: JESD204[0:2] transition opt_setup_stage3 -> opt_setup_stage4 [ 7.150619] jesd204: /axi/spi@ff040000/ad9081@0,jesd204:0,parent=spi1.0: JESD204[0:0] transition opt_setup_stage3 -> opt_setup_stage4 [ 7.162624] jesd204: /axi/spi@ff040000/ad9081@0,jesd204:0,parent=spi1.0: JESD204[0:2] transition opt_setup_stage4 -> opt_setup_stage5 [ 7.174621] jesd204: /axi/spi@ff040000/ad9081@0,jesd204:0,parent=spi1.0: JESD204[0:0] transition opt_setup_stage4 -> opt_setup_stage5 [ 7.221992] axi_adxcvr 84a60000.axi-adxcvr-rx: adxcvr_clk_enable: QPLL RX buffer underflow error, status: 0x61 [ 7.231976] axi_adxcvr 84a60000.axi-adxcvr-rx: adxcvr_clk_enable: QPLL RX buffer overflow error, status: 0x61 [ 7.246051] jesd204: /axi/spi@ff040000/ad9081@0,jesd204:0,parent=spi1.0: JESD204[0:2] transition opt_setup_stage5 -> clocks_enable [ 7.257787] jesd204: /axi/spi@ff040000/ad9081@0,jesd204:0,parent=spi1.0: JESD204[0:0] transition opt_setup_stage5 -> clocks_enable [ 7.269578] jesd204: /axi/spi@ff040000/ad9081@0,jesd204:0,parent=spi1.0: JESD204[0:2] transition clocks_enable -> link_enable [ 7.280882] jesd204: /axi/spi@ff040000/ad9081@0,jesd204:0,parent=spi1.0: JESD204[0:0] transition clocks_enable -> link_enable [ 7.544305] axi-jesd204-rx 84a90000.axi-jesd204-rx: axi_jesd204_rx_jesd204_link_running: Link2 status failed (CGS) [ 7.554653] jesd204: /fpga-axi@0/axi-jesd204-rx@84a90000,jesd204:4,parent=84a90000.axi-jesd204-rx: JESD204[0:2] In link_running got error from cb: -1 (ignoring!) [ 7.664538] ad9081 spi1.0: JESD RX (JTX) Link2 in CGS, SYNC asserted, PLL locked, PHASE established, MODE valid [ 7.674630] jesd204: /axi/spi@ff040000/ad9081@0,jesd204:0,parent=spi1.0: JESD204[0:2] In link_running got error from cb: -1 (ignoring!) [ 7.687057] ad9081 spi1.0: JESD TX (JRX) Link0 0xF lanes in DATA [ 7.693112] jesd204: /axi/spi@ff040000/ad9081@0,jesd204:0,parent=spi1.0: JESD204[0:2] transition link_enable -> link_running [ 7.704328] jesd204: /axi/spi@ff040000/ad9081@0,jesd204:0,parent=spi1.0: JESD204[0:0] transition link_enable -> link_running [ 7.715545] jesd204: /axi/spi@ff040000/ad9081@0,jesd204:0,parent=spi1.0: JESD204[0:2] transition link_running -> opt_post_running_stage [ 7.727710] jesd204: /axi/spi@ff040000/ad9081@0,jesd204:0,parent=spi1.0: JESD204[0:0] transition link_running -> opt_post_running_stage
Thank you in advance!
Fabio
Hi,
Is the HDL from main or from a release branch?
What about Linux?
Best regards,
Iulia
Hi,
the HDL is from hdl_2022_r2.
Linux is from the main branch of Analog Devices repository.
Regards,
Fabio
Hi Fabio,
I was able to reproduce what you described, even with the latest HDL (from main).
One problem, in my opinion, could be around the Tx prog. div. More details about this in https://docs.amd.com/v/u/en-US/ug576-ultrascale-gth-transceivers Figure 3-29 to get a better understanding. I played a little bit with the Rx PLL configuration (adi,sys-clk-select) and with the adi,out-clk-select, changing it to OUTCLK_PCS and PMA as well, but I didn't notice anything. These are the options you can give in the device tree https://github.com/analogdevicesinc/linux/blob/main/include/dt-bindings/jesd204/adxcvr.h#L19-L23 and you can notice them in Figure 3-29 at the TXOUTCLKSEL mux.
I can't investigate any further right now because I will be out of office for 2 weeks... I apologize but we are already short staffed this time around, so I doubt that someone else could help you until my return. I hope you'll be able to find the problem in the meantime. If not, I'll be back investigating.
Best regards,
Iulia
Hi Fabio,
Apologies for missing your thread. Those 2 out of office weeks turned sadly into a couple more and when I returned to work, I missed it in the pile.
Did you have any success since then?
Best regards,
Iulia
Hi Iulia,
yes, we were able to find a configuration that works with a different JESD mode and some adjustments both to the FPGA constraint file and the devicetree.
We also switched to Petalinux since our projects required it and at the beginning we were following the guides with Kuiper Linux to get to know the device, now fortunately everything seems to work as we want!
Thank you for your help!
Best Regards,
Fabio
Thanks for letting me know so quickly, and again, I apologize for missing this.
Best regards,
Iulia