1
Verilog-HDL 講習会DE0編(11) PS2キーボードの制御
4, July, 2013 鹿児島大学 中原 啓貴
PS/2 の規格 • 信号:「クロック」「データ」の2本
‒ デバイス側から送信される • データはクロックの立ち下がりで有効 • データ(11ビット) ‒ スタートビット(1ビットの「0」) ‒ データ(8ビット、LSBから送信) ‒ パリティ(データの1の個数が奇数1、偶数0) ‒ ストップビット(1ビットの「1」)
• キーボードに関して ‒ キーを押す:キーコード(8ビットのデータ) ‒ キーを離す:「F0」を送信して、キーコードを送る
• 注意:5V動作のキーボードもあり (DE0では3.3Vキーボードのみ動作?)
2
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
データ受信方法 • まず, 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}
PS2キーボード受信回路
5
CLOCK_50
RESET_N CLK1MHz CLK1MHz
PS2_KBCLK
PS2_KBDAT
LEDG
RESET_N
10
1MHz生成回路 (Gen_CLK1MHz)
PS2キーボード 受信回路 (DE0_TOP)
状態遷移図
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に今まで受信したデータを表示)
7
• ピン配置が面倒くさいので、デフォルトのプロジェクトを読み込みましょう! (DE0に限った事ではないが、Terasic製品はサンプルCD-ROMの プロジェクトを改変するのが楽でお勧め)
DE0付属のCD-ROM ”Demonstrations”内の "DE0_Top"フォルダの ファイル全てを C:¥verilog¥DE0_tutorial_7_1¥ 内にコピー
DE0_TOP.qpfをダブルクリックしてQuartus IIを起動
8
Pin Plannerを開いてみると ピン配置が終わっている!
Verilog-HDLを入力
9
ダブルクリック Verilog-HDLの テンプレートが 表示されるので コードを入力
コード入力したら保存を忘れずに!
入力するVerilog-HDL
10
11
入力する Verilog-HDL (続き)
動作させてみよう • キーボードを入力するとLEDGにデータが表示される (今回はJIS配列日本語PS2キーボードを使用)
12
キーボードの 「k」を押した
受信したデータ 0 1 0 0 0 0 1 0
データの1の個数は2, つまり偶数なのでパリティ=1
ストップ ビット=0
13
受信したデータ 0 1 0 0 0 0 1 0 つまり、16進数では 0x42なので 「k」のスキャンコードと一致
キーボードを離す時は 「F0」+「スキャンコード」が送信される (離したときに一瞬上位ビットのLEDGが 点滅するのはそのため)
機能キーは特にキーボード毎 (英語キーボードや101キーボード等)に スキャンコードが異なるので注意!
課題 • PS/2キーボードのスキャンコードを7セグメントLEDに表示するように改造せよ • PS/2キーボード受信回路のVerilog-HDLのシミュレーションを行い, 検証を行え ‒ 周期を確認し, 仕様と一致するか確認
14