Как синхронизатор 2-ff обеспечивает правильную синхронизацию?

9

Использование 2-ff синхронизаторов было стандартом для сигнала, чтобы пересечь границы часов. И есть много бумаги / рисунков, иллюстрирующих механизм, такой как этот:введите описание изображения здесь

Кажется BCLK может только образец пульс адата один раз (на втором нарастающем фронте BCLK ), что приводит к выходной метастабильность на bq1_dat . Как можно сэмплировать bq1_dat "high" на следующем активном фронте тактовой частоты?


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

введите описание изображения здесь

ps: метастабильное состояние не отображает «блуждающий» сигнал, а уровень, который не является ни «1», ни «0». На следующем рисунке показан пример метастабильной продукции.введите описание изображения здесь

Первоначальный рисунок взят из заметок лекции для EE108A, лекции 13: Метастабильность и сбой синхронизации (когда плохие шлепки идут плохо) WJ Dally.

Fiedel
источник
4
Я просто хочу сказать, что диаграммы, которые показывают метастабильную продукцию, «блуждающую вокруг», чрезвычайно вводят в заблуждение. Это не то, на что похожа метастабильность. Когда FF становится метастабильным, его выход переходит к одному конкретному промежуточному напряжению (значение зависит от технологии реализации) и остается там. После некоторого непредсказуемого промежутка времени напряжение будет качаться или высоко или низко, и какой путь это также непредсказуемо.
Дэйв Твид
@ Дэйв Твид ♦ Спасибо за комментарий. Почти во всех документах, которые я читал относительно метастабильности, я видел "блуждающие" волны. Я искал вокруг и нашел сообщение ( если триггер имеет нарушение настройки и становится метастабильным, гарантированно ли оно доведется до входного значения, когда он заканчивает колебаться? ), Содержащий выстрел из o-scope с захваченным метастабильным состоянием. Ссылка на исходную ссылку на рисунок включена в этот пост.
полевой
Да, это прекрасно иллюстрирует мою точку зрения, и презентация Powerpoint, из которой она исходит, содержит много полезной информации.
Дэйв Твид

Ответы:

8

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

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

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

    Самый простой вариант - продлить импульс - по сути, вы должны убедиться, что входной импульс длится более 1 такта от тактов назначения (он должен быть длиннее 1 такта как минимум на большее время установки и удержания для регистра назначения) , Например, если вы переходите от тактовой частоты 20 МГц к тактовой частоте 15 МГц, вы должны убедиться, что ваш импульс имеет два тактовых импульса на входе, что обеспечит его передачу на тактовый генератор назначения и не будет потеряно. Это также отвечает на ваш вопрос о том, как сигнал будет проходить гарантированно. Если импульс шире, чем один тактовый период назначения, это означает, что если он становится метастабильным на первом фронте тактового сигнала и в конечном итоге воспринимается как 0, то на втором фронте тактового импульса он определенно поймает импульс.

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

  2. Шины управления - или, возможно, типы шин данных. Это, возможно, более сложно, потому что, если у вас есть многоразрядный поток данных, который должен оставаться синхронизированным. В этом случае вы должны реализовать то, что называется «рукопожатие». Вы в основном загружаете свои данные на исходные часы и удерживаете их. Затем вы отправляете сигнал запроса (как в 1) через синхронизатор. Когда сигнал запроса пройден, вы знаете, что шина данных также стабилизируется в домене назначения. Затем вы можете отправить его в реестр банка в пункте назначения. Затем пункт назначения снова отправляет импульс подтверждения, чтобы сообщить источнику, что он может загрузить следующее слово.

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

  3. Шины данных - для данных, где у вас есть источник, который выплевывает данные непрерывно или в пакетном режиме, вам, вероятно, лучше использовать FIFO, чем синхронизаторы. FIFO использует двухчасовую память для хранения данных, а также счетчики для отслеживания объема данных в FIFO. Вы записываете данные в FIFO при наличии свободного места, а затем увеличиваете адрес записи. Затем этот адрес обычно кодируется в схеме «серого кодирования», которая гарантирует, что каждое увеличение адреса вызывает только одинбит в адресной шине для изменения (это означает, что вам не нужно синхронизировать несколько битов). Этот адрес затем передается в домен назначения (через одну из цепочек синхронизатора), где он сравнивается с адресом чтения. Если в FIFO есть данные, они могут быть считаны из памяти с помощью порта часов назначения. Адрес чтения аналогично кодируется Греем и отправляется обратно источнику через другой синхронизатор, чтобы порт записи мог вычислить, есть ли место в FIFO.

  4. Сигналы сброса - обычно они используют модифицированную версию синхронизатора, известную как «асинхронное утверждение, синхронная пустыня». В этой модифицированной версии ввод данных в первый триггер привязан к GND, и вместо этого входящий сигнал сброса подключается к асинхронным предустановленным сигналам каждого триггера в синхронизаторе. Это приводит к выходному сигналу, который является полностью асинхронным, когда он достигает высокого уровня, но цепочка синхронизатора гарантирует, что он понижается синхронно с тактовыми импульсами назначения, синхронизируя нули в цепочке регистров.

    Этот тип синхронизатора ужасен для данных и управления, но идеально подходит для сброса сигналов. Если вся логика назначения подает выходные данные этой цепочки на входы асинхронного сброса любого регистра в домене, то мало беспокоится о метастабильности при утверждении (даже если она асинхронная), поскольку все регистры переводятся в известное состояние. Затем, когда сигнал сброса сбрасывается в исходном домене, он синхронно сбрасывается в домене назначения, что означает, что все регистры выходят из сброса за один и тот же тактовый цикл (а не цикл +/- 1, если он был асинхронным деактивированием).


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

