FPGAで作る任意波形発生器(1/4 ページ)
生物医学などの分野で用いられる機器に対しては、信号の周波数を正確かつ高精度に設定したいという要求がある。そうした用途に適用可能な任意周波数/波形発生器を実現するには、FPGAを利用すると便利である。本稿では、任意周波数発生器の基本原理やその実現方法、任意波形発生器への展開方法を具体例を基に示す。
任意周波数発生器の基本原理
多くのシステムでは、水晶発振器からの原振を整数分周することでクロック信号を生成する。ところが、この仕組みでは、得られる周波数に制限がある。一方、任意波形発生器や任意周波数発生器、ないしは生物医学信号シミュレータなどでは、端数(小数)を持つ周波数のクロックをジッターを発生させることなく実現することが要求される。本稿では、FPGAを利用してこうした信号発生器を構成する方法を説明する。
最初に、任意の周波数を発生させる原理について、数式をベースとして説明しよう。まず、正弦波は次式のように表せる。
ここで、ωはラジアン/秒を単位とする周波数で、fはHzを単位とする周波数、tは時間、Φはラジアン単位の位相である。
続いて、時間の経過Δtに対する位相の変化ΔΦについて考えてみる。このΔΦは以下の式で表される。
これを変形すると、周波数は次式で定義できることになる。
式(3)において、Δtは水晶発振器からのクロック(またはサンプリングクロック)の周期に対応する。つまり、式(3)の意味するところは、クロックごとに位相をΔΦだけ進ませることによって、周波数fが生成できるということだ。
ここで、Δtをクロック周波数fCLKを用いて表現すると、次式のようになる。
式(3)のΔtに式(4)を代入すると、周波数は次式で表される。
任意の周波数信号の生成には、この式(5)を利用する。そのためには、クロック周期ごとに位相をΔΦだけ進める仕組みが必要となる。一般に、その仕組みには位相(フェーズ)アキュムレータが使用される。これはバイナリカウンタとして実現され、クロックの入力ごとにΔNだけカウントアップするよう機能する。
k段のバイナリカウンタは2k個の数値を生成するが、この値を1周期分の位相である2π〔ラジアン〕に対応させる。つまり、ΔΦ〔ラジアン〕の位相の進みをΔNのカウントの進みとして定義するのだ。この考えに基づき、式(5)のΔΦをΔNに置き換えると次式(6)が得られる。
式(6)からわかるように、周波数fを生成するためには、位相アキュムレータが周波数fCLKのクロックごとにΔNだけカウントアップすることになる。このΔNは次式で表せる。
Copyright © ITmedia, Inc. All Rights Reserved.