Comments 53
Занимаюсь электроникой, но метастабильность у меня больше ассоциировалась с приемом внешних аналоговых сигналов, и поэтому для меня странно, что в статье не упоминается триггер Шмитта, который по идее надо бы поставить перед D-входом первого тактируемого триггера.
Согласен, это упущено. Попробую дополнить потом.
Но, с одной стороны, я все таки больше ориентировался на внутренние асинхпрнные клоки, а с другой — в большинстве современных FPGA внутри входного пина триггера Шмитта нету, а ставить внешние по всем входам — слишком дорогое удовольствие. Да и бессмысленное, честно говоря, т.к. он окончательно проблему все равно не решит — время переключение отлично, от нуля, а значит вероятность попадания стоящего за ним триггера при неудачном совпадении фронтов остается.
Кроме того, ни слова не сказано про возникновение метастабильности и последующую возможность переключения в неизвестное состояние при подаче питания на микросхему. А ведь для того, чтобы ее избежать, приходится делать достаточно большие цепи глобального сброса.
А еще нежелательные стабильные состояния бывают не только у триггеров, но и у многих аналоговых схем, где для борьбы с ними тоже применяется много интересного.
А в целом — хорошая и полезная статья, спасибо.
Ну стартовая инициализация — весьма отдельная непростая тема, к которой я не готов ;) Могу лишь сказать, что пользователям FPGA в этом смысле значительно проще, там много сделано сразу «из коробки», а вот если самому с нуля микросхему проектировать… страшно представить.
А бывает еще стартовая инициализация аналоговых микросхем, которая часто некорректно моделируется)
>сброс асинхронный, он должен быть синхронен тактовому сигналу
На практике как раз реализуют синхронизацию снятия асинхронного сброса, тк возможность метастабильности при установке асинхронного сброса не важна (и флип-флоп сбросится еще до начала генерации клока).
Если асинхронный сброс полностью синхронен к клоку, то логичней использовать вход «синхронного сброса», чтобы не использовать флип-флопы со входом асинхронного сброса/установки, которые занимают большую площадь.
Что касается синхронного/асинхронного сброса в целом — все зависит от элементной базы. Для заказных микросхем действительно асинхронный сброс требует больше ресурсов. Но для FPGA — он там уже есть и доступен «бесплатно». Более того, синхронный сброс задействует дополнительный мультиплексор, который иначе может быть задействован в «пользовательском» режиме синтезатором.
С моей точки зрения, как разработчика на FPGA — если уж снятие сброса подсинхроизировано, то и установку проще тоже подсинхронизировать, просто пропустив сброс через цепочку триггеров, чем еще что-то городить. Хотя может я не знаком со всем многообразием ситуаций…
Вообще, если принимать во внимание явление метастабильности — то использование асинхронного сброса оказывается себе дороже. Когда я стал проектировать под FPGA с учетом метастабильности — то в моих проектах триггеры с асинхронным сбросом исчезли как класс. Если заботиться о борьбе с метастабильностью — то асинхронный сброс ничуть не упрощает схему по сравнению с использованием синхронного сброса.

