2FFシンクロナイザ
前項で見たように、クロックが同期と見なせる範囲(Clock Domain)は限定されるので、実際の設計では他のデバイスや外界といった非同期なクロックドメインとの間で転送(Clock Domain Crossing(CDC)転送という)するテクニックが必要になる。
そこで、互いに非同期なクロックclk_aからクロックclk_bへ信号を転送する際にどういう問題があるか考えてみる。
◇
1つめの問題は、clk_aのFF出力が変化すると組合せ回路の出力にハザードが出ること(→補足-ハザード)である。非同期なclk_bでサンプリングすると、このハザードを偶然サンプリングするかもしれない。
そこでハザードをサンプリングしない対策として、clk_aのFFとclk_bのFFの間には組合せ回路を置かないようにする。
◇◇
2つめの問題は、サンプリングの前後には値が確定している期間(セットアップ時間とホールド時間)が必要なことである(→同期設計ルール)。非同期なclk_bでサンプリングすると、値が変化している期間で偶然サンプリングするかもしれない。もし過渡値をサンプリングするとFFの出力はすぐに確定せずにアナログ的な変化をする(メタステーブル状態という)ので、これを組合せ回路に入れてしまうと1クロック周期たっても値が確定しないかもしれない。(といってもメタステーブル状態の波形を実際に見たことはないのでどんな振るまいかわからないのだが、変な値をサンプリングした現象ならば見たことはある)
そこでメタステーブル状態になったFF出力を直接使わないようにFFをもう1段置く。
こうやっても、clk_bの周期よりも長くメタステーブル状態が続いたらだめなのだが、実際にはclk_bの周期が数nsあれば十分である。
メタステーブル状態が続く時間tMETは長いものほど起きにくいというように確率的であり、最近のFPGAのデータシートには載っていないが、昔のMAX7000(0.5um)のアプリケーションノートに載っていた。
長さtMETのメタステーブルが起きるまでの平均時間:
MTBF = 1 / ( fCLOCK x fDATA x C1 x exp(-C2 x tMET) )
MAX7000の場合C1=2.98E-05 [fs], C2=5.023[GHz]
測定条件はfCLOCK=10MHz,fDATA=1MHzになっているが100MHzに直して計算してみると、
tMET |
MTBF fCLOCK=10MHz fDATA =1MHz |
MTBF fCLOCK=100MHz fDATA =100MHz |
1ns |
6日 |
8分 |
2ns |
2年 |
21時間 |
3ns |
372年 |
136日 |
tMET=3nsのメタステーブルが起きる確率は136日に1回と小さい。最近の高速なFPGAでは確率はもっと小さくなっているはずであるから、clk_bの周期が数nsあれば十分なはずである。
◇◇◇
結局、非同期な入力信号は2FFでサンプリングすればよい。このとき、clk_a側の信号はclk_bのクロック周期よりも長く保持されていることが前提である。(この同期化回路はよく使われるが決まった呼び方がないようなので、ここでは2FFシンクロナイザと呼ぶ)
また1つの非同期信号を複数の2FFシンクロナイザで受けて合流させると、複数のシンクロナイザが同じ値をサンプリングするとは限らないので、このような冗長な回路を組んではいけない。