Cosmo-Zでディジタルロックインアンプを作る(2)
ロックインアンプの原理は前回のブログで書いたとおり、簡単なのですが、実際に作ろうとすると2つの難しいところがあります。
① 除算器
② 三角関数の生成
まず、除算器ですが、FPGAで除算回路を作るのはとても難しいので、CoreGenを使います。
周期を計るカウンタを16bitにすると、80MHz÷65536=1220Hzなので、1.2kHz以下の信号にロックさせようとすると溢れてしまいますから、16bitでは足りません。
ここでは24bitにしました。すると、除算器に与えるdividendとdivisorも24bit精度にして、24bit/24bitの除算器を作らなければならないことになります。
すごい回路規模なんだろうな・・と想像しながらCoreGenでポチポチと設定します。
赤い枠で囲ったところが設定した項目です。
なお、dividendというのが分子でdivisorというのが分母です。
Output Channelというのが出力のビット幅を指定する部分で、小数点以下の部分をどういうフォーマットにするかを指定するものです。Reminderにすると「余り」が、Fractionalにすると「商」が出てきます。
今回はdividend < divisorで、結果は0~1の範囲ですから、欲しいのは商です。よってFractionalにします。24にすると、出力48bitのうち、24.24の固定小数点形式で出てきます。
こうして24bitの、0~FFFFFFまで周期Nでなめらかにカウントアップするカウンタが作られました。なお、割り算回路は結果が出るまでに20クロックくらいかかります。
次に、sinとcosを求める回路ですが、入力が24bitカウンタなので、テーブルで持つには大きすぎます。そこで、CORDIC法で求めます。CORDIC法についてはGoogleに聞いてください。
XILINXユーザはCoreGenの中からCORDICを選べばよいので、とても簡単にsin、cosを作ることができます。
CoreGenのMathFunctionから選ぶだけです。
設定は↑の図のように、関数をSin Cosにして、入力幅を24bitに、出力幅を16bitにするだけです。また、Phase FormatはScaled Radiansにします。
このコアは、Scaled Radiansにすると、入力に1と設定するとπとして解釈されます。
入力は固定小数点数ですが、フォーマットは下の図のように符号と整数部で3bit使います。
注意すべき点は、値の範囲は-π~πにすることです。0~2πを入れようとしたら飽和してしまってうまく結果が出ませんでした。
CORDICコアの出力結果のフォーマットは、こうなっています。
符号と整数部で2bitあることに注意してください。
上16bitと下16bitで取り出したとき、最大値が0x4000までしかいきません。
除算とか三角関数とかいかにも複雑な回路なので、どのくらいのレイテンシがかかるかを見ておいたほうが良いでしょう。
ISim(シミュレータ)を使って調べてみました。
なんと、24bitの除算で50クロック、24bit→16bitのCORDICで20クロック。合わせて70クロックもかかっています。
しかし、これらの回路は内部で完全にパイプライン化されているので、連続でデータを与え続けても大丈夫なようです。
こうして、80MHzで1クロックごとに更新されるsinとcosのデータを作ることができました。
これを波形で見てみましょう。
・灰色が、ファンクションジェネレータのトリガ信号(参照入力)
・赤が位相
・オレンジがsin、黄色がcos
です。
| 固定リンク
コメント