For Good FPGA Design

メタステーブル対策!(2)

メタステーブル対策!第2回~第4回は、多ビット信号(バス)のメタステーブル(metastable)対策について解説していきます。この回では、多ビット信号では単純にm-FFシンクロナイザーを使うことはできないという話をします。

目次

結論

  • m-FFシンクロナイザーの後は1クロックだけタイミングがずれる可能性がある

CDCとm-FFシンクロナイザー

メタステーブル対策!第1回の記事で解説したように、1ビットの信号であれば、m-FFシンクロナイザーを置くことで、非同期クロック間のデータ受け渡し(Clock Domain Crossing: CDC)ができました。

その中でもよく使われているのは、2-FFシンクロナイザー(2-FF Synchronizer)でした。

関連記事

多ビット信号のCDCにおける不具合

2ビット信号でのCDCを考えます。ブロック図は一般的に図1のように描かれます。CLK2で動作する2つのフリップフロップ(FF2とFF3)が2-FFシンクロナイザーです。

図1 2ビット信号の2-FFシンクロナイザー

フリップフロップは1ビットの記憶素子ですので、実際の回路は図2のようになります。同じ回路が、0ビット目と1ビット目それぞれについて、パラレルで存在することになります。

図2 2ビット信号の2-FFシンクロナイザーの実際

このときの信号波形は図3のようになります。

ここ、重要です。

図3 2ビット信号のCDCの波形

FF2_0とFF2_1の出力である、D3[0]とD3[1]はメタステーブルになる可能性があります。そして、FF3_0とFF3_0にはメタステーブルが入力されます。このとき、FF3_0とFF3_1の出力は、1または0のどちらかに確定します。どちらになるかはわかりません。次のサイクルでは、どちらのビットもとるべき値(図3の場合は1)に確定します。

つまり、多ビット信号でm-FFシンクロナイザーを通した後は、どこかのビットが1クロックだけずれる可能性があります。

図3においては、

  • D1が 0x0→0x3 と変化したとき
  • Q3は 0x0→0x1→0x3 と変化します

Q3を使う後段の回路が、0x1の瞬間で値を使うと、不具合が発生してしまいます。

したがって、多ビット信号では単純にm-FFシンクロナイザーを使えばよいということではありません。多ビット信号用の対策が必要となります。具体的な対策については次回解説します。

まとめ

  • m-FFシンクロナイザーの後は1クロックだけタイミングがずれる可能性がある
  • 多ビット信号の場合、どこかのビットだけずれる可能性がある
  • 多ビット信号のCDCでは、多ビット信号用の対策が必要
アバター画像
この記事を書いた人
ジーノ。大手電機メーカーで、基板設計の全般と、FPGAの設計に従事した経験を活かし、FPGAについて情報発信中。
RTL設計、シミュレーション、タイミング・クロージャ、FPGAまわりのハードウェア開発まで、幅広く取り扱っております。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA