- Game Bub là một thiết bị cầm tay mô phỏng retro dựa trên FPGA mã nguồn mở, hỗ trợ các trò chơi "Game Boy, Game Boy Color, Game Boy Advance"
- Có thể sử dụng băng game vật lý, đồng thời cũng chạy được các trò chơi được mô phỏng thông qua tệp ROM lưu trên thẻ microSD
- Trước đây chưa có trình mô phỏng FPGA mã nguồn mở nào có thể chạy được băng game thật như vậy, và một trong những mục tiêu chính là tự tay thực hiện mọi thứ để có thể hiểu rõ toàn bộ các thành phần
- Vì vậy, tác giả đã tự thiết kế PCB, viết firmware, xây dựng trình mô phỏng Game Boy và Game Boy Advance cho FPGA (dùng Chisel HDL), đồng thời thiết kế cả vỏ in 3D
- Hỗ trợ Game Link Cable nên cũng có thể chơi nhiều người ở chế độ GB và GBA
- Bao gồm các tính năng như xuất HDMI (qua dock), motor rung, đồng hồ thời gian thực, và được thiết kế để có thể mở rộng thêm bằng các bản cập nhật phần mềm sau này
- Thiết bị dựa trên PCB 6 lớp tích hợp Xilinx XC7A100T FPGA, được đóng gói trong một vỏ tùy chỉnh in 3D
Mục tiêu dự án
- Tạo ra một thiết bị cầm tay FPGA dùng pin sạc độc lập
- Giảm thiểu chi phí và độ phức tạp, sử dụng linh kiện thương mại nhiều nhất có thể
- Có thể chạy game Game Boy / Game Boy Color / Game Boy Advance
- Hỗ trợ băng game vật lý và tệp ROM trên thẻ microSD
- Cung cấp UI trực quan và overlay trong game
- Tích hợp màn hình, loa và ngõ ra tai nghe
- Hỗ trợ xuất HDMI
- Tính đến khả năng mở rộng trong tương lai (hỗ trợ hệ máy khác, Wi‑Fi, v.v.)
- Tự phát triển lõi mô phỏng FPGA, đồng thời tự thiết kế phần cứng và driver để có thể hiểu hoàn toàn hệ thống
Góc nhìn về retro gaming dựa trên FPGA
- Nhận định rằng "chơi game trên FPGA chính xác hơn mô phỏng phần mềm" là một cách tiếp thị bị phóng đại
- FPGA cũng là một trình mô phỏng, và chỉ hoạt động chính xác đến mức nó được lập trình
- Trình mô phỏng phần mềm cũng có thể đạt độ chính xác rất cao và có tính tiếp cận tốt
- Ưu điểm lớn nhất của trình mô phỏng dựa trên FPGA là dễ kết nối với phần cứng vật lý (băng game, cáp link, v.v.)
Tổng quan thiết kế phần cứng
- Cấu trúc FPGA + vi điều khiển (MCU): FPGA đảm nhiệm mô phỏng cốt lõi, còn MCU xử lý UI, nạp ROM, quản lý điện năng, v.v.
- Hỗ trợ Wi‑Fi và Bluetooth: dùng mô-đun ESP32-S3 (tuy nhiên không hỗ trợ Bluetooth Classic)
- Màn hình: LCD 320x480 3,5 inch (có thể phóng to màn hình game lên gấp 2)
- Pin và quản lý điện năng: pin lithium-ion, dùng IC sạc TI BQ2407x, kèm IC đo mức pin MAX17048 để theo dõi trạng thái nguồn
- Âm thanh: dùng codec âm thanh TLV320DAC3101, hỗ trợ xuất stereo và điều chỉnh âm lượng kỹ thuật số
- Thiết bị nhập liệu: sử dụng loại nút bấm có độ nảy tốt từng dùng trên GBA SP để mang lại cảm giác điều khiển tốt
- Bộ nhớ: sử dụng 32MB SDRAM để lưu ROM được mô phỏng
- Cổng băng game và cổng link: có thể kết nối trực tiếp băng game thật, kèm tính năng nhận biết chuyển đổi GBA/GBC
- Các tính năng khác: tích hợp IMU (cảm biến chuyển động), đồng hồ thời gian thực (RTC), motor rung
Thiết kế và kiểm thử PCB
- PCB được thiết kế bằng KiCad
- FPGA (Artix-7) dùng gói BGA nên được thiết kế trên PCB 6 lớp
- Ở bài kiểm tra nguyên mẫu đầu tiên, phần lớn các chức năng hoạt động bình thường, dù phát hiện một số vấn đề về quản lý điện năng
- Sau khi thử nghiệm ban đầu bằng MicroPython, firmware cho MCU được viết bằng Rust
Phát triển GUI và firmware
- GUI nền tảng Rust được triển khai bằng framework UI Slint
- Tối ưu tốc độ cập nhật LCD, và thiết kế để FPGA trực tiếp điều khiển màn hình thay vì MCU
- Bổ sung tính năng truyền dữ liệu bằng TinyUSB để microSD có thể được nhận diện như USB Mass Storage
Bổ sung hỗ trợ Game Boy Advance
- Triển khai CPU ARM7TDMI (kiến trúc pipeline 3 giai đoạn)
- Triển khai trực tiếp các thành phần phần cứng GBA như PPU, DMA, timer, âm thanh trên FPGA
- Để hỗ trợ băng game vật lý, đã phân tích giao thức bus đặc thù của GBA và tái tạo lại trên FPGA
- Hỗ trợ multiplayer GBA-GBA qua cáp link và kết nối với GameCube
Bản sửa đổi phần cứng thứ hai
- Thiết kế lại bo mạch và vỏ để áp dụng thiết kế mỏng hơn và công thái học hơn
- Điều chỉnh vị trí nút bấm để mang lại cảm giác thao tác tương tự GBA SP
- Loại bỏ cổng HDMI, thay vào đó thiết kế dock tùy chỉnh dựa trên USB-C để bổ sung xuất HDMI và hỗ trợ tay cầm
- Chế tạo riêng kính phủ màn hình LCD để tạo ra thiết kế cao cấp hơn
Thiết kế dock và xuất HDMI
- Dock được thiết kế theo cách xuất tín hiệu HDMI tùy chỉnh thông qua cổng USB-C
- Sử dụng MCU nền Raspberry Pi Pico W để có thể hỗ trợ tay cầm không dây
- Dock còn cung cấp chức năng USB hub để kết nối cả tay cầm có dây
Kế hoạch tương lai và khả năng mở rộng
- Hoàn thiện dock và triển khai hỗ trợ tay cầm Bluetooth
- Tiếp tục cải thiện độ chính xác của trình mô phỏng Game Boy Advance với mục tiêu vượt qua các bài kiểm tra của mGBA
- Nghiên cứu mô phỏng cáp link không dây (triển khai GBA Wireless Adapter dựa trên Wi‑Fi)
- Xem xét hỗ trợ thêm các tính năng như giao tiếp hồng ngoại Game Boy, cảm biến ánh nắng của Boktai, Game Boy Camera
Danh sách mong muốn cho việc sản xuất (nếu có thể sản xuất hàng loạt)
- Tấm nền LCD tùy chỉnh độ phân giải 720x480 (có thể phóng to GBA gấp 3)
- Vỏ đúc phun và nút bấm chất lượng cao
- Pack pin tùy chỉnh (tối ưu hiệu quả sử dụng không gian bên trong)
- Sử dụng SRAM và SDRAM dạng BGA (giúp thiết kế PCB nhỏ hơn)
Mã nguồn mở và tài liệu tham khảo
- Mã nguồn và sơ đồ mạch của dự án: GitHub
- Tài liệu phần cứng Game Boy và GBA: Pan Docs, GBATEK
- Công cụ mã nguồn mở: KiCad, FreeCAD, Chisel, Verilator, Slint, v.v.
Tổng kết
- Game Bub không chỉ là một máy chơi game retro đơn thuần, mà là một dự án đầy tham vọng nhằm mở rộng khả năng của mô phỏng dựa trên FPGA
- Trong tương lai, dự án sẽ tiếp tục phát triển cùng cộng đồng mã nguồn mở bằng cách bổ sung nhiều tính năng mở rộng khác nhau
3 bình luận
Trước giờ cũng có kiểu làm thủ công tại gia bằng FPGA rồi chỉ những người trong giới biết mới trao đổi mua bán với nhau, không ngờ lại còn có cả bản mã nguồn mở nữa. Thú vị thật.
Đúng là họ đã tự triển khai cả CPU bằng FPGA!, tôi tò mò về số lượng dòng code nên tìm thử thì hóa ra... có vẻ có thể lập trình FPGA bằng Scala chứ không phải kiểu như Verilog. Đơn giản hơn tôi tưởng nên khá bất ngờ.
https://github.com/elipsitz/gamebub/…
Bảo là trong những người mê thì fan Tây mới là đỉnh của đỉnh... haha
Ý kiến trên Hacker News
Dự án này thật sự rất tuyệt. Bài viết blog được viết rất kỹ lưỡng nên đọc rất thích. Tôi đã tự hỏi liệu nó có thể kết nối với GameCube hay không, và hóa ra điều đó đã được nhắc đến trong blog rồi
Cảm ơn vì dự án tuyệt vời và bài viết rất hay. Tôi rất thích những thứ như thế này
Tôi có một chiếc Analogue Pocket, nhưng việc nó dùng FPGA không có nhiều ý nghĩa với tôi. Tôi tự hỏi liệu so với giả lập bằng phần mềm thì khác biệt có thực sự lớn không
Tôi tự hỏi tổng chi phí của PCB sau khi gắn linh kiện là bao nhiêu. Chắc khoảng 60-70 thôi
Tôi thích phần cứng mã nguồn mở, nhưng vẫn băn khoăn chuyện gì sẽ xảy ra khi linh kiện bị ngừng sản xuất
Vấn đề MISO của display controller vốn nổi tiếng tai tiếng. Tôi đã gặp nó lần đầu vài năm trước. Người ta thường khuyến nghị dùng tri-state buffer trên đường chip select hoặc tách riêng bus
Tôi không có kinh nghiệm phần cứng nên có thể đây là suy nghĩ ngớ ngẩn, nhưng các hệ máy cũ như NES, SNES, Genesis tương đối đơn giản. Bằng sáng chế cũng có thời hạn. Tôi thắc mắc vì sao không có một bản tái tạo phần cứng dùng SoC để giả lập gần như hoàn hảo những hệ thống này. Có vẻ các dự án FPGA là thứ gần nhất, nhưng FPGA lại đắt so với các thiết kế CPU 40 năm tuổi và 1kb RAM
Dự án rất tuyệt. Việc UI được xây bằng Rust và Slint thực sự rất hay. Đó cũng là framework GUI mà tôi đang làm việc
Quá tuyệt vời. Tôi không rõ tác giả có giải thích lý do chọn bố cục dọc hay chưa. Trong không gian FPGA hiện tại, hầu như mọi thứ đều theo kiểu GBC. Tôi tò mò không biết đó là sở thích cá nhân hay còn lý do nào khác
Một bài viết xuất sắc. Tôi không quá quan tâm đến máy chơi game cầm tay, nhưng luôn hứng thú với các quyết định thiết kế hiện nay liên quan đến màn hình, vỏ máy, nguồn pin và kết nối. Việc tích hợp Pico W rất hay. Đó là một trong những hạng mục phát triển bị đánh giá thấp trong vài năm gần đây. Cảm ơn vì đã chia sẻ