数码之家

 找回密码
 立即注册
搜索
查看: 31324|回复: 203

[影音] 干一票大的!用FPGA制作红白机游戏烧录卡

    [复制链接]
发表于 2020-2-16 16:27:44 | 显示全部楼层 |阅读模式
本帖最后由 orsonzou 于 2020-2-20 15:32 编辑

鬼市真是一个神奇的地方,上次因为一个20元的屏幕大折腾一次之后(https://www.mydigit.cn/forum.php?mod=viewthread&tid=64326)。年前又在鬼市买了一个fpga开发板俺搞过单片机,soc,fpga这东西还真没搞过。于是开始了fpga的学习之旅!

这是鬼市买的黑金开发板:


但是fpga对于我这种电子达人,学习曲线还是相当陡峭的。

因为fpga对于硬件产品的开发实在是意义重大,相比于单片机,soc等,有更好的灵活性和性能,广泛应用于各行各业。作为一个电子达人,既然得到一块开发板,不深入一下怎么行呢?

在观摩了一系列的各种开发板的基础教程后,对fpga还是一脸懵逼。因为这东西对初学者实在是太不友好,开发环境复杂(各种jtag,示波器,逻辑分析仪等),对软件硬件的基础知识的要求非常之高。从基本的数字电路,到各种触发器,到寄存器,cpu,无一不是非常硬核的东西!

下图是初学资料,看了一大堆:


因为买的开发板太老,是altera cyclone 2的,应该是接近20年前的产品了。于是在网上买了一块国产(高云)fpga作为入门开发之用。这块板子小巧,能接屏幕,直接usb下载调试,也是非常方便。于是在提供的源程序基础上,改写了一些小程序出来。点亮个LED和屏幕,还算顺利。

国产的高云nano tang:


后来还买了BTC矿渣控制板,是Xilinx zynq 7010的。这货才是当今fpga的主流,其fpga+arm soc的架构,真是甩了Intel 接手后的Altera很多条街。具体关于xilinx zynq的东西以后有机会再说,反正就是强大得史无前例。

矿渣板:


目前我的fpga开发板集合:



在简单熟悉了tang nano和zynq的开发调试并驱动了LED流水灯之后,决定干一票大的。

之前帮人折腾各种老式游戏机的时侯,心想如果有软件辅助硬件维修该有多少。因为游戏机作为一套电脑系统,既复杂又相对电脑系统简单。电脑可以有各种诊断软件,但游戏机都只有一些游戏卡,没法完成各种自检级别的诊断。于是网上查了一下,还真有一些爱好者写的老游戏机的诊断软件,但是需要烧录或者固化到相应的卡上。于是萌生了自己用fpga做游戏卡的想法。
最简单的红白机的游戏卡叫NROM,只有两块ROM芯片,一片装32k程序,一片8k的图样。fpga上可以用ip核模拟ram rom等各种存储器,只要把相应的rom文件录入到fpga的rom ip核就可以了。

老的大黄卡:

于是在网上找了一个红白机测试程序,叫nestest.nes。nes文件格式简单,分离出程序rom和图样rom,然后用软件把二进制做成fpga开发软件识别的coe格式就行。

nes文件到coe文件的处理如下:



录入到fpga 的rom ip核:




于是开始电路设计等准备工作!

手上3块fpga开发板,但是他们的io都不够,因为红白机的卡槽是60脚,去掉一些不必要的,关键的信号也是50来条。3块板子的fpga的io引脚都是不够的。于是买了一块xilinx spartan6的最小系统开发板,全新包邮40元。

xilinx spartan6的最小系统开发板:


因为xilinx spartan6也是10年前的产品了,开发软件ise也是很老,软件能在xp上用。相对现在的xilinx vivadoo真是难用很多,不过基本的该有都有。对于我来说,io和基本ip核够用就好。

游戏烧录卡这个项目主要分软件和硬件部分,一方面设计硬件制作电路板,一方面是用ISE做fpga程序代码,写一些模拟测试。最后合并起来就行了。

spartan6是3.3v的电平标准,红白机是5v的电平标准。加上这么多io引出,用洞洞板肯定是不行的。于是开始了第一次pcb的设计制作,因为是头一次,这个过程也是一波N折。

电路不复杂,主要就是用总线收发器做5v和3.3v的电平转换。选了半天,用了3片74lvch162245,1片245,才够50多条。一片负责cpu 地址线(15位),一片负责ppu地址线(14位),一片负责cpu 数据和ppu数据(8位+8位),245负责控制总线。

到货的芯片:



第一次做,就用最简单嘉立创的EDA软件,从画电路图到PCB到下单一体。功能简单,适合初学者。

下图是电路和PCB设计:





第一次打样板子回来后,发现有不可更改的电路设计错误。于是打样第二次
下图是第一次打样后焊接的成果,因为错误,都废了:










第二次打样中间隔着春节,回来后是这样:



一阵焊接猛如虎,焊完之后,漂亮,不过这是理想中的样子:




但是最后实际因为电路设计的一些错误,PCB设计的语一些错误,最后的电路是这样,擦!!!丑得一比:




这就是理想和现实的差距,还好错误是可以通过飞线弥补的。也懒得再打样了,耽误事儿,所以就先这样吧!
第一次上机联调是紧张的,忐忑的,也是注定失败的。因为这东西软硬结合,各种总线,信号一堆,真是头大得一比。基本上来说,就是接示波器看数据总线上连个毛线都没有,一片空白。。。这东西的第一次,真是太难了。

下面是ISE软件界面:


不放弃的我,研究如何用调试fpga,用示波器肯定不行,因为信号太多,而且也没法知道具体的数据。fpga开发工具都能用jtag实时调试的,这样就可以用fpga的视角来看到具体实际的波形和数据究竟是什么。ISE的ChipScope就是ISE自带的调试工具,一阵学习后,各种信号,数据,一目了然。至少知道了红白机给fpga发了什么,fpga收到什么,fpga又回给红白机了什么。

折腾几天后,总于能在ChipScope看到数据和已经根据预设的逻辑,收发了一些数据,虽然数据都是些莫名其妙的,但是至少有数据流动了。

既然是一些莫名奇妙的数据,那就该知道正确的应该是什么。研究了一些红白机CPU上电后的一些资料,知道会访问内存FFFC和FFFD(实际是ROM的3FFC/3FFD,因为红白机只用15条地址线)的reset程序指针,然后转向这部分程序,开始执行。于是在ChipScope中设定cpu地址线上的地址,在3FFC上触发,并记录波形。

红白机模拟器的调试界面,可以看到内存和指令,红框部分是reset的中断例程入口和代码:




以上是理想的猜测,但是实际上,数据都是莫名奇妙的。。。不停的通过ChipScope找原因,发现数据的错误来自于fpga的50Mhz主频太高,对红白机的1到2兆的波形造成一些误读。于是修改fpga程序,自己为适应红白机cpu的1.66Mhz频率做了一些分频处理,于是第一次能收发一些正确的数据了。

如图可以看到数据总线上出现了3FFC/3FFD的地址,并在数据总线上出现了相应地址的正确的内容。。。但这个只是一个美好的开始,理论上要从这两个地址指向的内存开始读取和执行,但是并没有。。。这个找了好久,最后发现是我的程序和电路设计都是错误。我用fpga输出High Z来退出对数据总线的占用。但是因为有电平转换芯片的使用,所以还要用总线收发芯片的OE引脚来确保对数据总线的占用。相当于fpga一直占用数据总线,导致红白机CPU对机内其它设备,内存的存取被影响了。
找到问题之后飞线,用fpga控制74lvch162245的OE引脚,程序增加了cpu_data_oe和ppu_data_oe的控制。

飞线补上了cpu和ppu的data OE引脚:


搞定之后,ChipScope现实数据地址和数据线读取了3FFC/3FFD,并执行了3FFC/3FFD指向的reset例程部分,程序可以运行了!

第一次成功运行程序的波形:


但是,但是。。。ChipScope可以看到,运行一阵后,数据核地址总线都是全高电平了。这说明程序跑飞了,cpu处于死机状态。

用ChipScope看到波形还是有很多干扰,我怀疑是排线的串扰问题。于是在芯片旁加入了退偶电容抗干扰。果然一击奏效。。。汗)。波形看到cpu的执行地址在270-290之间循环,结合模拟器反汇编看到的。应该是在等待输入之类的地方了。

