S1用マウスIC機能を実装してPS/2マウスを使う
前回では、マウス制御ICがあればPC-98用バスマウスが使えることを確認できました。今回はマウスICがない場合を想定してこのICを含めた回路を考えてみます。
……マウスICがない。さて、どうしようか。なければ作ればいい。で、何で作ろうか。汎用ロジックICを組み合わせて…いやいやそんな面倒なことはしたくない…。となるとCPLDかFPGAとなるが…。
CPLDやFPGAについては開発した経験が全くなく、どんなデバイスを使用してどのように開発したらいいのかさっぱりわかりません。しかもお値段も結構高いという印象があり手を出すのを躊躇していたのですが、ネットで検索していところ、ちょうどいいものがありました。2016年4月にCQ出版社から発売された「(1)MAX10 (2)ライタ (3)DVD付き! FPGA電子工作スーパーキット」というもので、Altera社のMAX10というFPGAを搭載した基板が付いて4,500円とFPGA搭載基板の中ではかなりお安い(ただし、別途追加で部品を購入してはんだ付けする必要がある。追加部品一式を購入で+3000円弱)。
この冊子をもとに開発工程も一通り習得?したところで、いよいよマウスIC機能の製作にとりかかります。
製作するマウスICの機能としては、- PS/2マウスが使えるようにPS/2制御機能を実装。
- PS/2マウスから送られてくる移動量やボタンON/OFFの情報をIC内部のマウスレジスタに保存する。
- S1からはこのICのマウスレジスタを介して、逐次マウスデータを読み取る。
- データ入出力が16/8ビット両対応だがS1は8ビットなので8ビットのみ実装。
- ジョイスティックにも対応しているが、S1では使用していないのでこの機能は省略。
以上の方針で、Verilog HDLで実装していきます。なお、PS/2コントローラは開発ソフトであるQuartus Primeに標準で付いていたIPモジュールを使用することにしました。
実装ができたら、信号が正しく出ているかをシミュレーションツールModelSimを使って調べていきます。簡単なテストベンチを作成して実行。おかしいところは実装を変更しながら想定通りに動くようにします。
ここでFPGA側の開発は一旦中断して、S1と接続するための回路を設計します。ここで注意する点として、S1とPS/2マウスは5V、一方FPGAは3.3Vで動作するのでFPGAのピンに3.3Vを超える電圧がかからないようにしなければなりません。S1とFPGAの間には3.3V駆動だが5Vトレラントな74LCXという汎用ロジックICを使用しました(バッファ&ゲートにもなる)。IRQ割り込み信号だけはオープンコレクタなのでトランジスタで実装。PS/2マウス側はマウス内部のプルアップ抵抗で5V近くになるので、保護ダイオードとプルダウン抵抗で信号線が3.3V以下になるようにしました。
この回路図をもとにブレッドボード上に配線していきます。S1からの信号は拡張カード端子ではなく、マウスICのある部分から取り出すためICソケットにコードを配線し、これをS1にはめ込むようにします。
さあ、ではS1を起動してマウステスト用プログラムをLOAD&RUNします。結果は…ウーン、X方向はとびとびで動くしY方向は動かずと思ったら上下逆になっているしボタンを押しても割り込みが発生しないようだし……これは前途多難だ…。
デバッグのためにS1とFPGAの間にはロジックアナライザを接続します。そして、FPGAには内部の信号を観測するために付属するSignal Tap II Logic Analyzerを組み込みます。これらを用いて信号を観測しているとシミュレーションの時とは若干違う動きをしています。原因の1つはHDLの書き方で、ソフトウェア言語のように逐次処理させたい部分がうまく動いていないようでした。あとは仕様の勘違いなどいろいろな不具合と悪戦苦闘した結果、なんとか動くようになりました。
まとめ
初めてのFPGA、初めてVerilog HDLでコーディングなど初めてづくしでなかなか想定通りにはいきませんでしたが、なんとか動かすことができました。今後はこのFPGAを活用していろいろと拡張機器を作っていきたいと思います。(おわり)
ソースコード・ダウンロード
s1ps2mouse_020_source.zip (72KB)
[MD5:958da1e90c6bcfb54aef9a6056887ee5]
※試される方は自己責任でお願いします。
◆関連ページ◆