CPLDで遊ぼう!(16)
更新日:2006年8月20日

周波数カウンタ付きクロックジェネレータを作ろう
CPLDの開発が楽しくてしょうがありません。今回はクロックジェネレータを作ります。前回マスターした周波数カウンタを付けることによって出力される周波数が直読出来るようにしました。大変便利な装置と思いますので皆さんもチャレンジして下さい。では製作スタートしましょう。
周波数カウンタ付きクロックジェネレータを作ろうの構成
今回CPLD内部にはクロックジェネレータと周波数カウンタを構成します。周波数カウンタの原理は前回製作のものと全く同じです。クロックジェネレータの部分はNCO(Numerically Controlled Oscillator)というものを使用します。実はこの回路はトランジスタ技術の2001年5月号を参考にしています。原理が説明されていますので参考にして下さい。
(周波数カウンタ付きクロックジェネレータの構成概要)
クロックに10MHzを使用しましたので原理的には約1Hzから5MHzまでの周波数を出力出来ます。出力形態は矩形波としています。ほぼ1Hzごとに周波数が設定出来ますので実験的な周波数出力装置として大変重宝します。
周波数カウンタ付きクロックジェネレータを作ろうの出力周波数
出力される周波数は次の式で計算出来ます。クロックジェネレータのレジスタを24bitとして構成しています。
fout=(fx/2^24)*n
fx=10MHzとしてnを順次変化(ビットごと)させたときの出力周波数を表にしました。
(ビットごとに変化させた時の出力周波数)
計算では約0.6Hzごとに周波数が設定可能です。但し周波数カウンタの最小単位を1Hzとしていますので少なくとも±1Hz程度の誤差は出ると思います。任意の周波数が欲しい時には24個のDIPスイッチを切り換えて設定することになります。切りの良い周波数がどのDIPスイッチの設定で出力可能かを次に示します。
(周波数ごとのDIP設定値)
原理的には0.6Hzごとに設定出来るのでほぼ自分の欲しい周波数は1Hz単位で設定可能です。
周波数カウンタ付きクロックジェネレータを作ろうの全体内部構成図
全体の見通しを良くするために今回は全体構成図から見て下さい。
(CPLD内部構成図)
縮小しすぎてよく見えませんが、データを全て開放しますのであとでじっくり眺めて下さい。CPLDの機能を最大限に使用した素晴らしい出来だと勝手に思っております。
基本的に難しい部分はないと思いますが今までの私の製作に出てきてない部分の構成については以降順次説明いたします。
周波数カウンタ付きクロックジェネレータを作ろうの8ビット加算器とレジスタ
クロックジェネレータの部分の8ビット加算器とレジスタは開発ツールのマクロに入っているものをそのまま使用します。
(8ビット加算器)
(8ビットレジスタ)
周波数カウンタ付きクロックジェネレータを作ろうの6bitリングカウンタモジュール
今回の周波数表示は6桁なので6bitのリングカウンタモジュールを作りました。7セグメントのLEDをダイナミック表示する切り換えに使用します。
(6bitリングカウンタモジュールの入出力)
(6bitリングカウンタのVHDLソース)
周波数カウンタ付きクロックジェネレータを作ろうの6to1セレクタモジュール
6桁分の表示出力を順次選択するモジュールです。
(6to1セレクターモジュールの入出力)
(6to1セレクターモジュールのVHDLソース)
周波数カウンタ付きクロックジェネレータを作ろうの6bit反転出力モジュール
リングカウンタの出力を反転します。ダイナミック点灯の外付けトランジスタを駆動するためのモジュールです。
(6bit反転出力モジュールの入出力)
(6bit反転出力モジュールのVHDLソース)
周波数カウンタ付きクロックジェネレータを作ろうの計測クロック選択モジュール
今回6桁の7セグメントで周波数を表示していますが発生可能な周波数は最大7桁分あります。従って6桁を超えた場合は計測クロックを変えて周波数をずらして表示します。今回は手動でクロックの選択を行います。
(計測クロック選択モジュールの入出力)
(計測クロック選択モジュールのVHDLソース)
周波数カウンタ付きクロックジェネレータを作ろうのドット表示モジュール
周波数の区切りが判るように7セグメントのドットの表示を点灯させます。7セグメントとの表示を分けていますので別モジュールで点灯させます。
(ドット表示モジュールの入出力)
(ドット表示モジュールのVHDLソース)
周波数カウンタ付きクロックジェネレータを作ろうの周辺回路
CPLDの周辺回路について記します。
(7セグメント表示回路)
(周波数オーバー表示回路)
(出力バッファ回路)
(計測クロック選択回路)
(周波数設定のDIPスイッチ回路)
DIPスイッチの設定は24個分必要です。CPLDの入力として「CLEAR」端子がありますがこれは3.3VのVDDにプルアップして下さい。
周波数カウンタ付きクロックジェネレータを作ろうのピン接続のまとめ
ピン接続をまとめておきます。
(周波数カウンタ付きクロックジェネレータのピン接続)
周波数カウンタ付きクロックジェネレータを作ろうの製作から大完成へ
今回のケースは前回6桁表示で別の製作をしていたものを改造して使いました。従ってケースの加工工程の写真はありません。
(内部回路と完成の雄姿です)
24個分のDIPスイッチが天面に乗っているのが多少不細工ですが勘弁下さい。
電源は12Vを使用しますので内部で一度5Vにしています。CPLDの部分はコネクタを背面から出すことによって完成後も内部回路が変更出来るようにしています。
周波数カウンタ付きクロックジェネレータを作ろうを使ってみよう
DIPスイッチを順に設定して出力周波数を見てみましょう。
(周波数出力中)
(区切りの良い周波数も出せます)
周波数カウンタ付きクロックジェネレータを作ろうの出力波形確認
一応出力波形をオシロスコープで確認しておきましょう。
(1kHz、5kHz)
(30kHz、300kHz)
(625kHz、1.25MHz)
(2.5MHz、5MHz)
高い周波数まで綺麗な波形が出ています。(波形の少しの乱れは出力回路の影響と考えます。)
周波数カウンタ付きクロックジェネレータを作ろうの全VHDLソースコード
私と同じ製作をされる方、または勉強される方のために全ソースコードなどプログラム一式を公開いたします。フォルダごと圧縮しましたのでそのままもってって下さい。
全ソースコードはこちらです。
今回作ってみて判ったのですが、DIPスイッチで設定している周波数をダイレクトに出来たらいいなあと考えています。別マイコンを用いて周波数ダイレクト設定の別製作を現在進行中ですのでご期待下さい。
次回は「CPLDで遊ぼう」と「NEC78K0/K0Sマイコン開発室」とのコラボでお送りする予定です。
これからもますます楽しくなる「CPLDで遊ぼう!」をよろしくお願いいたします。