JR2BMU logo

FPGAボード Cmod S7を導入してみた(5)

  前回は強力なツールであるIPコアの使い方をご紹介しました。今回はIPコアを活用してDDSシンセサイザを実装してみます。

1.NCO(Numerically controlled oscillator)

  NCOとしてVivadoに含まれているIPコア、DDS compilerを用います。入力クロックを入れれば任意の正弦波を出力可能です。
  まず、NCOのクロックとして前回と同様に120MHzのクロックを生成してください。次に、(①~③)IPカタログからDDS compilerを選択します。ウィザードでは、④入力クロックを120MHzとし、⑤Spurious free dynamic rangeを95dBを入力します。これは量子化によるスプリアス成分の抑圧量で、値が大きいほど出力のビット数が増加します。95dBでは16bitとなりました。出力周波数を2MHzに設定し(⑥)、ウィザードを完了させます(⑦)。生成したモジュールのテンプレートは以下の場所に作成されています。
    \(プロジェクト名)\(プロジェクト名).gen\sources_1\ip\dds_compiler_0\dds_compiler_0.veo

nco_setup
  あとは、クロック生成モジュール(clk_wiz_0)とNCOモジュール(dds_compiler_0)を接続するHDLコードを作成します。 以下のファイルをご利用ください。
    HDL file [nco.sv]
    テストベンチ [nco_tb.sv]
  出力信号は、sin成分とcos成分が結合された32bitでNCOモジュールの[.m_axis_data_tdata]に現れます。それぞれ、符号付きの(2の補数)表現となっているので、出力に32'h7FFF7FFFを加えて符号なし表現に変換しています。
  次に、テストベンチをプロジェクトに追加してシミュレーションを開始してください。出力が出るまでに数十us掛かかるので、shift+F2(run for 10us)で出力(clk1)が出てくるまで進めてください。デフォルトではデジタル表示されますが、波形を右クリックしWaveform style --> Analogでアナログ表示させることができます。以下にシミュレーション結果では、正弦波信号が得られています。

sim_nco

2.ΔΣ型DAC

  発生させた波形を観察するにはDA変換が必要です。外付けのDACでも良いのですが、今回はΔΣ型DACを実装します。ΔΣ型DACはデジタル入力に対し、1ビットのPWM信号を出力します。この出力にLPFを接続すればアナログ出力が得られます。PWM信号の(時間方向の)分解能はクロック周波数で決まるので、出力波形の周波数成分よりも十分に高いクロックで動作させる必要があります。
  ΔΣ型DACの原理を簡単にご説明します。基本的には入力を2値化して出力していきます。2値化の際、丸め誤差(error(i) = y(i) - t(i))が生じます。この丸め誤差を次クロックの2値化の際に入力から差し引く(t(i+1) = x(i+1) - error(i))ことで、丸め誤差の蓄積を逐次補償しています。これにより入力値に比例したPWM出力が得られます。
schematic_dac

  実装したHDLコードを以下に示します。
    HDL file [DeltaSigma.sv]
    テストベンチ [DeltaSigma_tb.sv]
2値化はt[15:0]の最上位ビットで判断します。t[15]=0, 1のそれぞれの場合に出力OUTと次の2値化入力tを更新しています。また、それぞれの場合でオーバーフロー、アンダーフローが発生する場合に値を切り上げてこれを防止しています。
  テストベンチを用いたシミュレーション結果を以下の図に示します。入力として16bitのこぎり波を加えると、それに対応したPWM出力が得られていることが分かります。この出力にLPFを接続すればアナログ信号が得られます。

code_dac
sim_dac

3.実装

  ここまでに準備をしたクロック生成モジュール(clk_wiz_0)とNCOモジュール(dds_compiler_0)、ΔΣ型DACモジュールを接続します。以下のファイルをご利用ください。
    Constraint file[Cmod-S7-25-Master.xdc]
    HDL file [total_emb.sv]
    テストベンチ [total_tb.sv]

  RTL解析で得られたブロック図は以下の通りです。今回は、ボード上の12MHz発振器(clk)を入力し、8番・9番ピンにPWM出力を接続しています。
  上記のテストベンチでシミュレーションを行った結果、PWM出力が得られていることがわかります。
rtl_total
sim_total

  書き込みは(1)Synthesis、(2)Implementation、(3)Generate bitstream、(4)Programの順番で行います。プログラムが終わったら出力をご確認ください。正弦波信号が確認できれば成功です。
  以下に出力波形と出力スペクトラムを示します(出力ポートに簡易的なLPF挿入しています)。ブレッドボード上で組んでいるため、スプリアス強度等はあくまでご参考までにしてください。
result

  DDSシンセサイザの実装を行いました。次回は内蔵されているXADCを使用してみます。

©JR2BMU All rights reserved.

inserted by FC2 system