Неудивительно, что в новых сериях FPGA Xilinx (Artix-7, Kintex-7) асинхронный сброс триггеров отсутствует.
Не пугайте так — асинхронный сброс в 7 серии остался, просто теперь он является разделяемым с синхронным. Т.е. одновременно и того и другого [аппаратного сигнала сброса] у триггера быть не может. А так и синхронный и асинхронный поддерживаются. Иначе это был бы слишком кардинальный шаг, ломающий совместимость с 90% существующего кода.
Не следил за текущей ситуацией.
Но поползновения отказаться от асинхронных сбросов начались еще у Altera лет 5 назад. Хотели так сделать, но не знаю сделали по факту в каком-то семействе.
Как раз рассматривали такой вариант по совокупности причин, что в FPGA все заточено на синхронный дизайн + отдельные линии/площадь нужны для асинхронные цепей + флип-флоп занимает больше места, но тогда ресет включался бы в расчет пути данных и требовал бы еще задержку+площадь на один гейт перед входом флип-флопа.
Хм, я ошибся, действительно, асинхронный сброс остался. Но его использование не рекомендуется. Есть параграф в UG429 (7 Series Migration Guide), где указаны его недостатки и рекомендации по устранению его использования.
> Если заботиться о борьбе с метастабильностью — то асинхронный сброс…
Извиняюсь, что вырываю фразу из контекста. Асинхронный сброс опасен не только метастабильностью, но и тем, что он может поймать «иголку» — явление, когда, допустим, компаратор выдает короткий сигнал из-за того, что ему на вход пришло промежуточное состояние шины (сравнивает на 0b0000, счетчик при переходе из 0b0111 в 0b1000 «случайно» прошел через промежуточное состояние 0b0000), — и сбросится не по своему условию.
Ну и второй момент — если клока нет, то зачем сбрасывать, все равно ведь ничего работать не будет.
тем, что он может поймать «иголку»

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

если клока нет, то зачем сбрасывать

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

Хм, логично. Хотя тут реализации могут быть разными — возможно, не асинхронный сброс регистра, а например, мультиплексер перед выходом, по сигналу «clk_stopped» от dcm. И даже при всех советах о синхронных дизайнах, сам xilinx в dcm ядре использует асинхронный сброс. Насколько я понимаю, нас пытаются уберечь от неправильного использования, но при аккуратном использовании асинхронный сброс все же полезен в некоторых критичных местах.
мультиплексер перед выходом

Мультиплексоры — это трата ресурсов FPGA и дополнительная задержка сигнала на выходе. Если есть возможность, я предпочитаю выводить наружу сигналы прямо с триггеров, а если есть возможность — то и с IOB FFs.

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

То же касается использования триггеров в режиме Latch (проходная защелка). В моем довольно крупном проекте нет ни одной такой защелки. На D-триггерах все получается менее запутанно и более надежно. Эту функцию тоже можно постепенно выпиливать.
Я здесь хотел акцентировать внимание именно на ситуации, что хотя входы и называются «асинхронными», но при снятии асинхронного ресета происходит переход у синхронному состоянию работы. И именно в этот момент образуется проблема метастабильности про которую вы пишите.
Те отделить «мух от котлет» и показать суть проблемы в этом случае, а не ограничиться шаблоном делайте всегда вот так.
Синхронный сброс требует тактового сигнала, но иногда бывает нужно сбросить все триггеры до того, как тактовый сигнал появится (например, в контроллере JTAG, если он тактируется сигналом TCK, а не внешним тактовым сигналом).

Именно поэтому самый универсальный вариант — асинхронная установка сигнала сброса и синхронное снятие, то есть сбрасываем сразу, как только пришел сигнал сброса, а выводим из ресета только после синхронизации, чтобы быть уверенными, что все триггеры выйдут из ресета одновременно (на одном такте).
Правда, такой «универсальный» вариант, скорее всего, не будет работать для DFT-шного scan-теста (но это актуально только для ASIC-ов).

Поэтому самый универсальный вариант такой:

input clk;
input bad_reset;
input dft_mode;
output good_reset;

reg [1:0] rst_sync_r;

