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段にすることも)フリップフロップ数個とXORreq/ackの同期化回路と、両側の状態機械メモリ、ポインタとグレイコードの変換、同期化回路、fullとemptyの判定回路
主な用途イネーブルなどの制御信号、非同期の外部入力速いドメインで1サイクルだけ出る完了や割り込みの通知制御レジスタの設定値の受け渡し異なるクロックで動くバスやインターフェースの間のデータ転送

数値は代表的な目安で、世代や製品によって異なります。

どんなときに使うか

2段同期化回路
1ビットのレベル信号で、受け側の周期より十分長く保たれるとき。すべての方式の土台で、クロックが速いときやMTBFをさらに長くしたいときは3段にします。
トグル同期
速いドメインで出る短いパルスを、取りこぼさずに遅いドメインへ伝えたいとき。次のパルスまでに、受け側の数サイクル以上の間隔がある場合に限ります。
ハンドシェイク
設定値のようなマルチビットのデータを、ときどき確実に渡したいとき。周波数の比を問わず安全ですが、1回の転送に何サイクルもかかります。
非同期FIFO
データを連続して、または高い頻度で渡したいとき。速さの違いやバーストを吸収できますが、回路は最も大きくなります。

よくある質問

マルチビットのデータに、ビットごとに2段同期化回路を付けてはいけないのはなぜですか?

ビットごとに、変化を今回のエッジで取り込むか次のエッジで取り込むかが決まらないからです。例えば0111から1000に変わるとき、一部のビットだけが新しい値になった1111や0000を1サイクル受け取ることがあります。データ自体は同期化せずに保持しておき、1ビットの制御信号だけを同期化するハンドシェイクか、非同期FIFOを使います。カウンタの値なら、グレイコードにして1ビットずつしか変わらないようにする方法もあります。

同期化回路を2段から3段にすると、何が変わりますか?

メタステーブルが収まるのに使える時間が約1周期延び、故障の平均間隔(MTBF)が指数関数的に長くなります。MTBFはおおよそe^(t_r/τ) ÷ (T_0 × f_clk × f_data)で表され、例えばτ = 20 psでt_rが1 ns延びれば、MTBFはe^50倍(10の21乗倍以上)になります。その代わり、受け側に届くまでの遅れが1サイクル増えます。

非同期FIFOのポインタを、グレイコードにするのはなぜですか?

バイナリのポインタは、0111から1000のように複数のビットが同時に変わるので、別々に同期化するとまったく関係のない値を受け取ることがあるからです。グレイコードなら1つ進むごとに変わるのは1ビットだけなので、そのビットがメタステーブルになって新旧どちらに決まっても、結果は進む前か進んだ後の値です。少し古い値を見るだけなので、fullやemptyの判定は安全側に働きます。

非同期FIFOの深さは、どう決めますか?

書き込みのバーストの間に、読み出しが追いつかずにたまる最大の量で決めます。書き込み側100 MHz、読み出し側80 MHzで、100語のバーストを毎サイクル書き込み、毎サイクル読み出すなら、100 × (1 − 80/100) = 20語です。実際の設計では、ポインタの同期化の遅れの分の余裕を加えます。

理解度チェック

2段フリップフロップの同期化回路を3段に増やしたときの、メタステーブルによる故障の平均間隔(MTBF)の変化として正しいものはどれか。

  1. Aメタステーブルが収まるのに使える時間が約1周期増え、MTBFは指数関数的に長くなる
  2. B段数に比例して、MTBFが1.5倍になる
  3. Cメタステーブルの起こりやすさは入力側で決まるので、MTBFは変わらない
答えと解説を見る

正解:A. メタステーブルが収まるのに使える時間が約1周期増え、MTBFは指数関数的に長くなる

同期化回路のMTBFは、おおよそ MTBF = e^(t_r/τ) ÷ (T_0 × f_clk × f_data) で表されます。t_r はメタステーブルが収まるのに使える時間、τ と T_0 はフリップフロップの特性で決まる定数です。段を1つ増やすと t_r が約1周期(正確には1周期からフリップフロップの出力遅延とセットアップ時間を引いた分)延びます。例えば τ = 20 ps で t_r が 1 ns 増えれば、MTBFは e^50 倍、つまり10の21乗倍以上に延びます。1段目がメタステーブルになる確率は変わりませんが、その先へ伝わる前に収まる確率が大きく上がるのです。

4ビットのデータの各ビットに、それぞれ2段の同期化回路を付けて別のクロックドメインに渡した。データが 0111 から 1000 に変わるときに起こりうる問題として正しいものはどれか。

  1. Aビットごとに取り込まれるサイクルがずれ、1111 や 0000 のような途中の値を受け取ることがある
  2. B同期化回路を通すと、すべてのビットが同じサイクルでそろうので問題は起きない
  3. C4ビットすべてがメタステーブルになり、そのまま0にも1にも戻らなくなる
