CPLDユニバーサルプログラマ 動作原理

まえがき

 普通のユニバーサルプログラマといえば20万円くらいの代物なので、やっぱり趣味で買うわけにはいきませんよね。トラ技の公告などを見ていると、ROMライターだけなら5万円位で売られていて、GALライターだけでも5万円位で売られていて、PICライターだけでも3万円位しますよね。全部買うとやっぱり10数万円位してしまいます。高いですねぇ〜

 じゃぁ、自作してしまおうと考えて、回路図を描いてみると、かなりの面倒くささに耐え兼ねてギブアップしてしまう人が多いのではないでしょうか?

 ROMライターやGALライターやPICプログラマーなどを単体で造るのならばそれほど面倒な作業ではないのですが、それらを一つの基板上に載せてしまおうとすると、幾何級数的に面倒くささが増大します。それは、なぜかというと、デバイスによるピン配置が違いすぎるからです。だから、今までユニバーサルプログラマを自作してきた人たちは、デバイスごとに異なるソケットを用意してきたわけです。もし、それらのソケットを一つにまとめてしまうことができれば、こんなラクなことはないのですが、そうは問屋が卸さない理由があります。下の表を見てください。

PIN番号GAL16V8GAL20V8GAL22V1040pinROM32pinROM28pinROMPIC16F84
1   VPP   
2   #CE   
3   D15   
4   D14   
5   D13VPP  
6   D12A16  
7   D11A15A15/VPP 
8   D10A12A12 
9   D9A7A7 
10 VPPVPPD8A6A6 
11 RAG1P/#VGNDA5A5 
12VPPRAG2COM0D7A4A4 
13RAG1RAG3COM1D6A3A3 
14RAG2 COM2D5A2A2 
15RAG3 COM3D4A1A1 
16RAG4RAG4COM4D3A0A0 
17RAG5RAG5COM5D2D0D0 
18SCLKSCLKSCLKD1D1D1 
19SDINSDINSDIND0D2D2 
20GNDGNDGND#OEGNDGND 
21#STR#STR#STRA0D3D3 
22SDOUT SDOUTA1D4D4 
23 SDOUT A2D5D5SCLK
24   A3D6D6SDAT
25   A4D7D7VCC
26   A5#CE#CE 
27   A6A10A10 
28RAG0  A7#OE/VPP#OE/VPP 
29P/#VRAG0 A8A11A11 
30VCCP/#V GNDA9A9 
31 VCCVCCA9A8A8 
32   A10A13A13 
33   A11A14A14/#PGM 
34   A12A17VCC 
35   A13A18  
36   A14VCC  
37   A15   
38   A16   
39   A17/PGM   
40   VCC   

この表を見てまず気がづくことは、

  1. VPPやVCCの出る場所がデバイス毎に異なる
  2. 32pinROMと28pinROMの配列は似ている
  3. 40pinROMと28/32pinROMの配列に相関はない
  4. 書き込みの方法によって、ピン配置が異なり、さらには#OE/VPPというピンまである。このピンは通常のTTLロジックとVPPの高電圧が共存する。
  5. GALやPICのピン配置はさらに異なる。
ということです。VPPには12Vなどの高電圧を扱いますが、別のデバイスではその端子がTTLロジック電圧を扱うので、適切な電圧保護が行われなければいけません。
 1の事柄は、VPPの高電圧で書き込み器本体側のICが壊れないように適切に保護しなければならないことを示唆しています。2と3の事柄は、28/32PinROMと40PinROMの回路をそれぞれ別に造らなければならないことを示唆しています。また、4の事柄は、書き込み器が出力するピン割り当てを、デバイスの書き込み方法(ピン数と容量によって異なる)に合わせて変更しなければならないことを示唆しています。5の事柄はいっそう回路を複雑にしています。

 さて、これらの書き込み対象デバイスの挿入ソケットを一つの40ピンソケットにまとめてしまうような回路は、簡単に作れるでしょうか?回路を単純に設計すると、下の図のようになります。


 80個の3ステートバッファを用いればユニバーサルプログラマは作ることができそうです。3ステートバッファを大量に用意し、書きこみたいデバイスの種類毎に適切にイネーブルにしたり、ディセーブルにしたりすればよさそうです。しかしこれは作る気になりません。もうちょっと賢く作りたいということになります。

