Jump to content
    

Реализовать небольшую задержку внутри ПЛИС

Есть вот такой чудный узел от старинной схемы:

 

post-84003-1477309620_thumb.jpg

 

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

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

Можно ли, например, Quartus'у сказать в явном виде, что нужно сделать именно такую схему один к одному (если, конечно, ее в принципе можно построить из имеющихся логических блоков) ? Или, может, кто-то более умное и красивое решение подскажет ?

 

Share this post


Link to post
Share on other sites

Есть вот такой чудный узел от старинной схемы:

 

post-84003-1477309620_thumb.jpg

 

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

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

Можно ли, например, Quartus'у сказать в явном виде, что нужно сделать именно такую схему один к одному (если, конечно, ее в принципе можно построить из имеющихся логических блоков) ? Или, может, кто-то более умное и красивое решение подскажет ?

Нельзя старую идеологию переносить в ПЛИС.

Изучите тему "синхронного проектирования"...

 

Share this post


Link to post
Share on other sites

Нельзя старую идеологию переносить в ПЛИС.

Изучите тему "синхронного проектирования"...

В общем полностью согласен. Но в данном конкретном случае есть целый ряд объективных (и не очень) причин попробовать сделать "неправильно"...

 

Share this post


Link to post
Share on other sites

В общем полностью согласен. Но в данном конкретном случае есть целый ряд объективных (и не очень) причин попробовать сделать "неправильно"...

На столе 1 шт. заработает... Потом будете трахаться как Маврикиевна с цветным телевизором...

Просто подумайте над "ряд объективных (и не очень) причин"... Стоит ли рисковать ради этой ерунды...

 

Share this post


Link to post
Share on other sites

На столе 1 шт. заработает...

Одна из причин, по которой нет желания переделывать вообще все под нормальный синхронный проект - достаточно 1 шт на столе :)

 

Share this post


Link to post
Share on other sites

Одна из причин, по которой нет желания переделывать вообще все под нормальный синхронный проект - достаточно 1 шт на столе :)

Ну тогда рисовать цепочки вентилей без "оптимизации", смотреть на результат по месту...

Или вывести сигнал наружу, там его задержать дорожкой или на RC и задержанный снова ввести... Есть еще задержки во входных-выходных буферах, но надо смотреть на ПЛИС конкретно...

 

Share this post


Link to post
Share on other sites

Ну тогда рисовать цепочки вентилей без "оптимизации"

Не подскажете, как это в Quartus'е делается ?

 

Share this post


Link to post
Share on other sites

Не подскажете, как это в Quartus'е делается ?

Settings/Analysis & Syntesis/More Analysis

там галки Removes redundant LCELL и Registers в положение Off

Share this post


Link to post
Share on other sites

Settings/Analysis & Syntesis/More Analysis

там галки Removes redundant LCELL и Registers в положение Off

Прошу прощения - вопрос сформулировал не полностью... Интересует, как отключить эту оптимизацию для конкретного участка кода (а не для всего проекта) ?

 

Share this post


Link to post
Share on other sites

Одна из причин, по которой нет желания переделывать вообще все под нормальный синхронный проект - достаточно 1 шт на столе :)

А если так, то обычно берут несколько стартовых наборов и соединяют их между собой. А уж там обычно все есть, что нужно...

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

 

Share this post


Link to post
Share on other sites

если нужна очень маленький по длительности импульс:

1. можно на PLL поднять тактовую частоту до 400-500 МГц а потом просто сделать одиночный импульс. В крайнем случае можно использовать DDR регистр...

 

2. Можно попробовать подругому

Share this post


Link to post
Share on other sites

Не подскажете, как это в Quartus'е делается ?

lcell lc1(in, out);

Share this post


Link to post
Share on other sites

1. можно на PLL поднять тактовую частоту до 400-500 МГц а потом просто сделать одиночный импульс

Если бы у меня была лишняя PLL, я бы так и сделал - даже не спрашивая :)

 

Спасибо всем (пока пойду поизучаю, что такое lcell - хоть слово умное узнал) !

 

 

(пока пойду поизучаю, что такое lcell - хоть слово умное узнал) !

Чуть ли не первая ссылка в Google по lcell дает практически мой пример - ViKo отдельное спасибо !

Естественно, сама Altera категорически не рекомендует использовать lcell для задержки из-за непредсказуемости и нестабильности, но в моем случаю я рискну :)

 

Share this post


Link to post
Share on other sites

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

 

Документация вроде говорит, что явно указанная lcell не должна автоматически убираться Quartus'ом. Соответственно, я добавил в код (VHDL) нужный мне lcell, однако при компиляции было сказано, что он Synthesized away...

Ладно, решил просто отключить такую оптимизацию для всего проекта в целом. Для начала, очередной раз обнаружил, что 16-ый Quartus изменился в отношении интерфейса - соответствующие настройки нашлись не в Settings/Analysis & Syntesis, а в Settings/Compiler settings.

 

Но это ладно - главное, что там уже стоит Removes redundant logic cells - Off ! Что дальше с этим делать - ума не приложу :(

 

[update] - реально какая-то фигня... Попробовал слегка по другому - сделал просто сигнал и добавил к нему атрибуты:

 

attribute keep : boolean;

attribute keep of Delay12 : signal is true;

 

Сама Altera такой пример приводит, а оно почему-то все равно Synthesized away...

Edited by justontime

Share this post


Link to post
Share on other sites

Сама Altera такой пример приводит, а оно почему-то все равно Synthesized away...

Потому что у вас формируется два сигнала из одного.

Добавьте по входу в nand2 и на пин его, а снаружи этот пин на констату. Ну и lcell по выходу каждого элемента, который нужно оставить.

А вообще всё сильно зависит от того куда идут выходные сигналы.

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.

×
×
  • Create New...