答えと解説を見る

正解:A. ビットごとに取り込まれるサイクルがずれ、1111 や 0000 のような途中の値を受け取ることがある

2段同期化回路は1ビットごとに、変化を取り込むのが今回のエッジか次のエッジかが確定しません。0111 から 1000 への変化では4ビットすべてが変わるので、一部のビットだけが新しい値になった 1111 や 0000、0100 などを1サイクル受け取ることがあります。受け側がその値を使うと誤動作します。メタステーブルは時間がたてば0か1に収まります。カウンタの値ならグレイコードに変換して1ビットだけが変わるようにし、任意のデータならハンドシェイクや非同期FIFOを使います。

トグル同期(送り側でパルスが来るたびに反転するレベル信号を作って渡す方式)で、受け側でもとのパルスを取り出す方法として正しいものはどれか。

  1. A同期化したトグル信号を、そのままパルスとして使う
  2. B同期化したトグル信号と受け側のクロックのANDをとって、1サイクル幅のパルスにする
  3. C同期化したトグル信号と、それをさらに1段遅らせた信号のXORをとる
答えと解説を見る

正解:C. 同期化したトグル信号と、それをさらに1段遅らせた信号のXORをとる

トグル同期では、送り側でパルスが来るたびにフリップフロップの値を反転させ、0から1、1から0への変化として事象を表します。レベル信号なので、受け側の周期より短いパルスでも消えません。受け側では2段で同期化した後、もう1段遅らせた値とのXORをとると、変化があったサイクルだけ1になる1サイクル幅のパルスが得られます。トグル信号をそのまま使うと、2回目の事象で0に戻ったときに見落とします。クロックとの論理演算はグリッチの原因になります。

  1. ハンドシェイクによるクロックドメイン間のデータ転送の欠点として正しいものはどれか。
  2. 非同期FIFOで、書き込みポインタと読み出しポインタをグレイコードに変換してから相手のドメインに同期化する理由として正しいものはどれか。
  3. 書き込み側 100 MHz、読み出し側 80 MHz の非同期FIFOで、書き込み側は100語のバーストを毎サイクル1語ずつ書き込み、読み出し側は毎サイクル1語ずつ読み出す。バーストの間には十分な休みがある。あふれないために必要な最小の深さはいくらか(同期化による遅れは無視する)。

タイミング解析とCDCの練習問題へ

関連する用語の解説

同期化回路
非同期の信号を受け側のクロックにそろえる回路で、シンクロナイザとも呼ぶ。2段のフリップフロップを直列につなぐ構成が基本で、1段目がメタステーブルになっても次のエッジまでに収まる確率を高める。
トグル同期
送り側でパルスが来るたびに反転するレベル信号をつくって受け側へ同期化し、受け側で1サイクル前の値とのXORをとってパルスに戻す方式。受け側の周期より短いパルスも取りこぼさないが、パルスの間隔は受け側の数サイクル以上あける必要がある。
ハンドシェイク
送り側の要求(req)と受け側の応答(ack)をやり取りして、データを確実に受け渡す方式。クロックドメインの間ではreqとackだけを同期化し、その間データを止めておくので安全だが、1回の転送に数サイクル以上かかる。
非同期FIFO
書き込みと読み出しを別々のクロックで行うFIFOで、クロックドメインの間でマルチビットのデータを渡すのに使う。ポインタをグレイコードに変換して相手のドメインに同期化し、満杯(full)と空(empty)を判定する。ポインタはアドレスより1ビット多くして周回を区別する。
クロックドメイン
同じクロック、または周波数と位相の関係が決まったクロックで動くフリップフロップの集まり。非同期の関係にあるクロックドメインの間で信号を渡すときは、同期化回路が必要になる。
メタステーブル
フリップフロップでセットアップ時間やホールド時間が守られないとき、出力がしばらく0とも1とも定まらない状態。非同期信号は2段のフリップフロップで同期化して対策する。
グレイコード
隣り合う値の間で1ビットだけが変化する符号。ロータリーエンコーダや、異なるクロック間でのカウンタ値の受け渡しで、読み取りの誤りを防ぐのに使われる。
MTBF(平均故障間隔)
故障が起きる平均の間隔。同期化回路では、メタステーブルが収まらずに後段へ伝わる平均の間隔を指し、MTBF = e^(t_r/τ) ÷ (T_0 × f_clk × f_data) で表される。段数を増やして収まるまでの時間t_rを延ばすと、指数関数的に長くなる。

関連する比較