第一次程序不跑飞的波形:


接上屏幕一看,有画面了!!!虽然残缺不全,但是总算是一个巨大的进步!

残缺的画面:




然而这个残缺不全的画面,以为成功将近。。。但竟然又让我折腾了好几天!
直接说结论好了,红白机ppu的地址数据总线分时复用的ALE信号,造成了数据的干扰。fpga程序上,用另外分频出来的时钟和一些逻辑来确保数据的正确性,这说得简单,搞了3天,其中包括研究ALE这一堆知识。

示波器看到的数据干扰:


示波器看到的ALE,和干扰同步,证明是ALE产生的:


ChipScope看到的干扰,严重扰乱了数据:



红白机的ALE和51单片机的ALE,类似。。。那个年代,管脚不够用,所以总搞复用:





最后,终于,终于,终于,第一次出来完整画面时侯的心情是复杂和骄傲的:
小屏幕是上次折腾的产物(https://www.mydigit.cn/forum.php?mod=viewthread&tid=64326),这次派上用场。屏幕内容是正确的nestest.nes程序:



测试烧录了其它几个游戏,又遇到问题。有些游戏有第一画面,有些没有背景只有前景。研究发现是横向滚动核纵向滚动的游戏,对VRAM的访问地址,需要用跳线来设定,是访问2400还是2C00。开关加上后,顺利测试了几个游戏。到这里,这个项目基本完成了。

加上了H/V开关,开关好丑,凑合用:


烧录的90坦克:



烧录的超级玛丽:





杂乱的桌面:




spartan6开发板,LED分别是fpga,程序rom,图样rom的工作灯,读取的时侯会闪动:


xilinx的jtga连接器:


fpga的烧录界面:






作为家长,顺势给娃上了一课,什么叫不放弃,什么叫专研精神。。。然而,娃只想快点打超级玛丽。。。。


熟悉红白机的朋友都知道,FC只能访问32K的程序ROM空间和8K的图样ROM,因为数据线就那么多。然后任天堂在后续推出了无数的大容量游戏,他们使用了各种奇巧淫技来将有限的地址线扩展成更大的程序空间,以达到推出更大容量游戏的目的。他们的方法就是用各种MMC(mapper)芯片,通过各种对地址和数据的访问组合,来预设高位地址线的,从而欺骗CPU。对这方面感兴趣的同学可以自行查阅上百种的mapper。而我的fpga程序,只支持最简单的mapper0,也就是32K程序+8K图样的。对于各种mapper的支持,对fpga来说,也是很好实现的!这个以后再说了!

好了,感谢您看到这里!此刻病毒肆虐,我们必须利用时间,坚持学习。也向奋战在一线的医务和科研工作者表示致敬!感谢观看!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

打赏

参与人数 57家元 +931 收起 理由
音乐小麦 + 8
stdzlqz + 20
钟焘 + 4 優秀文章
疯狂石头 + 1 看不懂!五星好评!
链接 + 20
玛德陛下 + 20 謝謝分享
泥沙俱下 + 20 謝謝分享
vip2128 + 30 原創內容 大神
happyssy + 1 優秀文章
rallyezhang + 20 原創內容 有点厉害

查看全部打赏

发表于 2020-2-16 16:43:56 | 显示全部楼层
高手。顶一下。
回复 支持 反对

使用道具 举报

发表于 2020-2-16 16:58:19 | 显示全部楼层
这个牛逼,不得了,
回复 支持 1 反对 0

使用道具 举报

发表于 2020-2-16 16:58:51 来自手机浏览器 | 显示全部楼层
牛掰,绝世好贴,坐等版主加精
回复 支持 反对

使用道具 举报

发表于 2020-2-16 17:04:03 | 显示全部楼层
再打一版,全集成,USB直接烧录
回复 支持 1 反对 0

使用道具 举报

发表于 2020-2-16 17:08:14 | 显示全部楼层
真不错,我记得原来买过一张游戏模拟的光盘。不知道能不能烧录进去。
回复 支持 反对

使用道具 举报

发表于 2020-2-16 17:27:09 | 显示全部楼层
大神请收下我的膝盖
回复 支持 反对

使用道具 举报

发表于 2020-2-16 17:27:49 | 显示全部楼层
给楼主的钻研精神点赞。楼主的K2P有根5G天线要遮挡电视画面,然后让它躺下了!
回复 支持 反对

使用道具 举报

发表于 2020-2-16 17:47:25 | 显示全部楼层
怎么这么厉害
回复 支持 反对

使用道具 举报

发表于 2020-2-16 17:57:58 | 显示全部楼层
文宇群友来顶贴。我就想说,你这浪费,心不会痛吗?!
回复 支持 反对

使用道具 举报

发表于 2020-2-16 18:37:16 | 显示全部楼层
能玩的动FPGA都非等闲之辈~
回复 支持 2 反对 0

使用道具 举报

发表于 2020-2-16 18:39:56 | 显示全部楼层

牛掰,绝世好贴,坐等版主加精
回复 支持 反对

使用道具 举报

发表于 2020-2-16 19:42:43 | 显示全部楼层
折腾回我的童年了
回复 支持 反对

使用道具 举报

发表于 2020-2-16 20:13:32 | 显示全部楼层
初学就能把FPGA弄成花花,厉害了!
回复 支持 反对

使用道具 举报

发表于 2020-2-16 22:58:33 来自手机浏览器 | 显示全部楼层
厉害!楼主这种勇往直前刻苦钻研的精神非常值得敬佩!学习!
回复 支持 反对

使用道具 举报

发表于 2020-2-16 23:18:01 来自手机浏览器 | 显示全部楼层
能玩懂FPGA,有一定的技术功底,我也很早就想学了,但一直没有行动,
回复 支持 反对

使用道具 举报

发表于 2020-2-16 23:46:10 来自手机浏览器 | 显示全部楼层
楼主就是好榜样的代表!
回复 支持 1 反对 0

使用道具 举报

发表于 2020-2-16 23:52:10 | 显示全部楼层
大神!膜拜!!锲而不舍的精神值得学习:lol:
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-17 15:03:18 | 显示全部楼层
cn21sky 发表于 2020-2-16 17:57
文宇群友来顶贴。我就想说,你这浪费,心不会痛吗?!

浪费了啥?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-3 11:54 , Processed in 0.187201 second(s), 14 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表