47 / 63 · 概念
実際のボタン入力:同期化・デバウンス・一回のイベント
非同期入力の同期化と接点バウンス除去を区別し、連続サンプルに基づくデバウンサを設計します。
レッスンは無料で読めます。受講登録すると進捗を保存できます。
ボタン一回で複数の遷移が起きることがあります
機械式ボタンは、接点が安定するまで何度も接触と離脱を繰り返す場合があります。同時に、ボタン信号はシステムクロックと無関係に変わる非同期入力です。同期化はクロック領域へ取り込む問題、デバウンスは短い反復遷移を一つの安定状態として判定する問題です。2 段フリップフロップフリップフロップ 指定されたクロックエッジで入力を記憶し、次のエッジまで保持する素子です。入力はセットアップ・ホールド条件を満たす必要があります。 詳しく見るだけでバウンスが消えるわけではありません。
- 非同期ボタン: 接点バウンスとクロック非同期性が共存
- 同期化: 単一ビットレベルをクロック領域へ受信
- デバウンス: 連続する安定サンプルだけを状態変化として承認
- エッジ検出: 承認した 0→1 に一サイクルイベントを生成
この流れは十分長く保持される単一ビットのボタンレベルを前提とします。短パルス、多ビットの一貫した転送、非同期クロック自体の扱いには別設計が必要です。
連続 N サンプルの規則
現在の承認状態を q、同期後入力を x、q と異なる連続サンプル数を count とします。各サンプルで x=q なら count を 0 に戻します。x≠q なら count を増やし、連続 N 番目で q=x として count を 0 に戻します。
N=3、初期 q=0 の例です。各列は同期後の入力を観測するサンプル時点であり、実際の接点電圧ではありません。
| サンプル | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
|---|---|---|---|---|---|---|---|---|---|
| x | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 1 |
| 更新後 count | 0 | 1 | 0 | 1 | 2 | 0 | 0 | 1 | 0 |
| 更新後 q | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 |
| 立上りイベント | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
波形データを表示
| 信号 | 波形 | バスの値 |
|---|---|---|
| サンプル | 234523452 | 0 → 1 → 2 → 3 → 4 → 5 → 6 → 7 → 8 |
| x | 0101...01 | |
| 更新後 q | 0....1... | |
| 立上りイベント | 0....10.. |
遅延とカウンタ幅を明示する
サンプル間隔が なら、入力変化の位相により承認まで約 ~ かかり、前段の同期化遅延は別に加わります。「10 ms 安定」を保守的に求めるなら、最初と最後のサンプルの間隔も考慮して N を決めます。サンプル間の短い遷移は見えないため、連続サンプルの一致だけでは、その間の実電圧が一度も変わらなかったと証明できません。スイッチ特性とサンプル条件を一緒に定めます。
count が 0~N−1 だけを記憶するなら、必要幅は です。N=1 も処理します。最初の反対サンプルですぐ承認するため、N−1 の比較順が重要です。
一回の押下を一イベントにする
承認する次状態を q_next とすると、 です。上の表は承認と同じサンプルでイベントを出す方針です。q と一サイクル遅らせた q を別レジスタレジスタ 複数ビットの状態を記憶する回路です。このコースの同期式レジスタは、クロックエッジで定められた入力を記憶します。 詳しく見るで比較する実装は、観測位置により追加遅延があるため、イベントをいつ消費するかも定めます。
自分で考えてみましょう
N=3、初期 q=0 で 1,1,0,1,1,1 を入れると、どのサンプルで状態が変わりますか。N=8 のカウンタが 0~7 を記憶する場合の最小幅は何ですか。
解説を見る
第 3 サンプルの 0 が連続数を初期化するため、第 6 サンプルで 1 を承認します。count 0~7 は 3 ビットです。8 まで格納する実装なら 4 ビット必要なので、まず格納範囲を確認します。