
2026/03/16 2:36
**私のホームブリューCPU構築 – 書き起こし** 1. **目的とビジョン** - 組み込み用途向けに、性能と効率を両立した低消費電力カスタムCPUを作成する。 - 想定ユースケース:IoTゲートウェイ、エッジAI推論、軽量デスクトップワークステーション。 2. **アーキテクチャ概要** - 32ビットRISC‑Vコア(アウト・オブ・オーダー実行) - L1命令キャッシュ4 KB + L1データキャッシュ8 KB - ベクトル演算用64ビットSIMD拡張 - 統合暗号アクセラレータ(AES、SHA‑256) 3. **主要設計選択肢** | 機能 | 理由 | |------|------| | RISC‑V ISA | オープンソースで拡張性が高く、ライセンス費用が低い。 | | 4 kB I‑cache | 小規模コードベースのフェッチ遅延を最小化。 | | SIMDサポート | ベクトルワークロード(画像処理等)で性能向上。 | | Cryptoコア | セキュリティタスクをメインパイプラインから分離。 | 4. **実装詳細** - SystemVerilogで設計、Synopsys Design Compilerで合成。 - 対象プロセス:65 nm。典型負荷時に200 MHzで約1.5 mW。 - アイドルユニットはパワーゲーティングを実装。 5. **検証・検証** - ModelSimによる機能シミュレーションで命令セット全体(100%)をカバー。 - タイミングクロージャー達成、スラックマージンは+0.3 ns。 - PrimeTimeでの電力解析によりピーク電力<2 W。 6. **パッケージングと統合** - パッケージ:64ピンQFN、0.5 mmピッチ。 - ピン配置はVDD、GND、CLK、リセット、データバス、命令バス、JTAGデバッグインターフェースを含む。 - GitHubにファームウェアスタブ(ブートローダ)を公開。 7. **今後の展開** - 科学計算向け浮動小数点ユニットを追加予定。 - 28 nmプロセスでさらに低消費電力を目指す。 - 同一シリコンエリアにDSPアクセラレータを併設。 **リソース** - GitHubリポジトリ: `https://github.com/yourhandle/homebrew-cpu` - ドキュメントPDF(PDF): `homebrew_cpu_manual.pdf` ぜひクローンしてテストし、貢献してください!
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
WCPU‑1は、Logisim‑Evolutionでシミュレーションから始まり、完全に組み立てられたハードウェアへと進化したオリジナルの8ビットコンピュータです。カスタム8ビットCPU、アセンブラ、およびEEPROMベースのマイクロコードストレージというコアコンポーネントが現在稼働しています。チームはPCBWayを利用してPCBs(Arduino‑NanoベースのEEPROMプログラマー、レジスタボード、および制御モジュール)を製造し、設計をソリッドコアワイヤーでブレッドボードに広範囲に実装しました。いくつかの部品はSMT、他はテスト用にDIPバリアントが使用されました。
主要な設計欠陥が特定され修正されました:逆転したCEロジック、浮動するOE/WEピン、逆向きLED配線、不適切に出荷されたPCB、クロックタイミングのグリッチ(Schmittインバータとエッジゲート付き74HC377で修正)、およびEEPROM出力の不安定性。CPUは現在、3つのアドレッシングモードを備えた23命令をサポートし、約1 MHzで動作し、256バイトのRAMを持ちます—フィボナッチ計算、ループ、および条件分岐を実行可能です。
一時的なROMローダーはArduino Megaを使用してバス経由でプログラムを書き込むことでRAMにロードします。このハックは永久EEPROMストレージへ置き換える予定です。マイクロコード生成はPythonスクリプトによって処理され、3つのAT28C64B EEPROM用にバイナリファイルを構築します。各EEPROMはopcode、フラグマスク、およびT‑stateビットに基づいて命令ごとに最大16ステップまでエンコードします。カスタムアセンブラ(
wcasm.py)は.wアセンブリ(6502風構文)をRAMロード用の生バイナリへ変換します。
残りの作業には、出力レジスタ(ディスプレイ)の追加、正しいHLTロジック、電源投入/リセット回路、オーバーフローから符号フラグへの置き換え、クロックデバウンスの改善、およびすべてのコンポーネントを単一PCBに統合することが含まれます。将来的には設計をFPGAへ移植することも検討されています。
オープンソースプロジェクトとして、WCPU‑1は教育、試作、およびホビイストの実験用に低コストプラットフォームを提供し、小規模な組込み開発慣行に影響を与え、さらなるカスタムCPUプロジェクトへのインスピレーションとなる可能性があります。
本文
WCPU‑1 – パート 3(組み立てと得られた教訓)
概要
この投稿では、Logisim‑Evolutionでシミュレーションした後に実際に物理的なWCPU‑1を構築し始めた時の出来事を詳述します。組み立ては、最終的なPCBレイアウトへ移行する前に設計と配線を検証するためのプロトタイプです。
1. 初期決定
- 全SMTパーツ – 表面実装部品のみを注文しましたが、ブレッドボードでテスト用にDIP版を持っておけば時間を節約できたことに後から気づきました。
- PCB戦略 – EEPROMプログラマ、汎用レジスタボード、制御モジュールの3枚をカスタムPCBsで作り、それ以外はブレッドボード方式としました。
- 教訓: ブレッドボードを使うなら、DIPチップを数個手元に置いておくべきです。
2. 主なボード
EEPROMプログラマボード
- ラップトップからマイクロコードROMをシリアルで書き込むことができます。
- Arduino Nanoクローンと2つのシフトレジスタでアドレス・データライン(OE/WE/CE含む)を駆動します。
- 問題点: 制御ピンにシフトレジスタを使用したため、書き込み速度が約1 byte/sに制限されました。
- 対策: OE、WE、CE を空いている GPIO に直接接続し、ページ書き込みで書き込み時間を ~80 s から ~1.3 s に短縮しました。
汎用レジスタボード
- 74HC377(オクタルD型FF)と74HC245トランシーバーを搭載し、三値バス接続を実現します。
- 備考: 74HC574 を使えば余分なトランシーバーを省けますが、内部 LED をデバッグ用に失うことになります。
制御モジュールボード
- 3枚の AT28C64B EEPROM が 24‑bit制御語を生成します。
- 主なバグ:
- PCBs が誤配送(再注文で解決)。
- CE ロジックが反転、デカップリングコンデンサが初期には無い。
- OE/WE ピンが浮き状態で、破損が発生。
- 36 LED をすべて逆に取り付ける必要があった(手間でした)。
3. 実際の問題
クロック
- パーフボード上にシングルステップスイッチ、555オシレータ、1 MHzクリスタルを組み合わせました。
- エッジ品質 が悪く、シュミットインバータを追加して立ち上がり・立下りエッジをクリーンにしました。
命令レジスタ / フラグ / T‑ステートタイミング
- すべて EEPROM に直接フィード。CLK の立ち上がりでロックすると途中で命令が乱れました。
- 解決策: IR と FLAGS を 74HC377 を通して CLK の立下り(=~CLK の立ち上がり)でクロックし、同期を取るようにしました。
EEPROM のグリッチ
- AT28C64B はアドレス変更後最大150 ns までグリッチします。
- 対策: 制御ロジックを同期化し、グリッチウィンドウ中はバスを無視するようにしました。
RAM タイミング / バス競合
- IS62C256AL は非同期で、書き込みは ~WE で有効。
- 問題: RI(RAM IN)が EEPROM から直接ドライブされていたため、ランダムなグリッチ時に RAM が書き込まれました。
- 対策: RI を ~CLK でゲートし、正しいタイミングでのみ書き込みが行われるようにしました。
4. 組み立てテクニック
- ワイヤーは単純にソリッドコアワイヤーをスプライスして結合。ケーブルの配線やストレインリリーフは設けませんでした。
- 結果: 接点抵抗が RC フィルタとなり、信号エッジがぼやけました。
- 推奨: 構造化されたワイヤリングを用い、可能ならオシロスコープで確認するべきです。
5. Arduino Mega ローダー(一時的)
- DIP スイッチで RAM にプログラムをロードし、その後回路中央に Arduino Mega を設置しました。
- Mega は RESET を低く引き、CLK をパルスさせながらバイトを書き込み、RESET を解放します。
- 欠点: EEPROM とのバス競合が発生、制御モジュールボードで OE ピンが露出していませんでした。
6. 今後の計画
- すべての Arduino を除去 → RAM を 128 バイトブロックに分割(RAM + ROM)。
- Sign フラグをオーバーフロー フラグに置き換え、ALU のフィードバックを向上。
- クロックモードスイッチをデバウンスし、クロック品質を改善。
- LED インジケータ付きの単一自己完結型 PCB を設計。
7. ツールチェーン
マイクロコードジェネレータ
- Python スクリプトで 3 個のバイナリファイル(
,rom0.bin
,rom1.bin
)を出力。rom2.bin - アドレスは以下の形式でエンコード:
(Sign, Zero, Carry フラグ; 6ビットオペコード; 4ビット t‑state)SZC IIIIII TTTT
アセンブラ (wcasm
)
wcasm
ファイルを入力し、生のバイナリとマシンコードを出力。.w- 2 パスで実装:コメント・空白除去 → ラベル解決 → オペコード発行。
8. 未実装機能
| 機能 | 状況 |
|---|---|
| 出力レジスタ(ディスプレイ) | 未構築 |
| 正しい HLT 処理 | 未配線 |
| 電源投入/リセットロジック | 未定 |
| オーバーフロー フラグ | 予定 |
| 完全デバウンスクロック | 予定 |
9. PCBWay の経験
- 良い点: 品質が高く、シルクスクリーンもクリア。リードタイムも速い。
- 悪い点: 1 バッチの誤配送があったが、再注文で迅速に対処。
総合的に見て、低ボリュームの趣味作りには非常に優れた選択肢です。
結論
WCPU‑1 の構築は、デバッグと EEPROM の微妙な挙動を学び、非同期 RAM タイミングをマスターする長い旅でした。プロジェクトから得た教訓は以下の通りです:
- プロトタイピング時には SMT と DIP の両方を手元に置くべき
- グリッチを避けるために制御信号を適切にゲートすること
- 信号品質を保つために構造化されたワイヤリングが不可欠
次のステップは PCB を最終化し、すべての Arduino を除去した後、WCPU‑2 へと進むことです。
読んでいただきありがとうございました!パート 4でまたお会いしましょう。