• 本当は、田舎に庵を建てて隠遁生活したいけど、先立つものも無いので自宅で..。

DDSを作る

SDRの構成要素として、DDS(Direct Digital Synthesizer)があります。 手始めにこれを作成します。

DDSは、ROMに書き込んだ波形データをクロックで読み出していくという単純な原理に基づいています。

ROMのアドレス深さは、DDSが出力できる最低周波数を決めます。 今、アドレス深さが1024で、sin波1サイクル分のデータを格納したROMを80MHzのクロックで順番に読み出していくと、12.8μsで1サイクル、78.125kHzのサイン波が出力できます。 これを、2アドレス毎に呼び出すと、156.25kHzの出力になります。 このように、アドレスの間引き方を適当に選択するとクロックの1/2の周波数までの出力を得ることができます。

アドレスを決めるカウンターのビット数をnとすると、

出力周波数 = FTW * クロック周波数 / 2のn乗

という関係になります。 FTWは、Frequency Tuning Wordで、ROMのアドレスレスカウンタに加える値です。

アドレスカウンターのビット数は、DDSの分解能から決定されます。 上の式を変形して、分解能は、

分解能 = 出力周波数 / FTW = クロック周波数 / 2のn乗

となるので、

2のn乗 = クロック周波数 / 分解能

となり、分解能を1Hzとすると、2のn乗は、80Mに近いnで、27になります。

以上を踏まえて、Basys3で実際にDDSを作成しました。

ROMは、20bit x 1024のSingele Port ROMをIPジェネレータで生成しました。 20bit幅は、10bitのsin波データと10bitのcos波データを同時に格納しています。 romデータは、coeファイルをあらかじめ準備しておき、生成する時に読み込みます。

coeファイルの一部を以下に示します。

ROMデータは、sin波データの0~1/2パイのデータがあれば、他の象限のデータは生成できますが、制御が面倒なのでsin、cosとも1サイクル分作成しました。

ソースファイルです。 

テストベンチです。 出力周波数は、800kHzに設定しました。

シミュレーション結果です。

DDS_sim

800kHzのsin波とcos波が出力されているのが確認できました。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA