トランジスタ技術2006年4月号付録のCPLD基板を使用して、周波数カウンタを作りました(製作期間:2008年10月13日〜11月16日)
少し精確な周波数測定の必要があり、30ン年前にTTLを組み合わせて自作した周波数カウンタを探し出そうと、実家で聞いてみると、押入れの奥にしまったので、捜索不可能と宣告されてしまいました。探し出しても、ちゃんと動作する保証はなく、測定できる周波数も低かったので、新しいカウンタを作ることにしました。今更改めて標準ロジックICの組み合わせで作るのは面白くないので、何か良いものがないかとインターネットを検索してみました。いくつかの製作例を見つけましたが、トランジスタ技術誌2006年4月号の付録のCPLD基板を死蔵していましたので、nonchansoftさんの電撃麻雀遊戯の中の「CPLDで遊ぼう!」にある、「ミニ周波数カウンタを作ろう」を参考にして製作することにしました。
トラ技の基板は買ったまま死蔵していただけで、また過去にCPLDやHDLを使った経験はありませんでした。そこで、まずは開発環境を立ち上げて、実験をしながら少しずつCPLDに慣れて行くことにします。
とりあえず、付録基板の組み立てですが、これは部品さえ集めてしまえば問題はありません。水晶発振器はトラ技の製作例やnonchansoftさんの製作例にあわせて10MHzのものを探しましたが、秋葉原で正方形のタイプの10MHzを見つけるのに手間取り、少し高いもの(というより普通の値段のもの)を買ってしまいました。しかし、この周波数はVHDLコードの中の分周回路の定数を変更するだけで簡単に変更できます。したがって、CPLDの動作範囲で、作りたいクロック周波数の範囲内であれば適当な周波数のものが使えます。安売りしている発振器があれば、あまり周波数に拘らずに使うことができます(ということは、後でCPLD開発についての理解がもっと進んでから分かりました)。オプションの電源(3.3VのLDO電源)も取り付けています。
開発用のソフトウェアは、トラ技の付録CD-ROMのものは古くなっているので、CPLDのメーカであるALTERA社のWebから入手しました。最新(2008年12月14日現在)の無料版の開発ツールは「Quartus II Web Edition (v8.1)」となっており、以前必要だった、ライセンス登録が不要になっています。ソフトウェアのインストールは特に問題なく完了できました。古いバージョンのQuartus IIで作ったプロジェクトを開くと、「データベースを変換します」というようなメッセージが出ますが、「OK」としても今までのところ問題は起きていないようです。
次に、実験用兼周波数カウンタ製作用のベースボードを作ります。CPLD基板への電源の供給と、必要なI/Oピンの引き出し(コネクタ、ピンヘッダに接続)だけなので、非常に簡単です。ベースボードには、実験のため、スイッチポートにチャタリング防止用の抵抗・コンデンサ、またLEDのドライブ用のトランジスタが搭載してありますが、周波数カウンタのためだけであれば不要です。回路は最終的な周波数カウンタ用の回路そのままですので、次の章に掲載します。引き出したI/Oピンからさらにブレッドボードに配線を行い、ブレッドボード上に7セグメントLEDなどを置いて、実験環境としました。トラ技に掲載されている例題などを参考にCPLDとVHDLの理解のための簡単な実験を行いました。
ベースボード |
CPLD基板を搭載 |
実験中の様子 |
この段階で、今回周波数カウンタに使用するLED類の明るさを見ながら、電流制限用抵抗の値を調整して決めておきます。
ベースボードはまだ広いスペースが残っていますので、将来何か追加することも可能です。
いくつかの例題や、周波数カウンタの基本となるモジュールの実験で、CPLDやVHDLがある程度理解できたところで、実際の周波数カウンタの製作に取り掛かります。分からない部分も残っていますが、真似することで理解が進むこともありますので、とりあえずは作って動かしてみる方針です。全体の回路図(付録基板部分は除く)は、次のようになります。
基本的にはnonchansoftさんの回路(実質的にはCPLDのピンアサインで決まってしまう)をそのまま使っています。
7セグメントのLEDは秋月で2桁x4個100円(安ィ!)で購入したもの(HDSP-K211)です。アノードコモン型の7セグメントLEDであればたいてい使用できますが、電流制限用の抵抗(R10-17)は明るさを見ながら調整する必要があります(上述)。ユニバーサル基板を適当な大きさに切ったものにLEDと電流制限用抵抗を載せ、ベースボードとの接続用の線をコネクタ(ピンソケット)に引き出します(右下写真)。
LED表示基板(表) | LED表示基板(裏) | コネクタの配線 |
回路図上では、CN_LEDに7桁目、8桁目のLED用の配線(IO38, IO40)が書いてありますが、現在は使用していません。
プリアンプ部分は、ベースボードの空いている部分に作っても良いのですが、高い周波数を扱う広帯域のアナログ回路なので、ディジタル回路から発生する雑音の影響を減らすために、別の基板で作りました。全面に銅箔がついたままの生プリント基板の銅箔面に、同じく生プリント基板を約5mm各に切ったチップを貼り付け、その上に部品をハンダ付けする、「ランド方式」と呼ばれる方法で作成しています。元になる基板が全面アースとして使えるので、高周波でのトラブルが発生しにくいと期待できます。うまく部品配置すれば、コンパクトにまとめることが可能です。
CPLDの回路設計は、nonchansoftさんがソースコード他プロジェクト一式で公開されているので、これをほぼそのまま使わせていただきました。ただし、オーバーフロー表示のLEDのところにトランジスタのドライバが入っているため、出力の論理が反転している点は、変更が必要です。また、Quartus II のバージョンの違いのせいか、私の設定が悪いのか、1ヶ所どうしてもエラーとなってしまう部分がありましたので、ここも変更しました。変更した部分のVHDLのソースコードを以下に示します。
変更点 | 元のVHDLファイル | 変更後VHDLファイル | 説明 | ||||||
オーバーフロー表示信号の論理変更 |
latch1bitnot.vhd | latch1bit.vhd |
論理の変更に伴いentity名も「latch1bit」に変更。このためトップ・エンティティのインスタンスも置き換える必要あり。 | ||||||
エラー対策のための変更 | bunshu7sel.vhd | sel_div10.vhd |
実験過程で作成したVHDLファイルを使用したので、ファイル名とエンティティ名が変わった。このためトップ・エンティティのインスタンスも置き換える必要あり。信号名も変わってしまったので、以下のように読み替え。
|
この段階で、バラックで組み立て、CPLDにコンフィグレーションをダウンロードして、動作確認/デバッグを行います。
まだプリアンプを接続していないため、3V以上の振幅のある試験信号が必要でした。手元のDDSは出力電圧が低いせいか、カウントされません。適当な信号源が無いか探したところ、トラ技2008年8月号付録のマルチテスタに、パルス出力機能があることに気づき、これを接続しました。このマルチテスタのパルス出力の周波数は近似的に計算されたものなので、精確な周波数にはなりません。写真を良く見ると、マルチテスタの表示が「210kHz」なのに、周波数カウンタの表示は「210.60」になっているのが分かると思います。これでも一応動作していることは確認できました。
実はここに書いてあるほど順調に動作したわけではなく、オーバーフロー表示の論理が反転しているのを忘れていたり、勘違いがあったりして、何回もソースコード修正とダウンロードを繰り返しました。しかし、それも自作の楽しいところです。
動作確認できたところで、いよいよケース加工と最終的な組み立てです。ケースはタカチのYM-180を使用しました。大きめで、内部はガラガラですが、表示の大きさや入力コネクタの使い勝手などを考えると、適当な大きさだと思います。下の完成写真では、LEDの部分が穴が空いたままで、よく見ると、ユニバーサル基板が丸見えです。ここには後日スモークのアクリル板を両面テープで貼り付けました(ページトップの写真)。
ケース穴あけ |
ケースへの組み込み |
完成 |
はじめてCPLDやVHDLを使用しましたが、無事完成にたどり着きました。しかし、実は10進カウンタのキャリービットの処理などについては、まだ腑に落ちない部分があります。いろいろなWebサイトや書籍類をあたってみましたが、どこを見ても「これでいい」と説明してあるので、とりあえず、納得しておくことにしています。もう少し勉強が必要です。
下の写真は秋月のDDSキットの出力信号を測定しているところです。設定どおりの周波数が表示されています。双方の基準発振器の誤差によって、多少の誤差は出ていますが、当面の用途としては十分実用になりそうです。
最後になりますが、設計を参考にさせていただき、またこのページでの紹介も快く了解いただきました、nonchansoftさんに御礼を申し上げます。
ページ作成: 2008年12月14日〜20日