Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Программируемая задержка на CycloneII
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
Andr2I
Есть очень горячее желание сделать на CycloneII программируемую задержку шаг которой определяется задержкой одного элемента lcell. Предполагается сделать длинную "колбасу" из lcell (штук 100) и монстроподобный коммутатор (его составляющие тоже надо учесть в задержке).
Понятно, что лучше взять Спартан (там все уже сделано), но не хочется переходить и да и "жаба душит".
Понятно, что задержка будет меняться от чипа к чипу и при изменении температуры - предполагается ввести периодическую калибровку кварцованным периодом тактовой частоты.
Ну и также понятно, что кто-то над такой идеей уже думал и возможно попытался реализовать. Было бы очень интересно услышать.

P.S. Прекрасно понимаю, что шаг регулировки будет немного разным (оптимистичная оценка 10%) и сильно зависеть от размещения на кристалле. Раньше не пробовал, но читал что место расположения элементов можно зафиксировать - возможно это еще один подводный камень - будет Квартус плакаться и работать не даст.

С уважением, Андрей
Gate
Непонятны условия задачи - какие задерки хочется получить? шаг? надо ли выводить результат из кристалла?, но рискну дать несколько советов.
Я бы Вам посоветовал взять все же большую тактовую частоту и сделать ЛЗ на сдвиговом регистре, а вот внутри такта более мелкий шаг реализовывать через задержки в элементах.
Если шаг не более 2 нс - сделайте просто сдвиговый регистр, 500 Мгц потянет. Задерка на вых. пине будет примерно такая же.
Еще есть способ - с помощью PLL сделать 4 одинаковых частоты со сдвигом на 90 градусов и работать с ними, важно, чтобы 1/4 этой частоты > задержка на разводке + setup time на триггере. Думаю, что на втором циклоне можно добится 1 нс кванта задерки, но на выходном пине вы его сильно загрубите, если выход будет не lvds.
Насчет Вашей оценки точности в 10% сомневаюсь, поскольку бюджет задержек складывается как 30%-задержка элемента и 70%-задержка роутинга, Вам придется lcell каждый раз ручками расставлять.
А самый правильный способ - посмотреть в сторону MC100EP195 и аналогичных, если шаг нужен меньше 1 нс.
Andr2I
2Gate
Цитата
Непонятны условия задачи - какие задерки хочется получить? шаг? надо ли выводить результат из кристалла?,


Шаг нужен порядка 1 нс (желательно 0,5 нс) с выводом результата из кристалла. Абсолютная величина сдвига не играет роли - важно относительное изменение.

Цитата
Я бы Вам посоветовал взять все же большую тактовую частоту и сделать ЛЗ на сдвиговом регистре, а вот внутри такта более мелкий шаг реализовывать через задержки в элементах.


Именно так и думаю сделать. Но циклон тихоходный (8) и больше 200-250 МГц Квартус начинает ругаться. Можно попытаться повысить частоту на локальной шине сдвигового регистра, но много это не даст (как мне кажется).

Цитата
Еще есть способ - с помощью PLL сделать 4 одинаковых частоты со сдвигом на 90 градусов и работать с ними, важно, чтобы 1/4 этой частоты > задержка на разводке + setup time на триггере.


Тоже думал в этом направлении, но...
1) На выход идет однократный импульс, а не частота.
2) Если попытаться использовать сдвиг тактовой частоты на 90 градусов для сдвигового регистра, то тут тоже не очень хорошо - у циклоновской PLL только три выхода, а альтеровский "коммутатор" позволяет делать выбор тактового сигнала только от двух выходов PLL. Если взять два регистра и тактировать один по спаду, другой по фронту + коммутировать два сдвинутых на 90 градусов clk, то вроде получается, но объединение выходных сигналов на lcell, опять может здорово все испортить. Но где-то 1,5 нс наверное вытяну.

Цитата
Вам придется lcell каждый раз ручками расставлять.


Это-то и напрягает - не делал я так раньше.

Цитата
А самый правильный способ - посмотреть в сторону MC100EP195 и аналогичных, если шаг нужен меньше 1 нс.


Обязательно посмотрю. Но лишние 14 баксов сводят преимущества Альтеры против Ксайлакса на нет.

А вообще, большое спасибо за советы.
VslavX
Цитата(Andr2I @ Jan 13 2007, 16:40) *
Есть очень горячее желание сделать на CycloneII программируемую задержку шаг которой

