別ページ 「10. DDS 正弦波生成ロジックサンプル」 の DDS正弦波生成ロジックに、
内蔵 MMCM(PLL) を組み込んだ例を紹介する。
MMCM(PLL)を使用することで、FPGAの外部クロックに依存せず、生成する周波数に合わせたクロックが利用でる。
1. 主な仕様
・MMCM(PLL)設定周波数は 51.2MHz (外部クロック:20MHz)
波形メモリのテーブルは 8bit(256-STEP)のため、位相加算値=10000h にて、200KHzの正弦波出力となる
・波形出力: 8 bit
※本サンプルは 8bit の波形データを出力するところまで。
DA変換については別ページ 「 9. シグマ方式DACロジックサンプル」 を参照。
2. 使い方
・入力に周波数(位相加算値)を設定すれば、正弦波のデータ(8 bit)が出力される。
3. MMCM(PLL)の組み込み手順について
以下、MMCM(PLL)の作成/組み込み手順について説明する。
最初に「Clocking Wizard」を使用して MMCM(PLL)モジュールを作成する。
・事前にプロジェクトを作成しておく。
・①左上の「IP Catalog」を選択し、②「Clocking Wizard」をダブルクリックする。
![[picture:pic_dds_generator_002]](pic_dds_generator_mmcm_001.jpg)
・MMCM か PLL の設定画面、ここではデフォルトの MMCMを選択。
③MMCMの入力クロック(FPGAの外部入力クロック)周波数を設定する。この例では 20MHz。
![[picture:pic_dds_generator_002]](pic_dds_generator_mmcm_002.jpg)
④MMCMの出力クロック周波数を設定する。この例では 51.2MHz。
なお MMCM のRESET入力の極性は、デフォルトで正論理なので注意。
設定したら右下の「OK」ボタンを押す。
![[picture:pic_dds_generator_002]](pic_dds_generator_mmcm_003.jpg)
⑤「Generate」を実行すれば、⑥プロジェクトにMMCMモジュールが登録される。
登録後、Design Sources の「更新:Refresh」を行うこと。自動ではやってくれないらしい。
あとで周波数など変更したい場合は、⑥をダブルクリックすれば④から設定をやり直せる。
![[picture:pic_dds_generator_002]](pic_dds_generator_mmcm_004.jpg)
以上で MMCMモジュールの作成は完了。
次に、VHDLソースのTOPファイルに MMCMを呼び出す記述を追加する。
⑦「IP Source」タグを選択、「clk_WIZ_0」を展開し、⑧記述サンプルテンプレート「clk_WIZ_0.vho」を選択して開く。
⑨の部分をコピーしておく。
![[picture:pic_dds_generator_002]](pic_dds_generator_mmcm_005.jpg)
VHDLソースのTOPファイルを開き(本サンプルでは [DDS_GENERATOR.vhd] )、
⑩Component 記述として先の⑨を貼り付ける。
⑪インスタンス化の記述を追加する。
なお、MMCM の RESET 入力はデフォルトで正論理なので、必要に応じて反転記述を追加する。
![[picture:pic_dds_generator_002]](pic_dds_generator_mmcm_006.jpg)
あとは、必要な信号を各ロジックと接続すればよい。
4. MMCM(PLL)クロックのタイミング制約記述
本サンプルに関しては、MMCM(PLL)関連のタイミング制約記述を省略しても動作するが、
メモ書きを兼ねて、記述方法をまとめておく。
実は少々手間が掛かる。
外部クロックの名称は、入力端子の信号名をそのまま使用できるが、
MMCM(PLL)クロックは内部クロックのため、コンパイルを掛けるまで信号名が決まらない。
一度コンパイルしたのち、Tcl Console にて①「get_clocks」を実行すると、②クロック関連の信号名が表示されるので
これを参考にする。
![[picture:pic_dds_generator_002]](pic_dds_generator_mmcm_007.jpg)
本サンプルでは「clk_out1_clk_wiz_0」が MMCM の出力クロック信号名。
XDC ファイルでの制約記述には、このクロック名を使用する。
例:
# OUTPUT DELAY ----------------------------------
set_output_delay -clock clk_out1_clk_wiz_0 -min 0.10 [get_ports {WAVE_DATA_OUT[*]}]
set_output_delay -clock clk_out1_clk_wiz_0 -max 1.00 [get_ports {WAVE_DATA_OUT[*]}]
なお、上記XDCファイル修正後にコンパイルを掛けると、Synthesis 処理で warnings が出てしまう。
これは、まだ信号名として clk_out1_clk_wiz_0 が決定される前のため。
Implementation 処理まで実行すれば、信号名が決まりつじつまが合うようになる。
5. テストベンチについて
周波数(位相加算値)を変えることで、発生する周波数が変わることを確認する。
MMCM(PLL) によりクロックを 51.2MHz に設定したため、位相加算値=10000h にて、200KHzの正弦波出力となる。(周期 5uS)
※VIVADOシミュレーションではアナログ波形にノイズが乗るが、原因は不明。拡大表示すればほぼ消える。
![[picture:pic_dds_generator_002]](pic_dds_generator_mmcm_008.jpg)
6. サンプルファイル
MMCM(PLL)組み込み済みのプロジェクトファイル一式
・VIVADO用プロジェクトファイル:japanlogicdesign_dds_generater_vivado_mmcm.zip
※注意:VIVADO プロジェクトファイルは参考にとどめ、新規に作成しなおすことを推奨する
中国プロテクト:天安門事件、法輪功、チベット
|