For Good FPGA Design

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

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

目次

結論

  • 多ビット信号(バス)のCDCは様々な方法があり、システムによって最適な方法を選択する
  • ハンドシェイクによるCDCとFIFOによるCDCを紹介

多ビット信号のCDC

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

メタステーブル対策!第3回では、フリップフロップを使った回路による方法を紹介しました。

今回は、

  • ハンドシェイクによるCDC
  • FIFOによるCDC

を紹介します。

関連記事

ハンドシェイクによるCDC

図1にハンドシェイクによるCDCの回路、図2に波形を示します。

簡単に言うと、受け取る側が「受け取ったよ」と言うまで、送る側がデータを固定する、という方法です。

  • CLK1で動作するSender(送る側)は、Valid dataを送信するとともに、データが有効であることを示す1ビットの信号VLD1を送信します。
  • CLK2で動作するReceiver(受け取る側)は、VLD1を2-FF Synchronizerで同期化したVLD2を受け取ります。
  • ReceiverはVLD2を受け取ると、データをラッチし、データを受け取ったことを示すACK2を送信します。
  • SenderはACK2を同期化したACK1が返ってくるまで、データを固定しておきます。

以上のように、VLDとACKのやり取りによって、多ビット信号を安全に受け渡すことができます。この方法は、連続して変化するデータを渡すことはできません。

図1 ハンドシェイクによるCDC
図2 ハンドシェイクによるCDCの波形

FIFOによるCDC

次に、FIFOによるCDCを紹介します。FIFOは、First In, First Outの略です。図3のように、先に入ったデータから先に読み出すメモリーです。順番待ちの行列や、ところてんのようなイメージです。

図3 FIFO

FIFOのクロックは、書き込み(Write側)と読み出し(Read側)で、異なるクロックを使うことができます。これにより、異なるクロック間のデータ受け渡しが実現できます。FIFOはもちろんユーザーがロジックを組むことができますが、FPGAメーカーがIPを用意しているので、これを使うと便利です。

  • Intel: Platform Designerで「FIFO」と検索。Avalon-ST Dual Clock FIFOがシンプル
  • Xilinx: IP Catalogで「FIFO」と検索。FIFO Generatorがシンプル。IPの設定でIndependent Clocksを選択

FIFOを使ったCDCの回路は図4のようになります。同図のDual clock FIFOはWENがアサートされるとデータが書き込まれ、RENがアサートされるとデータを出力します。

FIFOに貯められるデータの量は有限ですので、満タンになったことを通知するFULL出力があります。Write側は、FULLを見て書き込みを一時ストップするなどの制御を行います。

一方、FIFOにデータが1つも無いことを通知するEMPTY出力もあります。Read側は、EMPTYを見て読み込みをストップするなどの制御を行います。EMPTYがアサートされているときに読み込みを行うと、不正なデータが読めます。

図4 FIFOによるCDC

まとめ

  • 多ビット信号(バス)のCDCは様々な方法があり、システムによって最適な方法を選択する
  • ハンドシェイクによるCDCとFIFOによるCDCを紹介
アバター画像
この記事を書いた人
ジーノ。大手電機メーカーで、基板設計の全般と、FPGAの設計に従事した経験を活かし、FPGAについて情報発信中。
RTL設計、シミュレーション、タイミング・クロージャ、FPGAまわりのハードウェア開発まで、幅広く取り扱っております。

コメントを残す

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

CAPTCHA