Том Карпентер
источник
В дополнение к ответу Тома я хотел бы добавить ссылку на PoC , в котором есть реализации для этих случаев. Документы синхронизатора доступны на RTD. В дополнение к теории цепочки 2 триггеров для базового синхронизатора 2-FF, PoC предоставляет специальные реализации ( sync_Bits) для ПЛИС Xilinx и Altera для улучшения поведения метастабильности. Синхронизатор 2-FF используется, например, sync_Strobeдля создания более сложных синхронизаторов для импульсов.
Пеббельс
Спасибо за детальное введение в стратегии синхронизации. Это изображение было получено от «Клиффорд Э. Каммингс» «Методы проектирования и верификации пересечения часового домена (CDC) с использованием systemverilog». Я понимаю, что для однобитового сигнала ширина должна составлять не менее 1 такта + время настройки + время удержания принимающей стороны, чтобы он мог безопасно пройти. На этом рисунке этот критерий не выполняется, поскольку импульс bdk дискретизируется импульсом adat только один раз на его заднем фронте, что приводит к метастабильности bq1_dat.
поле
... В результате чтение bq1_dat на следующем нарастающем фронте bclk может быть либо «0», либо «1». Так что синхронизация на картинке кажется неудачной. Я прав?
поле
@Paebbels Спасибо за ссылку. Посмотрим =)
полевой
Вы должны отредактировать это в своем вопросе, а не публиковать его как ответ, но, по сути, да, вы можете или не можете получить 1 на выходе в этом примере.
Том Карпентер
1

1) Используя ваш рисунок в качестве примера, aclk и bclk асинхронны друг с другом. Другими словами, они имеют разные источники часов. Они показывают adat как действительные данные, но синхронизируются только с aclk. Именно здесь в игру вступает синхронизатор bclk.

2) Этот рисунок предполагает сценарий наихудшего случая, где bq1_dat - грязный вывод, потому что bq1 FF перехватывает только часть конца данных, создавая метастабильное состояние, при котором выходные данные обычно являются мусором. Вот трюк. Bq2 имеет тот же bclk, что и bq1, но для передачи данных и их появления в bq2_dat требуется 2 такта bclk.

3) Первый bclk захватил часть данных, что привело к грязному выводу, но второй bclk - на один тактовый цикл позже, достаточно времени, чтобы неоднозначные данные из bq1_dat могли перейти в состояние высокого или низкого уровня. Грязный импульс bq1_dat длился достаточно долго, чтобы bq2 захватил действительную логику «1» (высокий логический уровень) и передал ее в bq2_dat как действительные и теперь синхронизированные данные (высокий логический уровень).

4) В нисходящем направлении любые часы, использующие bclk, будут иметь синхронизированные данные для работы. Обратите внимание, что только первый bclk FF имел дело с метастабильным состоянием . Вывод мог бы быть логически низким, если бы adat опоздал только на пико или нано секунд. Помните, что эти триггеры отсчитывают ввод данных только по переднему фронту часов. То, что происходит до или после нарастающего фронта, игнорируется.

Sparky256
источник
Обратите внимание, что задержка bclk обеспечивает только вероятностную меру безопасности, и точная величина зависит как от технологии FF, так и от периода bclk. В некоторых случаях высокого уровня может потребоваться 3 или более этапов, чтобы снизить уровень ошибок до приемлемых уровней.
WhatRoughBeast
@WhatRoughBeast. Я знаю, что в худшем случае требуется много этапов синхронизации, плюс цифровая фильтрация. Очевидно, мой ответ был слишком прост.
Sparky256
@ Sparky256 Что меня озадачивает, так это 3) в вашем комментарии. Как bq2 может захватить '1', когда bq1_dat находится в метастабильном состоянии?
поле
@fiedel, две вещи способствуют тому, что bq2 может захватить чистый ввод (по крайней мере). Сначала метастабильное состояние должно сохраняться в течение полного тактового цикла. Во-вторых, метастабильное значение (псевдо-середина рельса) из bq1 может быть маловероятным (или оптимизировано, чтобы избежать) быть в окне, что также приведет к тому, что bq2 будет метастабильным, но в основном это первое из них. Скажем, технология дает 5% -ную вероятность того, что метастабильность сохранится достаточно долго. стадия синхронизации 3-FF снизит это до 0,25%, потому что обе ячейки должны выйти из строя. Грязный на практике является четко выраженным экспоненциальным отклонением от почти стабильного состояния.
Шон Хулихейн
@SeanHoulihane. Спасибо за объяснение. Термин «нарастающий фронт» вводит некоторых в заблуждение, потому что окно приема данных (метастабильное или стабильное) находится на полпути нарастающего фронта и длится всего несколько пико или наносекунд. Только в этот момент входные данные имеют логическую «1» или «0», независимо от того, является ли она метастабильной или стабильной, в зависимости от уровня напряжения по сравнению с пороговым значением микросхемы для логики 1 или 0.
Sparky256