![見出し画像](https://assets.st-note.com/production/uploads/images/28070618/rectangle_large_type_2_3d1b609be715e43bd2a8c138ca0afee9.jpeg?width=1200)
Clocking Wizard
Xilinx のFPGA開発ツールである Vivado では多くのIPが提供されています。
FPGAに備わった機能のうち、メモリーや高速シリアル等の特別な機能を使用するためのIPです。
逆に言えば、IPを理解し使い熟せないと、高級なFPGAの機能の大部分が使い物になりません。
そんなわけで何回かに分けて、個人的によく使うIPの説明をしていきたいと思います。
※ この記事はVivado 2019.2、及びClocking Wizard 6.0を用いて説明を行います。
今回は Clocking Wizard、MMCM や PLL というクロック生成機能を使用するための IP です。
年々大規模化している FPGA では、クロックが一系統だけということは少なくなっています。特に Zynq や UltraScale のようにCPU内臓の FPGA においては、CPUのあるPS部と、ロジックを入れるPL部で、クロックが異なる方が一般的です。
これにはFPGA内部だけではなく、FPGAに接続されるデバイスも含めるて考える必要があります。
シンプルな設計を考えるならば、PS部で使われているクロックをそのままPL部でも使えればいいのです。しかし、外部に10MHzでしか動作しないデバイスが接続されている場合は、PL部の、一部だけでも10MHzで動作させなければいけません。
そして、そのデータをCPUで処理しようとすれば、PS部のクロックに乗せ換える作業も。面倒ですが、発生します。
そんなわけで、非常に出番の多い Clocking Wizard の解説です。
Clocking Wizard を使うためには、他のIP同様、Vivadoでプロジェクトを開いた状態で、Flow Navigatorの「IP Catalog」を選択します。
PROJECT MANAGERウィンドウが出て、この中に IP Catalog が開きます。
今回はClocking Wizardを使いたいので、Search窓に「clk」と打ち込んでIPを絞り込んでから「Clocking Wizard」を選びます。
この方法で作ったIPは Verilog か VHDL のソースコードとして作られます。
Block Design の中に組み込みたい場合には、Block Design を開いた状態で行えるAdd IPというコマンドを使って下さい(右クリックで呼び出すメニューの中にあります)。
「Clocking Wizard」を選択すると、設定ウィンドウが開かれます。これはIPを作った後からでも変更出来ます。
1.Board
Boardタブでは、クロック入力の設定をします。
通常は Custom を選択し、ユーザーが決めたクロックを入力します。
変更するのは sys_clk を使用する場合です。sys_clk とは、IBUFDSなど差動信号のタイミング調整に使う特殊なクロックです。sys_clkと規定されているピンから入力するクロックで、200MHzを使うことが多い、専用信号です。
IBUFDSはLVDS等の、そこそこ高速の信号に使われるので、sys_clk を選択するのは特殊な使い方と覚えていて問題ありません。特殊な使い方をする場合にはLVDSの送受信のためのアプリケーションノート等、使い方に合わせた解説資料を Xilinx が出していますので、そちらをご確認下さい。
2.Clocking Options
Clock Monitor
Enable Clock Monitoringを使用するかどうかを設定します。
イネーブルにすると、モニタ用の信号が追加され、クロックが停止している、クロックにグリッジが発生した、等の状態をモニタ出来ます。
Primitive
クロックの生成に使用する機能ブロックの選択です。
詳しい機能はデバイスのシリーズによって異なりますが、MMCM のほうが高機能で、PLL は低機能、Noneを選択した場合には専用機能を使わないということになります。
専用機能を使わないのであれば、わざわざ Clocking Wizard を使う必要もないので、基本的に MMCM か PLL のどちらかを選択します。どちらが良いのか分からない場合には MMCM を選択して下さい。
MMCM の数が足りなくなったら、どのクロックであれば PLL に移しても問題ないか検討することになります。
Clocking Features
クロック生成のオプションの設定です。デバイスによっては使用出来ない機能があります。またPLL選択時にも使用出来ない機能があります。
Frequency Synthesis と Phase Alignment はデフォルトでチェックが入っていると思います。これは入出力の周波数を違う周波数に設定出来る、という機能と、入力クロックの位相に合わせる、という機能です。この二つは基本的にチェックを入れたままで使用して下さい。
Minimize Power は省電力オプションです。省電力になる代わりに周波数、位相オフセット、デューティサイクルの精度が悪くなります。省電力が高い優先順位だった場合に、クロックの精度が粗くても問題ないか確認した上で使用します。
Spread Spectrum は日本語ではスペクトラム拡散とも呼ばれます。EMI対応の機能です。周波数をわざとある程度の幅で揺らせることによって、EMIを低減するための技術です。FPGA設計の観点から言うと、クロック周波数の精度を悪くすることになり、タイミングを満足することが難しくなります。
それを承知の上で、EMI対応が必要な場合に選択します。
Dynamic Reconfig は動作中にクロック周波数を変更するためのオプションです。このオプションを使用すると、AXI4-LiteバスもしくはDRPインターフェースから、生成するクロックの設定を変更することが出来るようになります。
Dynamic Phase Shift は動作中に位相の調整を行うためのオプションです。位相調整の基準となるクロックを追加で入力し、位相調整を行います。生成したクロックが、別のクロックと同期していなければならない場合に使用します。
Safe Clock Startup は入力クロックをロックした後で、クロック出力を開始するためのオプションです。後段のロジックでロック信号を確認するか、このオプションを使用して不安定なクロックが出力されないようにするか、どちらかの方法を使うことで、安定した動作が出来ます。
Jitter Optimization
ジッタ―とはクロックの振れ方のことを示します。
通常は Balanced の設定で問題ありません。出力ジッタを最小限に抑えたい時には Minimize Output Jitter を、入力クロックのジッタが大きいがロックを外さずに動いて欲しいときには Maximize Input Jitter filtering を選択します。
Dynamic Reconfig Interface Options
Dynamic Reconfig を使用する場合のインターフェースの設定を行います。
インターフェースは AXI4-Lite か DRP のどちらか一方を選択します。
また、2つの追加設定があります。Phase Duty Cycle Config、Write DRP registers は Dynamic Reconfig を ON にするだけでは使用出来ない、追加のレジスタへのアクセスが出来るようになります。
特に Phase Duty Cycle Config は、使用した場合は、使用するリソースの量が跳ね上がりますので、必要な機能かどうか確認してから ON にして下さい。
Input Clock Information
入力クロックの周波数を設定します。Jitter の値も出来れば入力クロックの仕様に従った値を設定したほうがいいですが、デフォルト値のままでも動作はします。
ここで二つめ以降の入力クロックを使用するかどうかのチェックボックスがあります。複数のクロックを入力する場合にはチェックを入れて下さい。
一つの MMCM/PLL に二つ以上のクロックを入力する場合には、それぞれの周波数に制限が掛かります。それは複数クロックを入力した場合でも、MMCM/PLL の一部の機能が共通だからです。
複数クロックを入力する時は、求める周波数が得られるように、データシートを詳細に確認して下さい。
3.Output Clocks
出力クロックの設定を行うタブです。
デフォルトでは clk_out1 にだけチェックが入っています。複数のクロック出力が必要な時は、 clk_out2 以降にチェックを入れると周波数や位相の設定が出来るようになります。
Output Freq はそのまま、得たいクロック周波数を設定します。
Phase は位相の設定です。同じ周波数で位相が90度ズレたクロックが欲しいなど、位相をずらしたい時に使用します。理由がなければデフォルトのゼロのままで問題ありません。
Duty Cycle はクロック信号の"1"の時間と"0"の時間の幅の設定です。ここも特に理由がなければデフォルトの50%のままにしてください。
出力クロックの周波数によっては、入力クロックの周波数と、MMCM/PLLの構成上、ピッタリの出力が得られない場合があります。その場合は、設定した値の隣に表示されている Actual の値がズレた値になります。Actual の値でも問題ないのか、構成を変更してピッタリの値を出す必要があるのかを検討してください。
USE CLOCK SEQUENCING
クロック出力の順番を設定するオプションです。
複数クロックを出力する場合に、どうしても始めはこのクロックから出力して欲しい、その次はこれ、このクロックは最後、という順番を指定するために使用します。
この機能はDrives に BUFGCE 選択した時だけ使用可能です。デフォルトのBUFG の場合には使用出来ません。
Clocking Feedback
MMCM/PLLで位相調整のためのフィードバックに使用する信号を選択します。
細かな制御部分になりますので、デフォルト値から変更するときには、データシートを良く読んで MMCM/PLL の構造を理解する必要があります。
On-Chip となっているのはFPGA内の信号をフィードバックに使用することを示し、 Off-ChipとなっているものはFPGAの外部の信号をフィードバックに入力することを示します。
位相調整をする理由が明確であれば、どの信号をフィードバックに入れるのが正しいのか判断出来ると思います。
Signaling にある Single-ended か Differential かは、フィードバックに入れる信号が通常の信号なのか、差動信号なのかの違いです。フィードバックに接続したい信号がどちらなのかを確認し、それに合わせた設定にします。
Enable Optional Inputs / Output for MMCM/PLL
オプションの入出力ピンを使用するかどうかの設定です。
reset は MMCM/PLL のリセットです。オプションの扱いにはなっていますが、チェックしてリセット信号を接続して下さい。
power_down は MMCM/PLL 部分の電源をカットし、クロックを停止するオプションです。電源をカットしてから、再度クロック出力を開始するにはリセット信号を入れて正常な起動シーケンスを踏ませる必要があります。
input_clk_stopped はステータス信号です。入力クロックが長い間変化しない場合に出力されます。
locked 信号は、入力クロックにMMCM/PLLがロックし、設定通りの周波数でクロックが出力されていることを示します。
input_clk_stopped と lock 信号と同じように見えますが、lock 信号はMMCM/PLLが正しくロックした場合の信号のため、不安定ながらも変化する信号が入力されている時と、まったく信号が変化していない時の区別がつきません。input_clk_stopped は入力信号が変化していないことを示してくれますので、異常動作時の判断材料の一つに出来ます。
clkfbstopped はフィードバック入力が停止していることを示すステータス信号です。フィードバック入力をFPGA内で直接入れている場合には、不要な信号です。フィードバック入力を Off-Chip の設定にし、FPGA外から入力している場合には必要なステータスとなります。
4.Port Renaming
タブの名称こそ「Port Renaming」ですが、ここにはMMCM/PLLの設定結果が表示されているだけで、名前の変更は出来ません。
5.MMCM Settings
設定結果の確認タブです。
MMCMとPLLの選択で、MMCMを選択した場合だけ表示されます。
「Allow Override Mode」にチェックを入れると、今までの設定を無視して、直接値を変更することが出来ますが、あまりお勧めはしません。どうしても、クロックのぶれを設定値の下ではなく、上にずらしたい等、細かな設定が必要な時にだけご使用下さい。
6.PLLE2 Settings
設定結果の確認タブです。
MMCMとPLLの選択で、PLLを選択した場合だけ表示されます。
「Allow Override Mode」にチェックを入れると、今までの設定を無視して、直接値を変更することが出来ますが、あまりお勧めはしません。どうしても、クロックのぶれを設定値の下ではなく、上にずらしたい等、細かな設定が必要な時にだけご使用下さい。
7.Summary
最終結果の確認タブです。
設定結果により、MMCM/PLL の設定がどうなったのか、ジッタ―の幅がどの程度発生するのかを確認出来ます。
結果に納得出来たら OK を押して IP を生成します。
生成した IP は後から設定を変更することも出来ますので、あまり悩まずに OK を押してもらって構いません。
プロジェクトでは複数の Clocking Wizard IP を使って、いくつものMMCM や PLL を使うことも珍しくありません。
複数を使う内に、MMCM が足りなくなって PLL に置き換えたり、クロックの精度を取るために、 MMCMを一つに複数のクロックを生成させず、二つのMMCMに分担させたりと、手間を掛ける必要も出て来ます。
その際には、MMCM や PLL の構造を理解する必要も出て来ます。詳細については、データシートを見てご確認頂ければと思います。
Clocking Wizard v6.0 (PG065)
https://japan.xilinx.com/products/intellectual-property/clocking_wizard.html#overview
この記事が気に入ったらサポートをしてみませんか?