プッシュスイッチを押すとトグルスイッチで指定した数値をSPI通信で送信、受信を行い、7セグメントに表示することができました。
ただし、今回作成した機能はプッシュスイッチのところに課題があります。シグナルタップアナライザで確認してみると下記のように出力されました。
プッシュスイッチを少し押しただけであるが、プッシュスイッチ(SET_N)が押し続けている状態になっています。FPGAとしては、10MHz(100nsec)クロックで動作しているので、スイッチは押し続けていると判定されてしまいます。そのため、一度送信すればよい数値データを繰り返し送信してしまっています。
そこで、エッジ検出が必要となってきます。今回は、前回作成したSPI通信の機能に、エッジ検出を追加ししたいと思います。合わせてチャタリング除去のためにポーリング処理も追加したいと思います。具体的には下記のようにエッジ検出処理とポーリング処理機能を構築します。
- プッシュスイッチが100msec毎に押されているかどうか判定する。
- 2回スイッチが押されていると判定された場合、FF(フリップフロップ)にその情報に「1」を入力する。
- もう一つFFを用意しておき、こちらには前回の値を保存しておく。
- 前回の値が「0」、且つ、今回の値が「1」の場合、エッジ検出信号を「1」にする。
エッジ検出処理とポーリング処理機能を構築していきたいと思います。下記のようなモジュールを用意します。