過去記事でやれPIC16Fだi8088だと書いている私ですが,i8088のボードの制作にあたりあれこれ道具が欲しくなり・・・
というか,持っている道具が古くLPTポート制御による機器ばかり,LPTポートが搭載されない昨今に合わせ,いい加減にUSBやRS-232に更新しようと思い開発ツールを設計していました。
その中で久しぶりにSPLD(旧称GAL)を使おうとした際,ちょっとハマったのでそれで記事を書いてみようと思います。
電子部品の話ですが,その記述言語が出てきたり,論理の話も多め,デバイスの概要解説も書いておきますので,PG,SE等「生粋のソフトウェアの人間です!」という人もどうぞ。
(色んな人向けに書いているので,適宜飛ばしながら読んでください)
1. ソモソモ論SLPD(旧称GAL)やCPLD,FPGAって何ぞや
さて,まずはSPLD,古い人だとGALと呼んでいる部品についてです。
SPLDとは「Simple Programmable Logic Device」の略称で,単純に翻訳すれば「簡単なプログラム可能な論理デバイス」となります。
「そんな~英語ぐらいわかるよ~」って?いえ,どんな部品か?と言われればそのままなのです。
GALというのは昔の呼び名で「Gate Array Logic」の略称です。
機能や内部の構造は同じです。
ICの型番も「GAL16V8」といった型番で,デバイスの名前がそのまま型番になっていました。結果,どこか製品名称な側面もあります。
この他にも「CPLD」という物もあり,Cは「Complexed」,ざっくり言ってしまえばSPLDとは規模の違いとなっています。
こういったデバイスたちは総じてPLDと呼ばれています。
他には仕組み違いでFPGA(Field Programmable Gate Array)という物もあり,こちらもPLDと同じくプログラム可能なロジックデバイスです。
FPGAとPLDの違いは今やあまり差がなくなってきてしまっているため,電子工学を専門とでもしない限り名前の違い程度で覚えてもらっても差し支えないと思います。
ただ影響の出る違いとして,FPGAは動作の決定を保持するメモリーがRAMの物がほぼ全てで,電源を切ると書き込んだロジックが消えてしまう点に注意してください。SPLD等のPLDはROMですので消えません。
さて,どういう物かは分かったところで,どんな仕組みなのか?も少しだけ。
論理回路(ディジタルのロジック回路)の動作を変更する仕組みは,例として大雑把に書くと以下の図のようになっています。
何か電子回路の図になりましたが,初級シスアド等で出てきたあの図記号です。
ここでは4入力の動作をプログラムできるようになっています。
ここでメモリーのbit1を 1=H にしたらどうでしょう?
U1のANDが入力に応じH/Lが出力するようになります。
同じくメモリーのbit2をHにすればU2のANDが入力に応じH/Lを出力するようになります。
この状態でbit3, bit4は 0=L とした場合,ANDの片方が常にLであるためU3,U4は常にLとなります。
その後,ORをとっていますから,どちらのANDがHを出力しても出力はHになります。
結果として「IN1,またはIN2が」Hなら出力はH,それ以外はLとなります。
ここでbit3もHにしたらどうでしょう?
するとU3も入力に応じH/Lを出力するようになります。
結果,動作が変わり「IN1,IN2,IN3の何れかが」Hなら出力はH,それ以外はLとなります。
さて,ここで変更した事は何でしょう?
回路は何も変えておらず,メモリーの値を書き換えただけですね?
これが「Programmable」の仕組みです。
PLDは上記のような回路がICの中に入っており,ユーザーはメモリーに値を書き込むだけでICの動作を変更できます。
ここで,PLDはコンピュータのように命令を解釈,入力,演算,出力と処理しているわけではないので高速に動作します。
かつAND/OR/NOTのロジックしか入っていないため,構造も単純です。
更には,AND/OR/NOTをユーザーが電気的に配線する必要がないので簡単にロジック回路を作る事ができます。
これらの事から,専用IC(ASIC等と呼びます)の試作や,動作を変更する必要がある機器,それでいて高速な動作が必要な部分(=コンピュータでは間に合わない部分)の論理演算に使用したりします。
ホビーの世界では,そこそこ配線はある物の専用ICなんて作れない!といったシーンで使ったりします。
これは製品でも登場するシーンで,速度はそんなに要求していないものの小型化,省配線化のために要所で幾つか使うというケースもあります。
反面,使わない部分にまでゲートが搭載されていますから消費電力が大きいという欠点もあり,使いどころは考えなければいけません。
ちなみに上記の回路の数十倍程度のロジックが一まとめになったICが売られていますが,たった数百円で買えます。
「(IN1 OR IN2) AND IN3 が成立していてIN4~IN7が0,3,5,9,A,Fの時だけH」ぐらいのややこしい事でも,恐らくそのうちの,IC内のプログラム領域の半分も使わず作れてしまいます。
さて,「Programmable」と言われるとIT従事者は次の疑問が頭の中をよぎっていると思います。「どうやってプログラムするのか?」ですね?
これ,言語で書く事ができます。
今現在メジャーなのは VHDL や Verilog HDL といった言語でしょう。
例えば,「IN1とIN2のANDのNOT(NAND)をとりOUTに出力しろ」と記述したければ以下のようになります。
OUT <= NOT(IN1 and IN2);
「まんまやんけ・・・」って感じですよね。
こんなのをせっせと書いていると,「俺氏オリジナルIC」が作れちゃう。それがPLDやPGA。
中にはCPUを作った人もいます。
と,どこかPG,SE等のIT従事者にも親しみがある?デバイスとなっています。
もし気になったようでしたら,これを機に調べてみてはいかがでしょうか?
2. ATF16V8x/ATF22V10x,ATF750xというデバイスとD-FF
さて,SPLDっちゃ何モンでぇ?と分かった所でタイトルの話に入っていきます。
タイトルにあるATF16V8x/ATF22V10xやATF750xというのはSPLDの型式で,旧ATMEL,現Microchip(これは過去に出てきたPICのメーカー)が製造するSPLDです。
・・・と,中には「あれ?」と思った方もいるかもしれませんね。
ATF16V8x,ATF22V10xは,かつてLatticeが製造,一世を風靡した?GAL16V8やGAL22V10とほぼ互換の製品です。
xの部分にはバージョンや派生のコードが入り,現在はCとその派生(低消費電力版のCQ等)が最新版となっているようです。
ATF750xは?というと,ATF22V10xの改良版のようなSPLDです。
ICのピン数もATF22V10xと同じとなっています。
が,この改良が中々な変化,これらのロジックを記述する言語であるCUPLの仕様と相まってちょっとハマりましたよ,というお話です。
あ,悪い話ではなく,今時風になっておりいっそATF750xの方がお勧め(後述)です。
そこを少し詳しく見ていきましょう。
まず,先は「こんなイメージですよ~」と簡単にして書いた動作変更のロジックですが,実際は下図のようになっています。
・・・なんか,目がショボショボしますね。
この網のような部分が先ほどの「こんな仕組み」と書いた回路の部分です。
SPLD,さっきの回路がこんなにいっぱい入ってるんですね。
で,CPLDはこの部分がもっともっとたくさん入ってます。
この配線に当たる部分,ロジックアレイ等と呼びますが,呼び名は割とバラバラです。
業務で関わる事があった場合は程よく相手に話し合わせといてください。メーカーによってすら違います。
さて,先のプログラムしたロジックがそのまま出力されるのかというと・・・何か「Output Logic」という物につながっていますね。この部分は別名「Macrocell(マクロセル)」と呼ばれています。
ここで少し論理的な演算ができるようになっています。近年はこの部分が高機能になり,できる事が増え,より複雑なロジックを作れるようになっています。
下図がATF16V8xのマクロセルの中身となります。

