- ベストアンサー
FPGAによるキーボードLSIの実現
お世話になっております. 現在PS/2,もしくはUSBのキーボード内部に使用されている LSIの代わりにFPGAを用いて実現する事を考えております. キーボードのIPは探してみるといくつかあるのですが, 基本的にキーを押したスキャンコードをシリアルに変更したものを 受け取って処理するIPが殆どの様です. ここを,キーを押した信号を直接受けとってPS/2のシリアルデータとして 変換するところをFPGAで実現したいのですが,そういったIPはあるでしょうか. 御存じであれば教えていただければ幸いです. それでは失礼いたします.
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
IP coreのオープンソースのサイト http://opencores.org/ とかにあったりしないかな? >ここを,キーを押した信号を直接受けとってPS/2のシリアルデータとして >変換するところをFPGAで実現したいのですが,そういったIPはあるでしょうか. キーボードに「キーを押した信号」なんて、存在しません。 キーボードの配線は、縦と横のメッシュ状の配線がしてあって、縦と横の交点にキースイッチがある構造をしています。 キーを押すと「縦と横がショートする」ので、横の配線に順に電気を流してみて、縦の配線がどうなったかで、キーが押されたかを判断します。 回路の例。 http://www.ei.fukui-nct.ac.jp/~t-saitoh/exp/h8/key-matrix.html んで、キーが128個なら、出力7ビット、入力8ビットのI/Oがあれば実現できます。 プログラムは 出力0のみHighにして、入力0~7を取り込み、ダイオードの特性に注意して、一定時間のタイムラグを取る。 出力1のみHighにして、入力0~7を取り込み、ダイオードの特性に注意して、一定時間のタイムラグを取る。 上記を出力0~6まで繰り返し、それを「1スキャン分」として記録する。 前回のスキャンと今回のスキャンで、状態変化が起きていたら、キーのオン、キーのオフとして処理する。 ってのを延々と繰り返すだけです。 キーのオン、キーのオフの処理では「出力0がHighの時に入力0がLowなら、物理スイッチ0番、入力1がLowなら物理スイッチ1番」のように、物理スイッチ0~127番までの、128個のスイッチを処理できます。 あとは http://hp.vector.co.jp/authors/VA037406/html/ps2interface.htm の「スキャンコード送信」に合わせて送信データを生成して、シリアル転送するだけです。 実は、この「送信データ生成」の所では、CAPSキーの処理とか、2バイト系コードの生成とか、キーリピート設定にあわせたMakeとBreakの生成とか、色々と面倒な事が山盛りなので、FPAGでIPを作ると死ねると思います。 PS/2キーボードって、データを送出するだけじゃなくてコマンドの受信もしないといけないので、それも忘れてはいけません。 なお、キーボードは「LSI化」って言うより「ワンチップマイコン化」されてて、チップの中には、複雑なプログラムが書き込まれたROM、データ記録用のRAM、定期的な処理を行う為のタイマ、タイマからの割り込みを処理する割り込み回路、シリアルポート、パラレルポートが入っています。 ぶっちゃけて言えば、キーボードの中には、月に行ったアポロ宇宙船のコンピューターよりも高性能なコンピューターが入っています。 「FPGAでどうこう出来ると思ったら大間違い」なので、マジにFPGAで作るなら「軽く3回は死ねる覚悟」で挑みましょう。
補足
詳細なキーボードの動作を教えていただきありがとうございます. そうですね,コマンドのところが厄介そうです. これをやってくれるようなIPが無いかと思っておりました. やりたい事は,PS/2キーボードに回路的に手を加えたいのですが それをFPGAで実現しようと思っておりました. IP等が無いような場合,何か良い方法はありますかね? それでは失礼いたします.