External SYSREF Usage

Some systems split SYSREF generation from the clock chip that generates converter and FPGA reference clocks. This is useful when the SYSREF source has dedicated synchronization behavior, as with ADF4030, or when the board architecture routes SYSREF through a separate device.

Direct External SYSREF

Without an external SYSREF PLL, the clock chip produces both device/reference clocks and SYSREF.

        flowchart LR
    VCXO[VCXO] --> CLK[Clock chip]
    CLK -->|converter ref/device clock| CNV[Converter]
    CLK -->|FPGA ref clock| FPGA[FPGA]
    CLK -->|FPGA device clock| FPGA
    CLK -->|SYSREF| CNV
    CLK -->|SYSREF| FPGA
    

With add_pll_sysref, the clock chip remains responsible for the ordinary clocking plan while ADF4030 produces SYSREF for the selected converter and FPGA models.

        flowchart LR
    VCXO[VCXO] --> CLK[Clock chip]
    CLK -->|converter ref/device clock| CNV[Converter]
    CLK -->|FPGA ref clock| FPGA[FPGA]
    CLK -->|FPGA device clock| FPGA
    VCXO --> ADF[ADF4030]
    ADF -->|SYSREF| CNV
    ADF -->|SYSREF| FPGA
    
sys.add_pll_sysref("adf4030", 100e6, sys.converter, sys.fpga)

add_pll_sysref supports both simple converters and nested converters such as AD9081. When the converter object contains ADC and DAC children, the external SYSREF source is applied to the relevant nested converter clocks.

ADF4030 Example

The example below follows the AD9081 pattern and adds ADF4030 as the SYSREF source for both the converter and FPGA. The clock chip still solves the converter device clock and FPGA reference/device clock paths.

import adijif

vcxo = 100e6
cddc = 6
fddc = 4

sys = adijif.system("ad9081", "hmc7044", "xilinx", vcxo, solver="CPLEX")
sys.fpga.setup_by_dev_kit_name("zcu102")
sys.fpga.ref_clock_constraint = "Unconstrained"
sys.fpga.sys_clk_select = "XCVR_QPLL0"
sys.fpga.out_clk_select = "XCVR_PROGDIV_CLK"

sys.converter.adc.sample_clock = 2900000000 / (cddc * fddc)
sys.converter.dac.sample_clock = 5800000000 / (cddc * fddc)
sys.converter.adc.datapath.cddc_decimations = [cddc] * 4
sys.converter.adc.datapath.fddc_decimations = [fddc] * 8
sys.converter.adc.datapath.fddc_enabled = [True] * 8
sys.converter.dac.datapath.cduc_interpolation = cddc
sys.converter.dac.datapath.fduc_interpolation = fddc
sys.converter.dac.datapath.fduc_enabled = [True] * 8

sys.add_pll_sysref("adf4030", vcxo, sys.converter, sys.fpga)

sys.converter.dac.set_quick_configuration_mode("0", "jesd204c")
sys.converter.adc.set_quick_configuration_mode("1.0", "jesd204c")

cfg = sys.solve()

After solving, the configuration includes a clock_ext_pll_sysref_adf4030 section. Converter and FPGA SYSREF clock names are supplied by that PLL instead of by the clock chip output list.

BSYNC Reference

ADF4030 also supports an optional BSYNC reference. In pyadi-jif, this is modeled by passing bsync_reference to add_pll_sysref.

        flowchart LR
    VCXO[VCXO] --> CLK[Clock chip]
    CLK -->|converter ref/device clock| CNV[Converter]
    CLK -->|FPGA ref/device clocks| FPGA[FPGA]
    CLK -->|BSYNC reference| ADF[ADF4030]
    ADF -->|SYSREF| CNV
    ADF -->|SYSREF| FPGA
    

When bsync_reference is a clock chip object, the system requests one additional clock chip output named <pll>_bsync_reference. That output is constrained to match the ADF4030 SYSREF output rate.

sys.add_pll_sysref(
    "adf4030",
    vcxo,
    sys.converter,
    sys.fpga,
    bsync_reference=sys.clock,
)

This is useful when the board routes a clock chip output to the ADF4030 BSYNC input and the solver should choose a coherent rate for both paths. The solved configuration will contain both:

  • clock["output_clocks"]["adf4030_bsync_reference"]

  • clock_ext_pll_sysref_adf4030["output_clocks"][...]

For a fixed BSYNC reference rate, pass a numeric frequency instead of the clock object:

sys.add_pll_sysref(
    "adf4030",
    vcxo,
    sys.converter,
    sys.fpga,
    bsync_reference=7.8125e6,
)

The numeric form constrains the ADF4030 output to the supplied rate and does not allocate an additional clock chip output.

Constraints and Limits

The ADF4030 model enforces its input, PFD, VCO, output divider, and BSYNC reference ranges during the solve. The BSYNC reference must be between the model’s bsync_freq_min and bsync_freq_max. If the clock chip cannot generate the requested BSYNC reference, narrow or relax the clock chip output divider constraints, the ADF4030 o divider options, or the requested SYSREF rate.