2016-09-14 14 views
0

私はスタート、ストップ、リセットボタンで制御できるnexys4でストップウォッチ回路を動作させています。だから私がスタートをクリックすると、カウンタは停止するかリセットするまでカウントを開始します。私は別のボタンを押すと、カウンタが1ビットだけインクリメントする機能を追加しようとしています。今はクロックが速すぎるので、増分ボタンを押すと、各クロックエッジでボタンが押されたことを検出しているので、増分ボタンを何回か押し上げます。どのくらいボタンを押したままにしても、どのようにボタンを1つだけ登録するには?デバンサー回路が必要ですか?ワンタッチボタンの検出方法は?

ありがとうございます。

答えて

1

必要なものは、立ち上がりエッジ検出器とデバウンスロジックです。 私は立ち上がりエッジ検出器を使用して始めます。これは問題のほとんどを解決するためです。

reg [3:0] resync; 
reg  inc_cntr; 
always @ (posedge clk) 
begin 
    resync <= {resync{2:0},inc_btn}; // This will clock in the inc_btn signal and remove metastability. 
    inc_cntr <= ~resync[3] & resync[2]; // Only high when the resync[3] was low and resent[2] is high. 
end 

これが解決しないのは、上から下への遷移が発生するたびにボタンが大きくバウンスする場合です。デバウンスを理解するためにこれを見てください。 Switch Debouncing

この2つのトピックの間で、適切なプッシュボタンフィルタを使用することができます。

+0

ステートマシンのボタンを押して出力状態をカウンタに送信して、何をするか(カウントアップ、ストップ、インクリメントのいずれか)を伝える場合、どこに行くのですか?私はちょうどステートマシンにそれを投げることができますか?または、それが自分のモジュールであり、増分ボタンが押されたときに、それをこのモジュールに送り(debouncerを使用して)、カウンターに出力を送り、それを1ずつインクリメントするように指示しますか? http://imgur.com/a/b7iOe(コントローラーはステートマシンを保持しています) – user2817437

+0

いいえ、私はデバウンサーのほかに働いています!デバウンサーは、 "inc_cntr <=〜resync [3]&resync [2]"行の直後に行くのでしょうか、それともそれ自身のモジュールでしょうか? – user2817437

+0

私はあなたの次のボタンプロジェクトでおそらく再利用できるので、あなたのdebouncerを別のモジュールにします。私はシンクロナイザーの後にデバウンスするだろう。 inc_cntrパルスに予約すると良いでしょう。あなたはデバンサーがメタ安定になるのを望んでおらず、シンクロナイザーはそれを防ぐでしょう。 –