Перейти к содержанию
    

Здравствуйте! Занимаюсь приемом serial data с lvds АЦП на Virtex 4. Задаю в констрейнах следующее:

NET "D0A_n" OFFSET = IN 0 ns BEFORE "FCO_n";
NET "FCO_n" TNM_NET = "FCO_n";
TIMESPEC "TS_FCO_n" = PERIOD "FCO_n" 8 ns HIGH 50 %;
NET "D0A_p" OFFSET = IN 0 ns BEFORE "FCO_p";
NET "FCO_p" TNM_NET = "FCO_p";
TIMESPEC "TS_FCO_p" = PERIOD "FCO_p" 8 ns HIGH 50 %;

Где D0A - это и есть serial data, а FCO - это frame clock, который затем умножается на DCM в 4 раза и получается clk4x, и этот клок уже стробирует данные в ISERDES. Вот что выдает STA:

================================================================================
Timing constraint: COMP "D0A_n" OFFSET = IN 0 ns BEFORE COMP "FCO_n";

2 items analyzed, 2 timing errors detected. (2 setup errors, 0 hold errors)
Minimum allowable offset is   4.779ns.
--------------------------------------------------------------------------------
Slack:                  -4.779ns (requirement - (data path - clock path - clock arrival + uncertainty))
  Source:               D0A_n (PAD)
  Destination:          ISERDES_inst (FF)
  Destination Clock:    clk4x rising at 0.000ns
  Requirement:          0.000ns
  Data Path Delay:      2.508ns (Levels of Logic = 2)
  Clock Path Delay:     -2.051ns (Levels of Logic = 3)
  Clock Uncertainty:    0.220ns

  Data Path: D0A_n to ISERDES_inst
    Location             Delay type         Delay(ns)  Physical Resource
                                                       Logical Resource(s)
    -------------------------------------------------  -------------------
    A9.PADOUT            Tiopp                 1.365   D0A_n
                                                       D0A_n
    B9.DIFFI_IN          net (fanout=1)        0.000   IBUFDS_inst0/SLAVEBUF.DIFFIN
    B9.I                 Tiodi                 0.000   D0A_p
                                                       IBUFDS_inst0/IBUFDS
    ILOGIC_X2Y95.D       net (fanout=1)        0.063   D0A
    ILOGIC_X2Y95.CLK     Tisdck_D_BOTH         1.080   ISERDES_inst
                                                       ISERDES_inst
    -------------------------------------------------  ---------------------------
    Total                                      2.508ns (2.445ns logic, 0.063ns route)
                                                       (97.5% logic, 2.5% route)

  Clock Path: FCO_n to ISERDES_inst
    Location             Delay type         Delay(ns)  Physical Resource
                                                       Logical Resource(s)
    -------------------------------------------------  -------------------
    C12.PADOUT           Tiopp                 1.116   FCO_n
                                                       FCO_n
    C13.DIFFI_IN         net (fanout=1)        0.000   IBUFGDS_inst/SLAVEBUF.DIFFIN
    C13.I                Tiodi                 0.000   FCO_p
                                                       IBUFGDS_inst/IBUFDS
    DCM_ADV_X0Y2.CLKIN   net (fanout=1)        1.039   FCO
    DCM_ADV_X0Y2.CLKFX   Tdmcko_CLKFX         -6.249   DCM_AUTOCALIBRATION_DCM_BASE_inst/DCM_BASE_inst
                                                       DCM_AUTOCALIBRATION_DCM_BASE_inst/DCM_BASE_inst
    ILOGIC_X2Y95.CLK     net (fanout=0)        2.043   DCM_AUTOCALIBRATION_DCM_BASE_inst/clk4x
    -------------------------------------------------  ---------------------------
    Total                                     -2.051ns (-5.133ns logic, 3.082ns route)

Вопрос: как понимать, что Tdmcko_CLKFX = -6.249 ns?

И вообще, если data path всегда будет больше clock path, то мой констрейн никогда не сойдется?

Пожалуйста, подскажите, как действовать?

Я же должен как-то распознать начало кадра...

Изменено пользователем shide_3

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здравствуйте! Занимаюсь приемом serial data с lvds АЦП на Virtex 4. Задаю в констрейнах следующее:

Пожалуйста, подскажите, как действовать?

Я же должен как-то распознать начало кадра...

 

Вот тут смотрите, как у аналогов сделано,

файл cf_adc_if.v, frame захватывается одновременно с данными и по нему выравнивают данные.

