For Good FPGA Design

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

今回は、多ビット信号(バス)の非同期クロック間のデータ受け渡し(Clock Domain Crossing: CDC)方法について説明します。

目次

結論

  • 多ビット信号(バス)のCDCは様々な方法がある
  • システムによって最適な方法を選択する必要がある

多ビット信号のCDC

多ビット信号のCDCでは、「これだけやればよい」という方法はありません。設計するシステムによって、最適な方法を選択する必要があります。よく使われる方法としては、

  • フリップフロップを使った回路による方法
  • ハンドシェイク
  • FIFOを使った方法

などがあります。

今回は、フリップフロップを使った回路による方法の例を2つ説明します。

周波数が低いクロックから周波数が高いクロックへ

図1に、周波数が低いクロックCLK1から、周波数が高いクロックCLK2にデータを受け渡す回路を示します。図2にタイミングチャートを示します。

これは、CLK1をCLK2でラッチする方法です。図1のように、CLK1をCLK2でラッチした信号をセレクト信号にします。この回路では、CLK2の周波数がCLK1の周波数の3倍以上であればビット化けせずにデータを受け渡すことができます。

この方法は、小さい回路規模で実現できます。ハンドシェイクやFIFOに比べればかなり簡易的な方法です。

図1 低周波クロックから高周波クロックへのデータ転送回路
図2 タイミングチャート

周波数が高いクロックから周波数が低いクロックへ

図3に、周波数が高いクロックCLK1から、周波数が低いクロックCLK2にデータを受け渡す回路を示します。図4にタイミングチャートを示します。

まず、低周波のクロックで受け取れるだけの時間、データを固定しておきます。これは前半のフリップフロップ3段、ORゲート、EN1, D1を出力するフリップの部分です。なお、ORゲートまでで、データの時間を長くできそうです。しかし、EN1, D1を出力するフリップは必ず必要です。理由は別途解説します。

低周波のクロックCLK2でデータを受け取った後、メタステーブル対策のためフリップ2段を入れ、その出力はEN2, D2となります。データ信号が確実に確定しているタイミングでデータを取り込むため、信号Sをつくります。この信号Sが1になったとき、データをラッチしQに出力します。

この回路では、CLK1とCLK2の周波数の比率により、回路を変える必要があります。例えば、CLK1がもっと高周波であれば、前段のフリップフロップの数を増やす必要があります。

また、低周波→高周波の回路とは異なり、CLK1側で連続して変化するデータの転送はできません。

図3 高周波クロックから低周波クロックへのデータ転送回路
図4 タイミングチャート

まとめ

今回は、多ビット信号(バス)の非同期クロック間のデータ受け渡し(CDC)を行う回路の例を示しました。多ビット信号では、「これだけやればよい」という方法は無いので、今回のような回路を参考に、システムに最適な回路を構築していただければと思います。

アバター画像
この記事を書いた人
ジーノ。大手電機メーカーで、基板設計の全般と、FPGAの設計に従事した経験を活かし、FPGAについて情報発信中。
RTL設計、シミュレーション、タイミング・クロージャ、FPGAまわりのハードウェア開発まで、幅広く取り扱っております。

コメントを残す

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

CAPTCHA