2段同期化回路・トグル同期・ハンドシェイク・非同期FIFOの違い:渡せる信号・転送の速さ・制約を比較
非同期のクロックドメインの間では、受け側のフリップフロップがセットアップ時間やホールド時間を満たせない瞬間が必ず来るので、メタステーブルが起こることを前提にした回路で信号を渡します。基本は、2段のフリップフロップで1ビットのレベル信号を受ける同期化回路です。短いパルスを渡すにはトグル同期、マルチビットのデータをときどき渡すにはハンドシェイク、データを連続して大量に渡すには非同期FIFOを使います。どれも、同期化するのは1ビットの信号か、1つ進むごとに1ビットだけ変わるグレイコードに限る、という考え方は共通です。
| 項目 | 2段同期化回路 | トグル同期 | ハンドシェイク | 非同期FIFO |
|---|---|---|---|---|
| 渡せるもの | 1ビットのレベル信号(ゆっくり変わる制御信号) | 1ビットのパルス(事象の発生) | マルチビットのデータ(ときどき1語ずつ) | マルチビットのデータの流れ(連続して大量) |
| しくみ | 受け側のクロックで2段のフリップフロップに通し、1段目のメタステーブルが2段目に取り込まれるまでに収まるのを待つ | 送り側でパルスごとに反転するレベル信号を作って同期化し、受け側で1段遅らせた値とのXORをとってパルスに戻す | データを保持したままreqを同期化して渡し、受け側が取り込んだらackを同期化して返す | デュアルポートのメモリに書き込み、グレイコードにしたポインタを相手のドメインに同期化してfullとemptyを判定する |
| 同期化する信号 | その信号そのもの | トグル信号(1ビット) | reqとack(各1ビット)。データは同期化しない | グレイコードのポインタ(1つ進むと1ビットだけ変わる) |
| 転送の速さ | 信号の変化は、受け側の周期より十分ゆっくりである必要がある | パルスの間隔を、受け側が変化を検出し終える数サイクル以上あける必要がある | 遅い。4相では1回の転送に、両方のドメインで合わせて8サイクル以上かかる | 速い。毎サイクル1語ずつ書き込み・読み出しできる |
| 受け側に届くまでの遅れの目安 | 受け側のクロックで約2サイクル | 受け側のクロックで約2〜3サイクル | reqが届くまで約2サイクル。ackが戻って次を送れるまでは、さらに往復分かかる | 書いた語が読み出し側に見えるまで約2〜3サイクル |
| 主な注意 | マルチビットに使うと、ビットごとに取り込むサイクルがずれて途中の値が見える。速いドメインからの短いパルスは消えることがある | パルスの間隔が短いと、トグル信号が元に戻って2回分の事象を見落とす | データはackが返るまで変えてはいけない | 深さはバーストの長さと読み書きの速さの差から決め、同期化の遅れの分の余裕を加える |
| 回路の規模 | フリップフロップ2個(高速なクロックでは3段にすることも) | フリップフロップ数個とXOR | req/ackの同期化回路と、両側の状態機械 | メモリ、ポインタとグレイコードの変換、同期化回路、fullとemptyの判定回路 |
| 主な用途 | イネーブルなどの制御信号、非同期の外部入力 | 速いドメインで1サイクルだけ出る完了や割り込みの通知 | 制御レジスタの設定値の受け渡し | 異なるクロックで動くバスやインターフェースの間のデータ転送 |
数値は代表的な目安で、世代や製品によって異なります。