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

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

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

 

post-84003-1477309620_thumb.jpg

 

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

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

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

 

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


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

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

 

post-84003-1477309620_thumb.jpg

 

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

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

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

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

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

 

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


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

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

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

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

 

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


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

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

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

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

 

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


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

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

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

 

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


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

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

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

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

 

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


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

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

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

 

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


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

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

Settings/Analysis & Syntesis/More Analysis

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

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


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

Settings/Analysis & Syntesis/More Analysis

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

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

 

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


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

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

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

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

 

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


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

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

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

 

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

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


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

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

lcell lc1(in, out);

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


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

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

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

 

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

 

 

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

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

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

 

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


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

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

 

Документация вроде говорит, что явно указанная 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...

Изменено пользователем justontime

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


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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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