背景和第一个样本
在以前的一篇文章中,我写道我正在对Commodore 128的PLA芯片进行反向工程。
这是一个非常有趣的项目,因为我对半导体的设计和制造并不了解。我的知识仅限于看水晶的照片和欣赏这些美丽的照片。
对我来说,我的研究始于购买廉价的用于焊接表面安装(SMD)组件的显微镜。

便宜的显微镜
一段时间后,我在YouTube上发现了一段视频,该视频展示了一种从盒中去除硅晶体的简便方法。
该方法看起来很简单,可以在家中实施,因为我已经拥有所有必需的设备。从包装中取出IC通常需要加热的硫酸或其他有害化学物质,而这些化学物质我我根本不想在家中尝试使用。因此,我在库存中挖出了几个损坏的MOS芯片(切勿丢掉任何东西,它可能会派上用场)。经过一点工作,我得到了两个8521R0模具和一个8721 PLA。在上一篇文章中,我展示了第一张真实照片。

8721 PLA芯片的完整照片
更好的显微镜
尽管实验成功,但我立即意识到显微镜没有足够的分辨率为我拍摄足够质量的照片。使用2倍巴洛镜时,最大放大倍率为90倍。另外,显微镜没有平台,所以我不得不将晶体放在桌子上,然后移动整个显微镜。这种设计非常不稳定,在其帮助下很难卸下必要的零件。
因此,我以合理的价格找到并购买了更好的显微镜。

AmScope ME580-T显微镜
在拍摄像样的照片方面做得更好,但我对自己购买的相机不满意。这是一款便宜的相机,除了AmScope应用程序外,没有遥控器。当时,Raspberry Pi基金会为Raspberry Pi发布了一款新的高质量相机。这款相机的C型固定座与显微镜兼容,因此我立即购买并将其安装在显微镜上。在Linux的舒适环境下提供完全控制的能力非常出色。

一部分硅芯片8521R0
与以前的系统相比,有了很大的改进。由于分辨率提高,我不得不缝制照片以获得更大的图像。乍一看听起来很简单,但是(您可能已经猜到)事实证明这并不是一件容易的事。我仍然很难将照片拼接在一起,但是我正在逐渐提高自己的技能。全景拍摄成功的关键因素之一是对焦,白平衡等的均匀性。照片越均匀,缝合就越容易和更好。
机械化
所有这些使我开始使桌子机械化。我开始对手动移动工作台感到非常厌倦,因为工作台上的照片沿多个轴移动,并且发生了其他变形。
经过大量的设计,3D打印和对CNC固件的研究,我想到了以下设计:

改良型显微镜AmScope ME580-T
顶部有一个7英寸的Raspberry显示器,后面是Raspberry Pi4。该照片未显示显微镜上安装的RPi HiQ相机。RPi拍摄照片,在显示屏上显示它们,并执行驱动CNC板的Python代码。
该平台和调平平台由28BYJ-48步进电机驱动,该步进电机由运行Grbl_Esp32的小型ESP32板以及四个AD4498步进电机控制器驱动。
该电路存在某些软件和硬件问题,但对于我的目的来说效果很好。
反转芯片
处理完后勤工作后,我回头对芯片本身进行了逆向工程。我最初想处理PLA芯片,因为这是最容易发现的事情。 PLA代表可编程逻辑阵列;在准将时代,类似的结构非常普遍。
根据维基百科的图表,我们应该期望芯片上有两个主要阵列,即AND和OR。输入连接到AND,引脚从OR阵列中出来。
回到芯片的上一个快照,我们可以通过在芯片的引脚和区域添加注释来改进它。处理完晶体的目的后,我们可以看到,所有输入都连接到一个阵列,所有输出都连接到另一个阵列,这与预期的一样。同样,它将帮助我们了解哪个数组在哪里。

带注释的8721 PLA模具快照在
这里,我们看到标记的I / O引脚以及它们与引线框架和DIP本身的引脚的连接。组成PLA结构的两个主要区域(与阵列和或阵列)也可见。另外,这里还有一些附加的逻辑,上面带有问号。它的目的对我来说是未知的,但是由于所有输出触点都通过它,因此我认为这是某种输出阶段。
与阵列
因此,如果我们首先开始更仔细地研究AND矩阵,我们将看到下图。颜色有些失真,因为这张照片是用AmScope相机拍摄的,我不知道如何在上面设置白平衡。

