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