always @(posedge clk, posedge bad_reset)
    if (bad_reset) rst_sync_r <= 2'b11;
    else rst_sync_r <= {rst_sync_r[0], 1'b0};

assign good_reset = (dft_mode) ? bad_reset : rst_sync_r[1];
Видимо половина питания на выходе получается из-за того что открываются оба ключа на выходе на "+" и "-" шины. Вроде бы как недолго в таком состоянии находится, но если это сделают сотня триггеров одновременно? какие иголки по питанию пойдут при этом…
Половина питания (примерно) на выходе получается из-за того, что если нарисовать схему триггера полностью и рассмотреть ее как аналоговую — то именно в этом положении у нее имеется состояние неустойчивого равновесия.

Простой пример — рассмотрите схему триггера Шмитта. Это усилитель (идеальный ОУ) с положительной обратной связью. Существует такой уровень входного напряжения, при котором выходное напряжение равно ему, и отсутствуют процессы, стремящиеся вывести схему из этого состояния (т.е. напряжение на входах идеального ОУ равно 0).

И это не зависит от схемотехники конкретного логического семейства, будь то КМОП, ТТЛ или даже РТЛ. Везде, в любых триггерах, существуют состояния неустойчивого равновесия. Различаться могут только конкретные уровни напряжения, соответствующие этому состоянию.
Есть такая вещь, как самосинхронные схемы, которые избавлены от этого недостатка.
Я слабо знаком, но у меня есть ощущение, что они существуют пока только на бумаге (ну или в каких-то нишевых решениях). Тот же Achronix, обсуждавшийся давеча, пытался сделать «асинхронную» FPGA, но пока так и не сделал…
О как, я как раз увидев фамилию автора статьи и посмотрев ваш профиль подумал — не родственники ли, часом ;)
Что-то никакого промышленного применения не наблюдается. ARM-ядро (AMULET) было сделано, если мне не изменяет память, где-то в 1995 году, т.е. 20 лет назад.

Есть хорошая книга про асинхронные схемы, правда стоит $245 на Амазоне: www.amazon.com/Principles-Asynchronous-Circuit-Design-Perspective/dp/0792376137/ref=sr_1_1?ie=UTF8&s=books&qid=1247408117&sr=8-1

А вот ее совершенно бесплатная (легальная!) версия, чуть-чуть урезанная: eecourses.technion.ac.il/048878/book.pdf — не благодарите :)

Самое интересное, что это одна из немногих областей, где был заметный в мировом масштабе вклад отечественных ученых (Варшавский и компания из ЛЭТИ).
За ссылку спасибо. А про Варшавского я в курсе, из других источников правда :) Насколько я помню, русскоязычный коллектив занимался этим в университете Айдзу в Японии.

Можно наверное спросить rg_software что там сейчас происходит и развивают ли тему.
А с чего, простите, у них нет этого состояния? Там точно такие же триггеры, как и везде.
Для метастабильного состояния нужен тактовый сигнал, а там его нету
Для метастабильного состояния нужен не тактовый сигнал, а наличие обратной связи, которая в самосинхронных схемах вполне себе есть.
Из литературы я бы еще посоветовал статьи И. Каршенбойма цикл «Краткий курс HDL».

Автору — пишите еще. )))
Я бы еще рекомендовал статью «Fourteen Ways to Fool Your Syncrhonizer». Там подробно рассматриваются типичные ошибки при проектировании схем синхронизаторов, объясняется, почему они не работают, и приводятся правильные решения.

Что же касается двухпортового ОЗУ — то само по себе оно еще не реализует асинхронное FIFO. Для реализации асинхронного FIFO нужно еще много интересных блоков, таких, как счетчики в коде Грея и прочие синхронизаторы. О проектировании асинхронного FIFO можно было бы написать отдельную статью.
Триггер можно сравнить с маятником на жестком стержне. У этого маятника есть два состояния равновесия. Первое — когда маятник внизу, а второе — когда он наверху. Первое состояние устойчивое, второе — нет.

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

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

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

В схеме любого триггера (хоть RS, хоть D, хоть JK, хоть Шмитта) есть два основных элемента, хоть иногда и не выделенные явно:

1) усилитель с ограничением выходного сигнала
2) положительная обратная связь

Эта схема имеет два положения устойчивого равновесия и одно — неустойчивое. Около положения неустойчивого равновесия триггер ведет себя как чисто аналоговая схема, которую можно изобразить в виде операционного усилителя с положительной обратной связью. Зависимость выходного сигнала от времени (если исходное значение сигнала находилось близко к положению неустойчивого равновесия) является возрастающей по экспоненте синусоидой, т.е. exp(k*t)*sin(2*pi*f*t), где f — частота резонанса, k — константа, зависящая от коэффициента усиления усилителя).

