CPLDで遊ぼう!(15)
更新日:2006年7月18日

SWチューナー用周波数カウンタを作ろう
前回汎用の周波数カウンタを作りましたがこの技術を生かせばいろんな周波数カウンタが作れると考えました。そこで「オーディオクラフト工房」でPICで作ったを全面的にCPLDで作り直しました。PICのときよりものすごく正確に表示することが出来ました。CPLDって楽しいですね。これからもどんどん作っていきますね。
SWチューナー用周波数カウンタを作ろうのSWチューナーについて
PICの製作の時は、周波数の計測が追いつかないと考えてSWチューナー側にアンプと分周回路を付加していました。この回路がチューナーの受信感度に影響していた感がありました。今回はCPLDを用いましたので直接計測が出来ると考えてSWチューナー側のアンプと分周回路は削除しました。アンプのみ周波数カウンタ側に入れ込みました。
(SWチューナー側のアンプと分周回路)
(SWチューナー側の内部)
余分な回路を削除しましたのでかなりすっきりしました。これによって感度も向上したように感じました。SWチューナー詳細は「オーディオクラフト工房」を参照お願いいたします。
SWチューナー用周波数カウンタを作ろうの全体構成
今回は出来るだけ外付け回路を減らすように工夫してみました。前回の周波数カウンタは各セグメントごとにスタティック点灯させていましたが今回はダイナミック点灯として回路の簡略化に成功しました。
(回路構成概要)
前回の周波数カウンタの基本は同じですが、測定時間が1種類しかないことと、7セグメントのダイナミック点灯を実現するためにいくつかのモジュールを新作して対応いたしました。このモジュールについて続いて説明いたします。
SWチューナー用周波数カウンタを作ろうの引き算モジュール(その1)
SWチューナーはスーパーヘテロダイン方式であるため局部発振周波数が受信周波数と異なっています。従って周波数の表示はこのずれ部分を考慮する必要があります。このSWチューナーは局部発振が450kHz上側になっています。周波数表示については随時450kHz分だけ引き算して表示する必要があります。カウントは従来の周波数カウンタと同じく4bitのBCDカウンタを使って計測を行います。その計測値をラッチモジュールに行く前に演算することにします。今回の表示の最小単位はkHzですのでそのカウント値から450をBCDで引き算すれば実現することが出来ます。実際には6桁のBCDカウンタを用いて計測を行います。上から5桁分だけ「0045」を引き算すれば正しい周波数表示となります。まずは「4」を引くモジュールの説明をします。
(BCDデータ4の引き算モジュールの入出力)
(BCDデータの4の引き算モジュールのVHDLソース)
単純に4を引くというモジュールはもっと別な方法でも出来る気はしますが、私の場合は判り易いように入力のパターンで出力を決めてしまいました。結局このほうが簡単だったと思います。下の桁から繰り下がり信号が来ているときとそうでないときの2通りで演算結果を出力しています。
SWチューナー用周波数カウンタを作ろうの引き算モジュール(その2)
同様に5の引き算を考えます。別に難しい部分はありませんね。
(BCDデータ5の引き算モジュールの入出力)
(BCDデータの5の引き算モジュールのVHDLソース)
SWチューナー用周波数カウンタを作ろうの引き算モジュール(その3)
下の桁から繰り下がり信号が来た時に対応できるよう、0の引き算のモジュールも必要になります。繰り下がり信号が来ていないときはそのまま出力しています。
(BCDデータ5の引き算モジュールの入出力)
(BCDデータの0の引き算モジュールのVHDLソース)
SWチューナー用周波数カウンタを作ろうの5bitリングカウンタモジュール
今回は7セグメント5桁分をダイナミック点灯します。そのベースになるのがこのリングカウンタです。入力信号が入るごとに出力が順にシフトしていき、全部シフトするとまた最初に戻ってくるというモジュールです。
(5bitリングカウンタモジュールの入出力)
(5bitリングカウンタのVHDLソース)
SWチューナー用周波数カウンタを作ろうの5to1セレクターモジュール
表示する5桁分のデータは1桁ごとに選択して出力しなければなりません。5bitのリングカウンタの出力データを元に5桁分のBCDデータを切り換えて出力します。(長いので横にしました)
(5to1セレクターモジュールの入出力)
(5to1セレクターモジュールのVHDLソース)
SWチューナー用周波数カウンタを作ろうの5bit反転出力モジュール
リングカウンタの出力データを反転します。ダイナミック点灯の外付け回路にPNPのトランジスタを使用するのでそのためのモジュールです。
(5bit反転出力モジュールの入出力)
(5bit反転出力モジュールのVHDLソース)
SWチューナー用周波数カウンタを作ろうの7セグメント出力モジュール
今回は7セグメントのLEDをポートで直接引き込みますので、出力を反転しています。それ以外に難しい部分はありません。
(7セグメント反転出力モジュールの入出力)
(7セグメント反転出力モジュールのVHDLソース)
SWチューナー用周波数カウンタを作ろうのラッチ出力分周モジュール
周波数の計測は20msecごとに行われています。従って表示のためのラッチも20msecおきになります。このスピードで表示が切り換わると一番下の桁の表示が大変見ずらくなります。そこでこれを1/5にすることによって表示の品位を少し高めました。これによりチューニングに対する表示追従には影響が少なく、見やすくなっています。計測・表示に関する基本原理は周波数カウンタのページを参考にして下さい。
(1/5分周モジュールの入出力)
(1/5分周モジュールのVHDLソース)
SWチューナー用周波数カウンタを作ろうの内部構成
ここまで説明した新たなモジュールと今までのモジュールを使って簡単にSWチューナー用周波数カウンタを構成することが出来ました。自作のチューナーなので中間周波数を450kHzではなく455kHzを使われている方は「5を引く」桁のさらに下の桁に「5を引く」モジュールを追加すれば簡単に対応することが出来ます。
(SWチューナー用周波数カウンタ内部回路)
SWチューナー用周波数カウンタを作ろうの入力アンプバッファ回路
SWチーナーからの局部発振周波数を受ける回路です。CPLDが3.3Vで動作していますので必ずVHCシリーズのICで受ける必要が」あります。このICは3.3Vで動作させますが入力レベルが電源電圧を超えても正しく使用することが出来ます。今回は入力アンプを組み込みましたので74HVCU04を使いました。
(入力アンプバッファ回路)
SWチューナー用周波数カウンタを作ろうの7セグメントLED回路
CPLDで直接7セグメントのLEDを駆動します。アノードコモンタイプの7セグメントLEDが必要です。ダイナミック点灯ですので切り換えにトランジスタを使用します。
(7セグメントLED回路)
SWチューナー用周波数カウンタを作ろうのピン接続のまとめ
SWチューナー用周波数カウンタのピン接続をまとめておきます。
(SWチューナー用周波数カウンタのピン接続)
SWチューナー用周波数カウンタを作ろうの製作から大完成へ
周辺回路を簡素化したので従来のオーディオクラフト工房のケースに収めることが出来ました。コネクタをケース裏面から出してあるのでCPLDの改良は後からでも可能です。
(ケースの加工です)
(CPLD基板はこんな感じ)
CPLD基板は接続しない端子にはピンを立てていません。
(内部構造と入力アンプバッファ回路部分です)
(動作中です)
周波数が入力されていない時には10MHzから450kHzを引いた値を表示しています。
(裏面はコネクタと入力端子です)
オーディオクラフト工房での使用ですので電源電圧は12Vになります。従って内部で一旦5Vに落としています。
(チューニングの最低周波数と最大周波数です)
(どちらも日本語の放送を受信中でした)
SWチューナー用周波数カウンタを作ろうの全VHDLソースコード
私と同じ周波数カウンタを作られるまたは勉強される方のために全ソースコードなどプログラム一式を公開いたします。フォルダごと圧縮しましたのでそのままもってって下さい。
全ソースコードはこちらです。
いかがでしたでしょうか。基本が判ればこれほど簡単に開発が出来るCPLDは大変すばらしいデバイスだと思います。今回のような周波数カウンタはCPLDの使用が大正解だと思います。
今回は「CPLDで遊ぼう」と「オーディオクラフト工房」のコラボでお送りしました。今後もこのようなコラボで製作の幅を広げて行きたいと思っています。
これからもますます楽しくなる「CPLDで遊ぼう!」をよろしくお願いいたします。