AD9082
Recommended for New Designs
The AD9082 mixed signal front-end (MxFE®) is a highly integrated device with a 16-bit, 12 GSPS maximum sample rate, RF digital-to-analog converter (DAC...
Datasheet
AD9082 on Analog.com
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
Dear,
We have an AD9082 FMCA EBZ evaluation board driven by a Xilinx ZCU102 FPGA board.
I tried to modify the HDL reference and the petalinux device tree to get the DAC/ADC working at 9.6GHz/4.8GHz, decimation of 4 and interpolation of 8.
I used MxFE JESD204x Mode Selector Tool to identify the JESD modes and decimation and interpolation. Here are the modes:
The HDL reference design is generated by the command below.
make JESD_MODE=8B10B
RX_LANE_RATE=12\
TX_LANE_RATE=12\
RX_JESD_M=4 \
RX_JESD_L=8 \
RX_JESD_S=1 \
RX_JESD_NP=16 \
TX_JESD_M=4 \
TX_JESD_L=8 \
TX_JESD_S=1 \
TX_JESD_NP=16
However, when the Petaliunx boots up I get the following error multiple times and the ADC doesn't work.
[ 12.514189] axi_adxcvr 84a60000.axi-adxcvr-rx: adxcvr_clk_enable: QPLL RX buffer underflow error, status: 0x61
[ 12.524180] axi_adxcvr 84a60000.axi-adxcvr-rx: adxcvr_clk_enable: QPLL RX buffer overflow error, status: 0x61
I would be grateful if you help me to resolve this issue.
Below, you can see the whole modified device tree, where I configured the DEV_REFCLK= 200MHz, DEV_SYSREF = FPGA_SYSREF= 1,171,875 Hz, CORE_CLK_Tx = CORE_CLK_RX = FPGA_REFCLK1 = FPGA_REFCLK2 = 300MHz.
#include "zynqmp-zcu102-rev10-ad9081.dts" &axi_ad9081_adxcvr_rx { adi,sys-clk-select = <XCVR_QPLL>; //adi,out-clk-select = <XCVR_REFCLK_DIV2>; adi,out-clk-select = <XCVR_REFCLK>; }; &axi_ad9081_adxcvr_tx { adi,sys-clk-select = <XCVR_QPLL>; //adi,out-clk-select = <XCVR_REFCLK_DIV2>; adi,out-clk-select = <XCVR_REFCLK>; }; /delete-node/ &ad9081_dac2; /delete-node/ &ad9081_dac3; &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 */ adi,pll1-clkin-frequencies = <100000000 100000000 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_c0: channel@0 { reg = <0>; adi,extended-name = "CORE_CLK_RX"; adi,divider = <10>; adi,driver-mode = <HMC7044_DRIVER_MODE_LVDS>; }; hmc7044_c2: channel@2 { reg = <2>; adi,extended-name = "DEV_REFCLK"; adi,divider = <15>; adi,driver-mode = <HMC7044_DRIVER_MODE_LVDS>; }; hmc7044_c3: channel@3 { reg = <3>; adi,extended-name = "DEV_SYSREF"; adi,divider = <2560>; adi,driver-mode = <HMC7044_DRIVER_MODE_LVDS>; adi,jesd204-sysref-chan; }; hmc7044_c6: channel@6 { reg = <6>; adi,extended-name = "CORE_CLK_TX"; adi,divider = <10>; adi,driver-mode = <HMC7044_DRIVER_MODE_LVDS>; }; hmc7044_c8: channel@8 { reg = <8>; adi,extended-name = "FPGA_REFCLK1"; adi,divider = <10>; adi,driver-mode = <HMC7044_DRIVER_MODE_LVDS>; }; hmc7044_c10: channel@10 { reg = <10>; adi,extended-name = "CORE_CLK_RX_ALT"; adi,divider = <10>; adi,driver-mode = <HMC7044_DRIVER_MODE_LVDS>; }; hmc7044_c12: channel@12 { reg = <12>; adi,extended-name = "FPGA_REFCLK2"; adi,divider = <10>; adi,driver-mode = <HMC7044_DRIVER_MODE_LVDS>; }; //******************** hmc7044_c13: channel@13 { reg = <13>; adi,extended-name = "FPGA_SYSREF"; adi,divider = <2560>; adi,driver-mode = <HMC7044_DRIVER_MODE_LVDS>; adi,jesd204-sysref-chan; }; }; }; &fmc_spi { trx0_ad9081: ad9081@0 { compatible = "adi,ad9082"; 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-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 <9600000000>; adi,main-data-paths { #address-cells = <1>; #size-cells = <0>; adi,interpolation = <8>; ad9081_dac0: dac@0 { reg = <0>; adi,crossbar-select = <&ad9081_tx_fddc_chan0>; adi,nco-frequency-shift-hz = /bits/ 64 <1000000000>; /* 1000 MHz */ }; ad9081_dac1: dac@1 { reg = <1>; adi,crossbar-select = <&ad9081_tx_fddc_chan1>; adi,nco-frequency-shift-hz = /bits/ 64 <1100000000>; /* 1100 MHz */ }; }; adi,channelizer-paths { #address-cells = <1>; #size-cells = <0>; adi,interpolation = <1>; ad9081_tx_fddc_chan0: channel@0 { reg = <0>; adi,gain = <2048>; /* 2048 * 10^(gain_dB/20) */ adi,nco-frequency-shift-hz = /bits/ 64 <0>; }; ad9081_tx_fddc_chan1: channel@1 { reg = <1>; adi,gain = <2048>; /* 2048 * 10^(gain_dB/20) */ adi,nco-frequency-shift-hz = /bits/ 64 <0>; }; }; adi,jesd-links { ad9081_tx_jesd_l0: link@0 { #address-cells = <1>; #size-cells = <0>; reg = <0>; adi,logical-lane-mapping = /bits/ 8 <0 2 7 6 1 5 4 3>; adi,link-mode = <17>; /* 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 = <4>; /* 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 = <8>; /* JESD L */ adi,samples-per-converter-per-frame = <1>; /* JESD S */ adi,high-density = <1>; /* JESD HD */ adi,tpl-phase-adjust = <6>; }; }; }; adi,rx-adcs { #size-cells = <0>; #address-cells = <1>; adi,adc-frequency-hz = /bits/ 64 <4800000000>; 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 <1000000000>; adi,nco-mixer-mode = <AD9081_ADC_NCO_VIF>; //adi,crossbar-select = <&ad9081_rx_fddc_chan0>, <&ad9081_rx_fddc_chan2>; /* Static for now */ }; ad9081_adc1: adc@1 { reg = <1>; adi,decimation = <4>; adi,nco-frequency-shift-hz = /bits/ 64 <(1000000000)>; adi,nco-mixer-mode = <AD9081_ADC_NCO_VIF>; //adi,crossbar-select = <&ad9081_rx_fddc_chan1>, <&ad9081_rx_fddc_chan3>; /* Static for now */ }; }; adi,channelizer-paths { #address-cells = <1>; #size-cells = <0>; ad9081_rx_fddc_chan0: channel@0 { reg = <0>; adi,decimation = <1>; adi,gain = <2048>; /* 2048 * 10^(gain_dB/20) */ adi,nco-frequency-shift-hz = /bits/ 64 <0>; }; ad9081_rx_fddc_chan1: channel@1 { reg = <1>; adi,decimation = <1>; 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>, <&ad9081_rx_fddc_chan1 FDDC_I>, <&ad9081_rx_fddc_chan1 FDDC_Q>; adi,logical-lane-mapping = /bits/ 8 <2 0 7 6 5 4 3 1>; adi,link-mode = <18>; /* 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 = <4>; /* 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 = <8>; /* JESD L */ adi,samples-per-converter-per-frame = <1>; /* JESD S */ adi,high-density = <1>; /* JESD HD */ }; }; }; }; };
Hi SAH ,
I will find someone to take a look at your issue, but it might take a little bit more than usual since it involves the software team too.
Until then,
Regards,
Iulia
Thanks for your reply Lulia. For HDL reference I check out the repo to 2021_r1 branch. I'm also using the same version of toolchain (Vivado 2021.1 and Petalinux 2021.1). For the devicetree I started with zynqmp-zcu102-rev10-ad9082-m4-l8.dts. It works just fine with the default configuration. I also would like to mention that I modified both HDL and device tree before to get different configurations (decimation, interpolation, JESD modes, etc.). But it's the first time I ended up with such an issue. Probably because it's the first time I change the FDAC and FADC.
Hi Lulia,
Any update on this?
I would be grateful if you help on this as it's blocking at the moment.
Best,
Ali
Hello SAH ,
Can you run this command in the board terminal: cat /sys/kernel/debug/clk/clk_summary (this provides us a list of all the clocks in the system)!
Also run this command: jesd_status (this shows us in which state is the JESD)!
What changes have you done on the HDL side?
Best regards!
Filip.
Thanks for your reply Filip.
I didn't change anything after building the HDL by the make command.
Here is the JESD status:
Also the clock status:
Moved to Linux Software Drivers forum since they can help you better with your issue.
Hi Filip,
I think I could realize a part of the issue. For some reason, the make command I used to produce the HDL file doesn't set the lane rate as expected. I set the lane rates to 12 in the make command. But when I open the project, and check util_mxfe_xcvr and the project settings, the lane rates are set to 10. Then I changed the lane rates to 12 manually, but still get the same error. It looks like the suggested configuration by the mode selector tool is not valid for the HDL generator. It only can generate HDL codes for rate 10 and 15. Can you help on this?
Filip, Iulia,
I managed to solve the issue with HDL reference make file. I just hard-coded the config in system_project.tcl and then it did the job and generated the project with the parameter I posted above. But still, the petalinux complains about the QPLL.
I tried different things to solve the issue:
I get the same error whenever the lane rate (tx and rx) is NOT 15G! Otherwise, everything works as expected.
I also checked the "Ultrascale FPGA transceiver wizard" to see if it can work with lane rate 12G and reclock 300MHz, which it does.
So no clue why such an error happens in other lane rates.
It's something really blocking at the moment. So I appreciate your help.
Best,
Ali
Hi Ali,
If you have solved the problem?I meet the same too.