Z80マイコン基板自作記:全レイヤでバグを踏み抜き、Rev.2を発注するまでの泥臭いトラブルシューティング
低レイヤ技術の実践として、Z80とCH559L(I/O・ディスプレイ制御用マイコン)を組み合わせたシングルボードコンピュータの自作に取り組んでいます。
データシートを読み込み、KiCadで回路図を引いてオリジナル基板(Rev.1)を発注しました。ピカピカの基板に部品をはんだ付けし、意気揚々と電源を入れたものの……Z80の動作やSRAM、EEPROMの動作は確認できたものの、Z80が命令を実行して`Hello World From Z80`を出力しない.....
ここから、回路(ハード)、ファームウェア(ソフト)、物理層という3つのレイヤが複雑に絡み合う、地獄のトラブルシューティングが始まりました。
1. ハードウェアの洗礼:~RD/~WR直結の悲劇
オシロスコープで波形を追う中で見えてきた最大の元凶は、Z80とCH559の ~RD / ~WR ピンを「直結」してしまったことでした。これにより強烈なバス競合が発生し、過渡的なグリッチでSRAMのデータが破壊されるなど、5つ以上の二次災害を引き起こしていました。
また、リセット回路(RC回路)の時定数(τ)が470msと大きすぎてリセットがダラダラと立ち上がってしまったり、~BUSRQや~INTピンのプルアップ抵抗を付け忘れてZ80が暴走したりと、回路設計の甘さも次々と露呈しました。
↑リセットがかかりまくっている様子
2. ファームウェアの罠:たった1ビットの設定漏れ
ソフト側で最も発見が困難だったのは、CH559の P1_IE(デジタル入力許可レジスタ)の設定ミスです。
P1_IE = 0xFF とすべきところを 0x01 としていたため、SPI操作時の read-modify-write で予期せぬ値が読み込まれ、直後の書き戻しでSRAMの選択ビットが消滅。「Z80が常にデセレクトされたSRAMに対してフェッチし続ける」という絶望的な状態に陥っていました。その他にも、ポートのプッシュプル/オープンドレイン設定のミスや、XBUSのアドレスマッピングの誤認など、仕様書の読み込み不足が牙を剥きました。
3. トドメの物理層エラー(接触不良)
ハード側の設計ミスとソフト側のバグが絡み合う中、極めつけは「Z80ソケットの接触不良」でした。最も重要な ~MREQ ピンが接触不良を起こしており、「ビットバングでの書き込みは成功するのに、Z80実行時はSRAMが読めない」という、デバッグを最も混乱させる症状を引き起こしていました。
バグの連鎖を断ち切り、Rev.2へ
ソフトウェアのバグならコードを直せば済みますが、ハードウェアのエラーはそうはいきません。しかし、データシートを隅々まで読み直し、テスタとオシロスコープで物理現象を一つずつ紐解いていく作業は、悔しい反面、「システム全体を掌握していく」という圧倒的な面白さがありました。
現在はこれらの問題を根本解決するため、そもそものCH559Lを廃止して、より5Vトレラントで使いやすいATmega2560-16AUを使うことにしました。それらを統合して、さらにESP32-S3を用いたVDP(Video Display Processor)を開発しました。