ゼロから科学計算機を構築する:FPGAへの旅
科学計算機の作成は、スマートフォンが普及した現代においては、しばしば解決済みの問題と見なされます。しかし、ハードウェア愛好家にとって、それは数値解析、コンピュータアーキテクチャ、デジタル論理、そして物理的なPCB設計にわたる、フルスタック・エンジニアリングのマスタークラスを意味します。
ヴィンテージなHP-41CVの触覚的な満足感に触発され、zdwによって詳述されたこのプロジェクトは、FPGAを使用して16桁のBCD (Binary-Coded Decimal) 計算機をゼロから構築する方法についての包括的な探求です。汎用マイクロコントローラに頼るのではなく、このプロジェクトでは、カスタムCPUと、10進数演算に特化して設計された専用の命令セットを実装しています。
基盤:数値的手法とパスファインディング
ハードウェア記述言語 (HDL) を一行も書く前に、真剣なエンジニアリング・プロジェクトには「パスファインディング(経路探索)」フェーズが必要です。これは、プロトタイピング、失敗、そして何が可能であるかの境界線を発見していく反復的なプロセスです。このプロジェクトにおける主な課題は、tan、ln、exp、および sqrt のような複雑な関数を、基本的な加算、減算、および乗算のみを使用して計算できるようにすることでした。
16桁の精度を達成するために、著者はC++で検証済みのリファレンス実装を開発しました。これは、最終的にハードウェアがテストされる際の「グラウンド・トゥルース(正解)」として機能します。ハードウェアのデバッグはソフトウェアのデバッグよりも桁違いに困難であるため、このフェーズは極めて重要です。数学的なゴールド・スタンダード(標準)を持つことで、結果がわずかにずれたときに、開発者が論理回路の中で「幽霊」を追いかけることを防ぐことができます。
開発フレームワーク
FPGA開発における最も大きな障害の一つは、フィードバック・ループです。これを解決するために、単一のVerilogソースコードを修正なしで4つの異なるプラットフォームで実行できる、マルチ環境テストフレームワークが確立されました。
- ModelSim: 基本的な論理を検証するための信号レベルのシミュレーションに使用。
- Verilator: サイクル精度のC++モデリングに使用。
- Qt: 高レベルなインタラクションのためのデバッガ・コンソールを備えたデスクトップ・プロトタイプ。
- WebAssembly: アプリケーションをブラウザで実行し、簡単に共有・アクセスできるようにするためのもの。
これらの無料ツールを活用することで、開発者は最初の物理的なボードを注文するずっと前に、シミュレーション環境で論理を検証することができ、コストのかかるハードウェアの修正リスクを大幅に削減できました。
専用CPUの設計
ほとんどの現代的なCPUは、2進数浮動小数点演算のために設計されており、高精度な10進数計算機においては、許容できない丸め誤差が生じる原因となることがよくあります。これを避けるため、著者は独自のアーキテクチャを持つカスタムCPUを設計しました。
- Nibble-Addressable Memory: BCDはすべての10進数桁を4ビットのニブルで表すため、メモリはバイト単位ではなくニブル単位でアドレス指定されるように設計されました。
- Custom ISA: 14個のALU操作を備えた12ビット固定長の命令セットが作成されました。これには、10進数演算に特有のキャリー(繰り上がり)とボロー(借り)を処理するためのBCD-adjust命令(Intel 8086に触発されたもの)が含まれています。
- Harvard Architecture: CPUは命令とデータのそれぞれに対して、個別の保存領域と信号経路を使用し、計算中の情報の流れを最適化します。
マイクロコードから物理的なハードウェアへ
CPUアーキテクチャが定義された後、次のステップはマイクロコード(ハードウェアにISAをどのように実行するかを指示する低レベル命令)を書くことでした。CPUは独自の設計であるため、著者は論理を回路語に変換するためにPythonで2パス・アセンブラを記述しました。
複雑な操作、例えば $y^x$ を、数百行の生のアセンブリではなく、数行のトークンに集約させるために、マイクロコードの上にスクリプト・インタプリタを層として重ねました。
物理的なハードウェアへの移行は、段階的に行われました。最初は、リボンケーブルを介してカスタムキーパッドとOLEDディスプレイに接続されたEP2C5開発ボードから始まりました。最終的な反復では、プロフェッショナルでスタンドアロンなデバイスへと進化しました。その特徴は以下の通りです:
- FPGAが直接はんだ付けされたカスタムPCB。
- 3Dプリントされた筐体。
- クラシックなHPのイエローとレッドの慣習に従った、色分けされたキーキャップ。
- 二重のプログラミング・コネクタ(反復のためのJTAGと、永続的なフラッシュメモリのためのActive Serial)。
最後の1桁を追いかける:2025年の改良
プロジェクトの初期バージョンでは約12桁の精度が達成されましたが、真の16桁BCDマシンには絶対的な精度が必要です。2025年の算術エンジン・リライトにより、いくつかの重要な改善が導入されました:
- Guard Digits and Sticky Bits: 丸め誤差の蓄積を防ぐための適切なトラッキングの実装。
- Banker's Rounding: 大規模なデータセットにおけるバイアスを減らすための、より数学的に中立な丸め方法。
- Enhanced Feature Set: 完全な三角関数スイート、10個のSTO/RCLメモリ・レジスタ、およびハードウェアベースのLFSR (Linear Feedback Shift Register) 乱数生成器の追加。
結論
最終的な結果は、わずか1,593個のロジック・セルを使用する、完全に機能する科学計算機です。これは、小型で安価なFPGAの容量の約35%を使用しています。著者は、物理的なキーの触覚的な感触がヴィンテージなHPのハードウェアには完全には及ばないものの、このプロジェクトは、専門化されたハードウェア・アーキテクチャが、解決しようとする問題によって完璧に形作られることを示す強力なデモとして機能しています。