正如我在上一篇文章中提到的,我一直在对C128中的PLA芯片进行逆向工程,现在我已经基本完成了这个过程,所以我认为是时候分享一些发现了。
这是一个非常有趣的项目,因为我对半导体设计和制造了解不多。我现有的知识延伸到看过一些死亡镜头,欣赏过那些漂亮的照片。
这一切都是从我买了一台便宜的显微镜来帮助焊接表面贴装元件开始的。
一段时间后,我最终在YouTube上观看了一段视频,视频显示了一种从包装中取出硅片的更简单的方法。
这看起来很简单,可以在家里试一试,因为我已经有了所有需要的设备。拆解集成电路通常涉及加热的硫酸或其他类似的令人讨厌的化学物质,我真的不想在家里玩这些东西。因此,我挖出了几个散落在各处的MOS芯片(不要扔掉东西,可能会派上用场)。在摆弄了一会儿之后,我最终得到了两个8521R0骰子和一个8721PLA。第一张真正的照片是上一篇帖子中显示的那张。
虽然这是成功的,但我很快意识到,这台显微镜没有足够的分辨率让我能够捕捉到足够高质量的图像。使用2倍Barlow镜头时,最大放大倍数为90倍。此外,它没有舞台,所以我不得不把碟子放在桌子上,然后移动整个显微镜,这非常不稳定,很难捕捉到你想要看到的部分。
事实证明,这款相机在拍摄质量不错的照片方面要好得多,但我对用它买的相机并不满意。这是一款便宜的相机,除了使用AmScope应用程序外,我无法远程管理它。大约在这个时候,Raspberry Pi基金会发布了用于Raspberry Pi的新款高品质相机。这台相机上有一个与显微镜相配的C型支架,所以我很快就把它放到了显微镜上。这款相机非常适合这项工作,可以在舒适的Linux上完全控制整个过程。
总而言之,这是对以前设置的巨大改进。有了更高的分辨率,我开始需要把照片缝合在一起来制作更大的照片。这在开始时听起来很简单,但最终(正如您可能猜到的那样)并不是很容易。我还在努力缝合,但慢慢好起来了。一个成功的全景拼接的关键之一是在平移、对焦、白平衡等方面拥有一致的照片。照片越均匀,拼接就越容易、越好。
这使我开始致力于电动化这张桌子。不得不手动移动桌子真的很烦人,照片最终要在多个轴上移动,等等。
大量的设计工作,3D打印和对CNC固件的研究之后,我最终完成了以下设置:
从顶部开始,我们有一个7英寸的Raspberry显示屏,背面安装了一个Raspberry pi4。没有看到的还有安装在显微镜上的RPI HiQ相机。RPI拍摄照片,在显示器上显示预览,还运行控制CNC板的python代码。
工作台和调平工作台由28BYJ-48步进电机驱动,使用一个运行Grbl_Esp32的ESP32和四个AD4498步进电机控制器的小电路板进行控制。
整个设置在软件和硬件上都有一些问题,但现在它工作得足够好,可以让我做一些工作。
物流现在已经理顺了,我又回到了芯片本身的逆向工程工作上。我最初的关注点是PLA Chipas,这应该是最简单的解决方案之一。PLA代表可编程逻辑阵列,是这个时代设计中非常常见的结构。
看一下维基百科的示意图,我们应该会看到两个主要的数组,AND和OR。输入连接到OR阵列的AND AND输出。
返回到上一次的冲模,可以通过对管脚和芯片的一般区域进行一些注释来改进它。一旦我们建立了引脚,我们就可以看到所有的输入都连接到一个阵列,所有的输出都连接到另一个阵列,正如预期的那样。这也有助于我们确定哪个阵列是哪个阵列。
在这里,我们看到I/O引脚标有它们如何连接到引线框架和DIP本身上的引脚。我们还可以看到组成PLA结构的两个主要区域,AND数组和OR数组。此外,底部还有一些用问号标记的额外逻辑。我不知道它的功能,但由于所有的输出引脚都通过它,我猜测这是某种类型的输出阶段。
因此,如果我们仔细研究一下和矩阵,我们将看到以下内容。颜色有点不对劲,因为这仍然是用AmScope相机完成的,我不知道如何在上面设置白平衡。
这对理解发生了什么没有太大帮助,因为所有有趣的部分都被最上面的金属层掩盖了。这是在我还在学习很多东西的早期,所以为了移除金属,我采取了一种非常暴力的方法。我使用重型机械擦洗来去除金属,我也了解到,一旦我把它放回显微镜里,它已经除去了除了衬底本身之外的所有东西。哎呀。
仔细观察这张图像,我们可以看到晶体管所在的小弯曲线,以在矩阵中创建连接。
继续看OR数组,我们会看到完全相同的模式。金属层就位很难辨别,尽管与AND矩阵相比更容易。只剩下衬底和扩散就容易多了。
有了这些知识,我们现在可以继续从图像中提取完整的PLA逻辑矩阵。
我用一个点标记了每个矩阵中的所有晶体管,得到了下面的图片:
所有输入在AND矩阵中都是水平的,每行都有一个正常信号和一个反相信号被馈入。所有输出在OR矩阵中都是水平的,它们由称为乘积项的垂直线连接。
例如,通过查看点,我们可以通过对AND矩阵中的所有垂直线执行逻辑AND来解码乘积项。
P0=Charen&;Hiram&;BA&;!MS3&;游戏&;RW&;AEC&;A12&;!A13&;A14&;A15。
例如,对于输出,我们改为水平查看每个输出,并与或组合。
回过头来看完整的芯片图片,现在除了输出路径中标有问号的盒子之外,我们已经拥有了所有东西。
看一看这个的高分辨率照片,我们可以看到每个输出都有相似的结构。除两种情况外,所有情况下都绕过结构,OR矩阵的输出直接进入输出引脚。但是,两个端号DWE和CASENB并非如此。
DWE是去往主系统DRAM芯片的写使能信号,CASENB将CAS信号选通到RAM。这两个信号是使用这些输出门结构以某种形式进行处理的,所以我必须对这个模块进行反向工程。
在阅读了相当长一段时间的硅芯片设计和制造以及多次尝试之后,我终于想出了一个有意义的原理图。我不打算在这里讨论整个过程,但我会在稍后记录并发布它。在这里,我也要感谢弗兰克·沃尔夫的帮助,如果可以的话,请支持他的项目!
更进一步说,它在DWE和CASENB输出中的使用方式使其成为普通的D锁存器。对于OR矩阵中的一对行中的PLA矩阵,也会出现对此的锁存启用。
因此,作为最终结果,我们现在可以写下C128PLA芯片的完整HDL代码。为此,我使用verilog。请注意,这是我写过的第一个verilog,所以它可能是次优的。在verilog中使用D锁存器输出通常被认为是一件坏事,但在这种情况下,我这样做是为了复制现有芯片的逻辑和功能。
据我所知,我已经证实了这一点,但如果我遗漏了什么,请让我知道!
与C64PLA不同的是,由于输出锁存器的存在,C128PLA不能仅用EPROM或类似的器件代替。
模块pla_8721(输入rom_256,输入va14,输入charen,输入hiram,输入loam,输入ba,输入vma5,输入vma4,输入ms0,输入ms1,输入ms2,输入ms3,输入z80io,输入z80en,输入exrom,输入游戏,输入rw,输入aec,输入dmaack,输入vicfix,输入a10,输入a11,输入a12,输入a13,输入a14,输入a15,输入。OUTPUT FROM、OUTPUT ROM4、OUTPUT ROM3、OUTPUT ROM2、OUTPUT ROM1、OUTPUT IOCS、OUTPUT DIR、OUTPUT REG DWE、OUTPUT REG CASENB、OUTPUT VIC、OUTPUT IOACC、OU。导线p0;导线p1;导线p2;导线p3;导线p4;导线p5;导线p6;导线p7;导线p8;导线p9;导线p10;导线p11;导线p12;导线p13;导线p14;导线p15;导线p16;导线p17;导线p18;导线p19;导线p20;导线p21;导线p22;导线p23;导线p24;导线p25;导线p26;导线p27;导线p28;导线p29;线p44;线p45;线p46;线p47;线p48;线p49;线p50;线p51;线p52;线p53;线p54;线p55;线p56;线p57;线p58;线p59;线p60;线p61;线p62;线p63;线p64;线p65;线p66;线p67;线p68;线p69;线p70;线p71;线p72;线p73;线。Wire p88;wire p89;wire casenb_int;/*产品条款*/Assign P0=Charen&;Hiram&;ba&;!MS3&;Game&;RW&;A12&;!A13&;A14&;a15;Assign p1=Charen&;Hiram&;!MS3&;Game&;!RW&;AEC&;!A14&;a15;分配p2=Charen&;Loram&;ba&;!MS3&;游戏&;rw&;AEC&;a12&;!a13&;a14&;a15;分配p3=Charen&;Loram&;!MS3&;游戏&;!RW&;AEC&;A12&;!A13&;A14&;a15。Hiram&;ba&;!MS3&;!exrom&;!Game&;rw&;AEC&;A12&;!A13&;A14&;a15;分配P5=Charen&;Hiram&;!MS3&;!exrom&;!Game&;!RW&;AEC&;A12&;!A13&;A14&;a15;Assign p6=Charen&;Loram&;ba&;!MS3&;!exrom&;!Game&;RW&;AEC&;A12&;!A13&;a14&;a15;Assign p7=Charen&;Loram&;!MS3&;!exrom&;!Game&;!RW&;AEC&;!A13&;!A15;分配p8=ba&;!ms3&;exrom&;!Game&;rw&;AEC&;a13&;!A13&;a14&;a15;分配p9=!MS3&;exrom&;!Game&;rw&;AEC&;a12&;!a13&;a14&;a15;分配p10=ba&;!MS2&;RW&;AEC&;a12&;!A13&;A14&;a15;Assign p11=!MS2&;MS3&;!RW&;AEC&;A12&;!a13&;a14&;a15;Assign p12=Charen&;Hiram&;ba&;!MS3&;游戏&;RW&;AEC&;!A10&;!A10&;A12&;!A13&;A14&;a15;Assign p13=Charen&;Hiram&;!MS3&;Game&;!RW&;AEC&;!A10&;!A11&;a12&;!A13&;A14&;a15;Assign p14=Charen&;Loram&;ba&;!MS3&;Game&;RW&;Aa。!A10&;!A11&;a12&;!A13&;A14&;a15;Assign p15=Charen&;Loram&;!MS3&;Game&;!RW&;AEC&;!A10&;!A11&;a12&;!A13&;a14&;a15;Assign p16=Charen&;Hiram&;BA&;!MS3&;!exrom&;!Game&;rw&;AEC&;!A10&;!A11&;A12&;!A13&;A14&;a15;Assign p17=Charen&;Hiram&;!MS3&;!exrom&;!Game&;!RW&;AEC&;!A10&;!A11&;A12&;!A13&;A14&;a15;Assign p18=Charen&;Loram&;BA&;!MS3&;!Exrom&;!Game&;RW&;AEC&;!A10&;!A11&;a12&;!A13&;A14&;a15;Assign p19=Charen&;Loram&;!MS3&;!exrom&;!Game&;!