У xilinx есть примеры (xapp524, xapp1071), но там все намного развесистее.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот тут смотрите, как у аналогов сделано,

файл cf_adc_if.v, frame захватывается одновременно с данными и по нему выравнивают данные.

У xilinx есть примеры (xapp524, xapp1071), но там все намного развесистее.

спасибо , но все же хотелось бы без bitslip обойтись, поскольку нет возможности запустить тестовую последовательность ацп..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

спасибо , но все же хотелось бы без bitslip обойтись, поскольку нет возможности запустить тестовую последовательность ацп..

При походе "аналогов" тестовая последовательность не нужна.

Как вариант, можно переписывать из serdes по фронту фрейма (используя его как клок), только с клоковыми доменами надо аккуратно.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как вариант, можно переписывать из serdes по фронту фрейма (используя его как клок), только с клоковыми доменами надо аккуратно.

Вы имеете ввиду в качестве clkdiv использовать частоту фрейма? поскольку выходной регистр serdes'а (тот который мы затем читаем) защелкивается по clkdiv

В принципе, у меня сейчас так и сделано

    ISERDES_inst : ISERDES
   generic map (
      BITSLIP_ENABLE => TRUE, -- TRUE/FALSE to enable bitslip controller
      DATA_RATE => "DDR", -- Specify data rate of "DDR" or "SDR" 
      DATA_WIDTH => 8, -- Specify data width - For DDR 4,6,8, or 10 
                       -- For SDR 2,3,4,5,6,7, or 8 
      INIT_Q1 => '0',  -- INIT for Q1 register - '1' or '0' 
      INIT_Q2 => '0',  -- INIT for Q2 register - '1' or '0' 
      INIT_Q3 => '0',  -- INIT for Q3 register - '1' or '0' 
      INIT_Q4 => '0',  -- INIT for Q4 register - '1' or '0' 
      --INIT_Q5 => '0',  -- INIT for Q3 register - '1' or '0' 
      --INIT_Q6 => '0',  -- INIT for Q4 register - '1' or '0' 
      INTERFACE_TYPE => "NETWORKING", -- Use model - "MEMORY" or "NETWORKING" 
      IOBDELAY => "BOTH", -- Specify outputs where delay chain will be applied
                          -- "NONE", "IBUF", "IFD", or "BOTH" 
      IOBDELAY_TYPE => "FIXED", -- Set tap delay "DEFAULT", "FIXED", or "VARIABLE" 
      IOBDELAY_VALUE => 0, -- Set initial tap delay to an integer from 0 to 63
      NUM_CE => 1, -- Define number or clock enables to an integer of 1 or 2
      SERDES_MODE => "MASTER" --Set SERDES mode to "MASTER" or "SLAVE" 
--      SRVAL_Q1 => '0', -- Define Q1 output value upon SR assertion - '1' or '0' 
--      SRVAL_Q2 => '0', -- Define Q1 output value upon SR assertion - '1' or '0' 
--      SRVAL_Q3 => '0', -- Define Q1 output value upon SR assertion - '1' or '0' 
--      SRVAL_Q4 => '0'
        --SRVAL_Q5 => '0',
        --SRVAL_Q6 => '0'
        ) -- Define Q1 output value upon SR assertion - '1' or '0' 
   port map (
      O => open,    -- 1-bit output
      Q1 => DA(0),  -- 1-bit output
      Q2 => DA(1),  -- 1-bit output
      Q3 => DA(2),  -- 1-bit output
      Q4 => DA(3),  -- 1-bit output
      Q5 => DA(4),  -- 1-bit output
      Q6 => DA(5),  -- 1-bit output
      SHIFTOUT1 => shiftout0a, -- 1-bit output
      SHIFTOUT2 => shiftout1a, -- 1-bit output
      BITSLIP => '0',     -- 1-bit input
      CE1 => '1',        -- 1-bit input
      CE2 => '0',        -- 1-bit input
      CLK => clk4x,        -- 1-bit input
      CLKDIV => CLK00,  -- 1-bit input
      D => D0A,            -- 1-bit input
      DLYCE => '0',    -- 1-bit input
      DLYINC => '0',  -- 1-bit input
      DLYRST => '0',  -- 1-bit input
      OCLK => '0',      -- 1-bit input
      REV => '0',        -- 1-bit input
      SHIFTIN1 => '0', -- 1-bit input
      SHIFTIN2 => '0', -- 1-bit input
      SR => '0'           -- 1-bit input
   );

