背景と最初のサンプル
以前の投稿で、Commodore 128のPLAチップのリバースエンジニアリングに取り組んでいると書きました。これでこのプロセスはほぼ完了したので、調査結果を共有するときが来ました。
半導体の設計や製造についてあまり知らなかったので、とても興味深いプロジェクトでした。私の知識は、水晶の写真を見て、これらの美しい写真を賞賛することに限られていました。
私にとって、私の研究は、表面実装(SMD)コンポーネントをはんだ付けするための安価な顕微鏡の購入から始まりました。

安い顕微鏡
しばらくして、Youtubeで、ケースからシリコン結晶を取り除く簡単な方法を示すビデオを見つけました。
私はすでに必要な機器をすべて持っていたので、この方法は自宅で実装するのに十分簡単に見えました。パッケージからICを取り出すには、通常、加熱された硫酸や、自宅で実際に実験したくないその他の危険な化学物質が必要です。そこで、壊れたMOSチップをいくつか掘り起こしました(何も捨てないでください。便利な場合があります)。少しの作業で、8521R0ダイが2つ、8721PLAが1つ得られました。前回の投稿で、最初の本物の写真を見せました。

8721PLAチップの完全な写真
より良い顕微鏡
実験は成功しましたが、顕微鏡には十分な品質の写真を撮るのに十分な解像度がないことにすぐに気づきました。 2x Barlowレンズの場合、最大倍率は90xです。また、顕微鏡にはステージがないので、クリスタルをテーブルに置いてから顕微鏡全体を動かす必要がありました。この設計は非常に不安定であり、その助けを借りて必要な部品を取り外すことは困難です。
そこで、より良い顕微鏡を見つけて、リーズナブルな価格で購入しました。

AmScope ME580-T顕微鏡
まともな品質の写真を撮るのにはるかに優れた仕事をしましたが、私はそれと一緒に購入したカメラに不満を持っていました。これは、AmScopeアプリケーションを除いて、リモートコントロールのない安価なカメラです。当時、ラズベリーパイ財団はラズベリーパイ用の新しい高品質カメラをリリースしました。このカメラは顕微鏡と互換性のあるCマウントを備えているので、すぐに購入して顕微鏡に取り付けました。 Linuxの快適さから完全な制御を提供するという驚くべき仕事をします。

シリコンダイ8521R0の一部
以前のシステムと比較して、これは大きな改善です。解像度が上がったため、画像を大きくするには写真をステッチする必要がありました。最初は単純に聞こえますが、(ご想像のとおり)簡単な作業ではないことがわかりました。写真をつなぎ合わせるのはまだ難しいですが、徐々にスキルを向上させています。パノラマショットを成功させるための重要な要素の1つは、焦点の均一性、ホワイトバランスなどです。写真が均一であるほど、ステッチが簡単になります。
機械化
このすべてが私にテーブルの機械化を始めさせました。私はテーブルを手動で動かすことに非常に飽き始めました。そこでは、写真がいくつかの軸に沿って移動し、他の歪みが発生しました。
多くのデザイン、3D印刷、CNCファームウェアの調査を行った後、次のデザインを思いつきました。

改造された顕微鏡AmScopeME580-T
上部には7インチのラズベリーディスプレイがあり、その後ろにはラズベリーPi4があります。写真は、顕微鏡に取り付けられたRPiHiQカメラを示していません。RPiは写真を撮り、それらをディスプレイに表示し、CNCボードを駆動するPythonコードも実行します。
対象ステージ及びレベリングステージは小さいESP32ランニングボードにより駆動さ28BYJ-48ステッピングモータによって駆動されるGrbl_Esp32を、ならびに4個のAD4498ステッパモータコントローラ。
回路には特定のソフトウェアとハードウェアの問題がありますが、私の目的には非常にうまく機能します。
チップを逆にします
ロジスティクスを扱った後、私はチップ自体のリバースエンジニアリングに戻りました。もともとPLAチップに取り組みたかったのは、それが最も簡単に理解できるからです。 PLAはProgrammableLogicArrayの略です。同様の構造はコモドール時代には非常に一般的でした。
Wikipediaの概略図に基づくと、チップにはANDとORの2つのメインアレイがあると予想されます。入力はANDに接続され、ピンはORアレイから出てきます。
ダイの前のショットに戻って、チップのピンと領域に注釈を追加することで、ダイを改善できます。クリスタルの目的を扱ったところ、予想どおり、すべての入力が1つのアレイに接続され、すべての出力が別のアレイに接続されていることがわかります。また、どの配列がどこにあるかを理解するのにも役立ちます。

