街机游戏机也可以可以做?手把手教你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-hans/1c3ab2b6bf02df914aa0b45d068b3ad6.html