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

Констрейны на глобальные сигналы: как правильно?

Здравствуйте, уважаемые гуру.

 

Хотца сделать банальнейшую вещь, а именно - использовать глобальные сигналы для передачи своих сигналов.

Ну например: секундный импульс.

Представляет из себя сигнал, который равен 1 один такт в секунду, всё остальное время он равен нулю.

Ну то есть, ____________________________/\________________________________/\__________

 

Получается этот сигнал при помощи здорового счетчика с не менее здоровым компаратором, соответственно уже имеет значительную задержку.

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

(необходимо сказать, что тактовая частота везде одна и та же, секундный импульс используется как линия данных в комбинационной логике)

 

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

 

Как это правильно сделать?

 

Применим ли здесь Multicycle, например так:

 

set_multicycle_path -from [get_registers {TCNTR_TimeCounter:CNTR_TimeCounter|Time_1S_Pulse}] -to * -setup -end 2
set_multicycle_path -from [get_registers {TCNTR_TimeCounter:CNTR_TimeCounter|Time_1S_Pulse}] -to * -hold -end 1

 

Ну то есть, насколько я понимаю эти констрейны, они требуют, чтобы сигнал Time_1S_Pulse анализировался относительно 2-го фронта, считая за 0 - фронт генерации Time_1S_Pulse.

 

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

 

Всем заранее спасибо за ответы.

 

P.S. Altera, TimeQuest.

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


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

Получается этот сигнал при помощи здорового счетчика с не менее здоровым компаратором, соответственно уже имеет значительную задержку.

 

А если большой счетчик разбить на 2 или несколько счетчиков? Или в крайнем случае большой счетчик с периодом пол-секунды, а после него делитель на 2, ну т.е. один триггер. Он то быстро будет щелкать. И уже сигнал с него рассылать. Не пойдет?

 

 

 

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


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

а зачем вообще кострейн то? Почему нельзя сделать сихронный компаратор и на него поставить еще один триггер?

 

Ну, типа такого:

if rising_edge( clk ) then
  count <= count + 1;
  flag_1s <= '0';
  if count = (PERIOD_IN_CYCLES-1) then
    count <= 0;
    flag_1s <= '1';
  end if;

  pulse <= flag_1s;
end if; -- rising edge

 

Транслятор будет автоматически делать register duplication для триггера pulse и в итоге всюду будет сфазированный.

 

Я правда, видимо, не понял главного, зачем пихать это в глобальный сигнал.

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


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

Я правда, видимо, не понял главного, зачем пихать это в глобальный сигнал.

В глобальный сигнал - потому что много потребителей у этого импульса.

 

Транслятор будет автоматически делать register duplication для триггера pulse и в итоге всюду будет сфазированный.

Он как-то очень хаотично его делает - то делает, то не делает, причем когда не делает - потом на него же ругается, что из-за него всё тормозит.

 

а зачем вообще кострейн то? Почему нельзя сделать сихронный компаратор и на него поставить еще один триггер?

Собственно, так и есть. TCNTR_TimeCounter:CNTR_TimeCounter|Time_1S_Pulse - это триггер как раз после компаратора.

 

А если большой счетчик разбить на 2 или несколько счетчиков? Или в крайнем случае большой счетчик с периодом пол-секунды, а после него делитель на 2, ну т.е. один триггер. Он то быстро будет щелкать. И уже сигнал с него рассылать. Не пойдет?

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

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


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

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

logic/register duplication включить, max_fanout ограничить. Но вообще на частотах до 200МГц, 3000 нормальный фанаут что бы работало без этих танцев (сыклон 3) ;)

 

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


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

Попробовал так, как написал в корне:

set_multicycle_path -from [get_registers {TCNTR_TimeCounter:CNTR_TimeCounter|Time_1S_Pulse}] -to * -setup -end 2
set_multicycle_path -from [get_registers {TCNTR_TimeCounter:CNTR_TimeCounter|Time_1S_Pulse}] -to * -hold -end 1

 

В результате, картина маргарином.

 

Период тактового сигнала T = 5.714нс (175 Мгц).

Я хочу, чтобы сигнал Time_1S_Pulse приходил в интервале между T и 2*T, т.е. (если не считать времен установки и удержания) от 5.714нс до 11.428.

 

После компиляции, максимальная задержка - 7.968 (нормально, Tsetup выдерживается с запасом), минимальная - 5.209, т.е. время установки не выдерживается больше чем на пол-наносекунды.

 

=> то ли я не так задал констрейн на hold, то ли здесь мультициклы вообще неприменимы.

 

Но вообще на частотах до 200МГц, 3000 нормальный фанаут что бы работало без этих танцев (сыклон 3)

