Chapter 4 用 FPGA 模擬 6502 開機
進度: 100% 7/19 (2021/7/15 started)
* 2021/7/15: 收到 Ben Eater 的 6502 CPU kit, 完成開機
* 2021/7/17: 下載 65C02 CPU VHDL 程式到 QMtech Cyclone IV Starter kit, 還不確定是否運作正常, Address bus 沒有訊號
* 2021/7/18: 將 65C02 VHDL code 下載到 QMtech Cyclone IV Starter kit 用 breadboard 接出來看訊號
* 2021/7/19: 用 Arduino Mega 2560 可以看得出 FPGA 上的 6502 power on 從 FFFC:FFFD 開始執行
之前的動作都是站在巨人的肩膀上實作, 接下來就要靠自己了.
4.1 用 FPGA 模擬 6502 CPU
- 到 FPGA-Based 6502 Processor in VHDL 下載檔案
- 失敗
- 失敗
- 改用另一個設計 OpenCores.org - cpu65c02_true_cycle
- 有好幾個檔案, top level 是 r65c02_tc
- 有好幾個檔案, top level 是 r65c02_tc
- 解壓縮後, 到目錄 cpu65c02_true_cycle/trunk/released/rtl/vhdl 下, 會有好幾個 .vhd 檔案, 找到 r65c02_tc.vhd (一開始, 有幾次在 r65c02_tc.vhd 或 core.vhd 間掙扎, 熟悉了 VHDL 的 hierarchical 架構才找到 r65c02_tc 是 top level)
- 打開 Quartus
- 建立新的 project, 命名為 r65c02_tc (project 名稱得跟 r65c02_tc.vhd 定義的 entity r65c02_tc 同名)
- 到 Quartus 的 Processing - Start Compilation
- 到 Quartus 的 Assignments - Pin Planner
- 設定以下的 pin definition
- 將 I/O Standard 全部設定為 3.3-V LVTTL
- 設定以下的 pin definition
- Pin Planner 後需要再一次 Quartus 的 Processing - Start Compilation
- 到 Tools 的 programmer
- 類似 Ben Eater 的 6502 Hello World 接上 Arduino Mega 2560, Mega 2560 接腳圖 可以看得到 6502 power on sequence 從 FFFC:FFFD 位址開始
Cyclone IV EP4CE15F23C8N
6502 CPU pin name / no. | PCB | PCB pin | FGPA location | FPGA PIN |
---|---|---|---|---|
A15 / pin / output | J12 | 33 | A10 | IO,DIFFIO_T14N |
A14 / pin | J12 | 31 | A13 | FPGA J12 pin 31 的 A14 燒掉, 暫時改成 JP1 pin 6 的 B7 |
A13 / pin | J12 | 29 | A14 | FPGA J12 pin 29 的 A13 燒掉, 暫時改成 pin 35 的 A9 |
A12 / pin | J12 | 27 | A15 | |
A11 / pin | J12 | 25 | A16 | |
A10 / pin | J12 | 23 | A17 | |
A9 / pin | J12 | 21 | A18 | |
A8 / pin | J12 | 19 | A19 | |
A7 / pin | J12 | 17 | A20 | |
A6 / pin | J12 | 15 | C17 | |
A5 / pin | J12 | 13 | C19 | |
A4 / pin | J12 | 11 | C20 | |
A3 / pin | J12 | 9 | F20 | |
A2 / pin | J12 | 7 | H20 | |
A1 / pin | J12 | 5 | B22 | |
A0 / pin | J12 | 3 | C22 | |
clk_clk_i / pin / input | J12 | 36 | B9 | B9 unconnected, use internal clock source clock_out |
irq_n_i / pin / input | J12 | 34 | B10 | |
nmi_n_i / pin / input | J12 | 32 | B13 | |
rdy_i / pin / input | J12 | 30 | B14 | FPGA J12 pin 30 的B14 燒掉, connected to Vcc, 暫時先接到 J12 pin 24 B17 |
rst_rst_n_i / pin /input | J12 | 28 | B15 | |
so_n_i / pin / input | J12 | 26 | B16 | |
D7 / pin / input | J12 | 18 | B20 | |
D6 / pin / input | J12 | 16 | D17 | FPGA J12 pin 16 的 D17 燒掉, 暫時改成 pin 22 的 B18 |
D5 / pin / input | J12 | 14 | D19 | FPGA J12 pin 14 的 D19 燒掉, 暫時改成 pin 20 的 B19 |
D4 / pin / input | J12 | 12 | D20 | |
D3 / pin / input | J12 | 10 | F19 | |
D2 / pin / input | J12 | 8 | H19 | |
D1 / pin / input | J12 | 6 | B21 | |
D0 / pin / input | J12 | 4 | C21 | |
:———————- | :—- | :———– | :————– | :——— |
rd_o / pin / output | JP1 | 5 | A7 | |
sync_o / pin / output | JP1 | 7 | A6 | |
wr_n_o / pin / output | JP1 | 9 | A5 | |
wr_o / pin / output | JP1 | 11 | A4 | |
Result (Clock step debounce) | unconnected, 訊號接到 clock_out | |||
Clock | T2 | unconnected, debounce clock 輸入, 接到 50MHz T2 訊號 | ||
Clock 1Hz | unconnected, 訊號經過邏輯運算接到 clock_out | |||
Clock 1MHz | unconnected, 訊號經過邏輯運算接到 clock_out | |||
sw2_in | JP1 | 13 | A3 | |
sw1_in | JP1 | 14 | B3 | |
clock_out | JP1 | 15 | B1 | |
Button (for step clock) | JP1 | 16 | B2 | |
Clock_reset_n | JP1 | 17 | C1 | connected to Vcc |
:———————- | :—- | :———– | :————– | :——— |
d_o[0-7] / pin / output | J10 |