Hello Casperites,

I am working on a roach2 yellow block for a new 12bit,  2.0 Gsps ADC/DAC
board designed at Fermilab.  I am having trouble with clocks.  The ADC/DAC
board is providing me with a 500 MHz clock over a particular zdok pair.  My
yellow block takes this into an mmcm and divides it down to 250 MHz to be
used as the fabric clock.

When testing it, I set the adc/dac clock running, then program the roach2.
When I call KatcpFpga.estimate_fpga_clock() it returns 167 MHz instead of
the expected 250 MHz.

I have attached what I think are the relevant snippets from my yellow
block.  The rest of it can be found at
https://github.com/mstrader/mlib_devel
Any ideas what could be the problem?

Thanks,
Matt Strader
#########################
/home/kids/mlib_strader/xps_library/@xps_adcdac_2g/xps_adcdac_2g.m
#########################
% external ports
ucf_constraints_clock  = struct('IOSTANDARD', 'LVDS_25', 'DIFF_TERM', 'TRUE', 
'PERIOD', '2 ns');
ucf_constraints_term    = struct('IOSTANDARD', 'LVDS_25', 'DIFF_TERM', 'TRUE');
ucf_constraints_noterm = struct('IOSTANDARD', 'LVDS_25');
mhs_constraints = struct('SIGIS','CLK', 'CLK_FREQ','500000000');
adcport1 = [s.hw_sys, '.', 'zdok1'];
ext_ports.data0_smpl_clk_p = {1  'in' ['adc_data0_smpl_clk_p'] 
['{',adcport1,'_p{[20],:}}'] 'vector=false'  mhs_constraints ucf_con
straints_clock};
ext_ports.data0_smpl_clk_n = {1  'in' ['adc_data0_smpl_clk_n'] 
['{',adcport1,'_n{[20],:}}'] 'vector=false'  mhs_constraints 
ucf_constraints_clock};

if  strfind(s.clk_sys,'adc')
  misc_ports.adc_clk_out    = {1 'out' [s.adc_str,'_clk']};
  misc_ports.adc_clk90_out    = {1 'out' [s.adc_str,'_clk90']};
  misc_ports.adc_clk180_out    = {1 'out' [s.adc_str,'_clk180']};
  misc_ports.adc_clk270_out    = {1 'out' [s.adc_str,'_clk270']};
end

# zdok1_clk0_p[1] # data0_clk_p
# zdok1_clk0_n[1] # data0_clk_n

#########################
/home/kids/mlib_strader/xps_base/XPS_ROACH2_base/pcores/adcdac_2g_interface_v1_00_a/hdl/verilog/adcdac_2g_interface.v
#########################

    wire data0_smpl_clk;
    IBUFGDS #(.IOSTANDARD("LVDS_25"))
        IBUFDS_inst_adc_clk(
          .O(data0_smpl_clk),
          .I(data0_smpl_clk_p),
          .IB(data0_smpl_clk_n)
          );


    //  -- MMCM INPUT


    wire mmcm_clk_in;
    BUFG BUFG_data_clk(
        .I(data0_smpl_clk),
        .O(mmcm_clk_in));



    //  -- MMCM

    wire smpl_clkdiv;
    wire mmcm_smpl_clkdiv_out;
    wire mmcm_smpl_clk_out;
    wire mmcm_clk_out_0;
    wire mmcm_clk_out_90;
    wire mmcm_clk_out_180;
    wire mmcm_clk_out_270;
    MMCM_BASE #(
       .BANDWIDTH("OPTIMIZED"),   // Jitter programming 
("HIGH","LOW","OPTIMIZED")
       .CLKFBOUT_MULT_F(12.0),     // Multiply value for all CLKOUT (5.0-64.0).
       .CLKFBOUT_PHASE(0.0),      // Phase offset in degrees of CLKFB 
(0.00-360.00).
       //Input 500 MHz -> 2 ns
       .CLKIN1_PERIOD(2.000),       // Input clock period in ns to ps 
resolution (i.e. 33.333 is 30 MHz).
       .CLKOUT4_CASCADE("FALSE"), // Cascase CLKOUT4 counter with CLKOUT6 
(TRUE/FALSE)
       .CLOCK_HOLD("FALSE"),      // Hold VCO Frequency (TRUE/FALSE)
       .DIVCLK_DIVIDE(6),         // Master division value (1-80)
       .REF_JITTER1(0.0),         // Reference input jitter in UI (0.000-0.999).
       .STARTUP_WAIT("FALSE"),     // Not supported. Must be set to FALSE.

       //Output 250 MHz 0deg for fpga
       .CLKOUT2_DIVIDE(4),
       .CLKOUT2_DUTY_CYCLE(0.5),
       .CLKOUT2_PHASE(0.0),

       //Output 250 MHz 90deg for fpga
       .CLKOUT3_DIVIDE(4),
       .CLKOUT3_DUTY_CYCLE(0.5),
       .CLKOUT3_PHASE(90.0),

       //Output 250 MHz 180deg for fpga
       .CLKOUT4_DIVIDE(4),
       .CLKOUT4_DUTY_CYCLE(0.5),
       .CLKOUT4_PHASE(180.0),

       //Output 250 MHz 270deg for fpga
       .CLKOUT5_DIVIDE(4),
       .CLKOUT5_DUTY_CYCLE(0.5),
       .CLKOUT5_PHASE(270.0),
    )
    CLK_MMCM (
       // Clock Outputs: 1-bit (each) output: User configurable clock outputs
       .CLKOUT0(mmcm_smpl_clkdiv_out),
       .CLKOUT0B(),
       .CLKOUT1(mmcm_smpl_clk_out),
       .CLKOUT1B(),
       .CLKOUT2(mmcm_clk_out_0),
       .CLKOUT2B(),
       .CLKOUT3(mmcm_clk_out_90),
       .CLKOUT3B(),
       .CLKOUT4(mmcm_clk_out_180),
       .CLKOUT5(mmcm_clk_out_270),
       .CLKOUT6(),
       // Feedback Clocks
       .CLKFBOUTB(),
       // Status Port
       .LOCKED(adc_mmcm_locked),
       // Clock Input
       .CLKIN1(mmcm_clk_in),
       // Control Ports
       .PWRDWN(1'b0),       // 1-bit input: Power-down input
       .RST(1'b0),             // 1-bit input: Reset input
       // Feedback Clocks
       .CLKFBIN(smpl_clkdiv)      // 1-bit input: Feedback clock input
    );

    //  Now put all mmcm outputs through a BUFG

    //250 MHz clocks with phases 0,90,180,270 for the fpga clock
    wire clk_0;
    wire clk_90;
    wire clk_180;
    wire clk_270;
    BUFG BUFG_clk0
       (.I(mmcm_clk_out_0),.O(clk_0));
    BUFG  BUFG_clk90
      (.I(mmcm_clk_out_90), .O(clk_90));
    BUFG BUFG_clk180
     (.I(mmcm_clk_out_180), .O(clk_180));
    BUFG BUFG_clk270
      (.I(mmcm_clk_out_270), .O(clk_270));

    assign adc_clk_out = clk_0;
    assign adc_clk90_out = clk_90;
    assign adc_clk180_out = clk_180;
    assign adc_clk270_out = clk_270;

Reply via email to