Basys3 FPGA上で動作するHackコンピュータの実装
本プロジェクトは、「コンピュータシステムの理論と実装(通称: Nand2Tetris)」で定義される Hackコンピュータアーキテクチャ をXilinx Basys3 FPGAボード上に実装したものです。SystemVerilog (IEEE 1800) で記述され、Vivado Design Suite向けに最適化されています。
Hackコンピュータは、16ビットのハーバード・アーキテクチャを採用した教育用プロセッサです。本実装では、以下の特徴を持ちます:
- 16ビット CPU: カスタムALU、Dレジスタ、Aレジスタ、プログラムカウンタを搭載
- メモリマップドI/O: スイッチ、ボタン、LED、7セグメントディスプレイを統合
- FPGA最適化設計:
- ROM → Distributed RAM (LUTRAM) として推論
- RAM → Block RAM (BRAM) として推論
- クロック分周回路による12.5MHz動作 (100MHz入力クロックから生成)
-
Hack CPU完全実装
- A命令 (即値ロード)
- C命令 (ALU演算 + 条件分岐)
- 7種類のジャンプ条件サポート
-
メモリシステム
- ROM: 4K words (12-bit アドレス空間) - 命令メモリ
- RAM: 16K words (14-bit アドレス空間) - データメモリ
-
ペリフェラルI/O
アドレス デバイス 方向 説明 0x6000SW[15:0] 読取 16個のスライドスイッチ 0x6001BTN[4:0] 読取 5個のプッシュボタン (C/U/L/R/D) 0x60027-Segment 書込 4桁7セグメントディスプレイ (BCD変換自動) 0x6003LED[15:0] 書込 16個のLED -
信号調整機能
- デバウンス回路 (約10ms安定化)
- CDC同期回路 (2段FFシンクロナイザ)
- FPGA: Xilinx Artix-7 (XC7A35T-1CPG236C)
- 評価ボード: Digilent Basys3
- 入力クロック: 100MHz (XDCで制約定義済み)
- システムクロック: 12.5MHz (1/8分周)
- タイミング余裕を確保するため低速動作
プロジェクトには3種類のサンプルプログラム (.hack バイナリ) が含まれています:
| ファイル名 | 説明 |
|---|---|
calculator.hack |
加減乗算対応の電卓アプリケーション (メイン成果物) |
math.hack |
乗算テストプログラム |
io_test.hack |
I/Oペリフェラル動作確認用 |
| デバイス | 役割 | 詳細 |
|---|---|---|
| SW[13:0] | 数値入力 | 0 ~ 16383 までの即値を14ビットバイナリで指定 |
| SW[15:14] | モード選択 | 00: 加算 / 01: 減算 / 10: 乗算 / 11: (未使用) |
| BTN_U | Load A | SW値を Val_A にロード |
| BTN_D | Load B | SW値を Val_B にロード |
| BTN_R | Execute | 現在のモード設定に従い演算を実行 |
| BTN_L | (予約) | 将来の機能拡張用 |
| BTN_C | Reset | システムリセット (CPU初期化) |
-
値Aの入力
- SW[13:0] に
123(バイナリ:00000001111011) をセット - SW[15:14] を
00(加算モード) に設定 - BTN_U を押下 → Val_A に 123 が格納
- SW[13:0] に
-
値Bの入力
- SW[13:0] を
456(バイナリ:00000111001000) に変更 - BTN_D を押下 → Val_B に 456 が格納
- SW[13:0] を
-
演算実行
- BTN_R を押下 →
123 + 456 = 579が計算される - 7セグメントディスプレイに
0579と表示
- BTN_R を押下 →
Hack ALUは乗算命令を持たないため、シフト加算アルゴリズム (Shift-and-Add) をソフトウェアで実装しました。
Basys3-Hack-PC/
├── rtl/ # RTL設計ファイル (SystemVerilog)
│ ├── basys3_hack_pc_top.sv # トップレベルモジュール
│ ├── hack_cpu.sv # Hack CPU実装
│ ├── hack_alu.sv # 16ビットALU
│ ├── hack_ram.sv # データメモリ (16K × 16bit)
│ ├── hack_rom.sv # 命令メモリ (4K × 16bit)
│ ├── memory_io_bridge.sv # アドレスデコーダ & I/Oブリッジ
│ ├── seven_seg_driver.sv # 7セグメントディスプレイドライバ
│ └── debouncer.sv # ボタンデバウンス回路
│
├── tb/ # テストベンチ (Simulation)
│ ├── system_tb.sv # システム統合テスト
│ ├── hack_cpu_tb.sv # CPU単体テスト
│ └── io_test_tb.sv # I/O検証テスト
│
├── sw/ # ソフトウェア (Hack Assembly)
│ ├── calculator.hack # 電卓アプリケーション
│ ├── math.hack # 乗算テストプログラム
│ └── io_test.hack # I/Oテストプログラム
│
├── xdc/ # 制約ファイル (Vivado XDC)
│ └── Basys3_Hack_PC.xdc # ピン配置 & タイミング制約
│
├── Basys3-Hack-PC.xpr # Vivado プロジェクトファイル
├── Basys3-Hack-PC.runs/ # ビルド出力ディレクトリ
├── Basys3-Hack-PC.sim/ # シミュレーション作業ディレクトリ
└── README.md # このファイル