Проста відповідь полягає в тому, що вони не займаються самостійно. Синхронізатор є не для того, щоб передати дані, але переконайтеся, що ви не закінчитесь метастабільними сигналами, що подають безліч інших сигналів і створюють проблеми. Другий FF, як показано на діаграмі, вловлює метастабільний перший вихід FF і не дозволяє йому поширюватися далі через конструкцію.
Існують різні види сигналів, і те, як ви включаєте синхронізатори, залежить від того, про який сигнал ви говорите. Але давайте розглянемо кілька поширених типів:
Тригерні сигнали - або будь-який сигнал, який в основному є імпульсом, який повинен запустити щось інше. Зазвичай вони не несуть даних, і все, що вас цікавить, - це, скажімо, зростаюча грань для того, щоб почати щось переходити в інший годинниковий домен. Щоб перехрестити їх, вам знадобиться синхронізатор (по суті, те, що показано на вашій схемі), але вам потрібно трохи більше.
Найпростішим варіантом є розширення імпульсу - по суті, ви впевнені, що вхідний імпульс становить більше 1 тактового періоду цільового часу призначення (він повинен бути довшим за 1 цикл, принаймні більший за час встановлення та час утримування для регістру призначення) . Наприклад, якщо ви переходите від тактової частоти 20 МГц до тактової частоти 15 МГц, ви переконайтесь, що ваш імпульс - два тактові цикли на вході, що забезпечить подання його та не втрачено. Це також дає відповідь на ваше запитання про те, як гарантовано переходити сигнал. Якщо імпульс ширший, ніж один тактовий час призначення, це означає, що якщо він переходить на перший край годинника і в кінцевому підсумку сприймається як 0, то на другому краю тактового сигналу він обов'язково вловить імпульс.
Оскільки з цим типом сигналу вас цікавить лише те, що імпульс пройшов поперек, неважливо, чи вихідний сигнал закінчується двома тактовими циклами високий час, а інший лише один цикл. Якщо вам потрібно переконатися, що це імпульс одноциклового циклу, ви можете створити просту ланцюг детектора краю.
Контрольні автобуси - або, можливо, типи шин даних. Це, мабуть, складніше, тому що якщо у вас є багатобітний потік даних, який повинен залишатися синхронізованим. У цьому випадку ви хочете реалізувати щось, що називається "рукостискання". Ви в основному завантажуєте свої дані на вихідний годинник і зберігаєте їх. Потім ви надсилаєте сигнал запиту (як у 1) через синхронізатор. Після того, як сигнал запиту попереду, ви знаєте, що шина даних також буде стабілізована в доменному призначенні. Потім ви можете перевести годинник у банк реєстру за адресою призначення. Потім пункт призначення знову надсилає імпульс підтвердження, щоб повідомити джерело, що він може завантажити наступне слово.
Ви б використовували такий тип шини, якщо вам потрібно було надіслати керуюче слово до цільового годинника, для якого вам потрібно знати, що воно потрапило туди, перш ніж ви надсилаєте інший (наприклад, якщо ви надсилаєте команду щось робити).
Шини даних - для даних, де у вас є джерело, яке викидає дані безперервно або в пакетні дані, вам, мабуть, краще використовувати FIFO, ніж синхронізатори. FIFO використовує подвійну тактову пам’ять для зберігання даних, а також лічильники для відстеження кількості даних у FIFO. Ви записуєте дані у FIFO, коли є простір, а потім збільшуєте адресу запису. Потім ця адреса зазвичай кодується у схемі "сірого кодування", яка забезпечує, що кожен приріст адреси викликає лише одинбіт в адресній шині для зміни (тобто вам не потрібно синхронізувати декілька біт). Потім ця адреса передається до домену призначення (через одну з ваших ланцюгів синхронізатора), де вона порівнюється з адресою зчитування. Якщо у FIFO є дані, то їх можна зчитувати з пам'яті за допомогою порту годинника призначення. Адреса зчитування аналогічно кодується сірим кольором та надсилається назад до джерела через інший синхронізатор, щоб порт запису міг обчислити, чи є у FIFO пробіл
Скидання сигналів - вони зазвичай використовують модифіковану версію синхронізатора в тому, що відомо як "Асинхронний запуск, синхронний пустель". У цій модифікованій версії введення даних до першого фліп-флопу прив’язується до GND, і замість цього вхідний сигнал скидання підключається до асинхронних заданих сигналів кожного фліп-флопу в синхронізаторі. Це призводить до отримання вихідного сигналу, який є повністю асинхронним, коли він виходить високо, але ланцюг синхронізатора забезпечує низький синхронний синхронізацію з цільовим призначенням шляхом проходження через нулі в ланцюзі регістрів.
Цей тип синхронізатора жахливий для даних та контролю, але ідеально підходить для скидання сигналів. Якщо вся логіка призначення подає вихід цього ланцюга на асинхронний вхід для скидання будь-якого реєстру в домені, то метастабільність при затвердженні мало побоюється (навіть якщо це асинхронно), оскільки всі регістри вимушені до відомого стану. Тоді, коли сигнал скидання відпадає у вихідному домені, він синхронно деассерирует у доменному призначенні, тобто всі регістри виходять із скидання в одному і тому ж тактовому циклі (а не +/- 1 цикл, якщо це був асинхронний дезасерв).
Як видно з вищесказаного, зробити набагато складніше робити перехрещування доменного годинника, ніж просто наклеїти на сигнал 2 синхронізатора обертання. Точний метод, що використовується, залежить від програми.