Там фанаут тысяч 5...

Stratix-IIGX в самой медленной градации...

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


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

Попробовал так, как написал в корне:

скрин бы отчета TQ по этому пути.

 

я бы сделал так -to [all_clocks {}]

 

Период тактового сигнала T = 5.714нс (175 Мгц).

Я хочу, чтобы сигнал Time_1S_Pulse приходил в интервале между T и 2*T, т.е. (если не считать времен установки и удержания) от 5.714нс до 11.428.

этого, мультицикл не гарантирует.

 

Там фанаут тысяч 5...

Stratix-IIGX в самой медленной градации...

не вижу проблем, дуплицирование двух-четырех регистров должно решить проблему.

 

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


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

Разбиваете счетчик пополам, с младшего в старший перенос (разрешение работы) делаете импульсом переполнения младшего, синхронизированным тактовой частотой. Получается задержка на один такт, но вам она не страшна.

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


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

Мне бы хотелось, чтобы мне посоветовали, как сделать через констрейны (если это возможно), а все советуют на регистрах...

 

Всё как всегда... :)

 

Суть в том, что в имеющихся условиях глобальные и региональные клоки в большинстве своем висят без использования, а туда можно было бы понавешивать много интересного.

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


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

Мне бы хотелось, чтобы мне посоветовали, как сделать через констрейны (если это возможно), а все советуют на регистрах...

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

 

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


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

я бы сделал так -to [all_clocks {}]

Результат идентичный.

Скрин положу в понедельник.

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


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

Суть в том, что в имеющихся условиях глобальные и региональные клоки в большинстве своем висят без использования, а туда можно было бы понавешивать много интересного.

Что-то я не могу проникнуться глубиной мысли...

Если нужно какой-то сигнал засандалить на глобальную линию, то можно воспользоваться примитивом GLOBAL .

Только что это в данном случае даст? Предположим, что сигнал по глобальной линии добегает до всех ALM'ов примерно в одно время. Что с ним ALM'у делать дальше? Насколько я понял, этот сигнал должен попасть в ALUT. Как его вытягивать на Local Interconect с глобальной линии?

Или я не прав?

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


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

Как его вытягивать на Local Interconect с глобальной линии?

нормально он вытягивается, правда задержка чтобы затащить и вытащить сигнал с этой линии порой перекрывает весь возможный выигрыш ;) Лучше дуплицировать.

 

меня другое в ква удивляет : поставим Max_Fanout в 200, вот если их будет например 205, то он дуплицирует логику, на одну точку повесит 200 точек подключения, а на другую 5. Даже попытку балансировать нагрузку не предпринимает (до 9.1 версии включительно).

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


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

правда задержка чтобы затащить и вытащить сигнал с этой линии порой перекрывает весь возможный выигрыш ;) Лучше дуплицировать.

О то ж, я именно это и имел в виду :)

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


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

временные констрейны используются не для того, для чего вы хотите их использовать

Применительно к вводу-выводу они используются именно так, как я хочу их использовать, т.е. для задания минимальных/максимальных задержек. В Вашей же статье про это читал, часть 4 если не путаю :).

Правда, там с использованием элементов задержек...

 

Вообще, применительно к данной задаче надо попробовать set_max_delay, set_min_delay :). Но, честно говоря, как-то это совсем уже выглядит стремно.

 

Если нужно какой-то сигнал засандалить на глобальную линию, то можно воспользоваться примитивом GLOBAL .

Логично, так и затягиваю. А что, есть еще способы?

 

нормально он вытягивается, правда задержка чтобы затащить и вытащить сигнал с этой линии порой перекрывает весь возможный выигрыш

Ну так в том и идея - при помощи допзадержки перед подачей сигнала на GLOBAL задержать сигнал грубо говоря на такт (поскольку это не влияет на работу алгоритма) и, таким образом, компенсировать влияние задержек (одинаковых для всех потребителей) по вводу сигнала на GLOBAL и выведения его из GLOBAL.

 

Лучше дуплицировать.

Тоска у него с дуплицированием. Ставлю цепочку из нескольких триггеров, чтобы дуплицированием сделал иерархическое дерево и развел сигнал куда надо.

Смотрю результат фиттера - никакого дерева нет, вся цепочка спиралькой расставлена в центре, к концу цепочки стянуты потребители. TimeQuest ругается на то, что часть потребителей не удалось притянуть достаточно близко.

 

Вручную, наверное, дерево можно сделать и результат будет лучше (если сделать так, чтобы синтезатор не выкинул дублирующие триггеры :) ).

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


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

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

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

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

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

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

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

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

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

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