平成14年7月4日朝刊
|
平成10年2月28日発行.第三種郵便物不認可
|
CPLDが使われている分野 |
---|
趣味ではない世界ではCPLDは脇役です。アドレスのラッチだとか、バスの制御だとか、あまり複雑な処理を担当させてもらえないのが実情です。従来のTTLロジックの置き換えというところでしょうか。 一方、趣味の電子回路の世界ではTTLロジックの置き換えを超えて、いろいろと面白いことに使われています。 FPGAの方がすごいことができる?CPLDとFPGAを比較すると、まず規模の大きさが挙げられます。規模の大きなCPLDというのはほとんどありませんが、FPGAでは100万ゲートとか200万ゲートというのがあたりまえのように存在します。FPGAは設計の自由度も非常に高く、複雑な演算やアルゴリズムを実現するのに向いています。PCIとのインターフェースもFPGAが圧倒的に多いですし、CPUを内蔵することだって難しくありません。 ![]() CPLDの方が使いやすい?コンフィグROMではCPLDFPGAを使いにくくしている点はいくつかあります。まず、コンフィグROMが必要であることです。CPLDは不揮発性なのでいったん書きこめば電源を入れるたびにすぐに使用可能になります。しかしながら一般的なFPGAはコンフィグROMというものを、FPGAの外側に用意しなければなりません。このコンフィグROMはメガバイト級を持ち、そう安いものでもありません。一昔前まではコンフィグROMはワンタイムのものばかりで、書き換え可能のものはつい最近でました。開発環境ならCPLD無料の開発環境もCPLDの方が先に登場しました。現在市場に出回っている主流のXILINX社CPLDはすべて無料で開発できますが、FPGAは300k程度の規模のものまでに制限されています。一昔前では簡単なFPGAのコンパイルですら一晩かかったりしたものですが、CPLDの論理合成は数分で終了します。入手性ならCPLDCPLDの入手性は良いです。私は1998年ごろから趣味でもCPLDを使い始めましたが、当時は入手にとても苦労しました。今では街でも普通に買えるようになりました。ところがFPGAの入手性といえば、いまだに良くないです。個人相手に売ってくれないということではなく、代理店にも望みのICがないことが珍しくないということです。 今後の趣味の世界はFPGAはプロ用、CPLDは趣味用だなんていう区分は絶対にありません。とにかく一昔前までは、趣味の世界ではCPLDの方が使いやすかったといえるでしょう。最近では大規模なFPGAボードも販売されるようになり、開発環境も規模限定とはいえど無料で揃うようになったので、今後は趣味の世界にもFPGAが広がっていくことを期待していますし、私もいろいろFPGA回路の製作例を増やしていくつもりです。 |
CPLDの構造 |
---|
XILINXのCPLDは下の図のような構造をしています。
ファンクションブロックは18本の入出力端子を持つブロックで、
CPLD内では複数のファンクションブロックが太い配線で接続されています。
そしてファンクションブロックは18個のマクロセルから構成されています。 一見して、TTLで組んだデジタル回路とはぜんぜん違います。このような回路で従来のTTL回路を置き換えできるのでしょうか? ![]() |
TTL時代の回路構成 |
まず、TTL時代にはどのような設計がおこなわれていたでしょうか?TTL ICを使った回路では、カウンタやラッチ、コンパレータ、セレクタ、プライオリティーエンコーダ、マルチプレクサなど、中規模の機能を持ったICを組み合わせて回路を構成していましました。
![]() |
組み合わせ回路とは |
組み合わせ回路とはコンパレータやデコーダ、マルチプレクサなど、クロックを必要とせずに、入力が決まれば瞬時に結果が得られるものです。そのような回路を組み合わせ回路といい、組み合わせ回路をループせずに組み合わせた回路も、また組み合わせ回路となるという性質があります。 たとえば10個の74HC138を組み合わせて作った複雑なアドレス選択回路も、入力が決まれば瞬時に出力が決まります。与えられた数値を11倍して5を足す回路も、入力が決まれば瞬時に出力が決まります。このような回路も組み合わせ回路です。 ところで、組み合わせ回路を複数集めると、普通は論理的な冗長性が生じます。この冗長性は圧縮することができます。次の図は複数の組み合わせ回路とレジスタで構成されたTTL回路の例で、圧縮してしまうことで残った組み合わせ回路とレジスタだけになる様子をあらわしています。 ![]() 圧縮してできた組み合わせ回路は、ANDとORとNOTの塊のような回路で、これをTTLの標準ロジックを集めて作るのは手間がかかりすぎるので普通はやりません。 下の図は11ビットの入力から1ビットを出力する簡単な組み合わせ回路の例ですが、74シリーズのICでこのような回路を作る気にはなれません。このような組み合わせ回路を汎用のTTLロジックで作ることは現実的ではなかったので、マルチプレクサやエンコーダ、コンパレータなどの機能を持ったICが街で売られていたわけです。 ![]() |
マクロセルとは |
マクロセルはCPLDを構成する基本単位で、汎用の組み合わせ回路と1ビットのレジスタ(フリップフロップ)で構成されています。汎用の組み合わせ回路は、ANDやOR、NOTそしてXORを自由にプログラミングでき、先ほどのような面倒な回路も、はんだ付けをすることなしに、作れてしまいます。 TTL回路の圧縮でもそうですが、組み合わせ回路の先にはレジスタ型の回路がつながる場合が多いので、マクロセルは組み合わせ回路とレジスタをセットにした構造になっています。 CPLDは、組み合わせ回路が適切にプログラムされた数多くのマクロセルをつなぎ合わせて作る回路というわけです。 CPLD回路設計の最も重要なステップは、マクロセルにフィットさせることです。CPLD設計の流れを下の図に示しますが、人間がおこなう作業は元にするTTL回路の本質を見極めて構造を抽出するところです。それ以外の処理はツールが自動でおこなってくれます。 マクロセルの構造を意識しなくてもツールはそれなりにフィットしてくれますが、チップの使用率が100%近いような極限状態や、チップの最大速度を出そうと思うならばマクロセルの構造に気を使った設計をしなければなりません。 ![]() |
組み合わせ回路とROMの違い |
組み合わせ回路とROMの違いについても簡単に触れておきます。マクロセル内の組み合わせ回路は、18ビットの入力から1ビットの出力を得るためのもので、その点だけみればROMの動作に似ています。しかし、18ビットアドレスのROMでは262144種類の情報は完全にランダムに設定できるのですが、組み合わせ回路はそうではありません。ある程度の「簡単さ」が必要になります。 下の図はその「簡単さ」を理解していただくためのイメージ図です。図を書く都合で8ビット入力1ビット出力の回路を組んだ場合を例に説明します。ROMでは入力と出力を完全に自由に対応づけできますが、CPLDでは右の図のような規則性が要求されます。 ![]() このような制限があるにもかかわらず、CPLDが世の中のかなりの回路をフィットできるのは、実際のアプリケーションで求められている回路、上図の右側の図のような規則性を備えているからに他なりません。 その「簡単さ」は、既存のTTLの組み合わせ回路を圧縮して作られたような回路であれば満たしていますが、8*8ビット乗算器の結果の10ビット目などというのは複雑過ぎて作ることができません。このような場合はFPGAを使うことになります。 なおFPGAでは、回路の構成単位はマクロセルではなく、小規模RAMです。このRAMはユーザーが自由にプログラムできるのですが、回路から見ればROMのようなものですから、上の図の左側のように任意のロジックを作ることができるわけです。FPGAはとても自由度が高いのです。 最後になりましたが、マクロセルのレジスタは使用しないこともできます。レジスタを使用しなければ、組み合わせ回路の結果が直接出力されます。 |
CPLDの得意と不得意 |
---|
CPLDとFPGA、ワンチップマイコンのそれぞれに得意分野とそうではない分野があります。それはお互いの構造の違いに大きく関係しています。 CPLDは一列に並んだマクロセルの組み合わせ回路とレジスタという構造をしていて、唯一のクロックで一斉に回路が動きます。遠いところにあるロジックもグローバルな太い配線を使って瞬時に伝わります。そのため緊密なロジックが他のファンクションブロックにあることも稀ではありません。 もちろん2つ以上のクロックを使用することもできますが、1つのクロックとして説明しました。 一方FPGAでは、小さなセルが互いにつながりあい、隣あうセル同士で情報を送り合うことで全体の動作をおこないます。もちろんグローバルな配線も用意されていて、遠いセルとも情報交換をおこなえるように工夫されつつありますが、近いものほど緊密につながります。最近では乗算器のように複雑な論理や、メモリなど資源を無駄遣いする回路は、それ専用の領域が用意されています。 ![]() |
CPLDが得意とする分野は |
CPLDの最小構成単位であるマクロセルは多入力であるので、それを活かせる分野が最適です。たとえば、アドレスデコード回路などには最適です。 一方FPGAの基本構成単位は5入力1出力のセルですが、18入力をつくるためにはそれを4個以上も消費してしまい、不経済です。 ![]() CPLDでは信号を左から右へ流すような分野が得意です。数バイトの情報を保持することもできますので、CPUから見えるモード設定用の内部レジスタを持ったI/Oをつくることもできます。 |
CPLDが苦手とする分野は |
記憶を必要とする分野は苦手です。CPLDでも多少の記憶ならできますが、1ビットを記憶するだけでも1つのマクロセルを使ってしまいます。たとえば、XC95108をメモリとして使うなら108ビット分しかありません。XC95108を8ビットのメモリとして使うなら13バイトしか作ることはできず、しかもFIFOになってしまうでしょう。 意外なことですが、バスのマルチプレクサも苦手です。4本の8ビットバスを1本の8ビットバスにマルチプレクスするのがぎりぎり限界です。 ![]() XC95シリーズを使って、1つのファンクションブロック内に4バイトのマルチプレクサを作った場合、ファンクションブロックは36本の入力信号しか入れることができないので、4*8=32と入力マルチプレクサの選択のための2ビットで、入力がほぼ飽和してしまいます。 この場合、18マクロセルあるファンクションブロックも8マクロセルしか有効に活用できず、10マクロセルが無駄になってしまいます。 左の図のように4バイトのメモリを作るのにファンクションブロックを2個使い、それを束ねるマルチプレクサでも2つのファンクションブロックをつかってしまうことも、珍しいことではありません。これだけでXC9572をほぼ使い切ってしまいます。 上記の問題を回避するために、8ビットのデータを複数のマクロセルから出力することもおこなうこともあります。 CPLDにとって演算はもちろん苦手です。任意の2つの数の足し算や引き算くらいのことならばCPLDでも可能ですが、掛け算は特に苦手です。 |
CPLD回路の設計方法 |
---|
ここでは具体的な例を出しながら、作りたいものが最も有名なCPLDであるXC95108の中に収まるか考えることにします。 |
CPLD回路の見積もり方法 |
いくつかのアプリケーションを例に、考えてみましょう。 どのような回路であっても、出力ピンの数と、内部で保持する情報量を見積もることから始まります。それらの数から必要なマクロセル数を算出し、目的とするデバイスにフィットできるかどうかを検討します。フィットできなければ、ひとまわり大きなデバイスを選択するか、デザインを分割します。 次に、デザインの雛型をつくり、ピン配置も決めたら実際にフィットしてみて実行速度を調べます。これでだめなら、組み合わせ回路を分割するか、ワンランク高速なデバイスを選択します。 ![]() |
デジタル時計の場合 |
ここでは「12:00」と表示されるデジタル時計を例にとって見積もります。果たして1個のXC95108で設計できるでしょうか?出力信号の見積もりまずは何本の信号出力が必要であるかを考えます。大雑把に言って、出力は
ダイナミック点灯させるので、その制御用に4本の出力と、「:」を点滅させるために1本必要です。 この方針でCPLD回路を大まかに設計すると下の図のようになります。 ![]() *ダイナミック点灯させると、出力の配線の数が減らせる。 レジスタ数の見積もり「時」「分」のカウンタこの時計では、「時」は1〜12までしか表示しないので、4ビットあれば足ります。「分」の桁も0〜59までなので5ビットあれば足りるかと思うかもしれませんが、CPLDが内部で扱っている数値は2進数ですから、それを10進数に直すためには割り算をしなければならなりません。演算全般がそうなのですが、特に割り算はPLDにとって苦手です。割り算をしなくてもよいようにBCDコードで扱うことにしましょう。 「分」の桁は10進数で2桁なので4*2=8ビット必要になりそうですが、10の位は0〜5までなので、3ビットで足ります。 回路内で統一を図るために「時」のカウンタもBCDで構成し、4+1ビットとします。 よって、「時」と「分」を記憶するためには4+3+4+1で12ビット必要ということになります。 1秒を刻むカウンタさて、時計ですから、1秒を刻みたいのですがCPLDに与えるクロックは何MHzのものを使えばよいでしょうか?時計用には38kHzの水晶がありますし、街では12MHzくらいの超高精度水晶もあります。これらの発振を利用して1秒を刻みたいわけです。 12MHzの水晶を使う場合で考えましょう。12Mというのは223 = 8388608 < 12,000,000 < 16777216 = 224
ですから、12MHzのクロックを分周して1Hzを得るためには24ビットのカウンタが必要になります。よって、24ビットを見積もります。「秒」のカウンタ「秒」を「分」に直すためには60まで数えられるカウンタがあれば良いのですが、「秒」をLEDに表示させるのであれば、2桁のBCDカウンタが必要で7ビット見積もります。「秒」を表示させる必要がなければ5ビットで済みます。ダイナミック点灯ダイナミック点灯をさせているわけですから、どの位置のLEDを表示させているかを保持する必要がありますが、これはダイナミック点灯用の出力レジスタと兼ねることができます。よって、新たに0ビット必要です。ダイナミック点灯によっていくつかのBCDカウンタの出力から1つを選択します。これはマルチプレクサでおこないます。マルチプレクサはマクロセルを消費せずに作ることができる場合がおおいので、新たに0ビット必要です。具体的に言えば、出力部のBCD→7セグ変換回路といっしょに作りこみます。 ダイナミック点灯を切り替える速さは、1秒間に100回も更新すれば問題ありません。ダイナミック点灯は4桁ですから400Hzが必要です。これを得るために18ビットくらいのカウンタを新規に用意するべきでしょうか?その必要はありません。 先ほど、1Hzを得るために24ビットのカウンタが必要と書きましたが、1Hzではなく400Hzを得ることにします。そして400Hzをさらに分周して1Hzを得ることにします。カウンタを2段にするわけです。 設計の一部見直し12MHzから400Hzを得るためには、カウンタで30000を数えればよいわけなので、15ビット必要です。400Hzから1Hzを得るためには9ビット必要です。今回はカウンタを2つに分けても合計のビット数は変わりません。今回は偶然そうなったわけですが、分けどころによっては1ビット増えることもあります。 ![]() 内部に必要なレジスタまとめまとめると、
出力本数まとめLEDへの出力に
XILINXのCPLDの場合、ほとんどの場合は1マクロセル=1ビットと考えてよいので、合計60マクロセル必要ということになります。 ただ、実際には設計時には予期しなかった信号が入る可能性があるので、余分に8ビットくらい見ておきましょう。たとえば、マルチプレクサと7セグ表示回路がひとつにまとめられるかなどです。とはいえ、それでも72マクロセル以下で収まりそうです。 機能の拡張さて、これにアラーム機能をつける場合はどうでしょうか?アラーム用の時、分、秒のカウンタと午前午後で新たに13ビット必要です。アラーム用の音を出すための分周カウンタもメインのカウンタを流用すれば足ります。ピピピピッピピピピッの音を出すためには、間欠動作させるわけですが、4回鳴らして4回休むと考えれば3ビットで足ります。これもメインのカウンタを借用しましょう。結局のところ、現在アラームが鳴らすべきか否かという情報だけを保持すれば良いので、1ビット必要です。 これまでの見積もりには考え違いもあるでしょうが、そうだとしても、それほどマクロセル数は増えません。 結論目覚し時計は1個のXC95108PC84Cで作ることができるという結論が得られました。もちろん同じものをPICマイコン1個でもできるでしょう。PICとの大きな違いは、CPLDでは回路のすべての部分が同時に動作していることです。PICで動作しているのは、現在実行している番地の1つの命令です。とはいえ、目覚し時計程度のアプリケーションであれば、大きな違いはわかりません。周波数カウンタも同様の方法で見積もることができます。 |
画像表示回路を作る場合 |
画像をテレビ画面に表示させる回路はCPLDで作れるでしょうか?最も簡単な例題として、ノンインターレースNTSCの同期信号を発生させる回路を例に見積もります。出力信号数の見積もりまずは何本の信号出力が必要であるかを考えます。大雑把に言って、出力は
内部レジスタ数の見積もり同期信号を作るために、水平カウンタと垂直カウンタが必要です。NTSCではドットクロックは12MHzから14MHzくらいの範囲なので、1つの水平ラインは同期信号の期間も含めて600から900ピクセルになります。このため水平カウンタは1023まで数えられるように10ビット用意します。 ノンインターレースNTSCでは走査線の数は263以下なのですが、垂直カウンタには511まで数えられる9ビットカウンタが必要です。 水平カウンタの値から同期信号を発生させるためには、カウンタの値とあらかじめセットされた値を比較して、その結果に基づいてフリップフロップを変化させます。このため、10ビットのコンパレータが必要になります。しかしながらその実装方法にはいくつかの方法が考えられ、それぞれ一長一短があります。 ![]() たとえば、水平カウンタの値が20のときに水平同期信号がLになり、水平カウンタが84のときに水平同期信号がHになるような回路を作りたいとします。そのような場合、上のコンパレータでは20と比較し、下のコンパレータでは84と比較します。 この方法の利点は、組み合わせ回路は単なる比較しかおこなわないので、回路が簡単になることです。 ところがコンパレータの出力(a1)と(a2)は組み合わせ出力であり、JKフリップフロップは組み合わせ回路とDフリップフロップで構成できますので、この回路を論理圧縮にかけると、2つのコンパレータの中身が複雑に絡み合った組み合わせ回路が作られます。圧縮後の組み合わせ回路は複雑になりますが、必要とするマクロセルは1つですみます。 ![]() 最初の例(a)では、組み合わせ回路は圧縮されて複雑になってしまいますが、2つ目の例(b)では一度フリップフロップを通すことでそれ以上の論理圧縮を禁止し、回路が複雑になるのを防いでいるともいえます。 ![]() この回路の利点は値の大小を不等号で判断することです。 またコンパレータの出力は組み合わせ回路なので、ICの外に信号を出さないときにはマクロセルを消費しないかもしれませんが、他の組み合わせ回路に入れると論理圧縮できなくなるほど複雑になる可能性があります。 今回はノンインターレースの同期信号を作り出していますが、インターレースにする場合は水平同期信号の上げ下げのために比較する場所が4つになります。例(a)や例(b)では、2つのコンパレータの出力を統合していますが、論理圧縮後の(a1)(a2)(b1)(b2)の信号はそれほど複雑ではないので、4つのコンパレータの出力を統合することもできるでしょう。 しかしながら例(c)ではコンパレータ後の出力が複雑になるので、ひょっとすると論理合成できないかもしれません。 レジスタを挿入するかしないかで、このような違いが生じます。 上記のことをまとめると、画像表示の基礎回路は次の図のようになります。 ![]() 画像表示の目的ここまでで33個くらいのマクロセルが必要になることがわかりました。さて、画像を表示させる目的はなんでしょうか?SRAMで構成した画像メモリの内容をテレビに表示させる回路であれば、メモリインターフェースとCPUとのインターフェースが必要になりますので、
マクロセル数のまとめ基本的な画像表示回路に必要なマクロセル数はざっと
CPUからインターフェースできて、メモリの内容を画像として表示する回路は75マクロセルくらいを消費しますので、XC9572では厳しいですが、XC95108にはフィットできることがわかりました。ただし、今回見積もったのはとても単純な回路で、実用的とはいえません。このデザインを実用的にするならば、もう少し複雑な回路になりますので、XC95108でいっぱいいっぱいになるのかなと思います。 PICでもテレビに画像を表示する回路が作れるよ、と思う方がいらっしゃるかもしれません。PICで画像表示回路を作ろうとすると、プロセッサは水平カウントや同期信号の発生に忙しく、とても1ピクセル毎に絵をだすことはできません。つまり解像度が低くなってしまいます。同時に処理できる命令が1つだけなので、カウンタや比較器のように単純だけれども同時に複数の部分が動くアプリケーションには不向きなのです。 CPLDですと、回路の各部分が独立に動くので画像表示くらいは楽勝です。 結論画像表示回路は1個のXC95108PC84Cで作ることができるという結論が得られました |
CPUを作る場合 |
FPGAでオリジナルなCPUを作る話はよく耳にしますが、CPLDでCPUは作れるでしょうか?設計を簡単にするため、仮想的なRISC型の8ビットCPUを題材に考察していきます。
必要なレジスタ数の見積もりCPUの汎用レジスタと、マクロセル内のレジスタは言葉は同じですが、混同しないようにしてください。アドレス関係まず、CPUに最低限必要なレジスタを数え上げましょう。CPUはメモリからプログラムを読み出して順次実行していくので、プログラムカウンタは必須です。簡単なCPUを考えているので、それほど大きなメモリ空間はいらないとして12ビットとします。また、ソフトウェア上からアドレスを指定してメモリの読み書きをおこなわなければならないので、メモリ参照用のレジスタも同じビット数用意します。これら2種類のレジスタはマクロセルを24個消費しますが、値を保持しておかなければならない性質のものであるので、アドレス出力と兼ねることはできません。アドレス出力用のマクロセルを別に12ビット分用意します。 サブルーチンコールをおこなうのであれば、スタックも必要です。
![]() データ関係データの流れのために、Bという名の汎用レジスタ1つと、データ出力用のバッファ、命令フェッチ用のレジスタ、そして演算結果や外部から取り込んだデータなどを内部のデータバスに出力するためのデータラッチ用レジスタを用意します。これだけで32ビット必要になります。アキュムレータCPUの中心部となるのは加算、減算、論理演算などをおこなうアキュムレータです。8ビットの加算や減算だけならば8マクロセルでできるのですが、これに論理演算が入ってくると8マクロセルには収まりませんので、論理を分割することになります。アキュムレータにも32ビットを見積もります。必要なレジスタ数のまとめ以上のことがらをまとめますと、
このうえさらに、フラグレジスタや命令解読回路、メモリインターフェースが入るととてもXC95108には入りきりません。 結論CPLDのXC95108が1個ではCPUを作ることは難しいでしょう。CPUの中ではデータを保持するだけの回路が多く、せっかくのマクロセルがただのフリップフロップとして使われてしまいます。アキュムレータは組み合わせ回路が非常に複雑になりますが、データ関連のマクロセルはデータを受け渡すだけなので組み合わせ回路をほとんど使いません。これは効率が悪いといえます。ただでさえマクロセル数が少ないCPLDでは、データを単純に保持するだけの回路は、もったいないといえます。 |
まとめ |
どの程度の規模の回路ならばCPLDにフィットできるかどうかを見てきましたが、意外と入ると思いませんか?簡単な画像ならばCPLDで作れてしまいます。 |
CPLDとGALの違い |
---|
GALとはGALとはGate Array Logicの略で、CPLDと同様にTTL回路の置き換えという目的が多いものです。しかしながら、GALはCPLDほどの集積度はないので、CPLD(ComplexPLD)に対してSPLD(SimplePLD)と呼ばれたこともあります。考え方の順序は逆かもしれませんが、ファンクションブロックが1つのCPLDと考えればよいでしょう。使い勝手![]() この点がGAL20V8では改善されていて、レジスタの出力とは関係ない入力専用のピンが4本追加されています。 また、GAL20V8と同じ24ピンでGAL22V10というのもありましたが、1個1000円くらいする高価なICだったので、滅多に使いませんでした。 |
XORゲート |
![]() GALではXORゲートを作り出すためにANDやORを使っていましたが、CPLDではマクロセルの中にあらかじめXORを持っています。このため論理圧縮がとても楽にできるようになりました。 とは言っても、これは論理圧縮をがんばっておこなっているツールが苦労する話で、我々ユーザが直接苦労することではありません。ユーザとしては、フィット後の論理式レポートを見て「よくこんな複雑な回路が入るな」と関心するだけです。 |
まとめ |
---|
いろいろ書いてきましたが、CPLDの特徴をまとめます。 |
CPLDの得意と苦手 |
CPLDは以下の分野で得意です。
|