街機遊戲機也可以可以做?手把手教你diy
自製一個單片機,移植nes遊戲【夢幻之星4】和街機遊戲【恐龍快打】,這是我一直想要做的事,目前已經完成了第一步:自製單片機(xmcu),遊戲移植任重而道遠(有興趣的小夥伴可以私信我)。
xmcu使用自創的指令集,開發語言為自創的x語言。
關聯
指令集
在創造xmcu系統之前,我寫過一個riscv軟核。riscv指令集在我看來還不夠精簡,不夠優雅,為此我創造了一套全新的cpu指令集(32 bit),命名為x指令集。x指令集的直接尋址空間為512Mbit,間接尋址空間為128Gbit,這對於FPGA來說綽綽有餘。
指令格式
x指令集追求極簡和優雅,並且只有一種指令格式,指令格式如下所示:
cmd:5 bit,指令類型。
type:3bit,數據類型,共8種數據類型。
imm:24 bit,立即數,數據類型由type指定。
為了提升指令優雅度,最新指令中移除了【延時槽】,數據相關性在硬體中處理
數據類型
指令壓縮
在x指令設計之初,只包含6種數據類型,type0 - type6,這6種數據類型足以涵蓋所有的軟體代碼行為,因此這6種指令集已經是完備的。
為了進一步提升代碼密度,引入了第7種數據類型,type7。在一些簡單的函數中,能夠壓縮減少66%的指令。
下面以程序a = b + c為例,說明數據類型7帶來的壓縮效果。
指令集描述
CPU架構
xmcu的cpu部分,採用非常簡單的方式實現,因此硬體資源開銷非常小。與傳統的risc指令集不同,在x指令集中,命令類型和數據類型是分離的,分別進行獨立的解碼,這在不增加硬體複雜程度情況下,極大的增大了指令的組合情況,使得指令能夠攜帶更多信息量。
面積與時序
x指令集的cpu裸核,目標器件Artix7,資源報告如下:
系統架構
xmcu的系統架構,包含如下模塊:
·片上雙端口ram
·x指令集的cpu
·中斷控制器irq
·系統調試器dbg
·內部總線ibus
·外部總線xbus
·硬體乘法器Hardware multiplier
·硬體除法器Hardware divider
·桶式移位器Barrel shifter
·存儲控制器Flash controller
·存儲控制器Sdram controller
·存儲控制器SDcard controller
·顯示控制器LCD controller
·定時器 Timer
·接口協議 iic、spi、uart
中斷響應
傳統的risc指令集的cpu,普遍採用了16/32個寄存器,在響應中斷時需要備份這些寄存器到堆棧中,中斷函數結束後需要恢復這些寄存器,中斷響應速度比較慢。
在x指令集中,cpu僅使用了3個臨時寄存器immh、temp、var,中斷響應不需要進行寄存器備份,cpu只需要等待指令需要的immh、temp、var生命周期結束,即可立即跳轉到中斷函數,因此xmcu的中斷響應非常迅速,且開銷非常非常小。
開發工具
xmcu的開發語言為x語言,我為x語言編寫了一些工具,包含編譯器、下載器、調試器......,為了方便開發,我編寫了一個簡略的集成開發環境,整合了xmcu開發過程中使用的工具集,xmcu集成開發環境通過串口與硬體進行連接。xmcu集成開發環境中內嵌了一個郵箱服務,可以在反饋介面發送反饋信息到[email protected]m。
應用示例
我基於xmcu系統,編寫了一個俄羅斯方塊遊戲,程式語言為自定義的x語言,開發工具為xide,運行平台為荔枝糖開發板,基於國產FPGA(安路科技的EG4S20BG256)。
硬體開發板
遊戲說明
·支持全觸摸屏操作,觸摸有特效
·遊戲元素存儲於FLASH芯片(開發板自帶的FLASH容量太小,我替換為了鎂光的128Mbit的FLASH芯片)
·介面布局&精靈元素采用matlab生成,部分圖片使用美圖秀秀編輯
·我一個做美術的朋友給我定製了一套新的遊戲主題UI,我暫時還沒替換,後續補上
·若干遊戲的特效
遊戲截圖
實際遊戲畫面很精美,手機拍照技術太渣,拉低了畫面水平
主程序&編譯結果
部分子模塊
未完待續
文章利用空餘時間不定時更新...
文章來源: https://twgreatdaily.com/zh-mo/1c3ab2b6bf02df914aa0b45d068b3ad6.html