Хочу сделать 5-канальную программируемую ЛЗ для импульсов с частотой следования до 20МГц. Задержка должна программироваться от 0 до 400 нс с шагом в несколько нс. Для этого есть специальные микросхемы у MAXIM, DATADELAY. Например 8-битная с шагом 2нс или 6-битная с шагом 6нс. Обе подходят. Схему уже набросал на MAXIMе, пока не выяснил насчёт доставабельности. Но возник вопрос: поскольку в проекте всё равно уже использую ПЛИС для управления ЛЗ, нельзя ли сделать на какой-нибудь ПЛИС или FPGA эти задержки, например с помощью строенных FIFO?
Цитата(ANT @ Mar 1 2006, 14:56)

Хочу сделать 5-канальную программируемую ЛЗ для импульсов с частотой следования до 20МГц. Задержка должна программироваться от 0 до 400 нс с шагом в несколько нс. Для этого есть специальные микросхемы у MAXIM, DATADELAY. Например 8-битная с шагом 2нс или 6-битная с шагом 6нс. Обе подходят. Схему уже набросал на MAXIMе, пока не выяснил насчёт доставабельности. Но возник вопрос: поскольку в проекте всё равно уже использую ПЛИС для управления ЛЗ, нельзя ли сделать на какой-нибудь ПЛИС или FPGA эти задержки, например с помощью строенных FIFO?
Посмотрите описание блоков DCM - у Ксайлинкса и PLL у Альтеры.
А что такое строенные FIFO?
Опечатка

встроенные.
Не думаю, что встроенное фифо удобно использовать - вам ведь нужно будет менять его глубину. Поскольку вход однобитный, то imho ставите сдвиговый регистр на 100-200 разрядов, тактируете его 300-500 Мгц (циклон или лучше циклон2), на вход - ваш сигнал, а выход снимаете с нужного вам разряда. Единственная проблема - мультиплексор 200-в-1 не вытянет за 1 такт при 300 Мгц - тогда разбиваете его на группы и делаете конвеер (это добавит фикс. задержку в несколько клоков, кот. вам надо учесть).
Подумал немного, и понял, что поторопился - как я советовал сделать легко, но ресурсов в кристалле это займет излишне много.
Второй путь - использовать встроенную память (но ограничение по частоте - 250 мгц на циклоне). Насколько я помню, fifo с управляемой глубиной в библиотеке нет, так что надо просто взять блок однобитной памяти и написать к нему контроллер.
Еще насколько помню, блоки памяти в циклоне можно конфигурировать как сдвиговый регистр, но можно ли динамически менять его длину не знаю, никогда не пользовался. По крайней мере, всегда можно собрать регистр переменной длины из нескольких кусков фиксированой длины (сделанных из памяти) и регистра перем. длины (собраного из триггеров).
Ну, а если взять тактовую 167,7Мгц(6нс) и 64 в 1, или 200МГц(5нс) и 80->1 , то вытянет? Допустим, если вытянет, то 5 таких каналов поместится в одном чипе?
Цитата(ANT @ Mar 1 2006, 17:56)

возник вопрос: поскольку в проекте всё равно уже использую ПЛИС для управления ЛЗ, нельзя ли сделать на какой-нибудь ПЛИС или FPGA эти задержки, например с помощью строенных FIFO?
А какая у вас ПЛИС? Сделать ЛЗ в ПЛИС можно. Но для её стабильности необходимо подать внешнюю тактовую частоту с периодом, равным шагу ваших задержек. Ну а дальше - счётчик и одновибратор на выходе, задающий требуемую длительность импульса. Либо сдвиговый регистр.
Пока ПЛИС простенькая - XC95108-10. Её хватает только на организацию интерфейса VME - линии задержки. Но можно взять и другую. А задержка на одновибраторе не подходит: работает только по переднему фронту сигнала и режет информацию о длительности входного импульса.
Сделайте аналогичную цепь и для заднего фронта!

)
Либо через сдвиговый регистр, как писали
Проще всего думаю будет сделать все-таки на двухпортовой памяти. Ставите счетчик на входной поток, это будет адрес записи. Отнимаете от него величину задержки - получаете адрес чтения. Таким образом получаете в памяти сохраненннный сигнал и считываете с нужной задержкой. Если задержка для всех каналов одинаковая, то можно увеличить разрядность памяти.
Учтите, что недостаток ЛЗ в ПЛИС по сравнению со специализированной микросхемой - у ЛЗ будет джиттер, соизмеримый с тактовой частотой сдвигового регистра или счётчика, т.е. несколько наносекунд. А у спец. микросхемы такого не будет.
Цитата(Tosha @ Mar 3 2006, 12:22)

Проще всего думаю будет сделать все-таки на двухпортовой памяти. Ставите счетчик на входной поток, это будет адрес записи. Отнимаете от него величину задержки - получаете адрес чтения. Таким образом получаете в памяти сохраненннный сигнал и считываете с нужной задержкой. Если задержка для всех каналов одинаковая, то можно увеличить разрядность памяти.
Каналы - независимые. Получается, что для записи входного 5-битового потока можно использовать общий счётчик адреса, а для чтения - индивидуальные? Какой чип годится для организации пяти каналов двухпортовой однобитной памяти глубиной порядка 100 бит и частотой записи/чтения порядка 200 МГц?
Да реализация именно такая.
Любой Cyclone или Cyclone2 имеет нужное количество блоков. А по быстродействию смотреть нужно. Судя по документации Cyclone надо брать -6, а Cyclone2 любой пойдет. По Xilinx не подскажу.
У Xilinx есть несколько App Notes где используются линии задержки с шагом порядка десятков пикосекунд с использованием стандартных блоков (buffer, carry chain)
http://www.xilinx.com/bvdocs/appnotes/xapp700.pdfhttp://direct.xilinx.com/bvdocs/appnotes/xapp697.pdfЗнаю, что это работает в Virtex-2 и Virtex-4.
Есть еще у ксилинкса вариант с использованием блока IDELAY в Virtex-4. Применяется в высокоскоростных интерфейсах.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.