他のユニバーサルプログラマの方式

 そこで、他のユニバーサルプログラマやROMライターではどのようにして、回路を作っているのでしょう。調べてみると、いくつかのタイプがあります。
  1. デバイスに合わせてソケットごと取り替えるタイプ
     データやアドレスを出力する回路が本体の内部に1つあり、セレクタは存在しません。そのかわり、デバイスのピン配置に対応させるために、ソケットが取り外せるような構造になっています。こうすると、ユニバーサルライタ内部の回路は簡単にできるというメリットがあります。デバイスごとにソケットを取り替えるというなんとも大胆な発想ですが、実際に商品として販売されています。このタイプではユニバーサルプログラマ本体を買っただけではだめで、デバイスごとのソケットを買わなければならないのです。もちろん、その取替えソケットは非常に高価で、ユーザーからみれば大変なコストになります。個人で揃えられ人はお金の余っているひとでしょう。

  2. ソケットが多数あるタイプ
     前のタイプと同じように、データやアドレスを出力する回路が本体の内部に1つあり、セレクタは存在しません。しかし、前のタイプと違ってソケットが複数取り付けられています。個人で自作したユニバーサルプログラマや、多くの自作の28/32/40pinROMライターではこの方式を使っています。このタイプの欠点は配線量がとても多くなるので、作るのが面倒くさいということです。そして、ソケットが複数必要になるのでコストがかかることです。ROMライターに必要なソケットはレバーのついたゼロプレッシャーソケットというもので、非常に高価なので、何とか1つにまとめてしまいたいと思うでしょう。

  3. ソケットが1つでセレクタがあるタイプ
     前のタイプと違って、データやアドレスを出力する回路が本体の内部に1つですが、セレクタが存在します。前のページで単純に描いたような回路を何とか巧みに作ったのがこのタイプです。このようなタイプのROMライターは市販品に見かけますが、これを分解してみますと、中に大量のトランジスターが入っていたりします。このトランジスターのおかげでVPP端子などからでる高電圧でセレクター回路に影響(破壊)することが防げるのでしょう。とにかくこのタイプはトランジスターやセレクタの数が多く、自作するのが面倒です。メーカー製の製品のコストが高いのも納得できます。また、ひとつのソケットにすべてのデバイスを挿入できるので、使い勝手がよいのも特徴です。

  4. マイコン内蔵のタイプ
     これは、レジスターや複雑なセレクターのかわりに、ユニバーサルプログラマー内部にマイコンを内蔵してしまって、そのマイコンに直結したパラレルポートがデバイスに直結します。レジスタやセレクタがないので簡単な構造ですが、プログラムが大変になります。3のタイプよりも配線は簡単ですが、マイコンを使っている以上とても簡単であるとはいえません。また、VPP電圧がパラレルポートを破壊しないような保護回路を作ることも必要です。一部のキットや自作のROMライターがこのタイプになっています。

     しかしながら、最近ではH8のようなワンチップマイコンが簡単につかえる時代なので、以前よりは難しくありません。しかも、マイコンを使った場合はプログラム次第でいくらでも新しいデバイスに対応できることになります。

CPLDユニバーサルプログラマ(XMP)の回路

 この回路は基本的に、セレクタ方式です。しかし面倒なところをすべて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をつなぐデータはエンコードされているので、配線の本数が最小限に押さえられているのが特徴です。本機の大まかなブロック図を載せます。 block-zu.gif

 もうひとつ、ROMライタで面倒だった回路は、VPPやVCCを与える回路です。VPP電圧は一般に12.5Vなどという電圧をつかうので、その電圧がCPLDなどに直接かかってしまうと破壊される可能性があるのです。多くのICは入出力端子に保護ダイオードが入っていて、電源電圧以上の電圧が端子にかかるとこの保護ダイオードがONして回路を守るような仕組みになっています。ところが、12.5Vの電圧をIC内蔵の保護ダイオードで保護できるかというとそれは不可能です。なぜなら保護ダイオードに電流が流れすぎてしまって結局は保護ダイオードもろとも壊れてしまうからです。ダイオードを焼ききらないためには弱い抵抗をはさめばよいのですが、この抵抗には無視できないほどの電流が流れます。さらに、今回製作するROMライターはユニバーサルプログラマなので、原則としてすべてのピンが入出力可能でなければなりません。

 本回路以外の従来の回路の多くは、TTLの7406(オープンコレクタのインバータ)を使って出力端子を保護していまた。また、VPP信号のかかる可能性のあるピンを入力可能にするための回路は見かけられませんでした。つまり、デバイスごとに別々のソケットが載っているということです。
 それらの回路は、あまり美しくない上に、作るのがとても大変なので、もっと簡単にVPPを与えられるよい回路が作れないものかと考えに考えました。望む条件は以下のとおりです。

これを満たすように私は下の図のような回路を考え出しました。
VCC VPP circuit.gif