(ATF16V8Bデータシートより抜粋,レジスタードモード時)
見慣れない物だと四角の中にD,CK,Q,#Q(#は文字の上の線を表します。読みは「キュー(Q)バー(  ̄ )」)と書かれた記号でしょうか?
これはDフリップフロップ(D Flip Flop,以下D-FFと省略)といい,IT従事者であれば・・・身近な例ではRAMの1bit分の回路だと思ってもらえばいいかと思います。
フリップフロップというのは入力に応じ状態を保持する回路です。そのため,SRAM(DRAMはまた別の仕組み)の中にたくさん使われています。
このD-FF,動作としてはDに0/1を入力した状態でCK(クロック)にパルスを入力すると,入力されていたDの状態がQに保持されます。
その後,Dを変化させてもQは変化せず,再びCKにパルスを入力するとQが更新されます。
ね?何かSRAMみたいでしょ?
因みにフリップフロップにはRS-FFやJK-FF,T-FFといった物もあります。
・・・というのが,今回のタイトルの「D-FF」の部分。これがATF750xと仕様が違うというお話です。
3.あれ?ATF16V8x,非同期リセットかけらんねーけど?
・・・とここでつまずきました。
その前からクロック(CK)を指定できなかったりで薄々変だな~とは思っていたのですが。
その辺を見ていきましょう。
まず,ATF16V8やATF750xは「CUPL」という言語を使います。
CUPLでのD-FFの使い方の例を以下に示します。
/* INPUT */
PIN 1 = CLK;
PIN 2 = IN1;
PIN 3 = RES;
/* OUTPUT */
PIN 19 = OUT1;
/* LOGIC */
OUT1.D = IN1;
OUT1.CK = CLK;
OUT1.AR = RES;
うん,コード出てきてやっとQiitaっぽくなった。
D-FFはマクロセルの中にあり,出力部分にありますので「=」の左辺に登場します。
D-FFのD入力を指定したい場合は出力の要素に「.D」を,CKを指定したい場合は「.CK」を指定します。
それに加え,「.AR」という物があり,コレは「Asynchronous Reset」で非同期リセットです。非同期リセットはクロックの入力にかかわらずQを0にする=リセットする機能です。
非同期リセットのほかにも,同期リセット(クロックに合わせてリセット)の「.SR」,同期プリセットの「.SP」等もあります。
これらを踏まえて上記のコードを読むと,「2番ピンに値をセット,1番ピンにクロックを入力すると値を保持,19番ピンに出力され,3番ピンをHにするとクロックの入力にかかわらずリセットがかかり出力はLになる」という意味になります。
・・・のはずなのですが,これで書くとATF16V8xではコンパイルが通りません。
記述してみると・・・
.D や .CK,その他 .AR が水色になり一見拡張子として認識しているように見えます。
が,コンパイルすると・・・
「unknow extension」「.ar なんて拡張子知らないよ!」と言ってきます。
あれれ?
が,これATF750xで書くと・・・
ちゃんとコンパイルが通ります。
記述が悪いわけではないようです。
チョット混乱したのですが,これ答えはタイトルの「マクロセル等の違い」になります。