Можно еще попробовать использовать программируемые задержки на входах Циклона.
Например, сначала сдвигаем синхронно, на нужное число по 4нс на 250МГц, а потом выходим наружу и синхронно подаем на набор из 8 входов со сдвигами от 0 до 3.5нс, ну и нужную фазу потом уже выбрать коммутатором. Плохо, конечно, что приходится выходить из кристалла наружу, но можно попытаться.
Gate
Цитата(Andr2I @ Jan 13 2007, 21:23) *
Цитата
Я бы Вам посоветовал взять все же большую тактовую частоту и сделать ЛЗ на сдвиговом регистре, а вот внутри такта более мелкий шаг реализовывать через задержки в элементах.


Именно так и думаю сделать. Но циклон тихоходный (8) и больше 200-250 МГц Квартус начинает ругаться. Можно попытаться повысить частоту на локальной шине сдвигового регистра, но много это не даст (как мне кажется).

Имхо на сдвиговом регистре получите 300-400 Мгц, правда зависит от длины - как только выйдите за пределы 1 LAB, тотчас возрастут задержки роутинга.

Цитата
Тоже думал в этом направлении, но...
1) На выход идет однократный импульс, а не частота.
2) Если попытаться использовать сдвиг тактовой частоты на 90 градусов для сдвигового регистра, то тут тоже не очень хорошо - у циклоновской PLL только три выхода, а альтеровский "коммутатор" позволяет делать выбор тактового сигнала только от двух выходов PLL. Если взять два регистра и тактировать один по спаду, другой по фронту + коммутировать два сдвинутых на 90 градусов clk, то вроде получается, но объединение выходных сигналов на lcell, опять может здорово все испортить. Но где-то 1,5 нс наверное вытяну.

Я имел в виду вот что: на плл получаете 2 частоты, сдвинутые на 90 градусов, а в триггерах используете или clk или !clk. Делаете длинный сдвиговый регистр, который тактируете какой-либо частотой (переключать динамически тактовые входы нельзя), а в конце ставите 4 триггера, каждый из которых тактируете своей сдвинутой частотой. А на самом выходе мультиплексор 4->1. Если предположить, что задержки в каждой ветви мультиплексора будут одинаковы (что очевидно неверно), то можно получить шаг F/4.
В этой схеме непонятно, как аккуратно избегать метастабильности на входе. Ставить 2 триггера, тактируемые сдвинутой частотой, чтобы не загрубить шаг?

Вопрос: а чем лучше для такой задачи xilinx?

PS Сейчас еще один метод в голову пришел ("статистический"):
1. Делаете цепочку lcell как хотели, с мультиплексором на выходе.
2. На один вход подключаете несколько таких цепочек, их выходы объединяете через мультиплексор на итоговый выход.
3. Бросаете это в кристалл, синтезируете и смотрите задержки от входа до выхода при разных значениях адресов мультиплексоров - и пытаетесь подобрать значения задержек через равные шаги. Получаете таблицу соответствия задержки адресам мультиплексоров и используете ее при управлении ЛЗ снаружи кристалла, или ставите перед адресными входами мультиплексоров RAM, в которую заносите полученную таблицу, ну а адрес RAM будет определять нужную задержку в некоторых единицах.
Andr2I
2VslavX
Цитата
Можно еще попробовать использовать программируемые задержки на входах Циклона.


Очень интересно! Т.е. на одной ячейке сделать коммутатор и его входы объявить Input Delay from Pin to Internal Cells? Может и получится, но есть еще минус (кроме выхода наружу) - ячейка имеет 4-х входовую таблицу, поэтому коммутатор получится 2-х входовой, следовательно надо будет 4 коммутатора и еще ячейку на объединение. Задержки на особенности разводки наверняка будут меньше задержки при выводе наружу.
Еще раз повторюсь - идея очень итересная, буду думать.

2Gate
Цитата
Если предположить, что задержки в каждой ветви мультиплексора будут одинаковы (что очевидно неверно), то можно получить шаг F/4.


В этом то и дело - опять придется руками расставлять. Интересно - это надо делать один раз или каждый перед разводкой проекта?

Цитата
В этой схеме непонятно, как аккуратно избегать метастабильности на входе. Ставить 2 триггера, тактируемые сдвинутой частотой, чтобы не загрубить шаг?


Метостабильность при поступлении исходного (несдвинутого) импульса (за счет задержек он может поступить на вход в момент переключения триггера сдвинутой частотой)?
Ну тут задержка должна быть приличная, хотя.. Два триггера с clk и !clk на входе данных должны помочь, но порядок выводов задержки будет нарушен.

Цитата
Вопрос: а чем лучше для такой задачи xilinx?


У Спартана штатная функция PLL делает такй сдвиг (кажется 256 градаций на период). И сдвиг можно менять при работе.

