Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Xilinx timing constraints: что необходимо для простейшей транзакции?
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
Antgol
Здравствуйте!

Глобальный вопрос такой: между 2-я Xilinx FPGA передаются данные и клок (не дифференциальный), по которому эти данные меняются; какие при этом должны быть заданы constraints?

Теперь опишу, в чем собственно проблема. Я передаю данные из Virtex 6 xc6vlx75t-2ff784 в Virtex 6 vc6clx760-1ff1760 (из дочерней карты с высокоскоростным трансивером в плату HAPS, одна плата вставляется в другую через разъем HapsTrack II). Данные меняются по клоку 250 МГц (он генерируется хард-ядром PCI-Express из референсного клока 100 МГц). Передается шина данных Data 32 бита, сигнал валидности Valid и сам клок Clk. На выходе одной ПЛИС и на входе другой использую регистры для Data и Valid по rising edge Clk (чтобы их можно было разместить рядом с пинами для минимизации задержки). Клок передается по пинам, подсоединенным к клоковым цепям каждой ПЛИС. Использую вот такой constraint в каждой ПЛИС:

NET "clk" TNM_NET = "clk";
TIMESPEC "TS_clk" = PERIOD "clk" 250 MHz HIGH 50.00%;

Проблема в том, что данные иногда приходят битые, например, х“97 2B FF FF” вместо х“97 6F FF FF”. Ошибки возникают на разных битовых позициях, похоже на рассогласование данных и клока на приемной стороне.
Нужно ли использовать какие-либо дополнительные constraints на сигналы Data и Valid, что-то вроде OFFSET IN или From-to? Ситуация-то вроде бы простейшая и вполне банальная. Книжку “Constraints Guide” Xilinx читал, пока не помогло..
AJIEKCEu
Пробовали считать выполнение условий Setup-Hold на входе?

Вариант для ленивых (но не совсем концептуально верный) - примите CLK на IDELAY и попробуйте поиграться с задержкой.
Antgol
Цитата(AJIEKCEu @ Jan 31 2014, 15:43) *
Пробовали считать выполнение условий Setup-Hold на входе?

А можно подробнее, что Вы имеете в виду под "считать"?
ISE говорит, что All constraints are met, в Timing Report на TS_Clk все холды и сетапы маленькие

Цитата(AJIEKCEu @ Jan 31 2014, 15:43) *
Вариант для ленивых (но не совсем концептуально верный) - примите CLK на IDELAY и попробуйте поиграться с задержкой.


А как это сделать по-правильному? Я понимаю, что можно поиграть с задержкой, я это делал путем задания разной частоты TIMESPEC "TS_clk" = PERIOD "clk" ХХХ MHz HIGH 50.00%; при этом, как я понимаю, задержка автоматически подкручивается во входном клоковом буфере. Что интересно, ошибок меньше, если задать частоту 125 МГц, а не реальную 250 МГц. Можно и с IDELAY поиграть. Но должен же быть некий правильный путь решения проблемы, я как раз думал, что нужно задать какие-то дополнительные констрейнты, чтобы задержки подкручивались автоматически.
AJIEKCEu
Цитата(Antgol @ Jan 31 2014, 16:15) *
А можно подробнее, что Вы имеете в виду под "считать"?

У вас есть выходные триггера, выходной синхросигнал (на первом ПЛИСе), есть среда передачи. Распространение сигналов занимает некоторое время, появляется разброс. Есть приемный триггер (во втором ПЛИСе). Что такое setup-hold вы наверное знаете. В передаче внутри ПЛИС за выполнением Setup-hold следит Xilinx и выводит отчет. Снаружи - должны посчитать вы.

Цитата(Antgol @ Jan 31 2014, 16:15) *
ISE говорит, что All constraints are met, в Timing Report на TS_Clk все холды и сетапы маленькие

ISE может посчитать ВНУТРИ ПЛИС. Но о вашей линии передачи снаружи у него нет данных.


Цитата(Antgol @ Jan 31 2014, 16:15) *
А как это сделать по-правильному? Я понимаю, что можно поиграть с задержкой, я это делал путем задания разной частоты TIMESPEC "TS_clk" = PERIOD "clk" ХХХ MHz HIGH 50.00%; при этом, как я понимаю, задержка автоматически подкручивается во входном клоковом буфере. Что интересно, ошибок меньше, если задать частоту 125 МГц, а не реальную 250 МГц. Можно и с IDELAY поиграть. Но должен же быть некий правильный путь решения проблемы, я как раз думал, что нужно задать какие-то дополнительные констрейнты, чтобы задержки подкручивались автоматически.


Возможно(хотя я не уверен), если задать правильный констрейн (пусть гуру сделают уточнение) ISE за вас накрутит линию приема через логику. Но я практически уверен, что никакой IDELAY он не добавит. И реализованная им схема (в случае если он умеет сам докручивать времянки) будет не совсем корректна (неоптимальна).

Поэтому:
http://www.xilinx.com/support/documentatio...uides/ug362.pdf (ключевое слово bufio)
http://www.xilinx.com/support/documentatio...uides/ug361.pdf (ключевое слово IODELAYE1)
http://www.xilinx.com/support/documentatio...heets/ds152.pdf (ключевое слова TPHCS)
В идеале, вам надо реализовать что-то вроде Рисунка 3-7 во 2-м документе. Только можно вместо ISERDES обойтись обычным триггером.

Ну а как посчитать времянки - спросите у товарищей на работе.
o_khavin
Цитата(Antgol @ Jan 31 2014, 14:56) *
Здравствуйте!

Глобальный вопрос такой: между 2-я Xilinx FPGA передаются данные и клок (не дифференциальный), по которому эти данные меняются; какие при этом должны быть заданы constraints?
Книжку “Constraints Guide” Xilinx читал, пока не помогло..

Вас не смущает, что данные бегут между чипами не в вакууме, а по реальным платам и разъёмам? Как там с разбегом сигналов и т.п.?
Вам нужно вместо чтения Constraints Guide поискать apnotes на синхронную передачу данных между чипами.

P.S. Ещё и клок не дифференциальный. wacko.gif
Torpeda
Цитата(Antgol @ Jan 31 2014, 13:56) *
Здравствуйте!

Глобальный вопрос такой: между 2-я Xilinx FPGA передаются данные и клок (не дифференциальный), по которому эти данные меняются; какие при этом должны быть заданы constraints?

Теперь опишу, в чем собственно проблема. Я передаю данные из Virtex 6 xc6vlx75t-2ff784 в Virtex 6 vc6clx760-1ff1760 (из дочерней карты с высокоскоростным трансивером в плату HAPS, одна плата вставляется в другую через разъем HapsTrack II). Данные меняются по клоку 250 МГц (он генерируется хард-ядром PCI-Express из референсного клока 100 МГц). Передается шина данных Data 32 бита, сигнал валидности Valid и сам клок Clk. На выходе одной ПЛИС и на входе другой использую регистры для Data и Valid по rising edge Clk (чтобы их можно было разместить рядом с пинами для минимизации задержки). Клок передается по пинам, подсоединенным к клоковым цепям каждой ПЛИС. Использую вот такой constraint в каждой ПЛИС:

NET "clk" TNM_NET = "clk";
TIMESPEC "TS_clk" = PERIOD "clk" 250 MHz HIGH 50.00%;

Проблема в том, что данные иногда приходят битые, например, х“97 2B FF FF” вместо х“97 6F FF FF”. Ошибки возникают на разных битовых позициях, похоже на рассогласование данных и клока на приемной стороне.
Нужно ли использовать какие-либо дополнительные constraints на сигналы Data и Valid, что-то вроде OFFSET IN или From-to? Ситуация-то вроде бы простейшая и вполне банальная. Книжку “Constraints Guide” Xilinx читал, пока не помогло..

1) STA констрейны нужны для того чтобы заставить тул выполнить необходимые вам условия.
Для этого надо сначала составить список этих условий.
Неработоспособность устройства по неизвестным причинам не есть основанием для создания констрейнов.
2) дпаже если вы никаких констрейнов не задали, тул всёравно считает все сигналы синхронными и применяет дефолтные констрейны к ним.
4) В вашем случае алгоритм действия такой:
- При помощи осцилографа понять почему данные приходят битыми (или задержки в линии не те, или помехи возникают из-за рассогласования линии передачи или кростолка и.т.д.)
- Если проблема именно в задержках в линии передачи (не согласованность данных и клоков и.т.п) то указать, что именно надо изменить и почему дефолтные правила STA не помогли.
Bad0512
Цитата(Antgol @ Jan 31 2014, 17:56) *
Здравствуйте!

