Разработка, производство и продажа радиоэлектронной аппаратуры
|
Требуется программист в Зеленограде - обработка данных с датчиков; ColdFire; 40 тыс.
e-mail: jobsmp@pochta.ru
|
FPGA - требуется идея
Отправлено
vitalyn (192.168.0.65,217.117.85.108) 21 февраля 2011, г. 13:55
Задача такая - нужно сделать программируемую цифровую линию задержки на 50 независимых выходов. Имеется два тактовых входа (CLK и START) и 50 выходов (OUT1-OUT50). По входу CLK более-менее постоянно следуют импульсы не совсем стабильной частоты, но это не важно, в данной задаче можно считать её постоянной. Итак, по положительному перепаду на входе START нужно сформировать на выходах OUTi импульсы длительностью в 1 период CLK с задержкой Ti периодов CLK от этого фронта, для чего имеются 50 регистров, в которые эти длительности задержки загружаются через некий интерфейс (эти величины переменные и не могут быть hardcoded). Должно неукоснительно выполнятся условие - сколько фронтов START поступило, столько же импульсов должно быть сформировано на выходах OUTi.
Теперь в чём суть геморроя - импульсы START могут следовать друг за другом непредсказуемо, причём, сильно быстрее, чем самый маленький из Ti. Скажем, самая маленькая задержка стоит 1000 тактов, самая большая - 10000 тактов, а импульсы START могут следовать с произвольными интервалами - хоть 200 тактов, хоть 200000 тактов (это уже неважно). Т.е. если импульсы START следуют быстрее, чем Ti, то их нужно поставить в очередь и отработать каждый в своё время, строго соблюдая заданные задержки. Точность задания задержек Ti - 1 такт CLK, и этим жертвовать нельзя. В принципе можно поторговаться и потребовать, чтобы глубина очереди, скажем, была не больше 8.
Подскажите тупому и глупому, как минимизировать эту задачу!
Составить ответ | Вернуться на конференцию
Ответы
- Как-то так: - alostap (21.02.2011, 15:41:43 77.66.228.39, 357 байт)
- Если FPGA - там память наверняка есть. Стандартным блоком делаешь из неё FIFO двухпортовый, запись - по START, считывание - логикой управления твоих линий задержки. Если буфер не пуст - запускаем очередной цикл. - Дастун (21.02.2011, 14:46:56 95.72.147.87, пустое)
- Блин, ступил. Проще:(+) - Дастун (21.02.2011, 14:55:51 95.72.147.87, 263 байт)
- Неверно. - vitalyn (21.02.2011, 15:01:35 192.168.0.65,217.117.85.108, 293 байт)
- Многоразрядный сдвиговый регистр, длиной в максимальную задержку, на памяти. Шириной в ceil(log2(максимальная задержка)) :-)) По которой код задержки двигается. Пришел СТАРТ, который надо на N задержапть - числдо N в начало сдвигового регистра. Оно потом двигается-двигается по регистру, как до отвода номер N регистра додвигается - пульс на выход:-) - -=ВН=- (21.02.2011, 14:33:36 194.190.183.238, 32 байт)