Pull to refresh

Comments 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, и т.д. — перемножая дроби меньше единицы, мы получаем значения все ближе и ближе к нулю. Из т̶е̶о̶р̶и̶и̶ ̶в̶е̶р̶о̶я̶т̶н̶о̶с̶т̶е̶й̶ этой простой математики и следует решение в виде наращивания числа триггеров.

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

Есть абстрактная двустабильная система, состояния переключаются импульсом энергии (электрической, механической и т.д.). При некоторых значениях энергии система становится нестабильной — не может переключиться до конца ни в одно ни в другое состояние — явление метастабильности. Выход из этого состояния — флуктуации внешних факторов, поскольку реальная система не может быть замкнутой. Вот и вся суть явления.
Примеры — триггеры на кмоп и биполярных транзисторах. Электромеханические реле — экзотика, но вполне могу себе представить метастабильность в такой системе — будет выглядеть как колебания пружин (они есть в реле) и перезарядка LRC контуров. Что касается второго линка, лень листать 800 страниц, сорри.
Only those users with full accounts are able to leave comments. Log in, please.