街机游戏机也可以可以做?手把手教你diy

2022-03-15     大方老师单片机

原标题:街机游戏机也可以可以做?手把手教你diy

街机游戏机也可以可以做手把手教diy

自制一个单片机,移nes游戏【梦幻之4】和街机游戏【恐龙快打】,这是我一直想要做的事,目前已经完成了第一步:自制单片(xmcu),游戏移植任重而道(有兴趣的小伙伴可以私信)

xmcu使用自创的指令集,开发语言为自创x语言。

关联

指令集

在创xmcu系统之前,我写过一riscv软核riscv指令集在我看来还不够精简,不够优雅,为此我创造了一套全新cpu指令(32 bit),命名x指令集x指令集的直接寻址空间512Mbit,间接寻址空间128Gbit,这对FPGA来说绰绰有余。

指令格式

x指令集追求极简和优雅,并且只有一种指令格式,指令格式如下所示:

cmd5 bit,指令类型。

type3bit,数据类型,8种数据类型。

imm24 bit,立即数,数据类型type指定。

为了提升指令优雅度,最新指令中移除了【延时槽】,数据相关性在硬件中处理

数据类型

指令压缩

x指令设计之初,只包6种数据类型type0 - type66种数据类型足以涵盖所有的软件代码行为,因此6种指令集已经是完备的。

为了进一步提升代码密度,引入了7种数据类型type7。在一些简单的函数中,能够压缩减66%的指令。

下面以程a = b + c为例,说明数据类7带来的压缩效果。

指令集描述

CPU架构

xmcucpu部分,采用非常简单的方式实现,因此硬件资源开销非常小。与传统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

·接口协 iicspiuart

中断响应

传统risc指令集cpu,普遍采用16/32个寄存器,在响应中断时需要备份这些寄存器到堆栈中,中断函数结束后需要恢复这些寄存器,中断响应速度比较慢。

x指令集中cpu仅使用3个临时寄存immhtempvar,中断响应不需要进行寄存器备份cpu只需要等待指令需要immhtempvar生命周期结束,即可立即跳转到中断函数,因xmcu的中断响应非常迅速,且开销非常非常小。

开发工具

xmcu的开发语言x语言,我x语言编写了一些工具,包含编译器、下载器、调试......,为了方便开发,我编写了一个简略的集成开发环境,整合xmcu开发过程中使用的工具集xmcu集成开发环境通过串口与硬件进行连接xmcu集成开发环境中内嵌了一个邮箱服务,可以在反馈界面发送反馈信息[email protected]m

应用示例

我基xmcu系统,编写了一个俄罗斯方块游戏,编程语言为自定义x语言,开发工具xide,运行平台为荔枝糖开发板,基于国FPGA(安路科技EG4S20BG256)

硬件开发板

游戏说明

·支持全触摸屏操作,触摸有特效

·游戏元素存储FLASH(开发板自带FLASH容量太小,我替换为了镁光128MbitFLASH)

·界面布&精灵元素采matlab生成,部分图片使用美图秀秀编辑

·我一个做美术的朋友给我定制了一套新的游戏主UI,我暂时还没替换,后续补上

·若干游戏的特效

游戏截图

实际游戏画面很精美,手机拍照技术太渣,拉低了画面水平

主程&编译结果

部分子模块

未完待续

文章利用空余时间不定时更...

文章来源: https://twgreatdaily.com/zh-hans/1c3ab2b6bf02df914aa0b45d068b3ad6.html