非同期リセットの解除タイミング

[] [] []


ここまで非同期リセット信号には触れなかったが、これもクロックと非同期な信号なので注意しなければならない。といっても注意しなければならないのは

リセット中の自分の値(0)と入力の値が反対(1)になっているFF

だけである。このようなFFはもし非同期リセット解除とクロックの立ち上がりエッジがほぼ同時になった場合に、スキューによって0,1のどちらになるかが不確定になってしまう。(なお、非同期リセットをかける方のタイミングは普通は気にしない)

1) 非同期リセットが解除されるとすぐに動きだすone-hot回路

非同期リセットrst_nのスキューによりFF1のリセット解除がFF0のリセット解除より遅れればFF1出力もFF0出力も両方0になり1が失われてしまう。またFF1のリセット解除がFF0のリセット解除より早ければFF1出力もFF0出力も両方1になり12個になってしまう。

2) バイナリカウンタでも、0からカウントアップする場合はリセット解除後の動作が000001と過渡値が存在しないので問題ないが、例えば初期値001からカウントアップする場合は、001010の過渡値011になる可能性があるので不都合である。

一般に、リセット解除後に複数のビットが同時に変化するカウンタは、過渡値になる可能性がある。

3) カウンタ単体では過渡値が生じない場合でも、もし複数のカウンタが同期してスタートすることを期待して設計している場合は、スタートが1クロックずれれば誤動作する。

このようなFFに対しては、非同期リセットrst_nの解除をclkに同期化したリセットsrst_nを使えばよい。ここで1段目のFFの出力はメタステーブル状態になるかもしれないので2段目のFFの出力を使う。

◇◇

このようなFFの存在はツールではチェックできないので、もし見逃していると、何度かON/OFFしているとたまにおかしい動作をするといった不具合になる。いっそのこと、非同期リセットrst_nの代わりに同期化したリセットsrst_nを使った方がよいかもしれない。

このとき、タイミング解析でsrst_nのリカバリタイム、リムーバルタイム(データ端子のセットアップタイム、ホールドタイムと同じ)をチェックする必要がある。(QuartusIIではクロック周期の制約を与えておけばチェックしてくれる。ISEではクロック周期の他にENABLE = reg_sr_rという制約を与えるとチェックしてくれる)


[] [] []