※ 本記事は,2003年1月号付属CPLD基板をご活用
いただいた読者の方による投稿レポートです.
秋月電子通商のDDSキットは,パラレルまたはシリアル入力により設定された周波数(1Hz〜17.5MHz)のサイン波を発生する基板です.このDDSキットと1月号付録の基板を組み合わせて,ロータリ・エンコーダにより周波数を設定でき,そのときの周波数をLCDモジュールに表示するシグナル・ジェネレータを製作しました.
●仕様設定
本装置の機能を以下のように設定しました.
・ロータリ・エンコーダにより周波数のUP/DOWNを行う.
・ロータリ・エンコーダによりUP/DOWNするけたをけた設定スイッチにより設定することとし,UPまたはDOWNのスイッチを押すごとに位置が1けたずつ上位/下位へずれるようにする.
・LCDに周波数を表示する.ここで,周波数範囲はMHzのけたから10Hzのけたまでの6けたとする(すなわち,1Hz台は0固定で出力範囲は10Hz〜9,999,990Hz).
ハードウェアの全体ブロック図を図1に示します.詳細は回路図を参照してください.
※回路図のデータ(kairo.pdf)はここからダウンロードできます.
[図1] 全体ブロック図
●CPLDの設計
CPLD内のモジュール構成を図2に示します.詳細はソース・リストを参照ください.
※ソース・リスト(final2.v)はここからダウンロードできます.
[図2] CPLD内のモジュール構成
1)エンコーダ入力判定 ENCODER
エンコーダのA相出力(PHA),B相出力(PHB)から回転の有無(MV),方向(DR)を判定するモジュールです.判定方法として,B相出力の立ち上がりエッジが検出されたときエンコーダの回転があったと判定し,そのときのA相のレベルがHレベルのときUP方向,A相のレベルがLレベルのときDOWN方向と判定し,変数MV,DRを出力します(図3).
[図3] ロータリ・エンコーダの出力と判定
B相出力の立ち上がりエッジが検出されたときエンコーダの回転があったと判定し,そのときのA相のレベルがHレベルのときUP方向,A相のレベルがLレベルのときDOWN方向と判定し,変数MV,DRを出力する.
2)周波数設定UP/DOWNカウンタ FREQCNT
10進のキャリ/ボロー付きのUP/DOWNカウンタを6けた接続しました(FREQ1〜FREQ6).ここで,けた設定スイッチ入力(MUP,MDOWN)により変化させるけたを設定する必要があることからけた設定レジスタ(FREQPTR)を使用し,エンコーダ入力モジュールの出力(DR,MV)があった場合にけた設定レジスタに対応したけたのカウンタを変化させるようにしました.
3)10進→2進変換 DDS
6けたの10進カウンタ(FREQ1〜FREQ6)から24ビットの2進数(DDSOUT)に変換するモジュールです.最初は各けたに10nを乗算し総和をとるような記述としましたが,回路規模が大きすぎて入りませんでした.そのため,10の乗算を3ビット・シフトと1ビット・シフトの和に置き換え,上位のけたから10の乗算と次のけたの加算を順次繰り返し計算することにより,回路規模を抑えることができました(図4).
[図4] 10の乗算を3ビット・シフトと1ビット・シフトの和に置き換えた
4)文字列表示シーケンサ LCDOUT
LCDへの周波数表示のモジュールであり,各けたごとに表示位置(LOC),データ(CHARDATA)を指定してキャラクタ表示シーケンサ・モジュールをスタートし(STDISP=1),キャラクタ表示シーケンサモジュールが終了するまで待って(BUSY=0)次のけたの表示を行うステートマシンを構成しています(図5).
[図5] 文字列表示シーケンサとキャラクタ表示シーケンサの動作
5)キャラクタ表示シーケンサ CHAROUT
LCDのキャラクタ表示のモジュールであり,リセット後LCDモジュールの初期設定を行った後,文字列表示シーケンサからの起動によりLCDモジュールの表示手順(DATA,RS,R/W,Eの信号ラインによるレジスタへの書き込みおよびステータス読み出し)に従って1キャラクタの表示を行うステートマシンを構成しています.
●ハードウェアの製作と動作確認
製作した基板の外観を写真1に示します.
[写真1] 製作したハードウェアの外観
オシロスコープを使って動作確認を行ったところ,ロータリ・エンコーダの操作によりLCD表示に対応してDDS出力の周波数が変化することが確認できました.
●感想
最初に作成した記述では回路規模が大きくなりすぎてしまいました.回路規模を抑えるにはどうすればよいかといったところで回路を共通化できるよう試行錯誤を行った点で苦労しました.どれくらいの回路規模でどのFPGAにおさまりきるかといったところがあらかじめ想定できる方法はないものでしょうか.
|