コードのダウンロード
バージョン2.0:debounce.vhd (3.1 KB)
非同期アクティブローリセットの追加
安定時間をより高精細に、よりシンプルに仕様化
バージョン1.0:debounce_v1.vhd (2.4 KB)
初版パブリックリリース
特長
- 機械式スイッチやボタンスイッチなどをデバウンスするためのVHDLソースコード
- 入力が安定するまでの時間を設定可能
- システムクロックの周波数を設定可能
はじめに
ユーザーインターフェースに機械式スイッチを使用することは、いたるところで行われています。しかし、これらのスイッチが作動すると、安定した状態になる前に、接点が跳ね返ったり、互いに反発することがよくあります。ここで紹介するデバウンスコンポーネントは、この一時的な曖昧さ(FPGAやCPLDと押しボタンなどのスイッチを接続する際によくある問題)に対処するためのシンプルなデジタル論理回路です。図1は、このデバウンスコンポーネントをシステムに組み込んだ典型的な例を示しています。このコンポーネントは、Quartus Prime 17.0.0 Lite Editionを使用して設計されています。
図1.実装例
動作原理
図2に、デバウンス回路を示しています。この回路は、押しボタンスイッチのロジックレベルをFF1へ、次にFF2へ連続的にクロック入力します。そのため、FF1とFF2には、常に押しボタンスイッチの最後の2つのロジックレベルが格納されます。この2つの値が一定時間同じであれば、FF3が有効になり、安定した値が結果出力にクロック出力されます。
XORゲートとカウンタがタイミングを取ります。押しボタンスイッチのレベルが変化すると、FF1とFF2の値が1クロック分異なり、XORゲートを介してカウンタがクリアされます。ボタンのレベルが変化しない場合(つまりFF1とFF2が同じロジックレベルの場合)、XORゲートはカウンタの同期クリアを解除し、カウンタはカウントを開始します。このようにカウンタは、①指定時間に達して出力レジスタが有効になるか、②ボタンの論理レベルがまだ安定していないためにXORゲートによって割り込まれクリアされるまでインクリメントし続けます。
図2.デバウンスコンポーネントの回路
構成
デバウンスコンポーネントは、ENTITYでGENERICパラメータを設定することで構成されます。表1にパラメータを記載します。ほとんどのスイッチは、作動後10ms以内に安定したロジックレベルに達するので、stable_timeパラメータのデフォルトはこの値に設定されています。
表1.Genericパラメータの説明
ポートの説明
表2で、デバウンスコンポーネントのポートについて説明します。
表2.ポートの説明
リセット
デバウンスコンポーネントが動作するためには、reset_n入力ポートが論理値ハイである必要があります。このポートを論理値ローレベルにすると、非同期でコンポーネントをリセットします。リセット中、コンポーネントは、3つのフリップフロップをクリアし、出力結果を「0」に設定します。一度リセットから解放されると、デバウンスコンポーネントは、動作を再開します。
まとめ
このシンプルなデバウンス論理回路は、プログラマブル論理の機械式スイッチデバウンスに対応しています。
付録:バージョン1.0に関する追加情報
この設計のバージョン1.0では、Nビットカウンタのサイズを使用して、ボタンスイッチの安定性を検証するのに必要な時間を決定しました。図3はこの回路を表したものです。キャリーアウトビットがアサートされるポイントまでカウンタがインクリメントすると、それ以上のインクリメントが無効になり、出力レジスタFF3が有効になります。この回路は、FF1に異なるボタンスイッチの値が入力され、XORゲートでカウンタがクリアされるまで、この状態を維持します。
図3.バージョン1.0のデバウンス回路
この方法では、カウンタのサイズとクロック周波数によって、ボタンスイッチの安定性を検証する時間帯Pが決定されます。この関係を表したのが式1です。
一般的なアプリケーションでは、クロックサイクル数が大きいので、FF2、FF3をロードすることによる2クロックサイクルの追加は無視しても大丈夫です。
ほとんどのスイッチは、作動後10ms以内に安定したロジックレベルに到達します。仮に50MHzのクロックの場合では、10msに到達するためには0.01 x 50,000,000 = 500,000クロックサイクルをカウントする必要があるのです。19ビットカウンタはこの要件を満たしています。図1のようにカウンタのキャリーアウトピンを使用することで、カウンタの出力バス全体を評価する必要がなくなります。この方法では、実際に実装される時間は、(219+2)/50,000,000 = 10.49msとなります。
デバウンスは通常、高い分解能を必要としないため、キャリーアウトピンを使って検証時間を特定することで生じる比較的小さな誤差は、ほとんどのアプリケーションで問題ありません。しかし、より高い時間分解能が必要な場合は、バージョン2.0が対応可能です。
お問い合わせ
ご意見、ご感想およびご質問は、eewiki@digikey.comまでお寄せください。