
2026/03/23 8:06
私のDIY FPGAボードはクエイク II(Quake II)を動かすことができます。
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
**
## Summary レポートは、Efinix Ti60F256 FPGA(256ピンBGA)と1 GB DDR3LメモリチップIM8G16D3FFBGを中心に構築された新しい6層PCBを記載しています。 主要ペリフェラルには、TMDSシリアライザ(TFP410)、USB電流制限器、SD‑カード電圧スイッチ(UHS‑1 SDR104 用の3.3 V↔1.8 V)、実時間クロック+バッテリー、ESP32 WiFiモジュール、および追加の高電圧 USB‑Cポートが含まれます。 BGA部品は、221 °C のボトムヒーターとハードガンを使用してはんだ付けされ、ステンシル幅は基板に合わせてペーストを正確に適用しました。DDR3コントローラのレイアウトはEfinix ガイドラインに従いましたが、内部層トレースの短縮によってトレース長一致は部分的にしか達成できませんでした。 FPGA の利用率はロジックリソースの 89 %(53,612/60,800 XLR)とメモリブロックの 95 %(241/256)に達しました。単一の VexiiRiscv コア(SpinalHDL 経由で構築)は 207 MHz で動作し、511 DMIPS、117 MFLOPS の実際的な FP ベンチマーク、および CoreMark 1.0 スコア 783.08 を提供します。メモリ性能:1 GB RAM;SD‑カード読み込み速度 45.06 MB/s;CPU memset 348 MB/s;DMA memset 1130 MB/s(理論上の限界 ≈1.6 GB/s)。WiFi 機能は ESP32 のピン使用ミスにより初期に失敗しましたが、後続のリビジョンで修正されました。 基板コストは 5–20 個あたり $100 を超えます。以前の二層プロトタイプは各約 $2 でした。カスタム HDL モジュール(DDR3 Tilelink アダプタ、UART、I²C、オーディオ、多数の SPI コントローラ、ビデオコントローラ、DMA)は主に SpinalHDL で開発され、VexiiRiscv と Dolu1990 の IP コアへの大きな依存がありました。SpinalHDL の学習曲線は不完全なドキュメントのため急峻でしたが、コミュニティサポートが助けになりました。 今後の計画には、リソース制限内で FPGA 対応 GPU を実装し、Quake II のパフォーマンス向上を目的とした DMA のさらなる最適化があります。
本文
2026年3月22日
Part 1/6 – イントロダクション
Part 2/6 – 最初のプロトタイプ
Part 3/6 – ほぼ動作している現在
Part 4/6 – 次世代(ここから)
Part 5/6 – もう一度試行
Part 6/6 – 「Quake II」を走らせるためのハードウェア最適化
新しいボードを設計する時期
以前作ったものをそのまま再現したくはありませんでした。もっと高度な構成にするにはBGAのはんだ付けが必要で、やれるか不安でしたが、挑戦してみることにしました。
具体的には、より進化したFPGA Efinix Ti60F256 と最新型メモリ IM8G16D3FFBG(1 GB DDR3L)を採用したいと考えました。前者はピン数256本、後者は96本で、どちらも0.8 mmのピッチです。
BGA‑256パッケージに入ったIC。一部はTi60ではないが、外観は非常に似ている。
DDR1を扱う際にメモリコントローラを再設計したくなくなり、Efinixのサイトで DDR3 Soft Controller Core を見つけ、DDR3 PCBレイアウトに関するガイドにも案内されました。
不慣れだった用語を学ぶために余分に時間を費やしました。トレース長マッチング要件はほぼ満たせず、アドレス・コマンドライン全てを単一層で走らせるのは不可能に近かったので、内部層でトレースを短くすることで補いました。
今回のPCBは 6層 です。デカップリングコンデンサの推奨数・容量も調べましたが、電源ピン付近に物理的に配置できるものは限られており、0603(0.06″ × 0.03″=1.6 × 0.8 mm)より小さい部品をはんだ付けしたくありませんでした。できるだけ多く挟み込む形で進めました。
FPGA下部に配置されたコンデンサ(3‑Dモデル)。
前回のボードからの主な変更点
- 緑色アーティファクトを防ぐため、独立したTMDSシリアライザチップ(TFP410)を採用。
- USB機器接続時の電流制限付き。
- SDカードデータラインの電圧を3.3 Vから1.8 Vに切り替えられるようにし、転送速度を104 MB/s(UHS‑1 SDR104モード)まで向上可能。
- リアルタイムクロックとバッテリーを搭載し、Linuxが起動時に1970年に戻るのを防止。
- ESP32モジュールをWi‑Fiアダプタとして追加。
- USB‑Cポートを二つ設け、標準USB(5 V 500 mA)が不足した場合は高電圧を要求できるチップを搭載。
BGAのはんだ付け方法
JLCPCBで6層PCBを注文すると2層に比べて費用が大幅に上がります。総額は100ドル以上で、5枚・10枚・20枚といった数量でもほぼ同じでした。一方、以前の2層ボード5枚のセットはわずか2ドルでした。
PCBsとステンシル(比較用に前回のPCBも添付)。
「BGAをはんだ付けする方法」という記事は多くが修理作業に焦点を当てています。ヒートガンで加熱、チップを取り外し、古いはんだを除去、リボール、再び修理対象のデバイスへはんだ付けといった工程です。これらは難易度が高く専用機器も必要ですが、本ケースでは不要です。
新しいチップを新品に取り付ける作業は容易です。まずボード上の全ての接点にフラックス付きペーストを塗布し、次にチップを配置して加熱します。この際、ペーストはチップのパッド上のサルダーボールと同じ温度帯で評価されるものを選びます。すべてが順調なら作業完了です。何か問題(見た目に不具合がなくても)が起きた場合は捨てて再挑戦、または修理パラグラフに戻ります。
ペーストを整然と塗布するにはステンシルが必要です。私のステンシルはPCBサイズに完全一致し、合わせやすくなっています。テープで固定し、プラスチックカードでペーストを広げました。
温度調節可能なボトムヒーター(「Uyue 946 Constant Temperature Heating Station Screen Removal tool」)を購入しました。数枚の安価メモリチップで試した後、221 °Cに加熱し、サルダーペーストが色変化してボールになる様子を観察。FPGAフットプリント上の生成されたボールは欠陥無しだったので、そのまま進めました。
テスト実行
ボトムヒーターでは部品をトップ面にしかはんだ付けできません。そのため、底面に数十個のコンデンサや抵抗を配置しつつ、上面への影響を抑えるためにヒートガンと低融点サルダー(183 °C)を併用しました。驚くほど最初からうまくいき、トップ側・底側・コネクタをそれぞれ3日で仕上げました。隣接ピンブリッジはわずかに発生したものの、BGAチップ下部には一切ありませんでした。
ボトムヒーター使用時の写真。
数ヶ月に渡るドライバ開発とデバッグ中、ESP32モジュールの誤ったピン設定が原因でWi‑Fiが機能しないことを発見しました。この問題は次回リビジョンで解決済みです。
システム・オン・チップ(SoC)
- SoC:CPU、メモリ、GPU、およびI/Oインターフェースを一つのチップに統合した集積回路。
- FPGA:フィールドプログラマブルゲートアレイ。VerilogまたはVHDL(HDL)で記述されたカスタムロジック(完全なSoC)が実装されます。
図面上、SoCは大きな緑色の四角「FPGA Ti60」に収まっています。他の緑色四角はボード上の他チップを示しています。スキーマでソースが明記されていないコンポーネントはすべて自作で、GitHub(Verilogコード・Scalaコード)で公開済みです。主なものにDDR3 Tilelinkアダプタ、UARTコントローラ、I2Cコントローラ、オーディオコントローラ、特定用途向け最適化されたSPIコントローラ3種、ビデオコントローラ、DMAコントローラがあります。
SoCの中で最も複雑なのはプロセッサコアですが、自前では作成せず以下を利用しました。
- VexiiRiscv – SpinalHDLで書かれたRISC‑Vコア。
- SpinalHDLとともに配布されるコンポーネント:Tilelinkインターコネクト、APB3ブリッジ、USB OHCIコントローラ、PLIC。
- ZipCPU/sdspi SDカードコントローラ。
- Efinix DDR3 Soft Controller Core(ソースは公開されていない)。
VexiiRiscvとSpinalHDLは非常に優れたツールです。Verilogからスタートしましたが、2年間でSpinalHDLへ移行し、自作モジュールの記述を容易にしています。
学習曲線は急でした。SpinalHDLはScalaで書かれたライブラリ群であり、Verilog/VHDLを生成します。パイプライン、FSM、バス、キャッシュなどハードウェア抽象化と、コルーチン、遅延インスタンス化、継承、プラグインという生成時構文を同一ファイルに混在させるのは容易ではありません。Scala自体が初めてで、何が変数名で何がSpinalHDL内部なのか判別できないことも多々ありました。ドキュメントは良いものの不完全です。もし1000ページの書籍があれば購入したいところです。
幸運にも Dolu1990 は常に質問に答えてくれました(Dolu1990、読んでいる方へ感謝)。
実績
| 指標 | 値 |
|---|---|
| FPGA利用率 | 53 612/60 800 XLRs (89 %)、241/256 メモリブロック (95 %) |
| コア | 207 MHzで単一RISC‑Vコア(FPUを犠牲にすれば二コア可) |
| Dhrystone | 511 DMIPS(2.46 DMIPS/MHz)– Pentiumより上、Pentium IIより下 |
| RAM | 1 GB – 平均的なPentium II PC以上 |
| 浮動小数点 | ピーク207 MFLOPS(実際は約117 MFLOPS) |
| CoreMark 1.0 | 783.08 |
| SDカード読み込み | 45.06 MB/s |
| CPU memset | 348 MB/s |
| DMA memset | 1130 MB/s(理論上最大≈1.6 GB/s、データが各クロックで転送される場合) |
Quake IIの最適化時にDMAを議論します。GPUはFPGAリソース不足だったため、グラフィックス関連処理も行える「DMAコントローラ」を作成しました。
スクリーンショット
- ベアメタル Hello World
- ウィンドウマネージャーとTTY実装
- Doom
- Heroes 2
(次パートにさらに多くの画像を掲載予定)
次回:近日公開