Как стать автором
Обновить

Комментарии 22

А можно пару примеров, где такое встречается? И происходит ли это случайно или где-то разные частоты требуются?
Если вы работаете с ПЛИС то с метастабильностью вы встретитесь как только начнёте принимать данные со входов. Как правило на курсах упоминают то, что все входные сигналы необходимо пропустить через триггер/регистр, даже если у вас вся логика обрабатывает 100% ошибок. Глюки от «да нафиг мне это триггер, яж такт потеряю один!» бывают совершенно разные, самый забавный — это улетевший в XXXX конечный автомат в середине цепочки, хотя он описан весьма качественно и «да он же имеет строчку вида default: next_state <= #5 error;»
Как правило на курсах упоминают то, что все входные сигналы необходимо пропустить через триггер/регистр,

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

Ну благо dual clock fifo есть и у altera и у xilinx, причём (у альтеры, с xilinx я мало работаю) простым пинком задаётся кол-во тактов между появлением данных на входе и доступностью оных на выходе (и какраз 3 Cycles, for best metastability там есть)
При создании констрейнтов все клоки (clock) в схеме разделяются на асинхронные группы так, чтобы внутри каждой группы клоки были строго синхронны друг другу. Сбои будут случайно возникать в синхронизаторах на границе доменов (clock domains), относящихся к разным группам.
Пример:
Клоки из группы А: С внешнего генератора через вывод микросхемы внутрь поступает опорная частота 25МГц, из которой с помощью PLL получается частота 50 МГц для APB, 100 МГц для AHB и 500 для AXI.
Клоки из группы Б: у контроллера UART приемопередатчик PHY работает на частоте 24 МГц, работающей от другого внешнего генератора.
Все клоки внутри группы А синхронны друг другу, но асинхронны клокам из группы Б. Поэтому в приемопередающей части контроллера UART должна производиться синхронизация из домена 50 МГц (APB) в 24 МГц (UART-PHY) и обратно. Сбои (ввиду метастабильности) будут наиболее часто возникать в первом триггере каждого синхронизатора, и на порядки реже — во втором, но исключительно редко могут возникать и дальше по схеме — в 4м, 5м и т.д. триггерах. Регулярность этих сбоев можно рассчитать, но для таких низких частот как в этом примере она будет маленькая — раз в несколько лет для первого триггера каждого синхронизатора. Если бы контроллер UART работал не на APB, а на AXI, то периодичность сбоев была бы на порядки выше.

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

Интересно бы было погонять триггерную схему в каком-нибудь доступном аналоговом симуляторе. Ни у кого нет модельки готовой?
Вот ссылка на модели транзисторов, а вот ссылка на спайс модели библиотеки стандартных элементов из FreePDK 45нм. Все остальное найдете там же. Сам не проверял, но должно работать — на этом FreePDK учат студентов в универе Северной Каролины (США).
Спасибо за статью. Особенно за то, что для тех, кто [пока] не может осилить теорию, есть простые рекомендации поставить нужное количество промежуточных регистров и молиться.
Возможно, стоит для совсем полных начинающих на всякий случай ещё добавить в явном виде мысль, что одиночный импульс так просто не пересинхронизировать — нужно делать схему установки-сброса. А для последовательности импульсов нужно ещё и накопление городить.
Не всегда пара последовательных регистров спасает ситуацию.
Например, если нужно шину данных перевести из одного домена в другой, то последовательные регистры не помогут.
Вот так делать не надо (verilog):
reg [7:0]data; //register in 1st domain

always @(posedge clk1)
   data <= input_data;

//cross domain...
reg [7:0]d0;
reg [7:0]data_out;

always @(posedge clk2)
   d0 <= data; // fix in first synchronizer

always @(posedge clk2)
   data_out <= d0;  // fix in second synchronizer



Если нужно шину провести из одного домена в другой, то скорее всего правильное решение — это FIFO с разными тактовыми частотами на запись и чтение.

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

Использование FIFO на двупортовой памяти хорошо только в случае блочных (burst) передач, поскольку занимает много площади на кристалле. В остальных случаях достаточно синхронизировать только интерфейсный хендшейк (сигналы запроса и ответа передачи). И, к слову, управление двупортовой памятью все равно придется синхронизировать в обе стороны.
Согласен.
Извините, я по привычке подразумевал, что все читающие понимают разницу между пересинхронизацией однобитного сигнала и шины. И это действительно входит в некое противоречие с моим же упоминанием начинающих читателей.
А как на метастабильность будут влиять шумы? В частности, тепловой шум?
Если посмотреть на предпоследний рисунок (Фазовый портрет), то при некоторой энергии управляющего импульса, состояние выходов триггера (изображающая точка на фазовом портрете) окажется в зоне метастабильности.
Далее, если исключить все абсолютно шумы (идеальный случай), то триггер будет выходить из этого состояния по Пуассону — от бесконечно долго до каких то вменяемых временных интервалов. Если же имеет место шум, то изображающая точка начинает хаотично перемещаться в зоне метастабильности (а-ля броуновское движение), пока случайно не выпадет из этой зоны. В какую сторону выпадет -в сторону лог. 1 или лог. 0 — заранее неизвестно, но зато — состояние метастабильности закончится досрочно, не по Пуассону.
Что касается именно теплового шума — это может быть электрон, оторвавшийся от кристаллической решетки (wiki). Важно то, что это некий случайный процесс, влияющий на замкнутую систему.
Как-то резко проскочили решение проблемы наращиванием тригерров уже по выводу в конце статьи, для меня. к примеру. не очевидо что это должно сработать и в статье никак не объясняется почему это работает, а тупо долбят статистикой.
Дело в том, что решение проблемы метастабильности с помощью цепочки триггеров очень подробно рассматривалось в этой статье от уважаемого nerudo, линк на которую приведён в самом первом абзаце данной статьи. Полагаю, поэтому и не стали повторять уже сказанное.
Пропустил Ваш вопрос, сорри.
Вероятность сбоя мультипликативна. К примеру, если вероятность сбоя с одним триггером равна 0.1, то системы из двух триггеров уже 0.1*0.1 = 0.01, и т.д. — перемножая дроби меньше единицы, мы получаем значения все ближе и ближе к нулю. Из т̶е̶о̶р̶и̶и̶ ̶в̶е̶р̶о̶я̶т̶н̶о̶с̶т̶е̶й̶ этой простой математики и следует решение в виде наращивания числа триггеров.

статье Л.Р. Марино математически доказано, что выходы абсолютно любого триггера, независимо от его конструкции, могут принимать метастабильное состояние."
Даже триггер на электромеханических реле? Каак?

В продолжении вопроса. А у фотонного триггера может быть метастабильное состояние? Рис 9.4 https://pstu.ru/files/2/file/kafedra/fpmm/of/Fizicheskie_osnovi_nanotehnologiyi_fotoniki_i_optoinformatiki_mag.pdf
nerudo Kopart valeriyk

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

Публикации

Истории