|
Программируемая задержка на CycloneII |
|
|
|
Jan 13 2007, 19:10
|
Знающий
   
Группа: Свой
Сообщений: 859
Регистрация: 7-04-05
Из: Санкт-Петербург
Пользователь №: 3 943

|
Непонятны условия задачи - какие задерки хочется получить? шаг? надо ли выводить результат из кристалла?, но рискну дать несколько советов. Я бы Вам посоветовал взять все же большую тактовую частоту и сделать ЛЗ на сдвиговом регистре, а вот внутри такта более мелкий шаг реализовывать через задержки в элементах. Если шаг не более 2 нс - сделайте просто сдвиговый регистр, 500 Мгц потянет. Задерка на вых. пине будет примерно такая же. Еще есть способ - с помощью PLL сделать 4 одинаковых частоты со сдвигом на 90 градусов и работать с ними, важно, чтобы 1/4 этой частоты > задержка на разводке + setup time на триггере. Думаю, что на втором циклоне можно добится 1 нс кванта задерки, но на выходном пине вы его сильно загрубите, если выход будет не lvds. Насчет Вашей оценки точности в 10% сомневаюсь, поскольку бюджет задержек складывается как 30%-задержка элемента и 70%-задержка роутинга, Вам придется lcell каждый раз ручками расставлять. А самый правильный способ - посмотреть в сторону MC100EP195 и аналогичных, если шаг нужен меньше 1 нс.
--------------------
"Человек - это существо, которое охотнее всего рассуждает о том, в чем меньше всего разбирается." (с) С.Лем
|
|
|
|
|
Jan 13 2007, 21:23
|
Местный
  
Группа: Свой
Сообщений: 368
Регистрация: 16-11-06
Из: Тверь
Пользователь №: 22 379

|
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 баксов сводят преимущества Альтеры против Ксайлакса на нет. А вообще, большое спасибо за советы.
|
|
|
|
|
Jan 14 2007, 02:25
|
Знающий
   
Группа: Свой
Сообщений: 859
Регистрация: 7-04-05
Из: Санкт-Петербург
Пользователь №: 3 943

