スイッチディバウンサー/ 方法1 / スイッチ1個の場合

pp.55-57

非公式訳:

方法1 (フルカウント方式)を図2.29aに示す。初段は単なる入力レジスタである。xyとが同時に変化した場合の影響をなくすために入れてある(ただしめったに起きる現象ではないため、実はこのブロックは省いてもよい)。xの変化がyに現れるまでに長い時間がかかるためシンクロナイザーが不要であることに注目してほしい(どんなメタステーブル状態よりもずっと長い時間がかかる)。2段目はタイマーそのものである。XNORゲートとカウンターとで構成される。入力と出力とをXNORゲートで比較してy≠x_regのときだけカウントアップする(したがってこのカウンターはほとんどの時間をゼロで停止したまま過ごす。これが省電力化に大きく効く)。最終段は単なるTFFである(前に図2.7で見たようにDFFで構成した)。カウンターのMSBに1が立つほどy≠x_regの状態が長く続いたときに出力をトグルする(フリップする)。yは、フリップフロップから直接出力されるためグリッチの生じないことに注目してほしい。図2.29b (N=2の場合)のタイミングダイアグラムをよく見て、動作が予想どおりであるかどうか確かめること。

カウンターのビット数(DFFの個数)はN=ceil(log2S)である。S=fclkTdebは、カウンターでカウントしなければならないカウント数である(fclkはクロック周波数、Tdebはディバウンスの継続時間である)。たとえば fclk=50 MHz、Tdeb=20 msとすると、カウンターにはN=20個のDFFが必要である。ただし図2.29に示したカウンターのビット数はN+1である。これについては以下に述べる。

この回路で特に重要なのがタイマーの構成である。このような構成にすれば、コンパレーターという大規模回路が不要である。上記の数値(S=fclk・Tdeb=106)を例に説明する。この場合、カウンターは0~106-1=1111 0100 0010 0011 1111までカウントする。したがって少なくとも12ビット幅以上のコンパレーターが必要である(1の有無だけを判すればよい)。このコンパレーターは相当に大きな回路になる。ただしディバウンサーでは正確な時間が不要であることを考えれば、コンパレーターはなくせる。余分なビット(フリップフロップ)をカウンターに追加すれば、そのMSBだけでコンパレーターの役割が果たせる。MSB=1のときに出力レジスターを有効化すると、yが更新され、その結果clear=1になって、次のクロックの立ち上がりでカウンターが0にリセットされる(MSBも0になる)。まとめると、カウンターは全部でS=2N+1個の状態をとるため、上記の値の場合は結局Tdeb≈2N/fclk=21 msになる。クロックゲーティングも含めこの回路ついて詳しくはエクササイズ13.12、13.14を見よ。

図2.29aに示したディバウンサーの簡易版を図2.29cに示す(この回路はエクササイズ13.13)で扱う。xが押しボタンから出ていて、その押しボタンが放されたときではなく押されたときだけyを変化(トグル)させたい場合は、たとえば出力にもう1つTFFを追加してそれをyでトリガーすればよい。別の方法としては、XNORゲートをインバーターに置き換えて、MSBに1が立ったあとにカウンターを停止し、xが0になったときにカウンターを0にリセットするというのもある(訳註: テキストは、スイッチを閉じたときにHになる回路にしてある)。