То, что процесс является колебательным (с возрастающей амплитудой), вносит дополнительные схемотехнические трудности. Схема, измеряющая выходное состояние триггера при его выходе из метастабильного состояния, может зафиксировать колебания. Если это асинхронный счетчик — то его значение может увеличиться на произвольную величину.
Так что триггер Шмитта (который совсем уж явно является усилителем с положительной обратной связью) тоже подвержен метастабильности.
За кадром осталось самое вкусное: как FIFO на границе тактовых доменов будет работать в качестве не только переходного блока, ни и как собственно FIFO. То есть, когда требуется отследить переполнение очереди (и наоборот, попытку чтения из пустой очереди). В этом случае придется передавать значения указателей rx и tx через границу доменов, но, поскольку это можно делать не очень точно (разрешается использовать немного устаревшее значение), спасает код Грея. А у него в основе которого лежит довольно красивая математика, с которой было бы неплохо ознакомить публику.
Мифическое мировоззрение порой заметно облегчает жизнь: это чертова черная магия (англ. pure fucking magic), которая работает ;-)

PS Рассказывать это долго, сложно, и не уверен, что здесь нужно. Может в следующий раз…
IP-ядра в ISE/Vivado так и делают. Они передают значения счетчиков в коде Грея, а на принимающей стороне преобразуют обратно. Хотя, вроде бы, не советуют пользоваться этими счетчиками и советуют использовать только однобитные сигналы состояния FIFO.
Спасибо, я узнал ещё одну вещь, которую я знать не хочу. Оно как-то работает, может навернуться в любой момент, и все отвернулись и делают вид, что так и должно быть.

Где вариант «когда-то изучал FPGA, но пошёл работать программистом и всё забыл»? :)
Хотел заниматься FPGA, но предложений работы в этой сфере после университета не получил, поэтому пошёл прокачивать навыки програмирования — благо, этому тоже учили. Не жалею, но обидно, что учил ненужное вместо нужного.
Хотя, разносторонний кругозор — тоже неплохо.
1. «Метастабильное состояние — состояние квазиустойчивого равновесия физической системы, в котором система может находиться ДЛИТЕЛЬНОЕ время». (Википедия). На первом рисунке из статьи показано нестабильное состояние, а не метастабильное состояние.
2. Не знаю ни одного прочитанного учебника, где-бы показывалось наличие метастабильного состояния в схемах триггеров. Однако метастабильное состояние очень просто возникает при МОДЕЛИРОВАНИИ схем: в реальных устройствах всегда присутствуют шумы, помехи и т.п., которые могут являться первопричиной переключения, а при моделировании схем таких причин нет. Поэтому график для Q(3) на четвертом рисунке, и графики на пятом рисунке, возможно, возникают только при моделировании.
3. К сожалению не зная схемотехники триггеров говорить о наличии эффекта метастабильности в них сложно. В работе, возможно, описывается известное явление «состязания» в цифровых схемах.
Всей нити рассуждений не уловил в виду вечера пятницы, но должен расстроить: метастабильность — эффект физического мира. Пятый рисунок получен осциллографом подключенным прямо к микросхеме. Вот тут в первом абзаце краткая история признания этого эффекта (с исторической картинкой, хотел сперва ее спереть для публикации).
Состязания (гонки) в цифровых схемах — другой эффект, возникающий из-за разного времени распространения сигнала через участки комбинационной схемы. Гонки проявляются в виде множественного переключения пока схема не перейдет в статическое состояние.
Прочитал о 50-летней истории эффекта в триггерах, за ссылку спасибо.
Хорошо бы поправить первый Ваш рисунок в соответствии со статьей в википедии и физическом словаре. Он испортил первое впечатление и вызвал недоверие к Вашей, теперь, после перечтения поправляюсь, очень хорошей статье.
Не знаю ни одного прочитанного учебника, где-бы показывалось наличие метастабильного состояния в схемах триггеров

