Gated Clocks и Clock Enables в FPGA и ASICS

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

Применяются ли те же принципы и к конструкциям ASIC?

Каковы безопасные методы проектирования, когда схема нуждается в разделенных или умноженных тактовых импульсах?

Я немного запутался, вы спрашиваете о стробировании часов в одном предложении и умножении/делении их в другом, как будто это одно и то же. О каком из них вы действительно спрашиваете?
Я думаю, что он спрашивает, каковы наилучшие методы для стробирования часов в проектах с разделенными или умноженными часами.
@trav1s: спасибо, что поправили меня. Простите мой запутанный вопрос. Я хочу знать, каковы безопасные методы проектирования, когда нужно разделить или умножить часы в дизайне FPGA и ASIC?
Итак, предполагается, что часы синхронизированы по фазе, верно? Тогда они находятся в одном домене часов. Это хороший вопрос...
@trav1s: Да, ваше предположение верно. Вы можете предположить, что у нас есть только одни главные часы и что нам нужно получить новые часы из них, имеющие ту же фазу, что и главные часы.
Это может вам пригодиться: electronics.stackexchange.com/questions/19966/…

Ответы (2)

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

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

ASIC — это совсем другой зверь. Когда вы проектируете ASIC, у вас есть полный контроль над воротами и проводами. Вы можете безопасно создать стробируемый тактовый сигнал и убедиться, что стробируемый тактовый сигнал распределяется правильно. Это очень распространенный метод минимизации энергопотребления. Например, посмотрите на современный микроконтроллер, и вы увидите, что вы можете программно включать и выключать тактовый сигнал для больших блоков схемы, таких как UART. Недостатком является то, что разработчики ASIC должны использовать очень дорогие и сложные инструменты временного анализа, чтобы сделать это правильно.

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

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

Идея состоит в том, чтобы свести к минимуму количество доменов часов и минимизировать количество пересечений доменов часов. Это абсолютно справедливо как для ASIC, так и для FPGA и даже для дискретных логических схем.

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

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

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

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

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

У FPGA 4 fun есть отличное введение в это:
http://www.fpga4fun.com/CrossClockDomain.html

Казалось бы, во многих случаях можно довольно легко гарантировать, что два домена тактовых импульсов никогда не будут иметь активный фронт тактовых импульсов где-либо рядом друг с другом. Например, один домен часов может реагировать на нарастающий фронт главных часов, а другой домен часов — на любой спадающий фронт главных часов, который возникает, когда установлен конкретный выход из первого домена. Допустимая задержка распространения при переходе между доменами будет намного меньше, чем внутри домена, но кроме этого, какие проблемы могут возникнуть?
Это пример доменов синхронных часов, где два часа связаны друг с другом. Тогда все, что вам нужно, это ограничения to-from с минимальным временем между действительными фронтами, в данном случае половина периода (если часы имеют рабочий цикл 50%).
Интересно, почему я не слышу, чтобы такой подход использовался ужасно часто? Я бы подумал, что в чем-то вроде ARM, когда периферийные подсистемы работают с часами, которые были противофазными основным часам, было бы легче воздерживаться от синхронизации основной части подсистемы, если у нее нет ничего полезного и основной процессор не хочет с ним разговаривать. Если, например, в UART ничего не происходит, нет необходимости синхронизировать большинство его регистров в течение каждого цикла. Просто тактируйте входной синхронизатор по тем же фронтам тактовых импульсов, что и основной ЦП, и тактируйте UART по...
... те противофазные циклы, когда либо ЦП хочет поговорить с UART, либо выход синхронизатора изменился, либо UART знает, что происходит что-то полезное. На многих чипах синхронизация UART заметно увеличивает энергопотребление; казалось бы, стробирование часов должно позволить устранить большую часть этих затрат без каких-либо штрафов, за исключением, возможно, необходимости добавления дополнительного состояния ожидания при чтении и/или записи регистров.