Weitere ähnliche Inhalte
Mehr von Hiroki Nakahara (11)
Verilog-HDL Tutorial (11)
- 2. PS/2 の規格
• 信号:「クロック」「データ」の2本
‒ デバイス側から送信される
• データはクロックの立ち下がりで有効
• データ(11ビット)
‒ スタートビット(1ビットの「0」)
‒ データ(8ビット、LSBから送信)
‒ パリティ(データの1の個数が奇数1、偶数0)
‒ ストップビット(1ビットの「1」)
• キーボードに関して
‒ キーを押す:キーコード(8ビットのデータ)
‒ キーを離す:「F0」を送信して、キーコードを送る
• 注意:5V動作のキーボードもあり
(DE0では3.3Vキーボードのみ動作?)
2
- 4. データ受信方法
• まず, 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}
- 6. 状態遷移図
6
Start
Bit Data
Bit0 Data
Bit1 Data
Bit2 Data
Bit3Stop
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に今まで受信したデータを表示)
- 13. 13
受信したデータ
0 1 0 0 0 0 1 0
つまり、16進数では 0x42なので
「k」のスキャンコードと一致
キーボードを離す時は
「F0」+「スキャンコード」が送信される
(離したときに一瞬上位ビットのLEDGが
点滅するのはそのため)
機能キーは特にキーボード毎
(英語キーボードや101キーボード等)に
スキャンコードが異なるので注意!