CLCの使い方 


【CLCとは】 (CLC:Configurable Logic Cell)

F1ファミリには新たに「次世代周辺モジュール」として下記のようなモジュール
が新規に追加されました。

 @ CLC:Configurable Logic Cell
 A CWG:Complementary Waveform Generator
 B NCO:Numerical Controlled Oscillator
 C PWM:Pulse Width Modulation
 D COG:Complementary Output Generator


ここではこの中のCLCについて使い方を説明しています。

【CLCモジュールの内部構成】

CLCモジュールは一言でいうと、簡単なCPLDをPICに実装したもので、CLC1からCLC4まで
最大4モジュールが内蔵されているデバイスがあります。内部構成は下図のようになっています。



内部ロジックは図の上部に示した8種類の回路からひとつを選択してロジック回路を構成し、
出力は外部ピンに出力したり、割り込みを生成したり、他の内部モジュールへ接続したり
することができます。
ハードウェアロジックで回路を構成していますので、プログラムには無関係に、
ハードウェアロジックの速度で高速に動作します。この速度は立ち上がりで数10nsec程度ですので
標準CMOSロジックと同等の性能と考えられます。

次に入力源となる信号は全部で29種類あり、この信号源から下表のようにCLC1からCLC3の
モジュールごとに16種の入力が指定されており、さらにCLC内部の4つの入力ブロックごとに
8種類ずつの選択肢に分けられています。
この中から任意のひとつを内部ロジックへの入力とします。
したがって、CLCモジュールごとに入力できる信号源が異なることになりますので、モジュールの
使い分けが必要です。

つまり、CLC1の入力のひとつであるlcxd1にはCLCIN0からTMR2=PR2のイベントまでの8種類の
内のひとつが選択できるということになります。したがってどの入力にも29種類の一つが選択できる
わけではないので、CLC1からCLC4までの接続する順番をうまく決める必要があります。


【CLC設定ツール "CLC Configuration Tool"】

CLCの入力や出力の設定はすべてレジスタ設定で行います。レジスタですから、電源オフで内容は
消えますので電源オン時には再設定する必要があります。

設定レジスタは非常にたくさんあり設定が複雑ですので、これらの設定値を自動的に求めることが
できるパソコン用ツールとして「CLC Configuration Tool」が用意されています。

このツールの画面は下図のようになっており、ひとつのCLCモジュール全体がグラフィック形式で
表示されています。
図の最上段でPICデバイスとCLCモジュールを設定してから、入力、ロジック、出力の3要素を
決めれば、レジスタ設定値が自動的にC言語またはアセンブラ言語用のソースファイルとして
出力されます。



入力信号の選択では、4入力ブロックごとに選択肢が8種類ずつ決まっていますので、必要な
入力信号を選択します。
その後、どのゲートと入力を接続するかをGATEnの直前にある「×マーク」をクリックして選択します。
未接続、接続、反転接続の3種類が選択できます。未接続とした場合のゲート入力はLowの扱い
となっています。

ロジック選択は最上段のメニューで行い、出力は右下のチェックボックスで行います。

最後にFileメニューをクリックして「Save C Code」とすれば、指定したディレクトリにレジスタ設定の
C言語ファイルが「xxxx.inc」の拡張子で生成されますので、この内容をCのソースファイルにコピー
して使います。

Toolのダウンロードは下記のCLCのページからできます。

 「Configuration Logic Cell(CLC)」のページ

【構成例1】

簡単な例題を作ってCLCモジュールの実力をみてみました。作成した回路は下図のような構成です。

CLC2でAND回路を構成し、8MHzのシステムクロックFoscをCLC2ピン(RC0)に出力しています。
その同じCLC2Out出力をCLC1で構成したJKフリップフロップ回路のクロックに入力しています。
CLC1のJKフリップフロップはJ、KともHighにし、RはLowにしていますので、CLC1ピン(RA2)には
Foscの1/2の周波数が出力されます。
これで、CLCのハードウェアとしての動作速度などの実力が見られます。


これをCLC Configuration Toolで生成して作成したプログラムが下記となります。

動作結果が下記写真のようになります。
写真は、上側がRC0ピンのFoscの出力で、下側がRA2ピンのフリップフロップの出力です。
いずれもパルスの立ち上りは結構高速で数nsecとなっていますが、立下りは約20nsec程度と
なっています。
写真の上側の8MHzクロックでは何とか矩形波の形状を保っていますが、デューティは50%では
なくなっています。これが16MHzになると矩形波の形状は維持できない結果となりました。
以上から、CLCロジックの動作速度は、汎用CMOSロジックの動作速度と同じ程度で、
10MHz以下が使用周波数の限界となっています。


【構成例2】

次の構成例はRCサーボの制御に使ったものです。
RCサーボの制御信号はPWM制御で、周期が20msecで、パルス幅は0.9msec〜2.1msecの
間の1.2msecで制御する必要があります。
この制御で難しいのは20msecと1.2msecの差が大きいことで、単純に周期20msecの
PWMで制御しようとすると、デューティの有効幅が約1/20になってしまいますから、
10ビット分解能があっても50ステップ程度の可変幅しか確保できなくなってしまい、
制御としては荒くなってしまいます。

そこで十分な分解能のPWM信号を生成するためにPWMモジュールとCLCモジュールを
組み合わせて下図のような回路を構成しました。


20.msec周期はタイマ0で作成し20.48msec周期とします。
このタイマ0のオーバーフローでCLC1のRSフリップフロップをセットします。
次にPWMの周期となるタイマ2を2.048msec周期に設定します。
このタイマ2とPR2の一致出力をCLC3のDフリップフロップのクロックとし、同時にCLC1の
RSフリップフロップをリセットします。
これで、タイマ0がCLC1のRSフリップフロップをセットしたときだけ、CLC3のDフリップフロップ
がセットされ出力がHighとなります。
そして次のタイマ2の一致でリセットされますから、PWMの1周期分だけCLC3OUTがHighと
なることになります。

このCLC3OUTと2組のPWM出力のANDをCLC2とCLC4で構成しています。
これで20.48msecに1回だけPWM1とPWM4のパルスが出力されることになります。

PWMの周期が2.048msecですから、RCサーボ用の出力としては0.9msecから2.048msecまで
使えます。つまり1024分解能の内、450から1023まで使えますから573ステップで
RCサーボを制御できることになります。
しかもPWMのデューティを設定すればあとはハードウェアで繰り返し動作しますから、
プログラムでRCサーボに対して常時実行しなければならないことは、デューティに変更が
あったときタイマ0の割り込み処理の中で設定するだけとなり非常に簡単な処理となります。

この構成でCLC Configuration Toolで生成したレジスタ設定が下記となります。
このリストを見れば、設定ツールを使わないと気の遠くなる作業であることがわかるかと
思います。