FPGAで蘇る486互換PC(第2回)

FPGAで蘇る486互換PC(第2回)

2025年12月3日

はじめに

前回、Tang Console 138K 上で ao486 の動作の続きで、今回は486Tangへのi8042 PS/2コントローラの組み込みを行いました。

準備するモノ

486Tang に i8042 PS/2 コントローラを組み込む

bochsrck GitHub 上のプロジェクト 486tang の Verilog コードとドキュメントを読み解きながら、PS/2 キーボードを「UART to PS/2 bridge 経由」ではなく、
FPGA の PMOD ポートへ直接接続する方式 へ変更してみました。

調査したモジュール構成は下図のとおりで、SoC 内には既に i8042 相当の PS/2 コントローラ(ps2.v)が存在しているため、
ホスト PC を介さずに直接 PS/2 デバイスを扱えるようにできます。

(図:486tang_ModuleConfiguration.png)

以下では、実際に行った作業手順をまとめます。

1.UART to PS/2 bridgeの削除

486Tang では、標準では USB シリアル(USB-JTAG)経由でキーボード/マウスを入力するためのブリッジ回路が組み込まれています。
直接 PS/2 を接続する場合、このブリッジは不要になるため、以下のファイルを削除します。

削除するファイル
src/common/ps2_device.v
src/common/uart2ps2.v

コメントアウト(削除)するモジュール登録
src/ao486_top.v 内の uart2ps2
src/system.sv 内の ps2_device

GOWIN のプロジェクトファイル(486tang_console138k.gprj)を開いて、これらのファイルを削除し、モジュール登録も忘れずに外します。

2.PS/2 controllerの改造

486Tang の SoC 内には、すでに i8042 互換の PS/2 コントローラsrc/soc/ps2.v) が含まれています。
このモジュールは、PS/2 の 11 ビットフレーム(Start / 8bit Data / Parity / Stop)を正しくデコードする実装があり、キーボード入力として十分に機能します。

今回は “PS/2 キーボードを直接接続” できるように、
clock / data 信号を 双方向で扱えるように再配線
といった最小限の修正のみで対応できました。

3. PMOD ピンへの割り当て

最後に、変更した PS/2 コントローラの ps2_clk / ps2_dataTang Console 138K の PMOD0 に割り当てます。

今回は以下のピンに接続しました。

PS/2 信号 PMOD0 ピン番号 FPGA
Clock 1 V18
Data 3 F18

・不要な UART → PS/2 ブリッジを削除
・既存の ps2.v を双方向信号に対応させる
・PMOD ピンに PS/2 Clock/Data を割り当てる
という 3 ステップで実装は完了しました。

修正CodeのPatchはここにあります。

Bochs BIOS と VGA BIOS のビルド手順まとめ

486Tang の BIOS(boot0.rom) と VGA BIOS(boot1.rom) をソースコードからビルドする手順を、開発メモ風に整理して紹介します。

BIOS (tools/boot0.rom)

$ git clone https://github.com/bochs-emu/Bochs.git
$ cd Bochs/bochs
$ ./configure --with-nogui --disable-pci --disable-xpm --disable-gameport
$ cd bios
sed -i.bak 's/^#define[[:space:]]\+BX_APM[[:space:]]\+1/#define BX_APM 0/' rombios.h
sed -i.bak 's/^#define[[:space:]]\+BX_PNPBIOS[[:space:]]\+1/#define BX_PNPBIOS 0/' rombios.h
sed -i.bak 's/^#define[[:space:]]\+BX_USE_PS2_MOUSE[[:space:]]\+1/#define BX_USE_PS2_MOUSE 0/' rombios.h
$ make
$ git clone https://github.com/MiSTer-devel/ao486_MiSTer
$ cd sw/sysbios
$ make

VGA BIOS (tools/boot1.rom)

$ git clone https://github.com/MiSTer-devel/ao486_MiSTer
$ cd sw/vgabios
$ make

まとめ

486Tang ではキーボード/マウス入力が UART ブリッジ経由で処理されていますが、実は SoC 内部には i8042 互換の PS/2 コントローラがすでに組み込まれています。
そのため、回路を少し手直しするだけで 本物の PS/2 キーボード を直接接続できる環境を構築することが出来ました。

この仕組みが動作すれば、古典的な OS──たとえば Minixlinux-0.01 のような、i8042 を前提とした初期のシステムも正常にキーボード入力を扱える可能性があります。
こちらについても、いずれ動作検証を進めてみたいと思います。