(ATF16V8Bデータシートより抜粋,レジスタードモード時)
ここで再登場のATF16V8xのマクロセルです。
よくよく見てみると,リセットに関する配線がありませんね?
最初,省略してあるだけかな?と思ったのですが,所が・・・

(ATF750Cデータシートより抜粋,レジスタードモード時)
ATF750xには「AR」と書かれた配線があります。
ATF750xのマクロセルには .ar の機能がありますが,ATF16V8xにはそもそも .ar の機能がないんですね。
実はこの他にも .ck もエラーになります。
こちらは配線部分に当たるロジックアレイになります。
ATF16V8xの場合・・・

(ATF16V8Bデータシートより抜粋,追記,レジスタードモード時)
このように,配線が固定されています。さらに言えば共通になっています。
しかし,ATF750xは・・・

(ATF750Cデータシートより抜粋,追記,レジスタードモード時)
このように,配線がプログラム可能になっています。さらには個別になっています。
そのため,好きな端子をクロックにでき,逆に言えばどの入力をクロックにするか?を指定してやる必要があります。
これらの差がコンパイル結果の原因となっていました。
つまり・・・
結論としては,IC内部の仕様,機能の問題となります。
Oops...
ならば何か解決策を・・・と言いたい所ですが,残念ながらD-FFはクロックに同期して動きます。
そのため,同期リセットは容易ですが,非同期リセットはだいぶ細工しないといけません。それでロジックを消費しては本末転倒です。
すると・・・ピン数がATF22V10xと同じATF750xでやってしまった方が早いでしょう。
なお,コレはATF16V8xの仕様漏れかというと,そう決めつけるにはちょっと酷な話。
元となっているGAL16V8は1980年代に発売されたICで,当時の半導体の技術ではただでさえ内部がゲートだらけなICにD-FFを入れるだけでも精一杯でした。
当時としては,使い勝手は物足りなくてもD-FFが入ってるだけありがたかったんですね。
その後,半導体の技術が向上し,より複雑な回路が作れるようになり,マクロセルもさることながらゲートアレイも増え,ARやSR,SPといった機能が追加されたんですね。
と,結果的に半導体技術の向上を感じるという,何だかポエムのような結果になってしまったというのが今回のお話でした。
4.まとめとSPLDとの上手な付き合い方?
さて,ちょっと物足りない結果ではありましたが,上記の通りIC内部の仕様の問題でした。
これらの事を踏まえ,私なりに出した結論は以下の通りです。
1. D-FF等を自由に使いたいのであればマクロセル等が高度な新しいデバイスを検討する
これはまさに今回の内容ですね。
マクロセルでできる事が新しいデバイスは増えています。マクロセルが高機能であればできる事も増えます。
更には全ての信号をプログラムできるゲートアレイ等,自由度も高くなっています。
ちょっと複雑な事をしたい場合は,新しいデバイスを検討した方がよいでしょう。
2. 簡単なAND/OR/NOTのロジックであれば古いデバイスでも平気
コレは今回の内容の対局です。
D-FFが結果的に不便だったATF16V8xですが,D-FFを使わない回路であれば別に問題になる事はありません。
ATF750xの半値程度で売られていますから,そういった回路では安上がりです。
業務であれば在庫管理を加味しつつ,あとは適材適所で使って行けばいいでしょう。
3. データシートを重箱の隅ぐらいまで読み倒し,事前に机上で試してみましょう
ココもちょっと気になった部分です。
実は私,今回登場した旧ATMELのSPLDの前にXILINXのXC9500シリーズというCPLDを使った事があり,その時は今回問題になった点は特に問題なく使えてしまっていました。
そのため,記述の差程度の感覚で使ってしまったというのはちょっと反省点です。
これらの事もあるため,SPLDのように事前に机上で動作を検討できる部品であれば何かコードを書いてコンパイルしてみるのも一つ手でしょう。まして,旧ATMELの開発環境である WinCUPL はシミュレーターを備えます。
ハードを作ってしまったあとでは手遅れです。事前で「あれ?」となれば間に合います。
幸い今回はこの流れ,まだ部品を買っていなかったのでセーフでした。
・・・といったところでしょうか?
以上の内容より以下の点も考えられます。
4. これから始めるのならATF750xの方がいいかもしれない
ここはちょっと私の感想も含まれるので議論の残るところです。あくまで「そんな意見もあるかもね?」と聞いてください。
3. で書いた通り,私自身,XILINXのXC9500シリーズを使っており,今となってはAR,プログラマブルなCK等は一般的となっているフシがあります。
これから始める,今~未来に生きるというのなら,過去に縛られる必要もありません。
過去を知らずに無知な強い言葉を発するのは良い事ではありませんが,古い常識に合わせる必要もないでしょうし,機能上不便であれば未来に復活する事も考え難いでしょう。
ならば,今時風なATF750xから学習を始めてもよいのでは?と考えます。DIP品もあり取り扱いも簡単です。
まして,言語上規定があるのに使えない,といった内容ですから考えようによっては学習上の混乱の元とも考えられます。
それらの事を考えると,ATF750C等のATF750xシリーズからでもよいように感じます。
・・・と,まぁ,こんな所でしょうか?
さて,今回の一件を通し,久しぶりにPLDに触れましたが勘は取り戻せました。
かつ,今まで見落としていたデバイスに出会ったり,とにかく力が欲しい,先端にいたいというギラギラした若い頃とは違った感覚でPLDを見る事もできました。
現在はというとライターを作るための調べ事も完了,RS-232C経由で書き込めるライターの設計・制作を検討しています。
追加でATF1500xも使ってみたく(こちらはJTAG),その調べ事もしている状況です。
まずはATF16V8x,ATF22V10x,ATF750xでPLDを再開してみようと思います。