上の回路を説明します

  1. CPLDを出た信号はダイオードを経てデバイスのソケットへと伝わります。このとき、CPLDからHIレベルの信号が出たときは、電源から抵抗R1を通じて流れてきた電流と共にダイオードに流れ、ダイオードD1が導通して多少の電圧降下を起こしつつ、ソケット端子には約3.3Vが加わります。ほとんどのプログラマブルデバイスでは3.3Vの信号はHIと認識されるレベルなので、問題ありません。
  2. CPLDからLOレベルが出力されたときには抵抗R1から流れた電流はほとんどすべてCPLDが吸い込んでしまうので、ダイオードは導通せず、ソケット端子には0Vが加わります。
  3. 一方、デバイス側からHIレベルが出力されたときには、ダイオードは導通せず、CPLDのピンが入力モードになっているならば、CPLDにはR1を通じて約5Vが加わり、HIと認識されます。
  4. デバイス側からLOレベルが出力されたときには、CPLDのピンが入力モードになっているならば、電源からR1を通じて流れてきた電流はダイオードを通じてデバイスに流れ込むので、CPLDにはLOと認識されます。
  5. もちろん、ソケットの端子にVPP電圧が何ボルト加わろうともCPLDはダイオードによって保護されているので、まったく無傷ですみます。
 要するに、この回路はロジック信号を双方向に伝達可能であるにもかかわらず、高電圧が伝わらない回路ということです。しかも、部品点数がとても少ないのが特徴です。
 VPP-ENABLEやVCC-ENABLEやGND-ENABLEはそれらのピンをアクティブにすれば、その電源が端子に加わるという機能です。もちろんVCCやVPPが必要のないピンにはこのトランジスタをつける必要がありません。VPPもVCCもGNDも必要がないピンには、上のような保護回路は必要なく、CPLDとソケットを直結しています。

 この回路のおかげで従来のユニバーサルプログラマに比べてVPP/VCC制御用の回路を大幅に簡略化でき、コスト削減を可能にしました。

 10kΩという抵抗の値は、適当に決めたわけではありません。これは検討に検討を重ねて出した結果、10kΩを選んだわけです。CPLDからデバイスへ送るパルスの立ち上がりと立下り特性、デバイスからCPLDへ送るパルスの立ち上がりと立下り特性。それから出力H時における入力側での電圧や出力L時における入力側での電圧がTTLレベルの基準をみたすかどうかなど詳細にシミュレーションした結果が10kΩという値を導いたわけです。  最初はダイオードに1S1588を使用していましたが、Ver2からはショットキバリアダイオードの1SS294を使用しています。その理由は、順方向の電圧降下が少ないからです。

デバイスの書きこみ方法

 原理は単純で、どのデバイスも基本的に次の手順です。
  1. 電源を入れる。必要に応じてVPPの高電圧をかける。
  2. アドレスを与える
  3. データを与える
  4. 書きこみ信号を与える
  5. 全てのデータの書きこみが終了するまで繰り返す
 デバイスへのデータの与え方は、大きく分けて2つに分けられます。一つはパラレル方式、もう一つはシリアル方式です。

 パラレル方式では、書きこみたいアドレスとデータを書き込みピンに与え、書き込みパルスを加えます。EPROMやFLASHROMがこのタイプです。
 シリアル方式では、書きこみ開始コマンドの後に、書きこみたいアドレスやデータは、クロックに同期させながらシリアル方式で順次送ります。そして、書きこみパルスまたは書きこみコマンドを与えます。シリアルEEPROMやPICがこのタイプです。
 GALは書きこみたいアドレスをピンで指定した後、シリアルでデータを送りこむので両方を複合させた方式といえます。
 本ユニバーサルプログラマは、書きこみたいデバイスを40ピンソケットに挿入した状態で、それぞれのピン配置に合わせてCPLDのピンから適切な信号が出て、書きこみ動作を行います。

 書きこみパルスは、書きこみの過程でたいへん重要なものです。デバイスへの書きこみというのは、FETのフローティングゲート上での電子の物理的な挙動と密接に関係しています。書きこみパルスの時間幅や書きこみ電圧が適切でないと、正常に書きこみできないばかりか、永久的な書きこみをしてしまうことすらあります。そのため、正確な時間幅のパルスを作り出すことが必要です。これにはWindows内蔵のタイマーなどは使用しないほうが無難です。
 本ユニバーサルプログラマでは、CPLD1の内部に18ビットのカウンタを内蔵して正確な時間を刻んでいます。

あとがき

 とりとめもなく書いてしまいましたが、おおよその動作原理は理解していただけましたでしょうか。
次はどこへ行きますか?
前へ 次へ 先頭へもどる
このWebページ上で紹介したすべての回路、情報、内容に関する著作権は「なひたふ」が所有します。無断転載を固く禁じます。
(C)Copyright 1999-2000 Nahitafu