非同期回路の2段FFについて

FPGAで非同期入力に対してはFFを2段挿入することは知っていたが
その理由をよくわかっていなかったので調べて分かったことを
(投稿の練習も含めて)備忘録として書いておく

 

主に参考にしたのは以下の2つのサイトです

1 . 非同期クロック と 検証手法−1 - 半導体事業 - マクニカ

2. 電気回路/HDL/非同期信号を扱うための危ういVerilogライブラリ - 武内@筑波大

 

まず、非同期の入力をFPGAの内部クロックでラッチしようとすると
FPGAのセットアップホールドに違反するタイミングで入力される場合がある。

違反した入力を受けたレジスタはメタステーブルと呼ばれる不安定な出力状態になる。

このメタステーブルへの対策としてFFを2段(以上)挿入する。

肝心のFFを2段挿入する理由は、1段目のFFがメタステーブル状態になっても次のクロックまでには安定した状態に戻るため、2段目のFFは安定した状態をラッチすることができる。

もし、1段目のFFと2段目のFFの間に組み合わせ回路があったりして遅延時間があると
2段目のFFは不安定な入力をラッチしていしまい誤動作のもとになる。

 

とりあえず、FFを2段挿入する理由は上記のイメージで理解することができたが
参考にしたマクニカのサイトによると3段以上挿入する場合も増えてきたらしい。

3段にするとメタステーブル状態をより抑えられる理由が

・単純に1段目と2段目の遅延が短く仕切れないから

なのか

・複数クロックにわたるメタステーブルを抑制するため

なのか分かれば調べてみたいなと思った。

 

また、Quartusで段数をどのくらいにすればいいかを調べられるみたいなのでそれも使えるようになってみたいなとも思った。

 

以上、間違っているところなどあれば教えてくださるとうれしいです。