СLK00 это и есть frame clk, только с выхода DCM (для того чтобы выровнять по фазе FCO и clk4x):

   DCM_BASE_inst : DCM_BASE
   generic map (
      CLKDV_DIVIDE => 4.0, -- Divide by: 1.5,2.0,2.5,3.0,3.5,4.0,4.5,5.0,5.5,6.0,6.5
                           --   7.0,7.5,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0 or 16.0
      CLKFX_DIVIDE => 1,   -- Can be any interger from 1 to 32
      CLKFX_MULTIPLY => 4, -- Can be any integer from 2 to 32
      CLKIN_DIVIDE_BY_2 => FALSE, -- TRUE/FALSE to enable CLKIN divide by two feature
      CLKIN_PERIOD => 2.0, -- Specify period of input clock in ns from 1.25 to 1000.00
      CLKOUT_PHASE_SHIFT => "NONE", -- Specify phase shift mode of NONE or FIXED
      CLK_FEEDBACK => "1X",         -- Specify clock feedback of NONE or 1X
      DCM_AUTOCALIBRATION => TRUE, -- DCM calibrartion circuitry TRUE/FALSE
      DCM_PERFORMANCE_MODE => "MAX_RANGE",   -- Can be MAX_SPEED or MAX_RANGE
      DESKEW_ADJUST => "SYSTEM_SYNCHRONOUS", -- SOURCE_SYNCHRONOUS, SYSTEM_SYNCHRONOUS or
                                             --   an integer from 0 to 15
      DFS_FREQUENCY_MODE => "HIGH",   -- LOW or HIGH frequency mode for frequency synthesis
      DLL_FREQUENCY_MODE => "HIGH",   -- LOW, HIGH, or HIGH_SER frequency mode for DLL
      DUTY_CYCLE_CORRECTION => TRUE, -- Duty cycle correction, TRUE or FALSE
      FACTORY_JF => X"F0F0",          -- FACTORY JF Values Suggested to be set to X"F0F0
      PHASE_SHIFT => 0, -- Amount of fixed phase shift from -255 to 1023
      STARTUP_WAIT => FALSE) -- Delay configuration DONE until DCM LOCK, TRUE/FALSE
   port map (
      CLK0 => CLK00,         -- 0 degree DCM CLK ouptput
      CLK180 => open,     -- 180 degree DCM CLK output
      CLK270 => open,     -- 270 degree DCM CLK output
      CLK2X => open,       -- 2X DCM CLK output
      CLK2X180 => open, -- 2X, 180 degree DCM CLK out
      CLK90 => open,       -- 90 degree DCM CLK output
      CLKDV => open,       -- Divided DCM CLK out (CLKDV_DIVIDE)
      CLKFX => clk4x,       -- DCM CLK synthesis out (M/D)
      CLKFX180 => open, -- 180 degree CLK synthesis out
      LOCKED => open,     -- DCM LOCK status output
      CLKFB => CLK00,       -- DCM clock feedback
      CLKIN => FCO ,      -- Clock input (from IBUFG, BUFG or DCM)
      RST => '0'           -- DCM asynchronous reset input
   );

Изменено пользователем shide_3

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здравствуйте! Занимаюсь приемом serial data с lvds АЦП на Virtex 4. Задаю в констрейнах следующее:

Для начала советую полностью разобраться с xapp866.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для начала советую полностью разобраться с xapp866.

попробую обязательно разобраться, но все же было бы хорошо понять , откуда берется этот отрицательный тайминг в STA :

DCM_ADV_X0Y2.CLKFX Tdmcko_CLKFX -6.249 , из-за которого clock path тоже получается отрицательным и констрейн не сходится..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

попробую обязательно разобраться, но все же было бы хорошо понять , откуда берется этот отрицательный тайминг в STA :

DCM_ADV_X0Y2.CLKFX Tdmcko_CLKFX -6.249 , из-за которого clock path тоже получается отрицательным и констрейн не сходится..

Отрицательный тайминг - это DCM компенсирует задержку в петле обратной связи, очевидно, петля через CLK получилась более длинная, чем путь CLK4X.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Отрицательный тайминг - это DCM компенсирует задержку в петле обратной связи, очевидно, петля через CLK получилась более длинная, чем путь CLK4X.

странно, а как тогда анализировать констрейны, он же никогда не сойдется при таком раскладе

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

странно, а как тогда анализировать констрейны, он же никогда не сойдется при таком раскладе