|
Цитата(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 будет определять нужную задержку в некоторых единицах.
--------------------
"Человек - это существо, которое охотнее всего рассуждает о том, в чем меньше всего разбирается." (с) С.Лем
|
|
|
|
|
Jan 14 2007, 09:56
|
Местный
  
Группа: Свой
Сообщений: 368
Регистрация: 16-11-06
Из: Тверь
Пользователь №: 22 379

|
2VslavX Цитата Можно еще попробовать использовать программируемые задержки на входах Циклона. Очень интересно! Т.е. на одной ячейке сделать коммутатор и его входы объявить Input Delay from Pin to Internal Cells? Может и получится, но есть еще минус (кроме выхода наружу) - ячейка имеет 4-х входовую таблицу, поэтому коммутатор получится 2-х входовой, следовательно надо будет 4 коммутатора и еще ячейку на объединение. Задержки на особенности разводки наверняка будут меньше задержки при выводе наружу. Еще раз повторюсь - идея очень итересная, буду думать. 2Gate Цитата Если предположить, что задержки в каждой ветви мультиплексора будут одинаковы (что очевидно неверно), то можно получить шаг F/4. В этом то и дело - опять придется руками расставлять. Интересно - это надо делать один раз или каждый перед разводкой проекта? Цитата В этой схеме непонятно, как аккуратно избегать метастабильности на входе. Ставить 2 триггера, тактируемые сдвинутой частотой, чтобы не загрубить шаг? Метостабильность при поступлении исходного (несдвинутого) импульса (за счет задержек он может поступить на вход в момент переключения триггера сдвинутой частотой)? Ну тут задержка должна быть приличная, хотя.. Два триггера с clk и !clk на входе данных должны помочь, но порядок выводов задержки будет нарушен. Цитата Вопрос: а чем лучше для такой задачи xilinx? У Спартана штатная функция PLL делает такй сдвиг (кажется 256 градаций на период). И сдвиг можно менять при работе. Цитата PS Сейчас еще один метод в голову пришел ("статистический"): Можно конечно, но так можно подобрать для конкретного кристалла и конкретной разводки. Постарел кристалл (или нагрелся) и все пропало. Чего-то не очень нравится.
|
|
|
|
|
Jan 17 2007, 09:50
|
Местный
  
Группа: Свой
Сообщений: 368
Регистрация: 16-11-06
Из: Тверь
Пользователь №: 22 379

|
2Tosha Цитата Берите VCXO или VCO, они управляются напряжением. Вся прелесть была в отсутствии внешних компонентов. А так можно и просто RCцепь снаружи прикрутить и менять ее постоянную изменяя напряжение на резисторе с помощью PWM (ну и пофильтровав его).
|
|
|
|
|
Jan 18 2007, 19:01
|
Группа: Новичок
Сообщений: 4
Регистрация: 17-01-07
Пользователь №: 24 518

|
В настоящее время мне приходится решать очень похожую задачу: есть несколько(порядка десяти) каналов по которым поступают сигналы с детекторов с длительностью порядка 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, с ней я пока возился совсем мало, но первое что бросилось в глаза - ждиттер у нее больше, чем на первом циклоне.
|
|
|
|
|
Jan 19 2007, 18:13
|

Местный
  
Группа: Свой
Сообщений: 468
Регистрация: 31-08-06
Из: Киев
Пользователь №: 19 991

|
Здравствуйте Уважаемые!!! Код 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, то огромное спасибо и высочайший
|
|
|
|
|
Jan 19 2007, 21:22
|
Местный
  
Группа: Свой
Сообщений: 368
Регистрация: 16-11-06
Из: Тверь
Пользователь №: 22 379

|
2 5pm Цитата Для создания блока задержки я использовал 128-разрядный сдвиговый регистр и цепочку из 127 lсell'ов. Т.е. каждый на каждый lcell сигнал подавался ИЛИ через передыдущий lcell ИЛИ с выхода соотвествующего регистра (зачем он сдвиговый?)? Цитата В процессе разработки было выполнено моделирование с реальными задержками, которое показало высокую дифференциальную нелинейность зависимости общего времени задержки(T) от номера номера выбранного разряда в управляющем регистре(N). В для разных значений N увеличение задержки составляло от 0.3 до 1.8 нс на каждый шаг. В тоже время среднее время, добавляемое одним шагом задержки составило ~0.7 нс. Ну так и должно быть - 256 ячеек компактно не разместишь и начинает играть длина связей. А зачем так много? Если шаг задержка 1 нс, то при тактовой частоте даже 100 МГц (реально можно 200) потребуется только 10-15 lcell. Там и дифф. нелинейность должна быть меньше. С уважением, Андрей
Сообщение отредактировал Andr2I - Jan 19 2007, 21:28
|
|
|
|
|
Jan 20 2007, 00:37
|
Группа: Новичок
Сообщений: 4
Регистрация: 17-01-07
Пользователь №: 24 518

|
Цитата Т.е. каждый на каждый lcell сигнал подавался ИЛИ через передыдущий lcell ИЛИ с выхода соотвествующего регистра (зачем он сдвиговый?)? Не совсем так. На каждый lcell сигнал подается ИЛИ через предыдущий lcell ИЛИ со в хода, т.е. внешнего пина. Дело втом, что входной сигнал поступает с внешнего детектора, регистрирующего заряженные частицы. Т.е. входные сигналы приходят асинхронно по отношению к тактовым синхроимпульсам. Сдвиговый регистр используется только для задания количества lcell'ов, через которые следует пропустить сигнал. Длинна регистра равна числу шагов программируемой задержки, т.е. в моем случае 128, соответственно сдвиговый он для того, чтобы в него было удобно заносить ту единственную единичку, которая определит итогувую величину задержки. Во время работы линии задержки регистр никуда, разумеется, не сдвигается. Вообще-то вместо извращения с этим регистром можно было бы просто сделать мультиплексор на 128, но мне показалось, что по ресурсам это не выгодно, может я ошибаюсь? Что займет меньше ячеек, сдвиговый 128-разрядный регистр или мультиплексор на 128 выводов? Как я уже сказал, входной сигнал по определению асинхронен, следовательно никаких синхронных вещей здесь применять нельзя. Если фронт задерживаемого сигнала прийдет почти одновременно с синхроимпульсом, то в регистр скорее всего ничего не запишется(мало время удержания), т.е. мы получим сдвиг выходного сигнала на величину такта, ну а дрожание (джиттер) сигнала на выходе будет таким образом даже превышать такт, а это неприемлемо.
|
|
|
|
|
Jan 20 2007, 18:48
|
Местный
  
Группа: Свой
Сообщений: 368
Регистрация: 16-11-06
Из: Тверь
Пользователь №: 22 379

|
2 5pm Ага вроде понял - у Вас 1 в сдвиговом регистре разрешает прохождение импульса извне на соответствующий lcell? Цитата Что займет меньше ячеек, сдвиговый 128-разрядный регистр или мультиплексор на 128 выводов? При такой постановки вопроса думаю, что мультиплексор будет экономичнее (надо просто взять и проверить), но там задержки будут - "мама не горюй". Думаю, что где-то до 50 МГц опуститесь. Если говорить просто про ультиплексор, то лучше выполнять его в несколько стадий - будет быстрее. А все-таки - 128 lcell дают максимальню задержку 128 нс - 8 МГц. У Вас тактовая нааверняка выше. Зачем так много?
|
|
|
|
|
Jan 23 2007, 12:46
|
Группа: Новичок
Сообщений: 4
Регистрация: 17-01-07
Пользователь №: 24 518

|
Да, Вы правильно меня поняли: сдвиговый регистр действительно нужнен только для управления и он используется именно так, как Вы сказали.
Задержка в 128 нс нужна потому, что задержанный сигнал потом будет снова выведен из ПЛИС и подан на другие блоки. С этим же связано и то, что таких задержек нам нужно несколько. Есть несколько детекторов, каждый образует свой канал и каждый из этих каналов, пройдя через ПЛИС, потом будет обработан внешними электронными блоками.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|