Jawaban sederhananya adalah mereka tidak melakukannya sendiri. Sinkronisasi ada di sana untuk memastikan data tidak sampai, tetapi memastikan Anda tidak berakhir dengan sinyal metastabil yang memberi makan banyak sinyal lain dan menyebabkan masalah. FF kedua seperti yang ditunjukkan diagram menangkap keluaran FF pertama yang dapat metastabil dan mencegahnya menyebar lebih jauh melalui desain.
Ada berbagai macam sinyal, dan bagaimana Anda memasukkan sinkronisasi tergantung pada sinyal apa yang Anda bicarakan. Tetapi mari kita lihat beberapa tipe umum:
Sinyal Pemicu - atau sinyal apa pun yang pada dasarnya adalah pulsa yang harus memulai sesuatu yang lain berjalan. Ini umumnya tidak membawa data, dan yang Anda minati adalah bahwa, katakanlah, ada kemajuan untuk memulai sesuatu yang terjadi di domain jam lain. Untuk mendapatkan ini untuk menyeberang, Anda akan memerlukan sinkronisasi (pada dasarnya melakukan apa yang ditunjukkan dalam diagram Anda), tetapi Anda perlu sedikit lebih banyak.
Opsi paling sederhana adalah memperpanjang pulsa - pada dasarnya Anda memastikan pulsa input lebih dari 1 jam periode dari jam tujuan (seharusnya lebih dari 1 siklus dengan setidaknya lebih besar dari pengaturan dan waktu tunggu untuk register tujuan) . Misalnya jika Anda beralih dari jam 20MHz ke jam 15MHz, Anda akan memastikan pulsa Anda adalah dua siklus jam pada input yang akan memastikan bahwa itu disajikan ke jam tujuan dan tidak hilang. Ini juga menjawab pertanyaan Anda tentang bagaimana sinyal dijamin dapat melintasi. Jika denyut nadi lebih luas dari satu periode jam tujuan itu berarti bahwa jika bergerak metastable di tepi jam pertama dan akhirnya dilihat sebagai 0, maka pada tepi jam kedua itu pasti akan menangkap pulsa.
Karena dengan jenis sinyal ini Anda hanya tertarik bahwa pulsa telah melintas, tidak masalah jika sinyal output berakhir dengan dua siklus clock tinggi beberapa waktu dan hanya satu siklus sisanya. Jika Anda perlu memastikan itu adalah pulsa siklus tunggal, Anda dapat instantiate rangkaian detektor tepi sederhana.
Kontrol Bus - atau mungkin jenis bus data. Ini bisa dibilang lebih sulit karena jika Anda memiliki aliran data multi-bit yang perlu tetap disinkronkan. Dalam hal ini yang akan Anda lakukan adalah mengimplementasikan sesuatu yang disebut "handshaking". Anda pada dasarnya memuat data Anda pada jam sumber dan menahannya. Kemudian Anda mengirim sinyal permintaan (seperti dalam 1) melalui sinkronisasi. Setelah sinyal permintaan melintas Anda tahu bahwa bus data juga akan distabilkan di domain tujuan. Anda kemudian dapat memasukkannya ke bank register di tujuan. Tujuan kemudian mengirimkan pulsa terima kasih kembali untuk memberi tahu sumbernya bahwa ia dapat memuat kata berikutnya.
Anda akan menggunakan bus semacam ini jika Anda perlu mengirim kata kontrol ke jam tujuan yang Anda perlu tahu bahwa itu sudah ada sebelum Anda mengirim yang lain (misalnya jika Anda mengirim perintah untuk melakukan sesuatu).
Bus data - untuk data di mana Anda memiliki sumber yang mengeluarkan data secara terus-menerus atau dalam ledakan, Anda bisa dibilang lebih baik menggunakan FIFO daripada sinkronisasi. FIFO menggunakan memori dua jam untuk menyimpan data, bersama dengan penghitung untuk melacak berapa banyak data yang ada di FIFO. Anda menulis data ke FIFO ketika ada ruang, dan kemudian menambahkan alamat tulis. Alamat ini kemudian biasanya dikodekan ke dalam skema "Pengkodean Abu-abu" yang memastikan bahwa setiap kenaikan alamat hanya menyebabkan satubit di bus alamat untuk berubah (artinya Anda tidak perlu menyinkronkan beberapa bit). Alamat ini kemudian ditransfer ke domain tujuan (melalui salah satu rantai sinkronisasi Anda), yang dibandingkan dengan alamat baca. Jika ada data di FIFO, maka dapat dibaca dari memori menggunakan port jam tujuan. Alamat baca juga memiliki kode Gray dan dikirim kembali ke sumber melalui sinkronisasi lain sehingga port tulis dapat menghitung jika ada ruang di FIFO.
Atur Ulang Sinyal - ini biasanya menggunakan versi sinkronisasi yang dimodifikasi dalam apa yang dikenal sebagai "Asynchronous Assert, Synchronous Deassert". Dalam versi modifikasi ini, input data ke flip flop pertama dikaitkan dengan GND, dan sebagai gantinya sinyal reset masuk dihubungkan ke sinyal preset asinkron dari setiap flip-flop di sinkronisasi. Ini menghasilkan sinyal output yang sepenuhnya tidak sinkron ketika menjadi tinggi, tetapi rantai sinkronisasi memastikan bahwa ia rendah secara serempak dengan jam tujuan dengan menghitung angka nol dalam rantai register.
Jenis sinkronisasi ini buruk untuk data dan kontrol, tetapi sangat cocok untuk mengatur ulang sinyal. Jika semua logika tujuan memasukkan output rantai ini ke input reset asinkron dari register apa pun di domain, maka ada sedikit kekhawatiran tentang metastabilitas saat ditampilkan (meskipun asinkron) karena semua register dipaksa ke kondisi yang diketahui. Kemudian ketika sinyal reset di-deasserted di domain sumber, itu secara sinkron deasserts di domain tujuan yang berarti semua register keluar dari reset pada siklus clock yang sama (daripada +/- 1 siklus jika deassert asynchronous).
Seperti yang dapat Anda lihat di atas, jauh lebih kompleks untuk melakukan lintas domain-jam daripada hanya menempelkan sinkronisasi 2 flip-flop pada sinyal. Metode persis yang digunakan tergantung pada aplikasi.