Цитата
PS Сейчас еще один метод в голову пришел ("статистический"):


Можно конечно, но так можно подобрать для конкретного кристалла и конкретной разводки. Постарел кристалл (или нагрелся) и все пропало. Чего-то не очень нравится.
Tosha
Можно попробовать подойти с другой стороны. Попробуйте изменять частоту сигнала тактирования сдвигового регистра. Не знаю какая задержка по длительности нужно, но для достаточно большой, такой способ пойдет. Берите VCXO или VCO, они управляются напряжением. VCXO достаточно много разных, +-100ppm можно найти, тогда для задержек ~ >200мкс (оценка) можно получить хорошую относительную точность. Про VCO - настройка частоты (например CVCO55CL-0045-0070) 50-70MHz, (20-15нс)пойдет и для маленьких задержек. С точностью похуже будет.
Andr2I
2Tosha
Цитата
Берите VCXO или VCO, они управляются напряжением.

Вся прелесть была в отсутствии внешних компонентов. А так можно и просто RCцепь снаружи прикрутить и менять ее постоянную изменяя напряжение на резисторе с помощью PWM (ну и пофильтровав его).
Tosha
Ну тут весь вопрос в задаче, которую решить нужно и точность которую нужно получить.
Ну а если делать как предлагалось, то у ксайлинкса видел аппнот про восстановление высокочастотного сигнала на 4 регистрах со сдвигом по фазе на 90 градусов. правда они его потом наружу не выдавали.
5pm
В настоящее время мне приходится решать очень похожую задачу: есть несколько(порядка десяти) каналов по которым поступают сигналы с детекторов с длительностью порядка 10-70 нс, требовалось cделать управляемую задержку и формирователь длительности выходного сигнала для каждого канала. Для создания блока задержки я использовал 128-разрядный сдвиговый регистр и цепочку из 127 lсell'ов. Для правильной работы единичный бит заносился только в один разряд регистра. Длинна цепочки, через которую пропускался сигнал зависела от номера разряда регистра:

0-й разряд - сигнал будет пропущен через 127 lcell'ов
1-й разряд - сигнал будет пропущен через 126 lcell'ов
......
127-й разряд - сигнал будет пропущен через 0 lcell'ов

В процессе разработки было выполнено моделирование с реальными задержками, которое показало высокую дифференциальную нелинейность зависимости общего времени задержки(T) от номера номера выбранного разряда в управляющем регистре(N). В для разных значений N увеличение задержки составляло от 0.3 до 1.8 нс на каждый шаг. В тоже время среднее время, добавляемое одним шагом задержки составило ~0.7 нс.

Кроме моделирования были произведены оценочные измерения с помощью осциллографа и микросхемы ALTERA EP1C12F324C8. Они подтвердили общую "тенденцию" наблюдавшуюся в модели. Кроме того наблюдался джиттер выходного сигнала с разбросом порядка 2% от величины на которую в данный момент задерживался сигнал. Тривиальное измерение температурной стабильности дало отклонение в 0.1% на каждый градус цельсия.

Также были выполнены наблюдения сигнала, задержанного на Stratix'e, с ней я пока возился совсем мало, но первое что бросилось в глаза - ждиттер у нее больше, чем на первом циклоне.
-=Vitaly=-
Здравствуйте Уважаемые!!!
Код
module delay ( clk_in ,clk_out ,DATA ,nWE );  
    
localparam WIDTH=16;
    
output clk_out;
reg clk_out /* synthesis syn_keep=1 alspreserve=1 */;

input clk_in;
wire clk_in;
input [WIDTH-1:0] DATA;
wire [WIDTH:0] DATA;
input nWE;
wire nWE;
reg [WIDTH:0] sel;

always@(posedge clk_in)
    begin
    if (nWE)
        sel<=DATA;
    end    

always@*
begin    
case(sel)
    16'h 0000: clk_out<=clk_in /* synthesis syn_keep=1 alspreserve=1 */;    
    16'h 0001: clk_out<=!(!clk_in) /* synthesis syn_keep=1 alspreserve=1 */;
    16'h 0002: clk_out<=!(!(!(!clk_in))) /* synthesis syn_keep=1 alspreserve=1 */;
        .................................................................
    default: clk_out<=1'b1;
endcase
end
    
endmodule


Подскажите как сделать то же самое (т.е задержку на инверторах), но чтобы синплифай не оптимизировал и не выкидывал цепочку инверторов. А если подскажете как заменить case на for или generate, то огромное спасибо и высочайший a14.gif
Andr2I
2 5pm
Цитата
Для создания блока задержки я использовал 128-разрядный сдвиговый регистр и цепочку из 127 lсell'ов.