具有金属层
的AND矩阵图像对于了解正在发生的情况不是很有用,因为所有有趣的部分都被最顶层的金属层覆盖。那时我才刚刚开始学习,所以我用蛮力去除了金属。我通过强烈的机械冲击擦除了金属。在显微镜下研究后,结果发现除了基材本身,所有东西都被清除了。
幸运的是,我需要的细节在位于基板中的扩散层中:

矩阵基板并
仔细观察图像,您会看到晶体管所在的小波浪线,以在矩阵中建立连接。
或阵列
转到OR数组,我们看到完全相同的格式。难以解析而不除去金属层,但是与AND矩阵相比更容易解析。并且仅留下基板和扩散层时容易得多。

或与金属层一起死亡

或基质基材
全矩阵解码
有了这些知识,我们就可以从图像中恢复完整的PLA逻辑矩阵。
我用点标记每个矩阵中的所有晶体管,并得到以下图像:

带有金属层
的AND矩阵在AND矩阵中,所有输入均为水平,并且正常信号和反相信号被馈送到每条线。在“或”矩阵中,所有引线都是水平的,并连接到称为最小项的垂直线。
在检查了点之后,我们可以通过对AND矩阵中的所有垂直线执行逻辑“ AND”来解码最小项,例如,
p0 = CHAREN & HIRAM & BA & !MS3 & GAME & RW & AEC & A12 & !A13 & A14 & A15
对于引脚,我们为每个引脚取一条水平线并将其与“或”组合,例如,
SDEN = p42 | p43 | p66 | p69
这就是我们获得整个逻辑方程组的方式。万岁!
输出级
让我们返回到晶体的完整照片-现在,除了在出口路径上标有问号的矩形之外,我们已经拥有所有东西。
查看该区域的高分辨率照片,我们看到每个引脚都有相似的图案。在除两种情况以外的所有情况下,均会绕过此结构,或矩阵的输出直接进入输出引脚。但是,这不适用于两个联系人:
DWE和CASENB。
DWE是将写使能信号施加到主系统的DRAM芯片上,并且CASENB将CAS信号传递给RAM。这两个信号由输出门结构以某种方式处理,因此我不得不对该模块进行反向工程。

带金属层的插座

输出块基板
在花费了大量时间阅读有关硅芯片的设计和制造的信息以及进行了许多尝试之后,我能够创建一个看起来很逻辑的电路。在这里,我不会详细介绍整个过程,但是稍后会记录和发布。在这里,我还要感谢弗兰克·沃尔夫(Frank Wolfe)的帮助,如果可能的话,请支持他的项目!

