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

iodelay в режиме с программируемой задержкой

Здравствуйте, коллеги!

 

Необходимо создать программируемую задержку входного импульса низкой частоты (~1 kHz). Использую для этого iodelay в режиме VARIABLE_FROM_ZERO, но столкнулся при этом с проблемами управления задержкой. Создается впечатление, что реальная задержка принимает совершенно случайные значения.

Хочу исследовать модуль iodelay, для чего его выход вывожу на другой вывод ПЛИС с тем, чтобы измерять задержку осциллографом.

Использование iodelay непосредственно между двумя пинами невозможно (кто бы сомневался)). Проблема заключается в том, что дизайн разводится только в том случае, если выходной сигнал iodelay пропустить через FD, что в моем случае делает работу бессмысленной. Если же в качестве промежуточных элементов брать какую-нибудь комбинационную логику, то проект упорно не разводится.

 

Кто-нибудь знает, как вставить iodelay таким образом, чтобы можно было бы наблюдать задержку осциллографом. Или у кого есть опыт в этом вопросе.

Заранее благодарен.

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


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

А на сколько требуется задержать сигнал?

Может Вам достаточно сделать сдвиговый регистр с мультиплексором и получать желаемое?

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


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

А на сколько требуется задержать сигнал?

Может Вам достаточно сделать сдвиговый регистр с мультиплексором и получать желаемое?

 

Нужно задержать сигнал на доли периода CLK. Сдвиговые регистры тут не подойдут.

 

В случае использования IODELAY в вышеописанном режиме теоретический дискрет временного интервала - 40 пс.

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


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

А если не секрет, для каких именно задач необходимо создавать такую задержку? Может имеет смысл задержать все входы-выходы через триггеры и в нужном месте задействовать 2 триггера? Хотя конечно если конкретно задержку в 40пс нужно, тогда посложнее. Опять же что значит комбинационные схемы не собираются? Если проект в Xilinx'е то возможно имеет смысл поиграться с IOBuffer.

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


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

А если не секрет, для каких именно задач необходимо создавать такую задержку? Может имеет смысл задержать все входы-выходы через триггеры и в нужном месте задействовать 2 триггера? Хотя конечно если конкретно задержку в 40пс нужно, тогда посложнее. Опять же что значит комбинационные схемы не собираются? Если проект в Xilinx'е то возможно имеет смысл поиграться с IOBuffer.

 

Есть две одинаковые платы, работающие от одного клока. Необходимо передать синхроимпульс с одной платы на другую. Без дополнительной задержки получается, что входящий синхроимпульс попадает на переходной процесс rising_edge, в результате чего он оказывается случайным образом то в одном такте, то в следующем.

 

Опять же что значит комбинационные схемы не собираются?

Implementation tool выдает сообщение "unroutable situation".

 

 

Если проект в Xilinx'е то возможно имеет смысл поиграться с IOBuffer.

Что такое IOBuffer ?

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


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

Есть две одинаковые платы, работающие от одного клока. Необходимо передать синхроимпульс с одной платы на другую. Без дополнительной задержки получается, что входящий синхроимпульс попадает на переходной процесс rising_edge, в результате чего он оказывается случайным образом то в одном такте, то в следующем.

Имел "счастье" передавать данные в обе стороны между ведущей и ведомой платами на расстояние порядка 20 см, частота 25 МГц. Для устойчивой работы пришлось сделать отдельный блок для "регенерации" тактирующего сигнала, устраняя возможные короткие импульсы. Боюсь другого пути у Вас нет.

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


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

В простом смысле IOBuffer - это буферы) Как-то выглядит вот так: http://www.xilinx.com/support/documentatio...util_ds_buf.pdf

И если вам нужно сделать передачу полдный дуплекс, тогда нужно разделить на 2 шины - одна передача, вторая приём. Клоковую частоту заводить с питаемой платы и возвращать её же назад. Аналогично на втором устройстве. А сами порты правильно описать в констрейнах. Тогда вам ничего не будет грозить. Единственное что я не могу посоветовать Даташитов никаких... Мне это обьясняли на пальцах и так мы тактировали внешний модуль Эзернет. Но тут я думаю схожая ситуация.

 

Опосля влезла ещё мысль) Отправляйте синхроимпульс не по возрастающему фронту, а по спадающему. Логика простая, реализация ещё проще. Максимум что - синтезатор ругнётся, но у вас будет гарантированный зазор в пол периода на приём синхросигнала.

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


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

