|
本帖最后由 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
打赏
-
查看全部打赏
|