リセット回路について
ASICでも、FPGAでもリセット回路(非同期リセット)について気を付ける必要があります。
(ASICではDFTも考慮する必要があります。)
製品の使用環境と基板上に関して、入力端子リセットにノイズが乗るのかなど、予め確認してからリセット構成を検討します。
リセットラインを考慮していない回路例
今はもう入力端子クロック(CLOCK)と入力端子リセット(RESET_N)を直接FFに繋げることはないと思っています。
(1系統のクロックでも入力端子クロックと同一周波数でPLLを介している場合もあるかと思います。)
この例では、
1系統のクロック(CLOCK)を、PLLを介して2系統(C0とC1)にしている例で説明します。
尚、CLOCK、C0、C1の周波数は全て違うものとしています。
以下がリセットライン(LOCK)を考慮しない場合のRTL図となります。
上図では、クロックドメイン(C0、C1)に対して、リセットラインが1本だけです。
このような場合、LOCKがLow→High(PLLがロックする)になった時に誤動作が発生する可能性があります。
例えば、
図中のUser Logicにカウンタやステートマシンがある場合、意図しない所から開始する可能性があります。
FFのリセットにもSetup/Holdがある
FFのリセット端子にも、クロックに対してSetup/Holdの規定があります。
下図のCKはクロック、RはFFのリセット端子を示します。
特に、リセット解除は気を付ける必要があり、クロックの立ち上がり付近でR(LOCK)がLow → Highになると、メタステーブルが発生します。
FFの非同期リセット端子はクロックに同期させる
クロックドメインに対応するリセットを生成し、各FFの非同期リセット端子に接続します。
FPGA内では、何系統ものクロックラインが存在すると思います。
その分のクロックに同期したリセットを生成する必要があります。
下図が「Reset Logic」を挿入した例になります。
「Reset Logic」で非同期対策しつつ、各クロックに同期したリセット信号を生成します。
これにより、RST0_N及びRST1_NはRecovery Time / Removal Timeを考慮して生成されます。
(合成ツールにもよりますが。。。ご使用する合成ツールを確認してください。)
注意事項)
上図は、一例となります。
使用環境と基板上のクロック精度やリセットなどの条件を確認して構成を検討する必要があります。
尚、上図では、入力端子RESET_Nにノイズが乗る(一瞬だけLowになる)と、PLLクロック(C0,C1)がリセットされ、且つ LOCKがLowになり、「Reset Logic」のRST0_N及びRST1_NがLowとなり、「User Logic」もリセット状態になります。
(動作中にノイズのせいでリセットがかかる)
リセット解除直後から動作する回路は極力避ける
上記リセット回路を作成し、且つ リセット解除直後から動作する回路を設計しないように私は心がけています。
これは非同期リセットとは別にレジスタで同期リセットできるよう設計しています。
(リセット解除後、CPUがレジスタを1にしないと動作しない回路にし、2段階のリセットをしています。)
最後に
リセット回路は疎かにしがちかと思います。
特に外部(基板上)の確認は必要と思っています。
また、
参考書にはあまり載ってないように思っています。