如果你去了Hackaday Supercon 2019,你可能会看到有人和徽章一起徘徊,这太重了。那是我!徽章是一个游戏机,我的FPGA供电的手持游戏控制台。随着年多年前的博客帖子证明,我一直在考虑长时间建造Gameslab,在过去的几个月里,我终于做到了。在这篇文章中,我将解释一个究竟究竟是什么是一个游戏机(游戏板,播放游戏的砖块,或者播放游戏的对象),为什么我建立一个,它是什么,以及我如何实现它。
GamesLab是一种根据Xilinx Zynq FPGA-ARM Cortex A9 Combo SoC的定制设计的手持式游戏机。 FPGA结构意味着游戏和应用程序可以带来自己独特的硬件来加载到织物中。例如,2D侧面滚动的ShooTer可以加载硬件以在屏幕上加速绘图和动画精灵。或者,GameBoy仿真器可以将GameBoy的CPU和外设加载到FPGA面料中以“成为”GameBoy而不是在软件中模拟它。
GamesLab是使用开源基伙车设计的(甚至是痛苦的高速DDR3接口)设计。 STM32L0车载基于RTFM RTOS运行嵌入式锈蚀固件。 Zynq Bootloader是DAS U-Boot的Ported Brnach,使用辅助程序加载器(SPL)来避免使用Xilinx的FSBL。 Bootloader加载自定义编译的MainLine Linux内核版本4.12(不是Xilinx树),其中包含FPGA结构中的自定义硬件的驱动程序。 Micro-SD卡包含自定义构建的Debian Root Image:Slabos :)。下面的游戏和上面的地形演示是我在FPGA结构中测试的USERSPACE应用程序,以测试FPGA结构中的硬件。
当我还是个孩子时,我学会了编程,因为我想制作游戏(Visual Basic 6,Woo!)。制作游戏工作的内部机制总是比游戏自己更加着迷,最终我发现了游戏跑步的硬件更有趣。游戏倾向于将有限的硬件推向最大的硬件,以产生比赛在你没有弄清楚之前的特殊效果或现实主义。几年前,我建造了一个基于ARM CPU,双端口RAM和一些微控制器的控制台。从那以后,我开始使用FPGA(如果您想学习FPGA,令人敬畏的谈话),我希望长时间建立一个基于FPGA的游戏机。我认为每个游戏都可以带来自己的专业化硬件的想法是超级有趣的。
当3月我发现一家eBay销售Xilinx Zynq XC7Z035芯片,翻新的供应商进行翻新,以获得非常合理的价格为120美元。如果你看看Digikey,这些芯片通常非常昂贵,少量昂贵,如1700美元昂贵。并且它们具有昂贵的原因,这些是具有双臂Cortex A9 CPU核和275K逻辑元件的真正巨大的部件(可适合多个数十个Gameboys,供参考)。
卖家表示,他们被“翻新”,我认为他们的意思是他们被从一些PCB中删除,清理过,并扣除。从中国eBay销售的部分实际上它非常常见。我听说有人在卓越的超声中开玩笑,“在Digikey上你可以在剪纸或华夫饼干上购买零件;来自中国,您可以订购Cut-PCB“。对于昂贵的筹码,很多时候你只需用你想要的芯片购买一块PCB!
用巨大的FPGA手中,我不能再推迟了GamesLab。此外,我需要将董事会放在一起,看看这些部件是否在我的易趣审查期结束之前是合法的。
GamesLab在材料清单上有大约360个零件,使其成为我设计的最复杂的董事会。电路板大致分为几个子系统:
GamesLab由锂聚合物电池组供电,通过USB Micro千斤顶充电。由于TI BQ24250 IC管理电池,USB插孔还可以在运行时为系统供电。在下面的示意图中,您还将注意到电池低侧的STC3115电池燃气表(不要复制此原理图......我还没有测试过!)。并且,在原理图的顶部,有一个电流感测放大器,用于所有其他转换器的主系统轨道。我并没有真正知道从这个FPGA期望的功耗,因为它也很高度依赖于在结构中配置的内容,因此我将仪器放在所有电压轨上。
来自BQ2425050的轨道驱动LDO供电,为STM32L073系统主管,四个单独的开关稳压器为1.0 V,1.5 V,1.8 V和3.3 V轨道,LCD背光驱动器和5 V USB升压转换器。您可以在完整的原理图中找到这些(警告:这是一个单巨头半组织 - Sheet™原理图)。
系统主管STM32L073管理BQ24250通过I2C,测量每个轨道上的电压和电流,并负责按顺序将每个导轨带到FPGA。 STM32L0系列的微控制器非常适合此应用,因为它们是低功耗,但仍然具有像USB的TTY的内置的USB外设。
巨型Zynq FPGA子系统(GZF)包含具有512 MB的DDR3 DRAM的Zynq零件。 DDR3 RAM可以运行高达533 MHz,每次数据线提供高达1066 Mbit / s的吞吐量。这里,16个数据线用于组合,理论带宽为约2132 MB / s(根本不是现实生活带宽; 80-90%的效率被认为是在不同负载下的真正良好)。
来自赛普拉斯,S25FL256S的32 MB四级SPI闪光灯的Zynq靴子。 Microchip USB3320C添加了USB 2.0主机端口,并且有一个microSD插槽(它向后......因为愚蠢的数据表)。 Zynq也通过I2C和UART连接到系统管理程序(STM32L073),因此U-Boot和Linux控制台可以转储到USB。
GamesLab上的屏幕是一个5英寸800x480 TFT显示器,具有多触摸面板。我在这个网站上找到了它,他们甚至将用微小的双面胶带为您附加触摸屏。请注意,我不会买他们销售的连接器。我尝试使用那些在原型板上的显示器,当您反复连接和断开显示时,它们很容易打破。相反,我在Digikey上发现了一些有很棒的连接器,有一点杠杆出现,这更容易用我的胖手指蠕动。
将LCD连接到FPGA非常简单,因为它是一个巨大的并行接口。颜色有24位(RGB,每个通道8位),垂直同步线,水平同步线和一些启用。 LCD线直接从3.3 V LVCMOS的FPGA I / O端口驱动。背光有点复杂,因为它需要一个驾驶员,该驱动器产生升压电压足以驱动整个LED链。最后,多触摸接口超过I2C到Zynq的ARM Cortex A9子系统。
Zynq不包含LCD控制器,也不包含任何图形加速器。所有这些都必须在FPGA面料中实施,这很棒!
GamesLab在右侧有4个彩色按钮,左侧4个灰色定向按钮,左侧和amp;右肩按钮和两个拇指杆。按钮在PCB上有点摇摆,但是用前面的面板在他们身上,他们感觉很棒! Supercon的几个人问我是这些好按钮的部件号,所以这是数据表。我很久以前从Sparkfun买了拇指镜......我希望我看过不同的。这些在底部有暴露的垫子,对焊料是皇家疼痛。显然,在那里有相似的拇指销;这会让我的生活变得更加容易!
GamesLab的声音子系统非常简单:带内置耳机放大器的立体声编解码器,以及用于驱动两个扬声器的D类Stereo放大器。在FPGA面料之前,任何花哨的声音效果或混合都将在向编解码器上传出。谢谢John Schuch(@Johns_AZ)和Alex Schultz在凤凰城的硬件欢乐时光帮助我帮助我,并且让我知道我的DAMP应该对输出的过滤器,或者事情可能会得到非常坏的。
组装GamesLab PCB是一种漫长而耐心的测试努力。这一切都以我收到的最大的Digikey零件袋子始于我接收过的零件零件以及带有PCB和模板的JLCPCB的盒子。 JLCPCB默认情况下向您发送巨型380x280 mm模板,它们非常大于(底框)。
确保PCB令人难以置信地确保PCB安全,这是绝对重要的。我使用这两个L-Brackets和大量磁带,以确保它根本没有移动。没有什么比将模板完美对准的是更糟糕的,开始施加浆料,然后在下面的PCB偏移,破坏了你的辛勤工作。
将焊膏施加到电路板上非常简单:将注射器喷射到模板上并用涂抹工具传播(高度专业的工具如下所示)。
对于回流,我使用了一流的黑色和甲板到1313SBD 4切片的烤箱,具有Eventoast技术。它专门用于一次烤多达4片面包,所以它也必须适合PCB。哦,旁边是我从一件套件中建造的回流烤箱控制器。它用热电偶监控烤箱,并通过PID控制回路将烤箱切换。您甚至不需要控制器进行回流,很多人用秒表和万用表温度显示手动手动进行,但我懒惰。
回流后,除了0.5 mm间距LCD连接器上的少数桥外,一切都很好。我用一些助焊铁和铁快速触动了那些。我真的开始不喜欢与鸥翼的部分如此,或类似于TQFP部件。他们总是在我身上桥梁。我没有任何QFN零件遇到任何问题,所以我想我会打开未来的设计。
Stencifing董事会的背面原来是挑战。由于前侧已经在其上具有部件,因此板不会置于平坦。所以,我不得不把它放在它下面的各种各样的东西来撑起边缘,我甚至不得不在它下面填写东西,以保持它在传播浆料的同时保持僵硬(注意图片下的角落下的所有废料)。放置巨型BGA部分实际上是最容易的,我有正确的镊子之后。如果您还有巨大的FPGA,请继续eBay并购买一些Hozan P-848宽手柄ESD-Tip Theezers。
回流板的后侧是一点复杂,因为我想支持董事会,只是为了确保它没有在底部的任何东西转移。我底部的零件发生了零问题,他们都幸存下来的双回流。焊接表面张力是一种强大的力量。虽然,我不太确定它在背面举行巨型FPGA。
最后,经过大约六个小时的椎板,患者放置,回流和通孔焊接,电路板已准备就绪。
在组装板上进行故障排除几件事之后,实际上是一堆工作。首先,我不得不调试为什么其中一个铁轨没有来。事实证明,其中一个开关稳压器具有桥接焊点,需要快速回流热风枪。我再也不会在这个小包装中挑选开关调节器。然后,我想出,我的JTAG连接器实际上是在原理图和布局上倒退......幸运的是,它适用于另一边的精细。一旦JTAG连接器逆转,我就可以看到Zynq,它显示了正确的部件号!
我正在跳过一堆步骤,即将在更多的帖子中进行写入,例如在锈病中设置STM32L073上的基本固件(也包括创建锈蚀器箱,电路板支柱和移植锈USB设备驱动程序箱为STM32L0)。它还花了一段时间来获取U-Boot配置和移植,然后从我的Dev Pances原型重新配置我的Linux设备树以引导Linux。但是,游戏机首次启动Linux是惊人的!
我肯定会写一些关于GamesLab的帖子。 我在想下面,让我知道你的想法: 使用Linux设备树覆盖将新的FPGA比特流和核心模块一起加载