В простом смысле IOBuffer - это буферы) Как-то выглядит вот так: http://www.xilinx.com/support/documentatio...util_ds_buf.pdf

И если вам нужно сделать передачу полдный дуплекс, тогда нужно разделить на 2 шины - одна передача, вторая приём. Клоковую частоту заводить с питаемой платы и возвращать её же назад. Аналогично на втором устройстве. А сами порты правильно описать в констрейнах. Тогда вам ничего не будет грозить. Единственное что я не могу посоветовать Даташитов никаких... Мне это обьясняли на пальцах и так мы тактировали внешний модуль Эзернет. Но тут я думаю схожая ситуация.

 

Опосля влезла ещё мысль) Отправляйте синхроимпульс не по возрастающему фронту, а по спадающему. Логика простая, реализация ещё проще. Максимум что - синтезатор ругнётся, но у вас будет гарантированный зазор в пол периода на приём синхросигнала.

 

То, что Вы прислали - это дифференциальный трансивер. Причем тут IODELAY ??

 

Коллеги, у кого есть опыт работы с IODELAY, помогите пожалуйста !!

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


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

Конкретно касательно буферров - возможно получится установив цепочку со входа на выход создать необходимую задержку.

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


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

Конкретно касательно буферров - возможно получится установив цепочку со входа на выход создать необходимую задержку.

на мой взгляд так не коректно...

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


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

Есть две одинаковые платы, работающие от одного клока. Необходимо передать синхроимпульс с одной платы на другую. Без дополнительной задержки получается, что входящий синхроимпульс попадает на переходной процесс rising_edge, в результате чего он оказывается случайным образом то в одном такте, то в следующем.

Эта задача решается с помощью PLL/DLL с внешней обратной связью(zero delay buffer). А IODELAY, в особенности такой кривой, как в S6, тут не помошник.

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


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

Спасибо!

 

Эта задача решается с помощью PLL/DLL с внешней обратной связью(zero delay buffer).

 

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

image.png

Я понимаю ситуацию так:

Из-за неизвестного фазового соотношения между клоками плат и из-за того, что неизвестно время распространения синхроимпульса по проводу, на приемной стороне может возникнуть race condition (Оно по факту и происходит, ибо я вижу, что импульс попадает то в одно временное окно, то в другое). Чтобы этого не было, нужно задержать сигнал на некоторое время. Причем хотелось бы иметь возможность менять это время "на ходу", чтобы сделать оптимальный подбор.

На сколько правильный/костыльный этот метод?

Как это можно сделать при использовании PLL/DLL с внешней обратной связью(zero delay buffer)?

image.jpg

А IODELAY, в особенности такой кривой, как в S6, тут не помошник.

В чем кривость IODELAY?

Невозможно точно установить время задержки?

Оно сильно зависит от внешних факторов?

Не работает интерфейс управления задержкой?

Еще что-то?

 

Заранее благодарен.

 

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


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

Если вы внешний тактовый сигнал в плисах напрямую заводите на тактовые входы регистров, то самый простой (минимум изменений) способ это "привязать" выходные сигналы к спаду, а входные к фронту тактового сигнала. Т.е. на передающей стороне состояние меняется по спаду, а на приемной стороне защелкивание производится по фронту. Но нужно учесть, что если изменятся условия подключения плат между собой и к генератору тактового сигнала, то и ситуация может поменяться на противоположную. Тогда рабочим может оказаться ваш текущий вариант.

 

Опишите подробнее клоковое дерево всей вашей системы, тогда проще будет подсказать решение.

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


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

Кривость IODELAY в том, что шаги могут различаться до 150ps, плавают в три раза по PVT, длина задержки не более полпериода, в старых ревизиях чипа были глюки, создаёт дополнительную задержку около 2 нс.

 

PLL с внешней обратной связью позволяет выдавать наружу сигналы, строго привязанные к фазе входного клока независимо от PVT, с точно настраиваемым сдвигом фазы относительно входного клока, для этого использовать два выхода PLL - один только для обратной связи, другой для тактирования выходных триггеров и прочего.

 

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


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

В чем кривость IODELAY?

Невозможно точно установить время задержки?

Оно сильно зависит от внешних факторов?

Не работает интерфейс управления задержкой?

Еще что-то?

 

Заранее благодарен.

С IODELAY в S6 не работал, потому про них не скажу. Но раз вы хотите/знаете на сколько вам надо по вращать фазу данных в IODELAY, что вам мешает сделать то же самое с клоком в DCM, как вам советует Timmy?

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


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

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

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

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

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

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

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

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

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

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