Jump to content

    
Sign in to follow this  
Koluchiy

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

Recommended Posts

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

 

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

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

Представляет из себя сигнал, который равен 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.

Share this post


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

 

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

 

 

 

Share this post


Link to post
Share on other sites

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

 

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

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 и в итоге всюду будет сфазированный.

 

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

Share this post


Link to post
Share on other sites
Я правда, видимо, не понял главного, зачем пихать это в глобальный сигнал.

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

 

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

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

 

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

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

 

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

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

Share this post


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

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

 

Share this post


Link to post
Share on other sites

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

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 в самой медленной градации...

Share this post


Link to post
Share on other sites
Попробовал так, как написал в корне:

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

 

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

 

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

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

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

 

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

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

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

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

 

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

 

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

Share this post


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

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

 

Share this post


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

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

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

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

Или я не прав?

Share this post


Link to post
Share on other sites
Как его вытягивать на Local Interconect с глобальной линии?

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

 

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

Share this post


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

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

Share this post


Link to post
Share on other sites
временные констрейны используются не для того, для чего вы хотите их использовать

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

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

 

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

 

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

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

 

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

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

 

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

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

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

 

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this