Попробуйте почитать Хоровиц и Хилл «Искусство схемотехники», глава 8, параграф 8.34
К сожалению не зная схемотехники триггеров говорить о наличии эффекта метастабильности в них сложно.

Вот вам схема триггера Шмитта:

с использованием идеального операционного усилителя.

Если теперь представить начальное состояние, в котором IN=OUT=2.5В, то напряжение между входами ОУ = 0, поэтому такое состояние допускается математической моделью, и нет никаких причин для изменения выходного сигнала ОУ.

Это состояние равновесия неустойчиво, и из-за возмущений и неточной реализации начальных условий схема рано или поздно выйдет из этого состояния. Но, как уже было рассмотрено выше, процесс выхода может занять сколь угодно длинное время. Правда, вероятность длительного выхода убывает по экспоненте, так что на практике реально длительное сохранение такого равновесия будет наблюдаться чрезвычайно редко.
1. В книге «Искусство схемотехники» (П. Хоровиц, У. Хилл) метастабильное состояние только упоминается, как любопытный эффект, но не рассматривается и не объясняется.
2. Схема триггера Шмитта находится в НЕУСТОЙЧИВОМ состоянии. МЕТАСТАБИЛЬНОЕ состояние — это 3-е, особое состояние (см. википедию или физическую энциклопедию).
только упоминается, как любопытный эффект, но не рассматривается и не объясняется.

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

Для меня лично, когда я читал этот учебник, явление метастабильности врезалось в память, хоть Хоровиц и Хилл пишут о нем полстраницы из всего талмуда в более 1000 страниц. Потому что это важная, критическая информация, от которой может зависеть работоспособность схем. И, когда я уже в реальной деятельности столкнулся с предупреждением о возможной метастабильности — то потрудился загуглить и найти все подробности. Чего и вам желаю. А то выглядит так, будто вы сюда спорить пришли и самоутверждаться, а не обогащать свой кругозор новыми знаниями.
см. википедию или физическую энциклопедию

Это спор о терминологии. Все дело в том, что в английском языке для описания того явления в цифровых схемах, которое рассматривается в статье, используется термин «metastable state», который часто переводят на русский язык буквально: «метастабильное состояние».

Посмотрел по ссылкам в Википедии. Тут я склонен с вами согласиться. Возникает впечатление, что в обоих языках для описания явлений в триггерах применение этого термина ошибочно. Там отсутствует равновесное состояние, устойчивое к малым возмущениям, кроме двух «обычных» состояний. Поэтому следовало бы говорить не о метастабильности, а о состоянии неустойчивого равновесия, о котором я писал во многих комментариях здесь.

Тем не менее, это сложившаяся терминология в данной области.
Уж извините, что не так. Просто хотелось обратить внимание автора и читателей на некорректный первый рисунок в статье, на котором показано нестабильное состояние, а не метастабильное состояние.
Нет проблем. В самом деле, вы оказались правы, это ошибочная терминология принята в электронике.
Похоже, что любой триггер подвержен такому состоянию. Больше-меньше но подвержен. несложно представить из-за чего это происходит — триггер это схема с обратными связями, пути сигналов синхронизации и данных проходят через разные элементы, а значит существует такая комбинация сигналов на входе которая может нарушить внутреннее состояние схемы. Чем точнее подгоним эти пути тем меньше будет «окно», но оно будет всегда.
Как-то странно написано. «Окно» всегда есть, но есть шаги/решения, которые гарантировано позволяют избежать этих проблем. Соответственно при правильной реализации в принципе не может быть «такая комбинация сигналов на входе которая может нарушить внутреннее состояние схемы».
В статье неявно сказана одна очень важная вещь, которую надо бы особо выделить: критически важно триггеры синхронизатора располагать как можно ближе друг к другу, это прямым образом влияет на время наработки на отказ, причем разница может быть на десятки порядков: www.aspenlogic.com/images/alj001.pdf
Only those users with full accounts are able to leave comments. Log in, please.