注釈付きの8721PLAダイのスナップショット
ここでは、マークされたI / Oピンと、リードフレームおよびDIP自体のピンへの接続を示しています。PLA構造を構成する2つの主要な領域、AND配列とOR配列も表示されます。また、ここには疑問符でマークされた追加のロジックがいくつかあります。その目的は私にはわかりませんでしたが、すべての出力接点が通過するので、これはある種の出力段だと思いました。
AND配列
したがって、最初にANDマトリックスをさらに詳しく調べ始めると、次の図が表示されます。この写真はAmScopeカメラで撮影したもので、ホワイトバランスの設定方法がわからなかったため、色が少し歪んでいます。

ANDマトリックスと金属層
すべての興味深い部分が最上部の金属層で覆われているため、画像は何が起こっているのかを理解するのにあまり役立ちません。当時は学び始めたばかりだったので、力ずくで金属を取り除いた。強い機械的衝撃で金属を消しました。顕微鏡で調べたところ、基板自体を除いて、一般的にすべてが除去されていることがわかりました。
幸い、私が必要とした詳細は、基板にある拡散層にありました。

マトリックス基板AND
画像をよく見ると、マトリックス内に接続を作成するためにトランジスタが配置されている小さな波線が表示されます。
OR配列
OR配列に移ると、まったく同じ形式が表示されます。金属層を除去せずに解析するのは困難ですが、ANDマトリックスと比較すると簡単です。そして、基板と拡散層だけが残っていると、はるかに簡単になります。

または金属層で死ぬ

またはマトリックス基板
フルマトリックスデコード
この知識があれば、画像から完全なPLAロジックマトリックスを復元することができます。
各マトリックスのすべてのトランジスタにドットを付けて、次の画像を取得しました。

金属層を備えたANDマトリックスANDマトリックスでは
、すべての入力が水平であり、通常の反転信号が各ラインに供給されます。ORマトリックスでは、すべてのリードが水平で、mintermsと呼ばれる垂直線に接続されています。
ポイントを調べた後、最小項をデコードして、ANDマトリックスのすべての垂直線に対して論理「AND」を実行でき
p0 = CHAREN & HIRAM & BA & !MS3 & GAME & RW & AEC & A12 & !A13 & A14 & A15
ます。たとえば、ピンの場合、各ピンの水平線を取り、それを「または」と組み合わせます。たとえば、
SDEN = p42 | p43 | p66 | p69
これで論理方程式のセット全体を取得できます。やったー!
出力段
クリスタルの完全な写真に戻りましょう。これで、出口パスに質問マークが付いた長方形以外のすべてができました。
この領域の高解像度の写真を見ると、各ピンに同様のパターンが見られます。2つの場合を除くすべての場合、この構造はバイパスされ、ORマトリックスからの出力は直接出力ピンに送られます。ただし、これは2つの連絡先には適用されません:
DWEとCASENB。
DWE書き込みイネーブル信号がメインシステムのDRAMチップに適用され、CASENBがCAS信号をRAMに渡しますか。これらの2つの信号は、これらの出力ゲート構造によって何らかの形で処理されるため、このブロックをリバースエンジニアリングする必要がありました。

金属層のあるアウトレットブロック

出力ブロック基板
シリコンチップの設計と製造に関する情報を読むことにかなりの時間を費やし、多くの試みを行った後、論理的に見える回路を作成することができました。ここではプロセス全体について詳しくは説明しませんが、後で文書化して公開します。ここで、可能であれば彼のプロジェクトをサポートしてくれたフランク・ウルフにも感謝します!

出力ブロック回路
もう少し見てみると、この回路の使用方法はピン
DWEを使用CASENBして、通常のDラッチに変えます。これを可能にするラッチは、PLAではORの1対の線で表されます。
結果
これで最終結果が得られ、C128コンピューターのPLAチップ用の完全なHDLコードを記述できるようになりました。このために、Verilogを使用します。考えてみてください。これが私の最初のVerilogコードであるため、最適ではない可能性があります。ピンにDラッチを使用することは、Verilogでは一般的に悪い習慣と見なされますが、この場合、完成したチップのロジックと機能を複製しています。
できればチェックしましたが、足りないものがあれば報告してください!
PLA C64とは異なり、PLA C128チップは、出力ラッチが存在するため、EPROMなどに置き換えることはできません。
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だけではないため、作業にはるかに時間がかかります。
参照: