アプリ版:「スタンプのみでお礼する」機能のリリースについて

以下のURLのverilog HDLのコードについて質問です。

watch_falling_edge <= { watch_falling_edge[4:0], key_clk};
ここで、クロックが上がるたびにwatch_falling_edgeにキークロックを1つずつ入れていくことはわかるのですが、
if( watch_falling_edge == 6'b111000)begin
ここで、なぜwatch_falling_edgeが「 6'b111000」になったときにcaseをはじめるのでしょうか?

またこれとは別に、クロックとキーボードクロックの周波数は全く違いますか?
よろしくお願いします。

http://www.hirokinakaharaoboe.net/tips_wiki/inde …

A 回答 (1件)

PS/2 規格をよくは知らないので多分ですが、



>ここで、なぜ watch_falling_edge が「 6'b111000」になったときにcaseをはじめるので

PS/2 は、キーボードからシリアルデータとシリアルクロックを受け取ります、
それらがそれぞれ入力信号 key_data key_clk に与えられてるようです。

シリアルデータはシリアルクロック立ち上がりエッジでて変化するので、受取り側は
シリアルデータが確定する立下りエッジ前後で取り込むのがセオリーです。

細かく見ると、立下りエッジより clk x 3 個分過ぎてますが、
機器外部からやってくる key_clk にはノイズが乗る可能性があり、
それによる誤動作を避けるために入力レベルの判断を「複数クロック期間連続すること」と
見てるのかなと思います。
(それはそれでちょっと突っ込みどころがあるのですがそれは置いといて)

watch_falling_edge(6bit) はシフトレジスタを構成し、より高周波数な clk のタイミングで
key_clk を最下位bitにシフト入力しています。

(watch_falling_edge <= { watch_falling_edge[4:0], key_clk}; の部分)

>またこれとは別に、クロックとキーボードクロックの周波数は全く違いますか?

シリアルクロックはたしか4,800Hz 程度です、
Verilog ソースだけでは正確には読取れませんが、 clk はもっと高周波数なはずです。
同じ周波数ではサンプリングしても立下りエッジ検出できないので。
3bitずつを期待してるので、最低でも6倍くらいないと、上で想像する動作は不可能です。

というか、ハードウェアを記述して設計するなら、入力信号の仕様は把握しとかないとダメです。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!