周波数カウンタ用カウンタブロック

Xilinx社のProgramable Logicである「XC9572」を使って
周波数カウンタのカウントをする部分のハードウェアを
作ってみました。




【概要】

PICなどで周波数カウンタを作成すると、PICの応答周波数の制限のため、
カウント周波数の上限が20MHz以下となってしまい、やや周波数レンジが狭く
感じます。
そこで、これを100MHz程度まで1Hz単位でカウントできるようにして、実用域を
広げることを目的に、CPLDをカウンタ部分に使ってみました。
このカウンタブロックとなるCPLDの回路構成を、VHDLで作成してみました。
これをPICなどと組み合わせれば、100MHzまでカウント可能な8桁の周波数
カウンタが構成できます。


このカウンタブロックを使った周波数カウンタの実際の製作例は下記にあります。



 ★ CPLDとPICによる
   8桁周波数カウンタの製作例



また、このブロックのVHDLソースファイルは下記となっています。
テキストファイルですので適当なエディタで開いてご覧下さい。

  ★ カウンタブロックメイン VHDLリスト(fcounter5.vhdl)
  ★ 非同期リセット付きBCDカウンタ VHDLリスト(count10.vhdl)
 


【全体の構成】

カウンタブロック製作例のVHDLの全体構成は下図のようになっています。
全体は大きく2つのブロックで出来ています。

(1) カウンタ本体
  8桁のBCDカウンタと4ビットの8−1セレクタで構成されています。
  カウンタは常時入力されたパルス(cclk)をカウントします。つまり周波数カウンタ
  のカウンタそのものです。
  外部からのカウント開始指令"trigger"によりカウンタを全て0にクリアします。

  セレクタは外部からの3ビットの桁選択信号"dgtslct"で指定された桁のカウンタ
  のBCDデータを、"bcdout"として4ビットで出力します。
  この出力は、"busy"がoffの時だけ有効となり、ビジー中、つまりカウント動作中
  は出力されません。これで不安定な出力データが出るのを防止しています。

(2) タイミングジェネレータ
  周波数カウンタとしての動作に必要なゲート信号を生成します。
  全体の基本クロック(clock)としては、高精度の12.8MHzを使うものとします。

  外部からのカウント開始指令(trigger)により、カウンタやラッチを全てリセットし、
  外部にbusy出力をしてからゲート時間のカウントを開始します。
  24ビットバイナリカウンタで12.8MHzをカウントダウンしてゲート信号を生成しま
  すが、このとき、外部からの選択信号(fast)により、1秒か0.1秒のゲート信号を
  出力します。
  このゲート信号により、カウントするデータ入力となるパルスsiginをゲートして
  8桁BCDカウンタへの入力信号sigoutを出力します。
  このsigoutを直接8桁BCDカウンタの入力cclkへ接続することで、周波数カウンタ
  として動作します。
  ゲート時間が終了するとbusy信号をoffとして外部にカウントが終了したことを
  通知します。



【動作タイミング】

上記で外部信号を加味した全体の動作タイミングは下図のようにします。
まず、開始指令であるtrigger信号がhighになったら、内部のカウンタ、ラッチを全て
リセットして、intbusy(外部へはbusyとして出力)をonとします。
これにより24ビットバイナリカウンタが0からカウント動作を始めます。このカウンタ
が動作開始する時にgateをONにし、fast信号がLowの時は12800000カウントでgate
をoffとします。fastがHighの時には1280000カウントでgateをoffにします。
これにより0.1秒か1秒のgate信号が生成されます。
ゲート時間完了と同時にintgateもoffとすることで、外部へのbusy信号もoffとなります。

このgate信号がonの間は、入力信号のsiginがANDゲートを通過してsigoutに出力され
ます。外部でこのsigoutをcclkに接続すれば、BCDカウンタがカウントを開始します。

0.1秒または1秒後にはintbusyつまりbusyがoffとなってカウント終了を外部に通知
します。そうすると8−1セレクタも外部出力が許可されます。
この後は、外部からdgtslctで指定された桁のBCDデータが外部にbcdoutとして出力
されます。





【VHDLの内容】

上記構成を実現するVHDLは下記のようになります。

【entityの記述】
 まず、外部入出力ピンの定義をしている「entity」については、上図の外部へ出ている
入出力ピンを全て定義しています。
ここではdgtslctとbcdoutがそれぞれ3ビットと4ビット幅なのでVECTORで定義しています。
あとはinとoutの定義だけです。




【architectureの記述】
 続いて本体のarchitectureの記述部です。

(1) componentの定義
 ここでは、カウンタ本体で使う「非同期リセット付きBCDカウンタ」を、componentとして
使うことを定義しています。ごくごく一般的なカウンタ部品ですのでライブラリ化できます。




(2) signalの定義
 次には内部でのみ使用する信号を定義しておきます。ここでは内部の部品間の接続に
必要な信号は全て定義しておく必要がありますが、VHDLを作成して行く過程で必要と
なった信号を追加して行けば問題ありません。




(3) gate信号生成プロセスの記述
 周波数カウンタとして動作させるために必要な0.1秒と1秒のゲートパルスを、12.8MHz
 の基準クロックをもとに生成します。
 まず、外部からのカウントスタート(trigger)で全体をリセットし、同時に、busyのステータスを
 生成します。そしてカウントを開始してfastに従って0.1秒か1秒のいずれかのゲート信号を
 内部へ出力します。
 また、この生成したゲート信号で、外部入力信号をゲートし、8桁BCDカウンタへの入力用の
 クロック信号を生成します。




(4) BCD選択と外部出力
 外部から与えられる選択コード dgtslctにより指定された桁のBCDコードを
 外部へ bcdout として4ビットで出力します。
 ここではcase文を使って全ての場合を記述しています。




(5) 8桁BCDカウンタの記述
 componentとして指定したBCDカウンタをベースに8桁をカウントします。
1桁目は常時カウント可能とし、2桁目からは上位桁として桁上がりをリンクします。
最後の8桁目の桁上がりは使わないので、openとしています。



以上がメインの部分のVHDLです。



【COUNT10の記述】
 componentとして指定した非同期リセット付きBCDカウンタの「COUNT10」の
VHDLは下記となっています。






  目次ページに戻る