Глобальный вопрос такой: между 2-я Xilinx FPGA передаются данные и клок (не дифференциальный), по которому эти данные меняются; какие при этом должны быть заданы constraints?

Теперь опишу, в чем собственно проблема. Я передаю данные из Virtex 6 xc6vlx75t-2ff784 в Virtex 6 vc6clx760-1ff1760 (из дочерней карты с высокоскоростным трансивером в плату HAPS, одна плата вставляется в другую через разъем HapsTrack II). Данные меняются по клоку 250 МГц (он генерируется хард-ядром PCI-Express из референсного клока 100 МГц). Передается шина данных Data 32 бита, сигнал валидности Valid и сам клок Clk. На выходе одной ПЛИС и на входе другой использую регистры для Data и Valid по rising edge Clk (чтобы их можно было разместить рядом с пинами для минимизации задержки). Клок передается по пинам, подсоединенным к клоковым цепям каждой ПЛИС. Использую вот такой constraint в каждой ПЛИС:

NET "clk" TNM_NET = "clk";
TIMESPEC "TS_clk" = PERIOD "clk" 250 MHz HIGH 50.00%;

Проблема в том, что данные иногда приходят битые, например, х”97 2B FF FF” вместо х”97 6F FF FF”. Ошибки возникают на разных битовых позициях, похоже на рассогласование данных и клока на приемной стороне.
Нужно ли использовать какие-либо дополнительные constraints на сигналы Data и Valid, что-то вроде OFFSET IN или From-to? Ситуация-то вроде бы простейшая и вполне банальная. Книжку ”Constraints Guide” Xilinx читал, пока не помогло..

Парочка уточняющих вопросов :
1. Как выводили клок из первого виртекса? Тупо assign pin = clk или с помощью DDR примитива?
2. Какой voltage standard пользуете?
3. Надеюсь, на втором виртексе клоки завдены на специальный клоковый вход?

Ну и пара мыслей на тему :
1. 250 МГц для single ended стандартов дюже много, тем более что вы всё это через разъём тащите. Напрашивается DDR LVDS, однако я не уверен что теперь вам это удастся сделать без переделки железа.
2. В любом раскладе предстоят танцы с IODELAY по входу данных, лучше бы подстройку задержек сделать динамической, хотя тут вам решать.
Antgol
AJIEKCEu, спасибо за ссылки, изучаю мануалы.

Цитата
Вас не смущает, что данные бегут между чипами не в вакууме, а по реальным платам и разъёмам? Как там с разбегом сигналов и т.п.?

o_khavin, немного, конечно, смущает, sm.gif но разброс, если верить мануалам, всего лишь +/- 84 ps

Забыл про это написать, каюсь. В одной плате согласно мануалу задержка FPGA-разъем 497+/-84 ps, в другой - 647+/-0.3 ps

Цитата
P.S. Ещё и клок не дифференциальный.

Могу переделать в дифференциальный. Мне казалось, что частота в общем-то еще не столь велика, можно и обычный использовать.

Цитата
1) STA констрейны нужны для того чтобы заставить тул выполнить необходимые вам условия.
Для этого надо сначала составить список этих условий.
Неработоспособность устройства по неизвестным причинам не есть основанием для создания констрейнов.

Torpeda, это понятно. Мой вопрос был такой: в той стандартной ситуации, что я описал, какие нужно задать стандартные требования.

Цитата
1. Как выводили клок из первого виртекса? Тупо assign pin = clk или с помощью DDR примитива?

Bad0512, да, тупо в .ucf прописал соответствие сигнала с пином (специальным клоковым пином)..

Цитата
2. Какой voltage standard пользуете?

Для интерфейсного разъема жестко прописан 2.5 В, используется LVCMOS25

Цитата
3. Надеюсь, на втором виртексе клоки завдены на специальный клоковый вход?

Да

Цитата
1. 250 МГц для single ended стандартов дюже много, тем более что вы всё это через разъём тащите. Напрашивается DDR LVDS, однако я не уверен что теперь вам это удастся сделать без переделки железа.

Я могу переделать клок под диф. пару без особых проблем, она там предусмотрена. Но вот всю шину данных переделать не получится физически.

Цитата
2. В любом раскладе предстоят танцы с IODELAY по входу данных, лучше бы подстройку задержек сделать динамической, хотя тут вам решать.

