14
1 Verilog-HDL 講習会DE0編(11) PS2キーボードの制御 4, July, 2013 鹿児島大学 中原 啓貴

Verilog-HDL Tutorial (11)

Embed Size (px)

Citation preview

Page 1: Verilog-HDL Tutorial (11)

1

Verilog-HDL 講習会DE0編(11) PS2キーボードの制御

4, July, 2013 鹿児島大学 中原 啓貴

Page 2: Verilog-HDL Tutorial (11)

PS/2 の規格 •  信号:「クロック」「データ」の2本

‒  デバイス側から送信される •  データはクロックの立ち下がりで有効 •  データ(11ビット) ‒  スタートビット(1ビットの「0」) ‒  データ(8ビット、LSBから送信) ‒  パリティ(データの1の個数が奇数1、偶数0) ‒  ストップビット(1ビットの「1」)

•  キーボードに関して ‒  キーを押す:キーコード(8ビットのデータ) ‒  キーを離す:「F0」を送信して、キーコードを送る

•  注意:5V動作のキーボードもあり (DE0では3.3Vキーボードのみ動作?)

2

Page 3: Verilog-HDL Tutorial (11)

PS/2キーボードの タイミングチャート

3

CLOCK

DATA

スタートビット

(必ず0) Bit 0

Bit 1

Bit 2

Bit 3

Bit 4

Bit 5

Bit 6

Bit 7

パリティビット

ストップビット

(必ず1)

0 0 1 0 1 1 1 1 0 0 1

データビット (8ビット) 最下位ビット (LSB)から送信 (この例では0111_1010を送信)

データビットの1の個数が 偶数のとき→1, 奇数のとき→0

CLOCKの立ち下がりでDATA有効 Tck=30us~50usつまり,10.0Hz~16.6Hz

Page 4: Verilog-HDL Tutorial (11)

データ受信方法 •  まず, CLOCKの立ち下がりを検出 •  1usec間隔で連続した「111000」を受信 ‒  1usecは適当に決めた間隔. 速過ぎてもだめだけど…

4

CLOCK

DATA

PS2_KBCLK

受信回路の CLOCK

1usec → 1MHz 1 1 1 0 0 0

シフトレジスタを使う! catch_negedge[5:0] <= {catch_negedge[4:0], PS2_KBCLK}

Page 5: Verilog-HDL Tutorial (11)

PS2キーボード受信回路

5

CLOCK_50

RESET_N CLK1MHz CLK1MHz

PS2_KBCLK

PS2_KBDAT

LEDG

RESET_N

10

1MHz生成回路 (Gen_CLK1MHz)

PS2キーボード 受信回路 (DE0_TOP)

Page 6: Verilog-HDL Tutorial (11)

状態遷移図

6

Start Bit Data

Bit0 Data Bit1 Data

Bit2 Data Bit3 Stop

Bit Parity Bit Data

Bit7 Data Bit6 Data

Bit5 Data Bit4

Reset LEDG <= 0; receive_data<= 0; catch_negedge <= 0;

catch_negedge==6'b111000 receive_data[0] <= PS2_KBDAT;

catch_negedge==6'b111000 receive_data[1] <= PS2_KBDAT; catch_negedge==6'b111000 receive_data[2]

<= PS2_KBDAT; catch_negedge==6'b111000 receive_data[3] <= PS2_KBDAT;

catch_negedge==6'b111000 receive_data[4] <= PS2_KBDAT;

catch_negedge==6'b111000 receive_data[5] <= PS2_KBDAT;

catch_negedge==6'b111000 receive_data[6] <= PS2_KBDAT;

catch_negedge==6'b111000 receive_data[7] <= PS2_KBDAT;

catch_negedge==6'b111000 receive_data[8] <= PS2_KBDAT;

catch_negedge==6'b111000 receive_data[9] <= PS2_KBDAT;

catch_negedge==6'b111000 LEDG <= receive_data;

この状態ではストップビットを 読み込まないように設計した (LEDGに今まで受信したデータを表示)

Page 7: Verilog-HDL Tutorial (11)

7

•  ピン配置が面倒くさいので、デフォルトのプロジェクトを読み込みましょう! (DE0に限った事ではないが、Terasic製品はサンプルCD-ROMの プロジェクトを改変するのが楽でお勧め)

DE0付属のCD-ROM ”Demonstrations”内の "DE0_Top"フォルダの ファイル全てを C:¥verilog¥DE0_tutorial_7_1¥ 内にコピー

Page 8: Verilog-HDL Tutorial (11)

DE0_TOP.qpfをダブルクリックしてQuartus IIを起動

8

Pin Plannerを開いてみると ピン配置が終わっている!

Page 9: Verilog-HDL Tutorial (11)

Verilog-HDLを入力

9

ダブルクリック Verilog-HDLの テンプレートが 表示されるので コードを入力

コード入力したら保存を忘れずに!

Page 10: Verilog-HDL Tutorial (11)

入力するVerilog-HDL

10

Page 11: Verilog-HDL Tutorial (11)

11

入力する Verilog-HDL (続き)

Page 12: Verilog-HDL Tutorial (11)

動作させてみよう •  キーボードを入力するとLEDGにデータが表示される (今回はJIS配列日本語PS2キーボードを使用)

12

キーボードの 「k」を押した

受信したデータ 0 1 0 0 0 0 1 0

データの1の個数は2, つまり偶数なのでパリティ=1

ストップ ビット=0

Page 13: Verilog-HDL Tutorial (11)

13

受信したデータ 0 1 0 0 0 0 1 0 つまり、16進数では 0x42なので 「k」のスキャンコードと一致

キーボードを離す時は 「F0」+「スキャンコード」が送信される (離したときに一瞬上位ビットのLEDGが 点滅するのはそのため)

機能キーは特にキーボード毎 (英語キーボードや101キーボード等)に スキャンコードが異なるので注意!

Page 14: Verilog-HDL Tutorial (11)

課題 •  PS/2キーボードのスキャンコードを7セグメントLEDに表示するように改造せよ •  PS/2キーボード受信回路のVerilog-HDLのシミュレーションを行い, 検証を行え ‒ 周期を確認し, 仕様と一致するか確認

14