输出框图
再看一点,我们使用该电路的方式是使用引脚
DWE并将CASENB其转换为常规D锁存器。允许这样做的锁存器在PLA中用“或”中的一对线表示。
结果
这样我们得到了最终结果,现在我们可以为C128计算机的PLA芯片编写完整的HDL代码。为此,我将使用Verilog。考虑。这是我的第一个Verilog代码,因此可能不是最佳选择。在Verilog中,通常将D锁存器用作引脚是一种不好的做法,但是在这种情况下,我将复制成品芯片的逻辑和功能。
如果可能,我已进行了检查,但如果我缺少任何物品,请报告!
与PLA C64不同,由于存在输出锁存器,因此无法用简单的EPROM或类似的东西替换PLA C128芯片。
module pla_8721(
input rom_256,
input va14,
input charen,
input hiram,
input loram,
input ba,
input vma5,
input vma4,
input ms0,
input ms1,
input ms2,
input ms3,
input z80io,
input z80en,
input exrom,
input game,
input rw,
input aec,
input dmaack,
input vicfix,
input a10,
input a11,
input a12,
input a13,
input a14,
input a15,
input clk,
output sden,
output roml,
output romh,
output clrbnk,
output from,
output rom4,
output rom3,
output rom2,
output rom1,
output iocs,
output dir,
output reg dwe,
output reg casenb,
output vic,
output ioacc,
output gwe,
output colram,
output charom);
wire p0;
wire p1;
wire p2;
wire p3;
wire p4;
wire p5;
wire p6;
wire p7;
wire p8;
wire p9;
wire p10;
wire p11;
wire p12;
wire p13;
wire p14;
wire p15;
wire p16;
wire p17;
wire p18;
wire p19;
wire p20;
wire p21;
wire p22;
wire p23;
wire p24;
wire p25;
wire p26;
wire p27;
wire p28;
wire p29;
wire p30;
wire p31;
wire p32;
wire p33;
wire p34;
wire p35;
wire p36;
wire p37;
wire p38;
wire p39;
wire p40;
wire p41;
wire p42;
wire p43;
wire p44;
wire p45;
wire p46;
wire p47;
wire p48;
wire p49;
wire p50;
wire p51;
wire p52;
wire p53;
wire p54;
wire p55;
wire p56;
wire p57;
wire p58;
wire p59;
wire p60;
wire p61;
wire p62;
wire p63;
wire p64;
wire p65;
wire p66;
wire p67;
wire p68;
wire p69;
wire p70;
wire p71;
wire p72;
wire p73;
wire p74;
wire p75;
wire p76;
wire p77;
wire p78;
wire p79;
wire p80;
wire p81;
wire p82;
wire p83;
wire p84;
wire p85;
wire p86;
wire p87;
wire p88;
wire p89;
wire casenb_int;
wire casenb_latch;
/* Product terms */
assign p0 = charen & hiram & ba & !ms3 & game & rw & aec & a12 & !a13 & a14 & a15;
assign p1 = charen & hiram & !ms3 & game & !rw & aec & a12 & !a13 & a14 & a15;
assign p2 = charen & loram & ba & !ms3 & game & rw & aec & a12 & !a13 & a14 & a15;
assign p3 = charen & loram & !ms3 & game & !rw & aec & a12 & !a13 & a14 & a15;
assign p4 = charen & hiram & ba & !ms3 & !exrom & !game & rw & aec & a12 & !a13 & a14 & a15;
assign 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 & a12 & !a13 & a14 & a15;
assign p8 = ba & !ms3 & exrom & !game & rw & aec & a13 & !a13 & a14 & a15;
assign p9 = !ms3 & exrom & !game & rw & aec & a12 & !a13 & a14 & a15;
assign p10 = ba & !ms2 & ms3 & rw & aec & a12 & !a13 & a14 & a15;
assign p11 = !ms2 & ms3 & !rw & aec & a12 & !a13 & a14 & a15;
assign p12 = charen & hiram & ba & !ms3 & game & rw & aec & !a10 & !a11 & 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 & aec & !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 & !rw & aec & !a10 & !a11 & a12 & !a13 & a14 & a15;
assign p20 = ba & !ms3 & exrom & !game & rw & aec & !a10 & !a11 & a12 & !a13 & a14 & a15;
assign p21 = !ms3 & exrom & !game & rw & aec & !a10 & !a11 & a12 & !a13 & a14 & a15;
assign p22 = ba & !ms2 & ms3 & rw & aec & !a10 & !a11 & a12 & !a13 & a14 & a15;
assign p23 = !ms2 & ms3 & !rw & aec & !a10 & !a11 & a12 & !a13 & a14 & a15;
assign p24 = charen & hiram & ba & !ms3 & game & rw & aec & !a10 & a11 & a12 & !a13 & a14 & a15;
assign p25 = charen & hiram & !ms3 & game & !rw & aec & !a10 & a11 & a12 & !a13 & a14 & a15;
assign p26 = charen & loram & ba & !ms3 & game & rw & aec & !a10 & a11 & a12 & !a13 & a14 & a15;
assign p27 = charen & loram & !ms3 & game & !rw & aec & !a10 & a11 & a12 & !a13 & a14 & a15;
assign p28 = charen & hiram & ba & !ms3 & !exrom & !game & rw & aec & !a10 & a11 & a12 & !a13 & a14 & a15;
assign p29 = charen & hiram & !ms3 & !exrom & !game & !rw & aec & !a10 & a11 & a12 & !a13 & a14 & a15;
assign p30 = charen & loram & ba & !ms3 & !exrom & !game & rw & aec & !a10 & a11 & a12 & !a13 & a14 & a15;
assign p31 = charen & loram & !ms3 & !exrom & !game & !rw & aec & !a10 & a11 & a12 & !a13 & a15;
assign p32 = ba & !ms3 & exrom & !game & rw & aec & !a10 & a11 & a12 & !a13 & a14 & a15;
assign p33 = !ms3 & exrom & !game & rw & aec & !a10 & a11 & a12 & !a13 & a15;
assign p34 = ba & !ms2 & ms3 & rw & aec & !a10 & a11 & a12 & !a13 & a14 & a15;
assign p35 = !ms2 & ms3 & !rw & aec & !a10 & a11 & a12 & !a13 & a15;
assign p36 = !aec;
assign p37 = !rw & aec & !a10 & a11 & a12 & !a13 & a15;
assign p39 = !charen & hiram & !ms3 & game & rw & aec & a12 & !a13 & a14 & a15;
assign p40 = !charen & loram & !ms3 & game & rw & aec & a12 & !a13 & a14 & a15;
assign p41 = !charen & hiram & !ms3 & !exrom & !game & rw & aec & a12 & !a13 & a14 & a15;
assign p42 = va14 & !vma5 & vma4 & !ms3 & game & !aec;
assign p43 = va14 & !vma5 & vma4 & !ms3 & !exrom & !game & !aec;
assign p44 = !ms0 & !ms1 & ms2 &ms3 & z80en & rw & aec & a12 & !a13 & a14 & a15;
assign p45 = hiram & loram & !ms3 & !exrom & rw & aec & !a13 & !a14 & a15;
assign p46 = !ms3 & exrom & !game & aec & !a13 & !a14 & a15;
assign p47 = ms0 & !ms1 & ms3 & exrom & !game & aec & !a14 & a15;
assign p48 = !ms0 & ms1 & ms3 & aec & !a14 & a15;
assign p49 = hiram & !ms3 & !exrom & !game & aec & a13 & !a14 & a15;
assign p50 = ms3 & exrom & !game & aec & a13 & !a14 & a15;
assign p51 = vma5 & vma4 & !ms3 & exrom & !game & !aec;
assign p52 = ms0 & !ms1 & ms3 & rw & aec & !a12 & !a13 & a14 & a15;
assign p53 = !ms0 & ms1 & ms3 & rw & aec & !a12 & !a13 & a14 & a15;
assign p54 = !ms0 & !ms1 & ms3 & rw & aec & !a12 & !a13 & a14 & a15;
assign p55 = !ms0 & !ms1 & z80io & !z80en & rw & aec & !a12 & !a13 & !a14 & !a15;
assign p56 = !ms0 & !ms1 & ms3 & rw & aec & !a14 & a15;
assign p57 = !ms0 & !ms1 & ms3 & rw & aec & a14 & !a15;
assign p58 = hiram & !ms3 & game & rw & aec & a13 & a14 & a15;
assign p59 = hiram & !ms3 & !exrom & !game & rw & aec & a13 & a14 & a15;
assign p60 = hiram & loram & !ms3 & game & rw & aec & a13 & !a14 & a15;
assign p61 = !z80io & !z80en & aec & !a10 & !a11 & !a13 & a14 & a15;
assign p62 = !z80io & !z80en & aec & a12 & !a13 & a14 & a15;
assign p63 = !z80io & !z80en & aec & !a10 & a11 & a12 & !a13 & a14 & a15;
assign p64 = !rw & aec;
assign p65 = rw & aec;
assign p66 = !aec;
assign p67 = !ms2 & !z80en & aec & !a10 & !a11 & a12 & !a13 & !a14 & !a15;
assign p68 = !ms2 & !z80en & !rw & aec & !a10 & !a11 & a12 & !a13 & !a14 & !a15;
assign p69 = !charen & !vma5 & vma4 & ms3 & aec;
assign p70 = !rom_256 & !ms0 & !ms1 & ms3 & rw & aec & a14 & !a15;
assign p71 = !rom_256 & !ms0 & !ms1 & ms3 & rw & aec & !a12 & !a13 & a14 & a15;
assign p72 = !rom_256 & !ms0 & !ms1 & z80io & !z80en & rw & aec & !a12 & !a13 & !a14 & !a15;
assign p73 = clk;
assign p74 = rw & !aec & vicfix;
assign p75 = !ms0 & !ms1 & ms3 & rw & aec & a13 & a14 & a15;
assign p76 = !rom_256 & !ms0 & !ms1 & ms3 & rw & aec & a13 & a14 & a15;
assign p77 = !ms0 & ms1 & ms3 & rw & aec & a13 & a14 & a15;
assign p78 = !ms0 & ms1 & ms2 & ms3 & rw & aec & a12 & !a13 & a14 & a15;
assign p79 = ms0 & !ms1 & ms3 & rw & aec & a13 & a14 & a15;
assign p80 = ms0 & !ms1 & ms2 & ms3 & rw & aec & a12 & !a13 & a14 & a15;
assign p81 = !ms3 & exrom & !game & aec & a12 & !a14 & !a15;
assign p82 = !ms3 & exrom & !game & aec & a13 & !a14;
assign p83 = !ms3 & exrom & !game & aec & a14;
assign p84 = !ms3 & exrom & !game & aec & !a12 & !a13 & a14 & a15;
assign p85 = !loram & ms3 & aec;
assign p86 = !hiram & ms3 & !aec;
/* outputs */
assign sden = p42 || p43 || p66 || p69;
assign roml = p45 || p46 || p47;
assign romh = p49 || p50 || p51 || p52 || p79 || p80;
assign clrbnk = p85 || p86;
assign from = p48 || p53 || p77 || p78;
assign rom4 = p54 || p55 || p75;
assign rom3 = p56 || p70;
assign rom2 = p57;
assign rom1 = p58 || p59 || p60 || p71 || p71 || p76;
assign iocs = p0 || p1 || p2 || p3 || p4 || p5 || p6 || p7 || p8 || p9 || p10 || p11 || p62;
assign dir = p12 || p14 || p16 || p18 || p20 || p22 || p24 || p26 || p28 || p30 || p32 || p34 || p39 || p40 || p41 || p44 || p65;
assign vic = p12 || p13 || p14 || p15 || p16 || p17 || p18 || p19 || p20 || p21 || p22 || p23 || p61;
assign ioacc = p0 || p1 || p2 || p3 || p4 || p5 || p6 || p7 || p8 || p9 || p10 || p11 ||
p12 || p13 || p14 || p15 || p16 || p17 || p18 || p19 || p20 || p21 || p22 || p61 || p62;
assign gwe = p37;
assign colram = p24 || p25 || p26 || p27 || p28 || p29 || p30 || p31 || p32 || p33 || p34 || p35 || p36 || p63 || p67;
assign charrom = p39 || p40 || p41 || p42 || p43 || p44 || p69;
assign casenb_latch = p73 || p74;
assign casenb_int = p0 || p1 || p2 || p3 || p4 || p5 || p6 || p7 || p8 || p9
|| p10 || p11 || p12 || p13 || p14 || p15 || p16 || p17 || p18 || p19
|| p20 || p21 || p22 || p23 || p39 || p40 || p41 || p42 || p43 || p44
|| p45 || p46 || p47 || p48 || p49 || p50 || p51 || p52 || p53 || p54
|| p55 || p56 || p57 || p58 || p59 || p60 || p61 || p62 || p63 || p67
|| p69 || p70 || p71 || p72 || p75 || p76 || p77 || p78 || p79 || p80
|| p81 || p82 || p83 || p84;
/* Latched outputs */
always @ (clk or p64)
if (clk)
dwe <= p64;
always @ (casenb_latch or casenb_int)
if (casenb_latch)
casenb <= casenb_int;
endmodule
下一步是什么
下一个要分析的芯片将是C128计算机MMU芯片,由于它不仅是普通的PLA,因此将需要更长的工作时间。
也可以看看: