Метастабільність тригера і міжтактова синхронізація

Дивовижний факт, але багато студентів, які успішно пройшли курс цифрової електроніки, залишаються в невіданні про таке явище, як метастабільність (або вважають його таким малозначимим, що приблизно через 2 дні після іспиту геть забувають). Між тим, збої в роботі пристрою, викликані метастабільністю діагностуються вкрай важко. Якщо ви дізналися себе в такому студенті, і якщо ви хоч якось пов'язані з розробками на базі цифрових мікросхем - вкрай рекомендую до прочитання даний текст. Можливо, що витративши 10 хвилин зараз ви заощадите багато днів, проведених за налагодженням у майбутньому.

Згадати б що таке тригер

Класичний D-тригер є базовою одиницею зберігання інформації в сучасних цифрових мікросхемах. На високому рівні абстракції він представляє пристрій пам'яті з входом даних D, виходом даних Q, а також вхідним керуючим тактовим сигналом (clk - clock в англійській термінології). Всі сигнали тут - логічні, можуть перебувати або в логічному 0 (далі «0») або в логічній 1 (далі «1»). Абсолютне значення напружень у вольтах нас поки не цікавить. При вступі на тактовий вхід фронту сигналу, тобто переходу з «0» в «1», тригер запам'ятовує поточне значення на вході даних D і передає його на вихід Q. У всіх інших ситуаціях тригер продовжує зберігати своє старе значення. Також у тригера можуть бути присутні й інші керуючі сигнали, зокрема сигнал асинхронного скидання aclr, що встановлює тригер в «0», незважаючи на інші входи.

Будь-який тригер має два часові параметри (вимоги), які необхідно виконувати для коректної роботи:

  1. Ts - setup time - час передвстановлення. Час протягом якого сигнал на вході D повинен залишатися стабільним перед приходом фронту тактового сигналу;
  2. ^ - hold time - час утримання. Час протягом якого сигнал на вході D повинен залишатися стабільним після приходу фронту тактового сигналу;

Сума цих двох параметрів дає нам тимчасово вікно в околицях фронту тактового сигналу протягом якого вхідні дані повинні бути стабільні. Аналогічні параметри є і для інших входів, зокрема для входу асинхронного скидання (їх називають recovery and removal time). Невиконання цих вимог призводить до невизначеного стану тригера. У найпростішому випадку це буде або «старе» або «нове» значення, що прийшло на вхід даних D в безпосередній близькості від фронту клока, але яке саме - невідомо. У багатьох ситуаціях з цим можна змиритися. На наступній картинці виходи Q (1) і Q (2) - дві реалізації спрацьовування тригера при порушенні вхідних часових параметрів.

Монета, яка зависла в повітрі

Однак іноді при порушенні часових параметрів відбувається вихід за межі «цифрового світу» і замість того, щоб прийняти стан чітко відповідний «0» або «1», вихід тригера починає бовтатися в проміжному стані з напругою приблизно відповідною половині напруги між «0» і «1». Груба аналогія з «механічного світу» винесена в заголовкову картинку. У стабільному положенні кулька знаходиться зліва або справа. Щоб він потрапив в інший стан - його потрібно штовхнути. Якщо зробити це досить сильно - він без проблем перевалить за вершину і опиниться з іншого боку (нормальне перемикання тригера). Якщо штовхнути занадто слабко - відразу скотиться назад. Якщо ж ви людина щаслива, то є шанс, що штовхнувши кульку, ви змусите її застигнути рівно на вершині.

Саме цей ефект і називається метастабільністю. На картинці вище цей варіант позначено як Q (3). Зрештою тригер «звалиться» в один з певних станів, але точно сказати коли це станеться неможливо. Час перебування тригера в метастабільному стані є ймовірнісною величиною і залежить від технологічних параметрів елементної бази, температури і т. п. На осциллографі ця картина виглядає приблизно ось так (синім кольором показаний вхідний сигнал, що порушує часові параметри тригера, рожевим - вихід тригера):

Чому метастабільність - це погано? По-перше, цей стан сам по собі невизначений і породжує невідомий результат у наступних елементах. Більш того, у багатьох випадках вихідний сигнал одного тригера подається відразу на кілька інших елементів, які через неідеальність технологічної бази можуть мати трохи різні пороги спрацювання. А значить, один і той же сигнал може трактуватися як «1» в одному місці і як «0» в іншому. Це може призвести до розсинхронізації роботи різних частин пристрою і загального збою (тобто такої ситуації з якої пристрій сам вийти нездатний). Більш того, якщо метастабільний стан протримався до приходу наступного тактового сигналу, то він може ввести наступний в ланцюжку тригер так само в метастабільний стан. Ймовірність цього невисока, оскільки діапазон вхідних напружень при якому тригер потрапляє в метастабільність надзвичайно вузький. Однак з урахуванням того, що подібна ситуація буде відбуватися регулярно з високою частотою (сучасні схеми можуть працювати на частотах до 1 ГГц, а то і вище) ця подія цілком реально. Знову таки, ймовірність такої події можна оцінити з урахуванням параметрів пристрою, частоти тактирования і частоти зміни даних. Загальна формула оцінки часу напрацювання на відмову виглядає наступним чином:

, де

t_R - часовий інтервал «захисту» від метастабільності. Для грубої оцінки можна вважати, що дорівнює 0 для одного тригера, періоду тактового сигналу за вирахуванням затримок на передустановку і поширення для другого тригера і плюс за періодом для кожного наступного;

\ tau - параметр залежний від технології, для сучасних пристроїв одиниці/десятки пікосекунд;

T_0 - тимчасове вікно потрапляння в метастабільність. Десятки/сотні пікосекунд;

f_c - частота тактового сигналу. Сотні мегагерц;

f_D - частота зміни даних. У діапазоні від 0 до f_c.

Для сучасної апаратури період потрапляння першого тригера в ланцюжку в метастабільний стан вимірюється мікро/мілісекундами, другого - годинником, третього - мільярдами-трильйонами років.

Ефект метастабільності може виникнути в декількох класичних ситуаціях:

  1. Явне порушення параметрів Ts і ^ тригера. Зазвичай виникає, коли пристрій намагаються змусити працювати на частоті, на якій він фізично працювати не може через занадто довгі шляхи поширення сигналів. Ця ситуація контролюється тимчасовим аналізатором і при нормальній роботі (при виконанні тимчасових вимог) зустрічатися не повинна.
  2. Порушення часових параметрів по входах асинхронного скидання. Дивно, але незважаючи на те, що скидання асинхронне, він повинен бути синхронний тактовому сигналу того тригера, який скидає, тобто його часові параметри декларуються щодо фронту тактового імпульсу. Про це часто забувають, подаючи скидання звідки ні влучаючи. Знову-таки, якщо сигнал скидання породжений за допомогою того ж тактового сигналу, як і тактовий сигнал трігера, що скидається, то тимчасовий аналізатор розбереться самостійно.
  3. Сигнали, що подаються синхронно (на тій же частоті з відомою затримкою) з інших пристроїв - тут найпростіший часовий аналіз (тобто декларування тільки тактової частоти) не працює і необхідно явно задавати тимчасові характеристики ваших вхідних/вихідних сигналів. Це є окремим непростим (але цілком дозволеним) завданням тимчасового аналізу.
  4. І, нарешті, найважчий випадок - сигнали передаються асинхронно, може бути зовсім на іншій тактовій частоті (і з невідомими зрушеннями фази) щодо приймальних тригерів. Їх джерелом може бути як зовнішнє обладнання (хоч кнопка на платі або послідовний порт) так і блоки тієї ж мікросхеми, що працюють на іншій тактовій частоті. Саме про цю ситуацію і піде подальша розмова.

Але спершу кілька слів про те, звідки ж береться безліч тактових сигналів. Безумовно, найпростіший і найприємніший варіант - коли тактовий сигнал тільки один. Тоді працювати з проектом просто і зручно. На жаль це можливо лише для зовсім простих пристроїв. Будь-який більш-менш складний пристрій зазвичай спілкується з кількома зовнішніми пристроями/інтерфейсами, кожен з яких може мати свій власний тактовий сигнал. Наприклад, нам треба прийняти дані з АЦП, буферизувати їх у зовнішній динамічній пам'яті після чого передати по Ethernet. У цьому випадку у нас буде як мінімум 3 непов'язаних один з одним тактових домена - інтерфейсу АЦП, системної шини і DDR-пам'яті, а так само клок Ethernet-інтерфейсу. А значить перед нами стоїть завдання коректно передавати дані (а так само параметри, керуючі сигнали, прапори статусу тощо) між цими тактовими доменами.

Як боротися

Для початку погана новина: повністю ефект метастабільності побороти неможливо, тому завжди залишається ймовірність того, що найближча АЕС раптово вибухне або ваш літак раптово впаде. Однак низкою простих дій можна дану ймовірність значно зменшити, приблизно зрівнявши з імовірністю того, що завтра захопить архангел Рафаїл і оголосить Судний День. Загальна тактика зрозуміла: ставимо підряд кілька тригерів (як показує формула вище, для реалістів цілком достатньо двох синхронізуючих тригерів) після чого даними можна користуватися. Однак є ряд технічних нюансів, які залежать від роду даних, що передаються.

Найпростіший випадок - передається псевдостатичний скалярний (однорозрядний) сигнал. Наприклад, сигнал вибору режиму тощо - перемикається вкрай рідко. У цьому випадку нашою єдиною турботою є захист від метастабільності - ставимо два тригери приймальної частоти і справу в капелюсі. З невизначеністю 1 такт (нас не хвилюючою) він буде переданий від джерела до приймача.

Сигнал дозволу тривалістю 1 такт. Складність полягає в тому, що при неспівпадінні частот є висока ймовірність або зовсім втратити сигнал (якщо приймальна частота нижче вихідної) або розтягнути його на кілька тактів, що теж не здорово.

Загальний підхід, що застосовується в цьому випадку - «подовжити» сигнал не кілька тактів, перенести його в новий тактовий домен відомим способом і там виділити подію фронту, заново сформувавши сигнал тривалість 1 такт.

Багаторозрядна шина, що передає єдине псевдостатичне значення (наприклад, конфігураційний параметр). Здавалося б, все просто - став по парі тригерів на кожен розряд шини - що ще треба? Однак нам відомо, що після виходу з метастабільного стану тригер може прийняти як старе, так і нове значення. Більш того, навіть без входу в метастабільність, просто за рахунок трохи відрізняються параметрів тригер одного з розрядів може встигнути підштовхнути нове значення, а тригер іншого - старе.

У даному випадку протягом як мінімум 1 такту на виході шини буде присутнє некоректне значення. Воно не буде дорівнює ні старому, ні новому з поданих на вхід. Для якихось схем це може не мати значення, а для якихось може бути важливо. Тому намагаються створити більш надійну схему з сигналом-підтвердженням, що вказує в який момент можна безпечно перещелкнути вхідні дані на вихід.

І, нарешті, найскладніший випадок - потік даних, що передаються з одного тактового домену в інший. Якщо дані відносно рідкісні (1 слово даних на 10 і більше тактів клока), то можна реалізувати схему з рукостисканням, аналогічну попередньому пункту. Але як бути, якщо дані йдуть на кожному такті (або близько до того)? Тут нам на допомогу прийде спеціальний апаратний блок - двопортова пам'ять з незалежними тактовими сигналами. Така пам'ять є як в сучасних FPGA, так і в технологічних бібліотеках для замовних мікросхем. Її можна писати і читати абсолютно незалежно через два окремих порти. Єдиним обмеженням є одночасне звернення на запис і читання за однією і тією ж адресою пам'яті - воно може призвести до невизначеного результату. На основі такого блоку пам'яті часто створюється модуль FIFO, який дозволяє з одного боку записувати дані з одного тактового домену, а з іншого - забирати в інший тактовий домен. Заодно логіка FIFO стежить за тим, щоб не відбувалося звернення до одного і того ж осередку пам'яті.

Ув'язнення

Наостанок хочеться підвести підсумок і дати кілька корисних порад:

  • Чим менше тактових сигналів, тим простіше робота з вашим проектом
  • Базовим сихронізатором є два (або більше) тріггери, що стоять один за одним
  • Між усіма асинхронними тактовими доменами повинен бути продуманий механізм передачі даних. Найкраще ще на етапі системного проектування намалювати тактову структуру проекту
  • Всі зовнішні сигнали, асинхронні по відношенню до вашого пристрою, в тому числі сигнали асинхронного скидання, повинні бути синхронізовані
  • У одному модулі краще використовувати лише один клок
  • Якщо всередині модуля більше одного клока, то для кожного внутрішнього сигналу потрібно чітко уявляти, яким клоком він формується і як потім використовується. Надійніше закодувати прямо в імені сигналу
  • Будьте особливо уважні на верхньому рівні проекту: саме тут дуже часто відбувається помилкове підключення сигналу з одного тактового домену в інший без пересинхронізації
  • Тактові сигнали, породжені на внутрішніх модулях множення частот (PLL/DCM/MMCM тощо) зазвичай синхронні, вони розглядаються тимчасовим аналізатором і для них пересинхронізація даних найчастіше не потрібна. Хоча і не завадить.
  • Сучасні засоби проектування намагаються самостійно виявляти ситуації передачі даних між тактовими доменами. Наприклад, Design Assistant має Альтеру (вбудований у Quartus), ALINT - Aldec. Варто прислухатися до виданих попереджень і порад

І на завершення кілька коментарів з можливих технічних питань.

Часові діаграми малювалися за допомогою простої безкоштовної програми TimingEditor. Деякі проекти збиралися в Quartus - виключно через зручність його схемного редактора. Все те ж саме може бути (і повинно бути!) реалізовано на чистому HDL (VHDL/Verilog). Якщо хочеться більш глибокого розуміння фізики метастабільності, то детальніше дану тематику можна вивчити за ключовими словами metastability і clock domain crossing. Наприклад, досить докладне дослідження Steve Golson «Synchronization and Metastability» і більш короткий документ Ran Ginosar «Metastability and Synchronizers», а так само багато інших доступні в інтернеті.

Тільки зареєстровані користувачі можуть брати участь в опитуванні. Увійдіть, будь ласка.

Соцопитування

42.2% Електронікою не займаюся, просто зайшов почитати 203

30.77% Займаюся електронікою, про метастабільність мені було відомо 148

27.03% Займаюся електронікою, дізнався багато нового 130

Проголосував 481 користувач. Утрималися 34 користувачі.

COM_SPPAGEBUILDER_NO_ITEMS_FOUND