Chapter 6 整合 65C02 CPU 及 ROM / RAM
6.1 整合 65C02 CPU 及 ROM (使用 Block RAM)
進度: 100% 8/4 (started on 2021/7/27)
* 關於 FPGA 內部 Block RAM 資料的參考文件: FPGA design usin VHDL - ROM implementation using block RAM
* Altera 建議使用內建的 IP, 透過 Quartus 的 MegaWizard Plug-In Manager, 使用 library of parameterized modules (LPM) 及 Soft IP MegaWizard Plug-In Manager, 但是遇到了幾個問題:
* 在 Quartus 的 menu - edit 無法找得到 MegaWizard Plug-In Manager. 解決方式: 選 menu - Tools - IP Catalog, 會在主畫面右側顯示 IP Catalog 子畫面, 選擇 (double click) Installed IP - Library - On Chip Memory - ROM 1-PORT
* 選擇 VHDL
* 選擇檔案儲存的目錄, 輸入檔案名稱, 要注意檔案名稱, 有錯誤時會提示 (我輸入 r65c02_rom_8kb.vhd)
* 這時候電腦反應很慢, 甚至當機, 查到intel 網頁說明 - MegaWizard extremely slow and unstable
# 原來執行
$ quartus
# 或是執行
$ /home/ubuntu/intelFPGA_lite/20.1/quartus/bin/quartus
# 會造成 MegaWizard 出問題, 應該改用以下執行方式
$ ssh -Y /home/ubuntu/intelFPGA_lite/20.1/quartus/bin/quartus
# 但是執行時, 出現問題
connect to host localhost port 22: Connection refused
# 這時候, 重新安裝一次 ssh
$ sudo apt-get install ssh
# 再執行一次
$ ssh -Y /home/ubuntu/intelFPGA_lite/20.1/quartus/bin/quartus
$
- 接下來, 設定 ROM: 1-PORT
- how wide: 8 bits
- how many 8-bits (menu 會隨著上一個設定而更新) words of memory: 32768 words
- 參考前面的 Apple II ROM Listings 的 APPLE2.ROM \(C000-\)FFFF 需要用到 20KB (還不清楚如何設定將 20KB 的資料映射到對的位址, 因為 Quartus 是先填 20KB, 再將其餘補零, 我們需要在前面的 12KB 補零, 20KB 的資料留在最後)
- 參考前面的 Apple II ROM Listings 的 APPLE2.ROM \(C000-\)FFFF 需要用到 20KB (還不清楚如何設定將 20KB 的資料映射到對的位址, 因為 Quartus 是先填 20KB, 再將其餘補零, 我們需要在前面的 12KB 補零, 20KB 的資料留在最後)
- Quartus 需要 ROM 的 hex 檔案是 intel hex 格式, 找到了個轉換程式 ARM Keil - BINARY to Intel HEX Converter Utility BIN2HEX.EXE 但只能在 Windows XP 下執行, 只得根據 How to Download and Install Windows XP for Free, 在 VirtualBox 建立個 Windows XP 的 VM, 雖然網路設定不通, 我只需要設定 shared folders 將 BIN2HEX.EXE 及 APPLE2.ROM 在 Windows XP 上執行即可產生 APPLE2.HEX.
- 因為 APPLE2.ROM 只有 20KB, 而 Quartus 上的 ROM 只能選 32KB, 因此 Quartus 會先把 APPLE2.ROM 的 20KB 填在前面, 後面補 0. 而我們需要的是前面補 0. 因此, 先修改 APPLE2.ROM, 先補上 12KB 的 0, 再執行一次 BIN2HEX.EXE, 這樣就對的上了.
- 執行 single step 時, 發現 CPU 讀到 ROM 的 data 會慢半拍, 原來, 我 ROM 的 clock 跟 CPU clock 一致造成的, 把 ROM 的 clock 拉到 FPGA 主頻率的 50MHz clk 來解決這問題.
- 照 Apple II 的 ROM 逐步執行, 發現 CPU 在 return 時, 跳到 0000h 的位址, 以為是哪裡有問題, 才注意到 jsr 的時候, CPU 先將目前的位址 push 到 1FF 的位置 (一開始還懷疑 CPU 的 soft core 設計有問題, 錯怪了), 但是我還沒有裝 RAM, return 時讀回來的是 0000h, 接下來就是安裝 RAM 了.
6.2 將 ROM data out 與 CPU data_in, data_out 連接, 且設定為 tri-state
進度: 100% 08/08 (started on 2021/08/05)
* 2021/08/08 - Connectoring CPU data_out and data_in with tri-state
6.3 整合 65C02 CPU 及 RAM (使用 FPGA IP)
進度: 100% 8/21 (started on 2021/8/4)
* 本來是想使用 QMTech 上的 DRAM, 看來幾天, 還是看不懂.
* 發現 FPGA 也是可以實現 RAM 的功能 (而且不需要設計 DRAM 必要的 refresh 線路), 參考intel VHDL Single Port RAM 設計
* 還沒搞清楚 single port 跟 dual port 的差異 (有 read/write 2 個 address port)
* 也沒搞清楚 synchronous 跟 asynchronus 的差異
* 先試範例的 single port ram
* 稍微改選範例程式, 因為原始程式 addr 的設定是 unsigned integer,
* 關於 VHDL Predefined Types from the package standard
* Integer : signed value
* Natural : unsigned value starting at 0
* Positive: unsigned value starting at 1
* 修改範例參考 FGPA4Student VHDL code for single port RAM,
addr: in natural range 0 to 32767;
-- 應該是配合 RAM 使用的定址方式 以 0 開始的 unsigned integer type
-- 改成以下
addr: in std_logic_vector(14 downto 0);
-- 存取到 ram 時, 需要做 type 轉換
ram(addr) <= data;
-- 從 std_logic_vector 轉成 unsigned integer
ram(to_integer(unsigned(addr))) <= data;
- 如果是倒過來, 應該用這個 function, # 不過, 我自己還沒驗證過.
my_vector <= std_logic_vector(to_unsigned(my_int, my_vector'length)));
- 整合進 r65c02_tc 時, Quartus 報錯, 無法容納 RAM size (32768 Bytes x 8 bits), 改成 16384 Bytes
6.4 整合 65C02 CPU 及 RAM (使用 QMTech 板上的 RAM) - 待完成
進度: 0% 8/21 (started on 2021/8/21)
* 把 FPGA 當 RAM 應該是太浪費了, (需要去了解 FPGA 做成 RAM 需要多少個 gates), 只能塞 16KBytes 的 RAM, 而 Apple II 需要 32KB RAM, 所以, 還是得試試用 QMTech 上的 RAM