Ок, понятно..


Всем большое спасибо за ответы. Я, по всей видимости, несколько недооценил сложность задачи - казалось, что все тривиально и должно сразу заработать. Ну и плюс я сперва заводил более медленный PCI-Express, который генерировал юзер-клок 125 МГц - на 125 передача между чипами, собственно, сразу и заработала без проблем. При удвоении частоты же, наверное, придется поразбираться с клоковыми ресурсами Virtex 6.
Torpeda
Цитата(Antgol @ Feb 3 2014, 09:52) *
Torpeda, это понятно. Мой вопрос был такой: в той стандартной ситуации, что я описал, какие нужно задать стандартные требования.

Судя по проявлению проблемы вам скорее всего надо решить проблему с согласованием линий передачи.
Относительно констрейнов... сложно ответить не зная шинного протокола, может вам и установок поумольчанию достаточно....
Может надо external delay (set_out_delay) задать....
SM
Цитата(Antgol @ Feb 3 2014, 10:52) *
на 125 передача между чипами, собственно, сразу и заработала без проблем. При удвоении частоты же, наверное, придется поразбираться с клоковыми ресурсами Virtex 6.


А Вы клок не удваивайте, удвойте только частоту данных - DDR
Antgol
Цитата
Судя по проявлению проблемы вам скорее всего надо решить проблему с согласованием линий передачи.
Относительно констрейнов... сложно ответить не зная шинного протокола, может вам и установок поумольчанию достаточно....
Может надо external delay (set_out_delay) задать....


Torpeda, а что Вы подразумеваете под шинным протоколом? Про external delay (set_out_delay) почитаю

Цитата
А Вы клок не удваивайте, удвойте только частоту данных - DDR

SM, Вы не совсем правильно поняли, я удвоением частоты не занимаюсь, клок генерируется в блоке PCI-Express, просто для разной конфигурации PCI-Express он генерируется разный.
SM
Цитата(Antgol @ Feb 3 2014, 13:33) *
я удвоением частоты не занимаюсь

Ну займитесь, значит, упополамливанием с переходом SDR->DDR sm.gif
krux
посмотрите ещё xapp856
Antgol
Цитата
Ну займитесь, значит, упополамливанием с переходом SDR->DDR

SM, а какие приемущества это даст? sm.gif

Цитата
посмотрите ещё xapp856

krux, ок, спасибо, посмотрю
SM
Цитата(Antgol @ Feb 3 2014, 16:02) *
SM, а какие приемущества это даст? sm.gif

Хорошую целостность сигнала клока для не-дифф линии.
AJIEKCEu
Цитата(SM @ Feb 3 2014, 16:04) *
Хорошую целостность сигнала клока для не-дифф линии.

Я бы сказал вопрос не в целостности, а гарантированной и предсказуемой задержке синхросигнала относительно данных.
Yuris
Хороший совет был посчитать Setup/Hold для начала. Использование констрейнтов OFFSET OUT и OFFSET IN (RTFM) поможет понять по отчетам какие временные соотношения клоков/данных вы реально имеете на выходах/входах данных. Может оказаться, что в выходном интерфейсе клок skew по разным битам данных достаточно большой. И входную задержку по клоку на приемной стороне придется точно рассчитывать с учетом этого валидного окна данных.
Еще стоит почитать XAPP1064, там есть приложение с примерами-исходниками по использованию IDELAY, ISERDES.
Corner
Вопрос раз - как разведена плата? Все проводники в шине должны быть электрически (не путать с физически) одинаковой длины.
Вопрос два - какая длина и какие меры для удаления "звона" приняты? Дорожка + емкость пина = колебательный контур.
Вопрос три - чем формируется и как принимается клок? Лучший вариант формирователя - ДДР буфер с константами на входах. Лучший вариант приемника - ДДР буфер с локальным клоком от этого пина.
Antgol
Прошу прощения за то, что молча бросил тему - закрутился и забыл...

Проблему я вроде бы решил месяц назад (ну т.е. мой тест прошел, но более глобально еще не тестировал), использовав в явном виде клоковые примитивы Virtex6, а именно IBUFG, BURF, также добавил задержку по клоку IODELAYE1. Что именно помогло, не выяснял. Если кому-нибудь интересно, могу привести куски vhdl.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.