Т.е. каждый на каждый lcell сигнал подавался ИЛИ через передыдущий lcell ИЛИ с выхода соотвествующего регистра (зачем он сдвиговый?)?

Цитата
В процессе разработки было выполнено моделирование с реальными задержками, которое показало высокую дифференциальную нелинейность зависимости общего времени задержки(T) от номера номера выбранного разряда в управляющем регистре(N). В для разных значений N увеличение задержки составляло от 0.3 до 1.8 нс на каждый шаг. В тоже время среднее время, добавляемое одним шагом задержки составило ~0.7 нс.


Ну так и должно быть - 256 ячеек компактно не разместишь и начинает играть длина связей.
А зачем так много? Если шаг задержка 1 нс, то при тактовой частоте даже 100 МГц (реально можно 200) потребуется только 10-15 lcell. Там и дифф. нелинейность должна быть меньше.

С уважением, Андрей
5pm
Цитата
Т.е. каждый на каждый lcell сигнал подавался ИЛИ через передыдущий lcell ИЛИ с выхода соотвествующего регистра (зачем он сдвиговый?)?

Не совсем так. На каждый lcell сигнал подается ИЛИ через предыдущий lcell ИЛИ со в хода, т.е. внешнего пина. Дело втом, что входной сигнал поступает с внешнего детектора, регистрирующего заряженные частицы. Т.е. входные сигналы приходят асинхронно по отношению к тактовым синхроимпульсам. Сдвиговый регистр используется только для задания количества lcell'ов, через которые следует пропустить сигнал. Длинна регистра равна числу шагов программируемой задержки, т.е. в моем случае 128, соответственно сдвиговый он для того, чтобы в него было удобно заносить ту единственную единичку, которая определит итогувую величину задержки. Во время работы линии задержки регистр никуда, разумеется, не сдвигается. Вообще-то вместо извращения с этим регистром можно было бы просто сделать мультиплексор на 128, но мне показалось, что по ресурсам это не выгодно, может я ошибаюсь? Что займет меньше ячеек, сдвиговый 128-разрядный регистр или мультиплексор на 128 выводов?

Как я уже сказал, входной сигнал по определению асинхронен, следовательно никаких синхронных вещей здесь применять нельзя. Если фронт задерживаемого сигнала прийдет почти одновременно с синхроимпульсом, то в регистр скорее всего ничего не запишется(мало время удержания), т.е. мы получим сдвиг выходного сигнала на величину такта, ну а дрожание (джиттер) сигнала на выходе будет таким образом даже превышать такт, а это неприемлемо.
Andr2I
2 5pm
Ага вроде понял - у Вас 1 в сдвиговом регистре разрешает прохождение импульса извне на соответствующий lcell?

Цитата
Что займет меньше ячеек, сдвиговый 128-разрядный регистр или мультиплексор на 128 выводов?


При такой постановки вопроса думаю, что мультиплексор будет экономичнее (надо просто взять и проверить), но там задержки будут - "мама не горюй". Думаю, что где-то до 50 МГц опуститесь. Если говорить просто про ультиплексор, то лучше выполнять его в несколько стадий - будет быстрее.

А все-таки - 128 lcell дают максимальню задержку 128 нс - 8 МГц. У Вас тактовая нааверняка выше. Зачем так много?
5pm
Да, Вы правильно меня поняли: сдвиговый регистр действительно нужнен только для управления и он используется именно так, как Вы сказали.

Задержка в 128 нс нужна потому, что задержанный сигнал потом будет снова выведен из ПЛИС и подан на другие блоки. С этим же связано и то, что таких задержек нам нужно несколько. Есть несколько детекторов, каждый образует свой канал и каждый из этих каналов, пройдя через ПЛИС, потом будет обработан внешними электронными блоками.
dvladim
Для хорошей стабильности задержки стоит взять схему с индустриальным диапазоном температур.
Наилучшее разрешение даст задержка по цепи переноса.
Вот и делаете: на одном ЛАБе строите цепочку из мультиплексоров, которая выбирает сигнал либо с локального трека, либо с цепи переноса предыдущего элемента. Между ЛАБами стоит соединять без мультиплексирования, жестко (эти задержки хуже прогнозируемы). И строите из таких ЛАБов цепочку нужной длины. (управление каждым мультиплексором со своего триггера).
Вот так можно получить линию задержки приличной длины и с хорошим разрешением.
Здесь стоит учитывать что передний и задний фронт разъезжаются по разному, и если нужны оба фронта в нужное время, то на конце этой линии придется делать компенсатор (две параллельных линии задержки связанных по "И").
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.