shide_3 0 5 января, 2016 Опубликовано 5 января, 2016 (изменено) · Жалоба Здравствуйте! Занимаюсь приемом 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, то мой констрейн никогда не сойдется? Пожалуйста, подскажите, как действовать? Я же должен как-то распознать начало кадра... Изменено 5 января, 2016 пользователем shide_3 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
faa 4 5 января, 2016 Опубликовано 5 января, 2016 · Жалоба Здравствуйте! Занимаюсь приемом serial data с lvds АЦП на Virtex 4. Задаю в констрейнах следующее: Пожалуйста, подскажите, как действовать? Я же должен как-то распознать начало кадра... Вот тут смотрите, как у аналогов сделано, файл cf_adc_if.v, frame захватывается одновременно с данными и по нему выравнивают данные. У xilinx есть примеры (xapp524, xapp1071), но там все намного развесистее. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
shide_3 0 5 января, 2016 Опубликовано 5 января, 2016 · Жалоба Вот тут смотрите, как у аналогов сделано, файл cf_adc_if.v, frame захватывается одновременно с данными и по нему выравнивают данные. У xilinx есть примеры (xapp524, xapp1071), но там все намного развесистее. спасибо , но все же хотелось бы без bitslip обойтись, поскольку нет возможности запустить тестовую последовательность ацп.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
faa 4 5 января, 2016 Опубликовано 5 января, 2016 · Жалоба спасибо , но все же хотелось бы без bitslip обойтись, поскольку нет возможности запустить тестовую последовательность ацп.. При походе "аналогов" тестовая последовательность не нужна. Как вариант, можно переписывать из serdes по фронту фрейма (используя его как клок), только с клоковыми доменами надо аккуратно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
shide_3 0 5 января, 2016 Опубликовано 5 января, 2016 (изменено) · Жалоба Как вариант, можно переписывать из 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 ); Изменено 5 января, 2016 пользователем shide_3 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Timmy 1 5 января, 2016 Опубликовано 5 января, 2016 · Жалоба Здравствуйте! Занимаюсь приемом serial data с lvds АЦП на Virtex 4. Задаю в констрейнах следующее: Для начала советую полностью разобраться с xapp866. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
shide_3 0 7 января, 2016 Опубликовано 7 января, 2016 · Жалоба Для начала советую полностью разобраться с xapp866. попробую обязательно разобраться, но все же было бы хорошо понять , откуда берется этот отрицательный тайминг в STA : DCM_ADV_X0Y2.CLKFX Tdmcko_CLKFX -6.249 , из-за которого clock path тоже получается отрицательным и констрейн не сходится.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Timmy 1 7 января, 2016 Опубликовано 7 января, 2016 · Жалоба попробую обязательно разобраться, но все же было бы хорошо понять , откуда берется этот отрицательный тайминг в STA : DCM_ADV_X0Y2.CLKFX Tdmcko_CLKFX -6.249 , из-за которого clock path тоже получается отрицательным и констрейн не сходится.. Отрицательный тайминг - это DCM компенсирует задержку в петле обратной связи, очевидно, петля через CLK получилась более длинная, чем путь CLK4X. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
shide_3 0 8 января, 2016 Опубликовано 8 января, 2016 · Жалоба Отрицательный тайминг - это DCM компенсирует задержку в петле обратной связи, очевидно, петля через CLK получилась более длинная, чем путь CLK4X. странно, а как тогда анализировать констрейны, он же никогда не сойдется при таком раскладе Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Timmy 1 9 января, 2016 Опубликовано 9 января, 2016 · Жалоба странно, а как тогда анализировать констрейны, он же никогда не сойдется при таком раскладе Надо в дизайне выравнивать клоковые линии. У вас, видимо, clk4x пошёл прямо на BUFIO, а clk - через BUFG, отсюда разница набегает. И констрейны надо правильно писать, я не просто так советовал изучать appnote. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
shide_3 0 10 января, 2016 Опубликовано 10 января, 2016 · Жалоба Надо в дизайне выравнивать клоковые линии. У вас, видимо, clk4x пошёл прямо на BUFIO, а clk - через BUFG, отсюда разница набегает. И констрейны надо правильно писать, я не просто так советовал изучать appnote. как раз нет. я не имею возможности использовать BUFIO, поскольку сигналы DCO не заведены на clock capable ножки ПЛИС (а просто на Global clock пины). Кстати, во всех xapp применяется BUFIO для выравнивания, а как тогда быть?можно для этого использовать просто DCM? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dimidrol 0 10 января, 2016 Опубликовано 10 января, 2016 · Жалоба как раз нет. я не имею возможности использовать 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
shide_3 0 10 января, 2016 Опубликовано 10 января, 2016 (изменено) · Жалоба Если нет возможности использовать 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 сам должен обеспечивать это соотношение уже внутри плис... Изменено 11 января, 2016 пользователем shide_3 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
shide_3 0 11 января, 2016 Опубликовано 11 января, 2016 · Жалоба Если нет возможности использовать bufio, можно взять iddr, на его тактовый вход подать сигнал с bufg (который в свою очередь идет с DCM в режиме повторения DCO), на вход данных подать DCO, а на выходе подсчитвать количество 0 и 1 на одном из выходов триггера на некотором промежутке времени. И на основании этих данных через функционал динамического сдвига фазы DCM непрерывно подстраивать фазу, таким образом что бы количество 0 и 1 было примерно одинаково. Соответственно сигнал с bufg будет близок по фазе с DCO. мне почему-то представляется, что при таком подходе не обязательно входной клок и выход DCM будут совпадать по фазе. Они могут быть и сдвинуты на 90 градусов, и при этом тоже количество нулей и единичек на выходе триггера будет равным. Поправьте пожалуйста если чего-то не понял Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
shide_3 0 13 января, 2016 Опубликовано 13 января, 2016 · Жалоба Если нет возможности использовать 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) если да, то зачем тогда нужно их дополнительно выравнивать? пожалуйста, просветите, не могу никак разобраться... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться