To follow up and finish this thread:  I figured out that my main problem
was in how I was generating the ramp on the ADC/DAC board, which was
sensitive to timing problems.  I fixed this and now I get very nice looking
eye patterns, even when the data comes in at 500MHz DDR.

Also, after seeing a hint in the mailing list archive
<http://www.mail-archive.com/casper%40lists.berkeley.edu/msg04631.html>, I
managed to use the mmcm in high bandwidth mode with a 125 MHz pfd freq.
When I instantiate the mmcm I tell it the pfd freq will be 135 MHz,
CLKIN1_PERIOD=7.407, and then give it 125 MHz instead.

Thanks for your help, Jack and John.

Matt

On Fri, Apr 29, 2016 at 5:56 AM, John Ford <[email protected]> wrote:

> Hi all.
>
> >From the work that Matt's done on the IODELAY and such, and the orginal
> description of the problem, i.e. a simultaneous switching of several bits
> at once, this sounds like a ground bounce problem or decoupling problems
> on the ADC/DAC board, and not a firmware or ROACH problem.
>
> John
>
>  > Matt,
> >
> > No good ones --
> >
> > Are the bits that fail hardware / boffile specific?
> > Are all the timing constraints correctly set up?
> > Are all the IODELAY blocks suitably configured with resets, etc?
> >
> > That's all I got :(
> >
> > The ADC5g does 1.25Gb/s per ZDOK pair perfectly happily (I have 18 boards
> > running them, and I don't remember the last time they failed to link up
> > properly), so I don't think there's any fundamental problem from the
> > ROACH2
> > side.
> >
> > Jack
> >
> >
> > On Thu, 28 Apr 2016 at 20:46 Matt Strader <[email protected]>
> > wrote:
> >
> >> Thanks, Jack.
> >>
> >> I added IODELAYs to all my data bits.  I used my ramp input to check for
> >> glitches in all the bits for each step in IODELAY value.  Also, I found
> >> that having the mmcm in low bandwidth mode is indeed a bad idea, and
> >> switched to high bandwidth mode and slightly slower clocks.
> >>
> >> I find a reasonable eye to calibrate with, except there are 4 bits that
> >> glitch no matter what value I use for their IODELAY.  I lowered the
> >> clock
> >> rates quite a bit more, with the same result.
> >>
> >> Any more recommendations?
> >>
> >> Thanks,
> >> Matt
> >>
> >> P.S. Here's what my eyes look like for 475 MHz DDR (1 indicates a bit
> >> glitches for the delay value).  Notice that data2 bits 1,5,8, and 9 are
> >> ones all the way down the column.
> >> dly : data0_bits   data1_bits   data2_bits   data3_bits
> >>   0 : 101100000000 000000000000 101100100010 110110001000
> >>   1 : 001100000000 000000000000 101110100010 110010001000
> >>   2 : 001100000000 000000000000 101110100010 110000001000
> >>   3 : 000100000100 000000000100 111110100010 110000001000
> >>   4 : 000000000100 000000000100 111111100010 110000000000
> >>   5 : 000001001110 000011001100 111111101010 110001100000
> >>   6 : 000001011110 000011101100 111111111110 110001110010
> >>   7 : 000001011110 000011111110 111111111111 110001110111
> >>   8 : 010011111110 010011111111 111111111111 110001110111
> >>   9 : 010011111111 010111111111 001100100010 111001110111
> >>  10 : 010011111111 101100000000 101100100010 001110011101
> >>  11 : 010011111111 101000000000 101100100010 011110001000
> >>  12 : 110011111111 001000000000 101100100010 010110001000
> >>  13 : 101100000000 000000000000 101100100010 110110001000
> >>  14 : 101100000000 000000000000 101100100010 110110001000
> >>  15 : 001100000000 000000000000 101110100010 110000001000
> >>  16 : 001100000100 000000000000 101110100010 110000001000
> >>  17 : 000100000100 000000000100 111110100010 110000000000
> >>  18 : 000001001110 000001000100 111111100010 110000000000
> >>  19 : 000001011110 000001001100 111111111010 110001100010
> >>  20 : 000011011110 000011111100 111111111110 110001110010
> >>  21 : 010011111110 000011111111 111111111111 110001110111
> >>  22 : 010011111111 000011111111 111111111111 110001110111
> >>  23 : 111110110011 010111111111 101100100011 111001110111
> >>  24 : 111100100001 101100000000 101100100010 111111111111
> >>  25 : 101100100001 101000000000 101100100010 011110001000
> >>  26 : 101100000001 001000000000 101100100010 110110001000
> >>  27 : 101100000000 000000000000 101100100010 110110001000
> >>  28 : 001100000000 000000000000 101110100010 110110001000
> >>  29 : 001100000100 000000000000 101110100010 110110001000
> >>  30 : 000100000100 000000000100 111110100010 110000000000
> >>  31 : 000000000100 000000000100 111111100010 110000000000
> >>
> >>
> >>
> >> On Tue, Apr 26, 2016 at 4:55 PM, Jack Hickish <[email protected]>
> >> wrote:
> >>
> >>> Hi Matt,
> >>>
> >>> The usual way to deal with this is IODELAY blocks as you suggest. The
> >>> adc5g core has an example of the correct instantiation of the IODELAY
> >>> primitive and some controller code to talk to them. IIRC, the delay
> >>> goes
> >>> straight after the input buffer, prior to the SERDES (or presumably
> >>> immediately before the output buffers for the DAC).
> >>>
> >>> Cheers
> >>> Jack
> >>>
> >>>
> >>> On Tue, 26 Apr 2016 at 16:02 Matt Strader <[email protected]>
> >>> wrote:
> >>>
> >>>> Hello again,
> >>>>
> >>>> Now that my clocks are working, I've run into the next problem in my
> >>>> yellow block.  I have the adc/dac board sending a ramp, which I see on
> >>>> the
> >>>> roach2 side, but there are periodic glitches (see attached).  ?
> >>>>  zdok_ctr_ramp2.tiff
> >>>> <
> https://drive.google.com/file/d/0B6vM_l0m98k9MmQtVEp5SS1SeWs/view?usp=drive_web
> >
> >>>>
> >>>> The data is coming over four 14-bit buses aligned to a 500 MHz clock
> >>>> from the adc/dac board, at DDR.  The glitches happen when the value
> >>>> coming
> >>>> through is a round number in binary, i.e. whenever several bits flip
> >>>> at
> >>>> once.  It seems that at each glitch, one or more bits fail to flip
> >>>> when
> >>>> they should, though they usually arrive at the right value one cycle
> >>>> later.
> >>>>
> >>>> I saw in the mailing list archive that people have had problems
> >>>> <
> https://casper.berkeley.edu/wiki/ADC16x250-8#ADC16_Sample_Rate_vs_Virtex-6_MMCM_Limitations
> >
> >>>> with glitches when using MMCMs in LOW bandwidth mode.  I've tried both
> >>>> LOW
> >>>> and HIGH modes and see the same thing.  (For the HIGH mode I slowed my
> >>>> clock from 500 MHz to 350 MHz.  To use exactly 500 MHz as I want, I'm
> >>>> stuck
> >>>> with LOW mode.)
> >>>>
> >>>> I'm guessing that IODELAYs are the solution to this?  Do I put the
> >>>> delays at the inputs of my OSERDESs?  Any recommendations?
> >>>>
> >>>> Thanks,
> >>>> Matt?
> >>>>
> >>>> On Wed, Apr 20, 2016 at 6:47 PM, Matt Strader
> >>>> <[email protected]
> >>>> > wrote:
> >>>>
> >>>>> I found my mistake.  I did not have feedback input and output ports
> >>>>> of
> >>>>> the mmcm (CLKFBOUT,CLKFBIN) connected correctly.
> >>>>>
> >>>>> Matt
> >>>>>
> >>>>> On Tue, Apr 19, 2016 at 12:10 PM, Matt Strader <
> >>>>> [email protected]> wrote:
> >>>>>
> >>>>>> 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
> >>>>>>
> >>>>>
> >>>>>
> >>>>
> >>
> >
>
>
>

Reply via email to