CPLDで遊ぼう!(14)
更新日:2006年6月30日

周波数カウンタとして完成させよう
今回は今まで作ってきたモジュールをベースに周波数カウンタとして完成することにしましょう。一部新しいモジュールも付け加えています。なんとか完成しましたので順に説明します。それにしてもCPLDはロジック設計者にとっては大変便利なICです。今回実感しました。
周波数カウンタとして完成させようのDP点灯モジュール
今回の周波数カウンタは計測モードを3種類切り換えることにします。その時に周波数の区切りでDPを点灯することにします。
(1Hz表示モード)
(10Hz表示モード)
(100Hz表示モード)
3種類の計測モードを上図のようにして、kHzとMHzの区切りにDPを点灯させます。
体感的にわかるようにしたつもりですが、このあたりは皆さんの好みで変えてもらっても良いかと思います。
(DP点灯モジュールの入出力)
入力の状態によって6個のDPを点灯消灯させます。今回の7セグメントLEDは全てトランジスタアレイを中継して駆動していますのでこれらのDPにたいしてもトランジスタアレイを経由します。今からの追加になりますが、なんとか入れ込むことが出来ました。
(DP駆動回路)
DPの接続先は後ほどまとめて記載します。
(DP点灯モジュールのVHDLソース)
周波数カウンタとして完成させようの計測クロック選択モジュール
3種類の計測モードに対してクロックを選択するモジュールを考えます。
3本の入力に対して対応するクロックをひとつだけ選択して出力する簡単なモジュールです。
(計測クロック選択モジュールの入出力)
(計測クロック選択モジュールのVHDLソース)
周波数カウンタとして完成させようの計測制御信号モジュール
計測クロック選択モジュールから出力される計測基本クロックを元に制御信号を出力するモジュールを作ります。今回の周波数カウンタの最小カウント周波数は1Hz、10Hz、100Hzの3種類とします。その時の基本クロックは1sec、100msec、10msecとなります。この基本クロックから計測ゲート信号、ラッチ信号、リセット信号を作ります。
作り方は色々あると思いますが、極めて簡単な方法を考えました。
(計測制御信号の状態)
まずは基本クロック(clkin)を2分周して計測ゲート信号(gateout)を作ります。
次に計測ゲート信号の反転信号をラッチ信号(latch)とします。
基本クロックの反転信号(not clkin)とラッチ信号をANDしてリセット信号(cnt_clear)を作ります。これらの3種類の信号で計測、ラッチ、クリアを連続して行います。計測ゲート信号は基本クロックの倍の周期にしかなりませんので1Hzモードの場合は2秒に一回の計測表示となります。
(計測制御信号モジュールの入出力)
(計測制御信号モジュールのVHDLソース)
周波数カウンタで一番難しいとされるこの部分が完成すればもう全て完成したようなものです。結構シンプルに出来たでしょう。
周波数カウンタとして完成させようのオーバーフロー表示モジュール
計測数が表示桁をオーバーする場合は適時LEDを点灯させることにします。
カウンタがオーバーフローすると桁上がりの信号が出力されますのでその信号をラッチしてLEDを点灯させます。次の計測でオーバーフローしなかった場合はLEDを消灯する必要があるので計測のクリア信号を利用して毎回消すようにしています。
このLEDも一応出力トランジスタを介して点灯しています。
(オーバーフロー表示回路)
(オーバーフロー表示モジュールの入出力)
(オーバーフロー表示モジュールのVHDLソース)
周波数カウンタとして完成させようのラッチ分周モジュール
今回3種類の計測モードを用意していますが、100Hzもモードの時、ラッチは0.02秒に1回行われます。周波数が安定している場合は気にならないのでしょうが、通常は最後の桁の表示が頻繁に変わって大変読みずらくなります。これを回避するために100Hzモードの場合のみラッチを10回につき1回の割合に分周することにします。そうすると10Hzモードの時と同じタイミングで表示するようになるので大変見やすくなります。
(ラッチ分周モジュールの入出力)
(ラッチ分周モジュールのVHDLソース)
周波数カウンタとして完成させようの全体構成
(回路構成概要)
今まで説明しました各モジュールを組み合わせて次のような構成としました。
(周波数カウンタの全体構成)
本当はこれらの構成もVHDL表記が出来るはずですけれども、ロジックICを組み合わせて回路設計をし電子工作を行ってきた私にとってはこの構成図(回路図?)での表現が一番判り易いように思います。
周波数カウンタとして完成させようの入力回路
実際の信号を受ける部分の回路構成は超有名な「電子工作の実験室」を参考にさせて頂きました。全く同じ回路で申し訳ございません。この場をお借りして御礼とさせて頂きます。
(入力回路)
周波数カウンタとして完成させようのピン接続のまとめ
周波数カウンタとしてのピン接続をまとめておきます。
(周波数カウンタのピン接続)
周波数カウンタとして完成させようの大完成の姿
アルミのケースにうまくまとめて測定器っぽくしてみました。まずは中身をどうぞ。
(いつでもアップデート出来るようにコネクタもそのまま収納です)
(ところ狭しと並んでいます)
(結構いけてるでしょう)
(電源投入時はゼロリセット状態です)
プッシュスイッチを押すごとに測定モードが変わります。
(100Hzモードです。100MHzまで表示出来ます)
(10Hzモードです。10MHzまで表示出来ます)
(1Hzモードです。1MHzまで表示出来ます)
周波数カウンタとして完成させようの計測実用のお姿
(別CPLD基板のクロック周波数を測っています)
いやいや、まいりました。ぴったり10MHzです。
(計測モードを変えていくと細かく計測できますね)
9.999963MHzというところでしょうか。
(随分前に作った発振器を測定中)
周波数カウンタとして完成させようの全VHDLソースコード
私と同じ周波数カウンタを作られるまたは勉強される方のために全ソースコードなどプログラム一式を公開いたします。フォルダごと圧縮しましたのでそのままもってって下さい。
全ソースコードはこちらです。
今回の製作はいかがでしたでしょうか。正直ここまでCPLDが面白いとは思ってませんでした。しかしながらどっぷりはまり込んでしまったという感じです。
ここまで来たからにはどんどんCPLDの製作を続けて行きたいと勝手に考えております。日本橋や秋葉原ではなんとかまだ4月号残っております。この際買占めしておいて下さいね。そうしないと私の製作にはついていけませんよ。私的にはこのCPLD基板を8枚ゲット出来ております。
次回は久しぶりにオーディオクラフト工房に戻りSWチューナー用の新たな周波数カウンタを発表したいと考えております。それにしても便利なICやわ。
これからもますます楽しくなる「CPLDで遊ぼう!」をよろしくお願いいたします。