Надо в дизайне выравнивать клоковые линии. У вас, видимо, clk4x пошёл прямо на BUFIO, а clk - через BUFG, отсюда разница набегает.

И констрейны надо правильно писать, я не просто так советовал изучать appnote.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Надо в дизайне выравнивать клоковые линии. У вас, видимо, clk4x пошёл прямо на BUFIO, а clk - через BUFG, отсюда разница набегает.

И констрейны надо правильно писать, я не просто так советовал изучать appnote.

как раз нет. я не имею возможности использовать BUFIO, поскольку сигналы DCO не заведены на clock capable ножки ПЛИС (а просто на Global clock пины). Кстати, во всех xapp применяется BUFIO для выравнивания, а как тогда быть?можно для этого использовать просто DCM?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

как раз нет. я не имею возможности использовать BUFIO, поскольку сигналы DCO не заведены на clock capable ножки ПЛИС (а просто на Global clock пины). Кстати, во всех xapp применяется BUFIO для выравнивания, а как тогда быть?можно для этого использовать просто DCM?

 

Если нет возможности использовать bufio, можно взять iddr, на его тактовый вход подать сигнал с bufg (который в свою очередь идет с DCM в режиме повторения DCO), на вход данных подать DCO, а на выходе подсчитвать количество 0 и 1 на одном из выходов триггера на некотором промежутке времени. И на основании этих данных через функционал динамического сдвига фазы DCM непрерывно подстраивать фазу, таким образом что бы количество 0 и 1 было примерно одинаково. Соответственно сигнал с bufg будет близок по фазе с DCO.

 

Исходники такой системы выравнивания фазы выкладывал на этом форуме пользователь dsmv, http://electronix.ru/forum/index.php?showt...t&p=1265034

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если нет возможности использовать bufio, можно взять iddr, на его тактовый вход подать сигнал с bufg (который в свою очередь идет с DCM в режиме повторения DCO), на вход данных подать DCO, а на выходе подсчитвать количество 0 и 1 на одном из выходов триггера на некотором промежутке времени. И на основании этих данных через функционал динамического сдвига фазы DCM непрерывно подстраивать фазу, таким образом что бы количество 0 и 1 было примерно одинаково. Соответственно сигнал с bufg будет близок по фазе с DCO.

 

Исходники такой системы выравнивания фазы выкладывал на этом форуме пользователь dsmv, http://electronix.ru/forum/index.php?showt...t&p=1265034

 

спасибо за ссылку.

получается, что в любом случае нужно динамически подстраивать фазу, и того что я задал OFFSET между входными данными и DCO, все равно недостаточно? по идее же PAR сам должен обеспечивать это соотношение уже внутри плис...

 

 

Изменено пользователем shide_3

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если нет возможности использовать bufio, можно взять iddr, на его тактовый вход подать сигнал с bufg (который в свою очередь идет с DCM в режиме повторения DCO), на вход данных подать DCO, а на выходе подсчитвать количество 0 и 1 на одном из выходов триггера на некотором промежутке времени. И на основании этих данных через функционал динамического сдвига фазы DCM непрерывно подстраивать фазу, таким образом что бы количество 0 и 1 было примерно одинаково. Соответственно сигнал с bufg будет близок по фазе с DCO.

мне почему-то представляется, что при таком подходе не обязательно входной клок и выход DCM будут совпадать по фазе. Они могут быть и сдвинуты на 90 градусов, и при этом тоже количество нулей и единичек на выходе триггера будет равным. Поправьте пожалуйста если чего-то не понял

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если нет возможности использовать bufio, можно взять iddr, на его тактовый вход подать сигнал с bufg (который в свою очередь идет с DCM в режиме повторения DCO), на вход данных подать DCO, а на выходе подсчитвать количество 0 и 1 на одном из выходов триггера на некотором промежутке времени. И на основании этих данных через функционал динамического сдвига фазы DCM непрерывно подстраивать фазу, таким образом что бы количество 0 и 1 было примерно одинаково. Соответственно сигнал с bufg будет близок по фазе с DCO.

 

Исходники такой системы выравнивания фазы выкладывал на этом форуме пользователь dsmv, http://electronix.ru/forum/index.php?showt...t&p=1265034

ответьте пожалуйста на один единственный ламерский вопрос: если использовать цепь обратной связи DCM и завести выходной клок на CLKFB, то входной клок и все выходные клоки DCM выравниваются по фазе? (об этом написано в user guide) если да, то зачем тогда нужно их дополнительно выравнивать? пожалуйста, просветите, не могу никак разобраться...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...