В спартан6 например ести примитива ИДДР2, это флип-флоп работающий в режиме ДДР. Ставите ПЛЛ, регенерируете клоки входные, подаете эти клоки на ИДДР2 (или аналогичную примитиву в виртексе), задаете равнение по первому или второму клоку, а дальше тот клок по которому задано равнение подключаете к памяти итд.
Прикрепляю картинку для наглядности.
clk_p и clk_n это клоки поступающие от АЦП, затем первая строка это данные поступающие на 0.5нс раньше, вторая строка если они поступают на 0.5нс позже, третья строка это промежуток времени который включает в себя верные данные вне зависимости от максимальной задержки.
ПЛЛ генерирует смещенные клоки C0 и C1, для захвата данных. C0 и C1 подаются на ИДДР2 как и сами данные (первое слово и второе).
красное поле это промежуток полученный из Даташит Репорт, вобщем он должен быть короче чем зеленый промежуток (валид дата как вы назвали), это означает что ФПГА осиливает АЦП данной скорости.
желтая линия показывает смещение относительно референс клока для того чтобы правильно задать констрейны. Констрейны чтобы правильно задать нужно сгруппировать клоки C0 и C1 и указать смещение их пиков относительно clk_p. А вот сами констрейны:
NET "adc1_clk_p" TNM_NET = "adc1_clk_p";
TIMESPEC TS_adc1_clk_p = PERIOD "adc1_clk_p" 5 ns HIGH 50 %;
NET "adc1_data*" TNM = "IN_DDR";
NET "C0" TNM_NET = "clk0_grp";
NET "C1" TNM_NET = "clk180_grp";
TIMEGRP "IN_DDR" OFFSET = IN -500 ps VALID 1500 ps BEFORE "adc1_clk_p" TIMEGRP "clk0_grp";
TIMEGRP "IN_DDR" OFFSET = IN -3000 ps VALID 1500 ps BEFORE "adc1_clk_p" TIMEGRP "clk180_grp";Теперь обраите внимание на следующих отрывок из Даташит Репорт:
Data Sheet report:
-----------------
All values displayed in nanoseconds (ns)
Setup/Hold to clock adc1_clk_p
------------+------------+------------+------------+------------+------------------+--------+
|Max Setup to| Process |Max Hold to | Process | | Clock |
Source | clk (edge) | Corner | clk (edge) | Corner |Internal Clock(s) | Phase |
------------+------------+------------+------------+------------+------------------+--------+
adc1_data_n | -0.515®| SLOW | 1.831®| FAST |C0 | 1.250|
| -3.010®| SLOW | 4.257®| FAST |C1 | 3.750|
adc1_data_p | -0.516®| SLOW | 1.831®| FAST |C0 | 1.250|
| -3.011®| SLOW | 4.257®| FAST |C1 | 3.750|
------------+------------+------------+------------+------------+------------------+--------+Из этого даташит репорта можно определить требование Setup/Hold, и то каким образом ИСЕ сгенерирует Слэки:
1.250ns - 0.515ns =
0.735ns Setup time, поэтому Setup Slack для группы "C0" укасзан как: 0.75ns-0.735ns = 0.015ns
1.831ns - 1.250ns =
0.581ns Hold time, поэтому Hold Slack для группы "C0" указан как: 0.75ns-0.581ns = 0.169ns
3.750ns - 3.010ns =
0.740ns Setup time, поэтому Setup Slack для группы "C1" указан как: 0.75ns-0.740ns = 0.010ns
4.257ns - 3.750ns =
0.507ns Hold time, поэтому Hold Slack для группы "C1" указан как: 0.75ns-0.507ns = 0.243ns
Исходя из выделенных цифр и составлена красное поле на диаграмме.
Я вижу у вас АЦП немного другой, но если принцип уже ясен то разобратся можно очень быстро.
А с варьированием Delay думаю не стоит вообще связыватся.
Эскизы прикрепленных изображений