メタステーブルにご注意ください

2009/07/03-

 FPGAやCPLDで言語設計をやっていると、ソフトウエアであるような錯覚をおぼえ、細かいタイミングを忘れがちではないでしょうか。
基本要素はフィリップフロップですので、クロックとデータの間にはセットアップ時間とホールド時間を守る必要があります。
うまく同期回路で設計できたとき、開発ツールのレポートでホールド時間は全てマイナスとなり、ホールド時間は考えなくて良くなります。
 セットアップ時間やホールド時間は、ツールのレポートしたタイミングをすべて完璧に守る必要があります。
 上の画像のように、CLKとINPUTがあるとします。INPUTは周期的な波形ですが、非同期に存在する信号であれば必ずどこかでセットアップ時間を守れないタイミングがあることになります。
 タイミング条件を守れないとき、メタステーブルというやっかいな現象が発生し、予想外の動作で悩まされることがあります。
メタステーブルの良い解説はこちらのリンクをご覧下さい。

 アルテラ社のメタステビリティに関するアプリケーションノートはこちらのPDFをご覧下さい。
 ザイリンクス社のメタステビリティに関するアプリケーションノートはこちらのPDFをご覧下さい。

 具体的な対策としては、下記のように入力をにフィリップフロップを追加します。確実にするには数段を追加するほうが良いと考えられます。

上記アプリケーションノートより
 FPGAやCPLDの回路を思ったとおりに(シミュレーション通りに)動かすには入力を完全に同期化し、FPGA内部は単一のシステムクロックで完全同期設計をすることであります。複数クロックを使うのは超高度テクニックであるといえます。
 最近のFPGAでは内部クロックをPLLやDCMでてい倍し、相当高速のクロックで動作させることができるのはとてもありがたいことです。

追記:
とある回路と、そのタイミングレポート例です
ホールドは全てマイナスになっています。
GOOD
クロックをいじってわざと悪い回路にしてみると
ご覧のようにホールド条件にプラスが表れました
BAD
皆さまのご参考になれば幸いです。
(間違いなどありましたらご指摘をお願いします)

アルテラコーナートップへ