
2026/02/05 2:35
**24ビットアーケードCRTディスプレイアダプタを一から作る** 1. **概要** - 目的:アーケード機用のカスタム24ビット CRT ディスプレイアダプタを構築する。 - 主な構成要素:映像プロセッサ、RGB 出力回路、電源、およびインターフェースコネクタ。 2. **設計手順** 1. **信号生成** - プログラム可能なグラフィックコントローラを用いて 24 ビットカラー データを生成。 - ピクセルクロックを水平/垂直同期パルスへ変換。 2. **色変換** - RGB を CRT の蛍光体に適したタイミングで変換。 - 正確な色再現のため、バイアスとレベリングを追加。 3. **電源管理** - +5 V、+12 V、および高電圧 CRT ターボの要件を満たす規格化電源設計。 - 信号整合性確保のためフィルタリングと絶縁を実装。 4. **PCB 配線** - 高速トレースはインピーダンス制御で走行。 - IC の近くにデカップリングコンデンサを配置。 5. **テスト&キャリブレーション** - オシロスコープで同期信号を検証。 - テストパターンを用いて色バランスを調整。 3. **必要材料** - グラフィックコントローラ(例:DAC0818 など)。 - RGB トランス・バイアスクロス。 - 電源モジュール。 - PCB、コネクタ、抵抗、コンデンサ、インダクタ。 4. **安全上の注意点** - 高電圧 CRT 部品は慎重に扱うこと。 - 施工全体で適切なグラウンドを確保すること。 5. **参考資料** - 選択した IC のデータシート。 - CRT 信号タイミングのチュートリアル。 - トラブルシューティング用コミュニティフォーラム。 これらの手順に従い、信号整合性と電源取り扱いを細部まで注意すれば、一から 24‑bit アーケード CRT ディスプレイアダプタを成功裏に構築できます。
RSS: https://news.ycombinator.com/rss
要約▶
日本語訳:
著者は、JAMMA コネクタを使用し、18‑ビットカラーで非標準の 320×240 → 336×262 解像度が必要な RCade アーケードマシンの CRT を駆動するためにカスタム USB‑to‑VGA アダプタを構築しました。
初期には Raspberry Pi からフルスピード USB(USB 2.0)でフレームバッファをストリーミングしようと試みましたが、必要なフレームレート(10 fps 未満)を維持できませんでした。そのため著者は RP2040 上に GUD(Generic USB Display)プロトコルのギャジェットを実装し、3 つの PIO プログラム(HSYNC、VSYNC、RGB)を使用して VGA タイミングと 16‑ビットカラーを生成しました。
フルスピード帯域幅(約 11 Mbps)はまだ不十分だったため、プロジェクトは STM32H750 に移行し、内蔵 ULPI USB インターフェースとフレームバッファ用の HyperRAM を採用しました。USB、LTDC、および RAM トレースの長さ合わせを徹底的に行うことでフルスピード動作が可能になり、クリスタルオシレーターとグラウンドプレーンの問題を修正した後、ボードは RCade CRT で真の 60 Hz リフレッシュレートを実現しました。
最終的な PCB には Mini‑USB HS 入力、75 Ω にインピーダンスマッチされた 3 本の 8‑ビット DAC を備えた VGA 出力、HyperRAM、およびコントローラ入力用の JAMMA ピンアウトが含まれています。今後はオーディオ出力を追加し、制御入力を読み取り、ダブル/トリプルバッファリングを実装し、GUD デルタを無効化し、ドキュメントを改善する予定です。全てのファームウェアは GitHub でオープンソースとして公開されています。
本文
11 月、私の友人であるリカレントユーザー・フランクがリコースセンターにアーケードマシンを持ち込みました。 私たちはそれを RCade と呼び、オリジナルの CRT をそのまま残し(素晴らしい選択)、Raspberry Pi に接続しました。その後、より強力なコンピュータが欲しくなり、ディスプレイに接続する方法が必要になりました。 私は USB 経由で通常の PC とインタフェースできる CRT‑display アダプタを作れると述べ、このプロジェクトです。
ディスプレイが期待するもの
RCade の CRT は JAMMA コネクタを使用しています。 フランクは VGA と JAMMA を橋渡しするコンバーターを購入しましたが、市販の VGA アダプタだけでは不十分でした:
- CRT は非標準解像度(320 × 240 → 336 × 262)で動作します。
- 多くのアダプタは 640 × 480 以下に下げられません。
- 任意の解像度と、Pi の 18‑bit 出力よりも優れた色深度が必要でした。
VGA は CRT が行うことをほぼそのまま映し出すアナログプロトコルです。 CRT 内部には赤・緑・青の 3 本の電子銃があります。 水平方向と垂直方向にビームを誘導する 2 本の電磁石があり、ビームはラインごとにスイープしながら色を制御します。 VGA は R‑G‑B 信号に加えて HSYNC と VSYNC パルスを提供し、ドライバーと CRT を同期させます。
試行 1:RP2040 PIO
私は Raspberry Pi RP2040(約 1 ドル)とその Programmable IO(PIO)を使用しました。 3 本の PIO プログラムを書きました:
| プログラム | 用途 |
|---|---|
| hsync | HSYNC パルスを生成し、各ライン開始時に IRQ を発生させます。 |
| vsync | その IRQ をカウントして VSYNC パルスを作ります。 |
| rgb | DMA からピクセルデータを読み取り、GPIO 上で R‑G‑B を出力します。 |
コードは長く、すべてのタイミング値をハードコーディングしていますが、カスタムソリューションで任意解像度を出力できることを証明しました。
Linux 側:GUD プロトコル
USB 経由でフレームバッファを送信したいと考えました。 まず DRM フレームバッファを公開するカーネルモジュールを書きましたが、作業は痛々しく、ドキュメントも乏しかったです。 代わりに GUD(USB ディスプレイアダプタプロトコル)を発見しました。 これは変更されたピクセルのみ(デルタ)を送信し、オプションで圧縮をサポートします。
ホストモジュールを逆エンジニアリングした後、RP2040 用の Rust ガジェットを書き、GUD を実装しました。 CRT 上の最初の画像は粗いもので(古いボードから取り付けた 12‑bit DAC)、しかしコンセプトが機能することを証明しました。
RP2040 の制限
RP2040 は USB フルスピード(11 Mbps)のみです。 320 × 240 × 16 bpp であれば、1 枚のフレームは約 154 kB、10 fps 未満になります。 より高速なインタフェースが必要でした。
STM32 に切り替える
USB ハイスピード(480 Mbit/s)を 外部 PHY とともに サポートし、VGA‑style 信号を駆動できる LTDC 周辺機能と、外部 RAM アクセスを提供するマイクロコントローラを探しました。 いくつか試した結果、STM32H750IBT(176 ピン LQFP)に決めました。 このデバイスは USB OTG HS インタフェース(外部 ULPI PHY が必要)と LTDC ブロックを備えています。また、ボードでは HyperRAM をフレームバッファストレージとして使用しています。
PCB デザインは簡単ではありませんでした: 16 ビット RAM バス用に 38 本の長さ合わせトレース、多数の短い USB/PHY トレース、ショートを防ぐための慎重なグラウンド設計。 私は自動 DRC チェックと Gerber ファイルおよび STL モデル(YAPP/OpenSCAD)生成を含むカスタム CAD ワークフローを使用しました。
ブルーアップ & デバッグ
- USB – 初めは FS で動作。クレストに並列接続された 1 MΩ 抵抗を追加すると、HS モードが安定化しました。
- LTDC – USB PHY を修正した後、スムーズに動作しました。
- GUD – 高速 USB 上でも最適化なしで動作しました。
最終ボードは 60 Hz 全フレームで動作し、色深度(24‑bit)が向上しバンディングも解消されました。 RCade は劇的に改善されました。
残された課題
- USB の信頼性 – ボードを RCade に取り付けた後、USB インタフェースが停止しました。 STM32 または PHY が ESD 損傷した可能性があります。
- オーディオ & コントロール – 将来のボードではアンプとアーケード入力を追加する予定です。
- バッファリング & デルタ最適化 – ダブル/トリプル バッファリングを実装し、GUD がデルタを無効にできるようにします。
- ドキュメント – GUD プロトコルのより明確なドキュメントを書きます。
リソース
| 種類 | リンク |
|---|---|
| ハードウェア回路図 & PCB ファイル | https://github.com/.../hardware |
| フィームウェア(STM32、RP2040) | https://github.com/.../firmware |
| 元の RP2040 コード | https://github.com/.../rp2040-original |
| DAC 方程式 | https://github.com/.../dac-equations |
| GUD ガジェット試行 | https://github.com/.../gud-gadget |
このプロジェクトは、低レベルビデオ、USB、および PCB デザインについて多くを教えてくれました。 ハードウェアはまだ不安定ですが、コアアイデア―アーケードキャビネットを現代のマイクロコントローラで適切な VGA ディスプレイに変える―は堅実でさらなる改良が可能です。