FPGA 入門シリーズ 10 -- ボタンのデバウンス

記事の紹介

この一連の記事は、FPGA モジュールの作成、基本的な構文、ステート マシン、RAM、UART、SPI、VGA、機能の検証など、主に FPGA 初心者向けに書かれています。初心者がFPGA開発の能力をより早く向上させることを目的として、各章に分けて知識を解説しており、各章にはターゲットを絞ったコードの書き方とコードの解説が記載されており、読者の参考となります。

第 11 章: ボタンのデバウンス

前の章では、ブリージング ライト、ステート マシン、およびトップダウン設計について説明しました。この章では、これらの知識ポイントを直列に結び付けます。設計要件は次のとおりです。

        ①開発ボード上で自動販売機の実験を完了する ボタンを押すことでコイン投入動作を実現 ボタンを1回押すと(押してから持ち上げるまでを1回とカウント)、コインの挿入。 

        ②ボタンを1回押すと、1つのLEDライトが点灯し、ボタンを2回押すと、2つのLEDライトが点灯します。ボタンを3回押すと、呼吸ライトがコーラ効果として機能し、呼吸ライトは10秒後に消えます。初期状態に戻ります。 

        上記の要件に従って、まず、図 1 に示すように、対応する状態遷移図を描画します。

図1 状態遷移図

        図 1 に示す状態遷移図によればステートマシンは記述でき、IDLE ステート、ONE ステート、TWO ステート、THREE ステートのジャンプ条件はすべてキー(キー)であり、THREE ステートがその状態に移行するための条件は、 IDLE状態は10秒です。IDLE 状態ではすべての LED ライトが消灯し、ONE 状態では 1 つの LED ライトが点灯し、TWO 状態では 2 つの LED ライトが点灯し、THREE 状態では LED ライトが呼吸状態になります。

        一般にボタンを押してから離すまでには数十ミリ秒以上かかり、システムクロックの周期はナノ秒レベルであるため、ボタンを押すと10万以上の立ち上がりエッジで収集されてしまいます。ただし、ボタンを押して立ち上がりエッジのみを収集したいのですが、そうでない場合はボタンを複数回押したとみなされるため、ボタンを処理する必要があります。図 2 の波形図に示すように、ボタンが押されていないときは High レベル、押されているときは Low レベルであるとします。

図2 ボタン波形

        図 2 の解析から、キーが押されたとき、キーの立ち上がりエッジと立ち下がりエッジが 1 つだけ存在することがわかり、立ち上がりまたは立ち下がりを検出することで、キーが 1 回押されたと判断できます。エッジ検出の具体的な方法を図 3 に示します。 clk の立ち上がりエッジを使用してキーを 1 サイクル遅延させて key_reg を生成でき、キーの立ち上がりエッジまたは立ち下がりエッジを使用できます。 key と key_reg の値を通じて同時に判断されます。図 3 からわかるように、clk の立ち上がりエッジを使用して key が 1 に等しく、key_reg が 0 に等しいことを検出すると、それは key の立ち上がりエッジになります。 1 にすると、キーの立ち下がりエッジになります。

図 3 エッジ検出

        図 3 から、キーの立ち上がりエッジまたは立ち下がりエッジに基づいて、キーが 1 回押されたと判断できることがわかりますが、実際にはそうすることはできません。図 4 にボタンのモデルを示しますが、s ボタンを押していないときは、a と b の 2 点が切断され、s ボタンを押すと線が接続されますが、ボタンを押すと、物理的な線が接続されます。ジッター現象 このとき、切断と接続の間の一定期間、a、b の 2 点が繰り返され、図 5 に示すような振動と安定した波形が現れます。

図4 ボタンモデル

図5 キーシェイク

        図5に示す前振動は鍵盤を押したときの振動、後振動は鍵を離したときの振動で、前後の振動の持続時間は一般的に5~10msです。 , キーは clk によって上昇します キーによって収集される立ち上がりエッジと立ち下がりエッジが多数あるため、キーの立ち上がりエッジと立ち下がりエッジを使用してキーが 1 回押されたと判断することは無効です。新しい方法。

        キーが押されたときのキーの値はロー (0) であり、ジッタリング期間中にキーにはハイ レベルとロー レベルの両方があることがわかっています。clk の立ち上がりエッジを使用して、キーがローのままである時間を計算できます。キーがハイレベルであることを検出すると最初からカウントを開始し、そのカウントが 5 ~ 10ms を超えるとキーが押されたと判断でき、このとき clk が押されたことを示すフラグを生成できます。フラグビットが High の場合、キーが 1 回押されたとみなされ、具体的な波形は図 6 に示されます。

図 6 ボタンのデバウンス波形図

        ここで、キー値が5ms継続したときにキーが押されたと考え、クロック周期が50MHz、つまり20nsであるとすると、5msは250000clkサイクル、つまりcntの場合は5msを占める計算になります。 cnt が 249999 のとき、po_key_flag は 1 周期分プルアップできます キーを押している長さは判断できないため、cnt は何度も 249999 の値に達する可能性があります。 po_key_flag が複数回プルアップされ、キーを 1 回押すと複数回押したとみなされるように見えるため、図 6 に cnt_flag 変数が表示されます。 、キーが高レベルに等しくなるまでプルダウンされません。そのため、最初の cnt を設定できます。これは 249999 に等しく、後者とは異なります。その後、cnt と cnt_flag を使用して 1 つのキーで共同制御することもできます。を押して、po_key_flag が 1 クロック サイクルの High レベルだけを持っていることを確認します。波形図より以下のコードが得られます。

コード例:

コード分​​析:

        ① 17 行目の always ブロックは、キーが押されたときにカウントを開始し (値 0)、キーが離されたことを検出すると (値 1) ゼロに戻るカウンターを実装しています。キーの値が常に 0 になるまで、つまりキーが押され続けてシェイク プロセスが終了するまで、カウントとゼロ化のサイクルを実行します。カウンタは 5 ミリ秒間カウントを続けます。 

        ②26行目のalwaysブロックはフラグを生成しており、初めてcntが5msに等しいことを検出したときにフラグをハイレベルにし、最初のcntが5msに等しいことを識別できるようにします。後続の cnt は 5ms に等しくなります。オンでは、キーが放されるまで (値 1)、フラグはロー レベルに設定されます。 

        ③ 34行目のalwaysブロックは、キー押下プロセス全体でクロックサイクルのハイレベルフラグを実現します cntが5msまでカウントされるとき、po_key_flagが1つだけ有効であることを保証するために、ここでの条件はcnt==5msだけを必要とするわけではありません, そして cnt_flag==0 が必要です。これまでのところ、ボタンの防振処理は実現されており、これをベースに本来の要件を十分に実現できます。

第 12 章では Verilog HDL におけるデジタル管について説明します。

過去のレビュー

FPGA 入門シリーズ 1 -- モジュールの作成と回路合成

FPGA 入門シリーズ 2 -- シミュレーションの検証

FPGA 入門シリーズ 3 -- ワイヤとレジスタ

FPGA 入門シリーズ 4 -- 割り当てステートメント

FPGA 入門シリーズ 5 -- 演算記号

FPGA 入門シリーズ 6 -- 判断声明

FPGA 入門シリーズ 7 -- クロック周波数分割

FPGA 入門シリーズ 8 -- トップダウン設計

FPGA 入門シリーズ 9 -- ステート マシンと Do ファイル

Supongo que te gusta

Origin blog.csdn.net/mochenbaobei/article/details/130584775
Recomendado
Clasificación