普通のユニバーサルプログラマといえば20万円くらいの代物なので、やっぱり趣味で買うわけにはいきませんよね。トラ技の公告などを見ていると、ROMライターだけなら5万円位で売られていて、GALライターだけでも5万円位で売られていて、PICライターだけでも3万円位しますよね。全部買うとやっぱり10数万円位してしまいます。高いですねぇ~
じゃぁ、自作してしまおうと考えて、回路図を描いてみると、かなりの面倒くささに耐え兼ねてギブアップしてしまう人が多いのではないでしょうか?
ROMライターやGALライターやPICプログラマーなどを単体で造るのならばそれほど面倒な作業ではないのですが、それらを一つの基板上に載せてしまおうとすると、幾何級数的に面倒くささが増大します。それは、なぜかというと、デバイスによるピン配置が違いすぎるからです。だから、今までユニバーサルプログラマを自作してきた人たちは、デバイスごとに異なるソケットを用意してきたわけです。もし、それらのソケットを一つにまとめてしまうことができれば、こんなラクなことはないのですが、そうは問屋が卸さない理由があります。下の表を見てください。
PIN番号 | GAL16V8 | GAL20V8 | GAL22V10 | 40pinROM | 32pinROM | 28pinROM | PIC16F84 |
1 | VPP | ||||||
2 | #CE | ||||||
3 | D15 | ||||||
4 | D14 | ||||||
5 | D13 | VPP | |||||
6 | D12 | A16 | |||||
7 | D11 | A15 | A15/VPP | ||||
8 | D10 | A12 | A12 | ||||
9 | D9 | A7 | A7 | ||||
10 | VPP | VPP | D8 | A6 | A6 | ||
11 | RAG1 | P/#V | GND | A5 | A5 | ||
12 | VPP | RAG2 | COM0 | D7 | A4 | A4 | |
13 | RAG1 | RAG3 | COM1 | D6 | A3 | A3 | |
14 | RAG2 | COM2 | D5 | A2 | A2 | ||
15 | RAG3 | COM3 | D4 | A1 | A1 | ||
16 | RAG4 | RAG4 | COM4 | D3 | A0 | A0 | |
17 | RAG5 | RAG5 | COM5 | D2 | D0 | D0 | |
18 | SCLK | SCLK | SCLK | D1 | D1 | D1 | |
19 | SDIN | SDIN | SDIN | D0 | D2 | D2 | |
20 | GND | GND | GND | #OE | GND | GND | |
21 | #STR | #STR | #STR | A0 | D3 | D3 | |
22 | SDOUT | SDOUT | A1 | D4 | D4 | ||
23 | SDOUT | A2 | D5 | D5 | SCLK | ||
24 | A3 | D6 | D6 | SDAT | |||
25 | A4 | D7 | D7 | VCC | |||
26 | A5 | #CE | #CE | ||||
27 | A6 | A10 | A10 | ||||
28 | RAG0 | A7 | #OE/VPP | #OE/VPP | |||
29 | P/#V | RAG0 | A8 | A11 | A11 | ||
30 | VCC | P/#V | GND | A9 | A9 | ||
31 | VCC | VCC | A9 | A8 | A8 | ||
32 | A10 | A13 | A13 | ||||
33 | A11 | A14 | A14/#PGM | ||||
34 | A12 | A17 | VCC | ||||
35 | A13 | A18 | |||||
36 | A14 | VCC | |||||
37 | A15 | ||||||
38 | A16 | ||||||
39 | A17/PGM | ||||||
40 | VCC |
この表を見てまず気がづくことは、
さて、これらの書き込み対象デバイスの挿入ソケットを一つの40ピンソケットにまとめてしまうような回路は、簡単に作れるでしょうか?回路を単純に設計すると、下の図のようになります。
しかしながら、最近ではH8のようなワンチップマイコンが簡単につかえる時代なので、以前よりは難しくありません。しかも、マイコンを使った場合はプログラム次第でいくらでも新しいデバイスに対応できることになります。
この回路は基本的に、セレクタ方式です。しかし面倒なところをすべてCPLDにいれてしまいました。このユニバーサルプログラマで使ったCPLDはXILINX社製のXC95108で、このCPLDは最大108個のマクロセルが使えます。簡単に言うと、フリップフロップの数が108個の大きなPLDということです。GALやPEELを使っている人にはこの巨大なPLDがいかに便利かわかるでしょう。しかも、XILINX社製のXC9500シリーズは5V系のCPLDですが、コア電圧とI/O電圧を別個に設定でき、I/O用電源を3.3Vにすれば3.3V系の信号を電圧ストレスなしに取り扱うことができます。この点が特筆すべき点の一つで、ワンチップマイコンを使った場合はこう簡単にはいきません。(最近のマイコンでは簡単なものもあるかもしれないが)
本回路ではそのようなCPLDを2個使っています。1個目のCPLDはステートマシンやタイミング発生用の長いタイマーなどが入っています。2個目のCPLDはアドレスやデータを保持するレジスタと、その出力をダイナミックにピンに割り当てるためのセレクタが入っています。それから、CPLDの出力とROMの出力がぶつからないようにするための3ステートバッファやそれを制御するための回路が入っています。
それら2つのCPLDをつなぐデータはエンコードされているので、配線の本数が最小限に押さえられているのが特徴です。本機の大まかなブロック図を載せます。
もうひとつ、ROMライタで面倒だった回路は、VPPやVCCを与える回路です。VPP電圧は一般に12.5Vなどという電圧をつかうので、その電圧がCPLDなどに直接かかってしまうと破壊される可能性があるのです。多くのICは入出力端子に保護ダイオードが入っていて、電源電圧以上の電圧が端子にかかるとこの保護ダイオードがONして回路を守るような仕組みになっています。ところが、12.5Vの電圧をIC内蔵の保護ダイオードで保護できるかというとそれは不可能です。なぜなら保護ダイオードに電流が流れすぎてしまって結局は保護ダイオードもろとも壊れてしまうからです。ダイオードを焼ききらないためには弱い抵抗をはさめばよいのですが、この抵抗には無視できないほどの電流が流れます。さらに、今回製作するROMライターはユニバーサルプログラマなので、原則としてすべてのピンが入出力可能でなければなりません。
本回路以外の従来の回路の多くは、TTLの7406(オープンコレクタのインバータ)を使って出力端子を保護していまた。また、VPP信号のかかる可能性のあるピンを入力可能にするための回路は見かけられませんでした。つまり、デバイスごとに別々のソケットが載っているということです。
それらの回路は、あまり美しくない上に、作るのがとても大変なので、もっと簡単にVPPを与えられるよい回路が作れないものかと考えに考えました。望む条件は以下のとおりです。
上の回路を説明します
この回路のおかげで従来のユニバーサルプログラマに比べてVPP/VCC制御用の回路を大幅に簡略化でき、コスト削減を可能にしました。
10kΩという抵抗の値は、適当に決めたわけではありません。これは検討に検討を重ねて出した結果、10kΩを選んだわけです。CPLDからデバイスへ送るパルスの立ち上がりと立下り特性、デバイスからCPLDへ送るパルスの立ち上がりと立下り特性。それから出力H時における入力側での電圧や出力L時における入力側での電圧がTTLレベルの基準をみたすかどうかなど詳細にシミュレーションした結果が10kΩという値を導いたわけです。 最初はダイオードに1S1588を使用していましたが、Ver2からはショットキバリアダイオードの1SS294を使用しています。その理由は、順方向の電圧降下が少ないからです。
パラレル方式では、書きこみたいアドレスとデータを書き込みピンに与え、書き込みパルスを加えます。EPROMやFLASHROMがこのタイプです。
シリアル方式では、書きこみ開始コマンドの後に、書きこみたいアドレスやデータは、クロックに同期させながらシリアル方式で順次送ります。そして、書きこみパルスまたは書きこみコマンドを与えます。シリアルEEPROMやPICがこのタイプです。
GALは書きこみたいアドレスをピンで指定した後、シリアルでデータを送りこむので両方を複合させた方式といえます。
本ユニバーサルプログラマは、書きこみたいデバイスを40ピンソケットに挿入した状態で、それぞれのピン配置に合わせてCPLDのピンから適切な信号が出て、書きこみ動作を行います。
書きこみパルスは、書きこみの過程でたいへん重要なものです。デバイスへの書きこみというのは、FETのフローティングゲート上での電子の物理的な挙動と密接に関係しています。書きこみパルスの時間幅や書きこみ電圧が適切でないと、正常に書きこみできないばかりか、永久的な書きこみをしてしまうことすらあります。そのため、正確な時間幅のパルスを作り出すことが必要です。これにはWindows内蔵のタイマーなどは使用しないほうが無難です。
本ユニバーサルプログラマでは、CPLD1の内部に18ビットのカウンタを内蔵して正確な時間を刻んでいます。