Menggunakan sinkronisasi 2-ff telah menjadi standar bagi sinyal untuk melewati batas jam. Dan ada banyak kertas / gambar yang menggambarkan mekanisme ini, seperti ini:
Tampaknya bclk hanya dapat mencicipi denyut nadi adat satu kali (pada ujung kedua bclk yang meningkat ), yang menyebabkan keluaran metastabilitas pada bq1_dat . Bagaimana bisa bq1_dat dicicipi "tinggi" di tepi jam aktif berikutnya?
Selain pertanyaan saya, saya ingin menambahkan apa yang saya pikirkan agar sinyal dapat masuk dengan aman ke domain jam lain (misalkan 2-FF sudah cukup untuk memenuhi persyaratan MTBF). Harap perbaiki saya jika ada kesalahan.
ps: Keadaan metastabil tidak menampilkan gelombang "berkeliaran", tetapi level yang bukan '1' atau '0'. Gambar berikut menunjukkan contoh output metastable.
Angka asli berasal dari catatan Kuliah untuk EE108A, Kuliah 13: Kegagalan Metastabilitas dan Sinkronisasi (ow Ketika Flip-Flops Baik Menjadi Buruk) oleh WJ Dally.
sumber
Jawaban:
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.
sumber
sync_Bits
) untuk Xilinx dan Altera FPGAs untuk meningkatkan perilaku metastabilitas. Sinkronisasi 2-FF digunakan misalnyasync_Strobe
untuk membuat sinkronisasi yang lebih kompleks untuk pulsa.1) Menggunakan gambar Anda sebagai contoh, aclk dan bclk saling tidak sinkron. Dengan kata lain, mereka memiliki sumber jam yang berbeda. Mereka menunjukkan adat sebagai data yang valid tetapi hanya disinkronkan ke ACLK. Di sinilah sinkronisasi bclk berperan.
2) Gambar ini mengasumsikan skenario terburuk, di mana bq1_dat adalah output yang berantakan karena bq1 FF hanya menangkap sebagian dari akhir data, menciptakan keadaan metastabil di mana output biasanya berupa sampah. Inilah triknya. Bq2 memiliki bclk yang sama dengan bq1, tetapi dibutuhkan 2 jam siklus bclk agar data dapat lewat dan muncul di bq2_dat.
3) Bagian bclk pertama yang diambil dari data, menghasilkan output yang berantakan, tetapi bclk kedua adalah satu siklus jam kemudian, cukup waktu untuk data ambigu dari bq1_dat untuk menetap dalam keadaan tinggi atau rendah. Denyut bq1_dat berantakan berlangsung cukup lama untuk bq2 untuk menangkap logika yang valid '1' (logika tinggi), dan meneruskannya ke bq2_dat sebagai data yang valid dan sekarang disinkronkan (logika tinggi).
4) Downstream, setiap jam menggunakan bclk akan memiliki data yang disinkronkan untuk bekerja dengannya. Perhatikan bahwa hanya FF bclk pertama yang harus berurusan dengan kondisi metastabil . Hasilnya bisa menjadi logika rendah jika adat hanya terlambat pico atau nano detik. Ingat sandal jepit ini sampel input data hanya di tepi naik jam. Apa yang terjadi sebelum atau sesudah sisi naik diabaikan.
sumber