реклама на сайте
подробности

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Констрейны на глобальные сигналы: как правильно?, Сделать из багов фичи
Koluchiy
сообщение Jan 20 2012, 11:12
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 972
Регистрация: 12-04-09
Из: Москва
Пользователь №: 47 543



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

Хотца сделать банальнейшую вещь, а именно - использовать глобальные сигналы для передачи своих сигналов.
Ну например: секундный импульс.
Представляет из себя сигнал, который равен 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.
Go to the top of the page
 
+Quote Post
barabek
сообщение Jan 20 2012, 11:43
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 540
Регистрация: 16-08-07
Из: Владивосток
Пользователь №: 29 831



Цитата(Koluchiy @ Jan 20 2012, 21:12) *
Получается этот сигнал при помощи здорового счетчика с не менее здоровым компаратором, соответственно уже имеет значительную задержку.


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


Go to the top of the page
 
+Quote Post
Hoodwin
сообщение Jan 20 2012, 11:43
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 881
Регистрация: 21-03-10
Из: _// \\_
Пользователь №: 56 107



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

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

Я правда, видимо, не понял главного, зачем пихать это в глобальный сигнал.
Go to the top of the page
 
+Quote Post
Koluchiy
сообщение Jan 20 2012, 12:08
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 972
Регистрация: 12-04-09
Из: Москва
Пользователь №: 47 543



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

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

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

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

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

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

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

Проблема не в самом триггере, а в пути от него до потребителей - микросхема большая, потребителей много, чтобы всё это работало не слишком долго, фиттер тянет все потребляющие этот сигнал цепи к генератору секундного сигнала, что портит разводку.
Go to the top of the page
 
+Quote Post
des00
сообщение Jan 20 2012, 12:13
Сообщение #5


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(Koluchiy @ Jan 20 2012, 06:08) *
Проблема не в самом триггере, а в пути от него до потребителей - микросхема большая, потребителей много, чтобы всё это работало не слишком долго, фиттер тянет все потребляющие этот сигнал цепи к генератору секундного сигнала, что портит разводку.

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


--------------------
Go to the top of the page
 
+Quote Post
Koluchiy
сообщение Jan 20 2012, 12:45
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 972
Регистрация: 12-04-09
Из: Москва
Пользователь №: 47 543



Попробовал так, как написал в корне:
Код
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 в самой медленной градации...
Go to the top of the page
 
+Quote Post
des00
сообщение Jan 20 2012, 13:26
Сообщение #7


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(Koluchiy @ Jan 20 2012, 06:45) *
Попробовал так, как написал в корне:

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

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

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

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

Цитата
Там фанаут тысяч 5...
Stratix-IIGX в самой медленной градации...

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


--------------------
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jan 20 2012, 13:29
Сообщение #8


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Разбиваете счетчик пополам, с младшего в старший перенос (разрешение работы) делаете импульсом переполнения младшего, синхронизированным тактовой частотой. Получается задержка на один такт, но вам она не страшна.
Go to the top of the page
 
+Quote Post
Koluchiy
сообщение Jan 20 2012, 13:47
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 972
Регистрация: 12-04-09
Из: Москва
Пользователь №: 47 543



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

Всё как всегда... sm.gif

Суть в том, что в имеющихся условиях глобальные и региональные клоки в большинстве своем висят без использования, а туда можно было бы понавешивать много интересного.
Go to the top of the page
 
+Quote Post
des00
сообщение Jan 20 2012, 13:57
Сообщение #10


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(Koluchiy @ Jan 20 2012, 07:47) *
Мне бы хотелось, чтобы мне посоветовали, как сделать через констрейны (если это возможно), а все советуют на регистрах...

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


--------------------
Go to the top of the page
 
+Quote Post
Koluchiy
сообщение Jan 20 2012, 14:00
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 972
Регистрация: 12-04-09
Из: Москва
Пользователь №: 47 543



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

Результат идентичный.
Скрин положу в понедельник.
Go to the top of the page
 
+Quote Post
Stewart Little
сообщение Jan 20 2012, 14:14
Сообщение #12


Лентяй
******

Группа: Свой
Сообщений: 2 203
Регистрация: 11-10-04
Из: Санкт-Петербург
Пользователь №: 843



Цитата(Koluchiy @ Jan 20 2012, 17:47) *
Суть в том, что в имеющихся условиях глобальные и региональные клоки в большинстве своем висят без использования, а туда можно было бы понавешивать много интересного.

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


--------------------
Чтобы слова не расходились с делом, нужно молчать и ничего не делать...
Go to the top of the page
 
+Quote Post
des00
сообщение Jan 20 2012, 16:52
Сообщение #13


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(Stewart Little @ Jan 20 2012, 08:14) *
Как его вытягивать на Local Interconect с глобальной линии?

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

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


--------------------
Go to the top of the page
 
+Quote Post
Stewart Little
сообщение Jan 20 2012, 18:43
Сообщение #14


Лентяй
******

Группа: Свой
Сообщений: 2 203
Регистрация: 11-10-04
Из: Санкт-Петербург
Пользователь №: 843



Цитата(des00 @ Jan 20 2012, 20:52) *
правда задержка чтобы затащить и вытащить сигнал с этой линии порой перекрывает весь возможный выигрыш wink.gif Лучше дуплицировать.

О то ж, я именно это и имел в виду sm.gif


--------------------
Чтобы слова не расходились с делом, нужно молчать и ничего не делать...
Go to the top of the page
 
+Quote Post
Koluchiy
сообщение Jan 21 2012, 08:57
Сообщение #15


Знающий
****

Группа: Свой
Сообщений: 972
Регистрация: 12-04-09
Из: Москва
Пользователь №: 47 543



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

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

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

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

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

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

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

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

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

Вручную, наверное, дерево можно сделать и результат будет лучше (если сделать так, чтобы синтезатор не выкинул дублирующие триггеры sm.gif ).
Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 1st July 2025 - 08:42
Рейтинг@Mail.ru


Страница сгенерированна за 0.015 секунд с 7
ELECTRONIX ©2004-2016