インテルのみ表示可能 — GUID: hjh1481130296289
Ixiasoft
インテルのみ表示可能 — GUID: hjh1481130296289
Ixiasoft
17.6.4.2. システム時間のレジスターモジュール
64ビット時間はこのモジュールで維持され、入力リファレンス・クロックclk_ptp_refを使用して更新されます。このクロックは、HPSからのemac_ptp_clk、もしくはFPGAからのf2h_ptp_ref_clkにすることが可能です。HPSのemac_ptp_clkはosc1_clkから派生するもので、クロック・マネージャーでコンフィグレーションされます。この入力リファレンス・クロックは、PHYインターフェイスで送信または受信されるイーサネット・フレームのスナップショット (タイムスタンプ) を取得するためのソースです。
システムの時間カウンターは、粗補正の方法を使用して初期化または補正することができます。この方法では、初期値またはオフセット値が、Timestamp Updateレジスターに書き込まれます。初期化の場合は、各EMACのシステム時間カウンターがTimestamp Updateレジスターの値で書き込まれます。システム時間の補正の場合は、システム時間にオフセット値が加算または減算されます。
微補正の方法の場合、マスタークロックに対するスレーブクロックの周波数ドリフトは、粗補正のような1クロックではなく、一定の期間にわたって補正されます。このプロトコルは、線形時間の維持に役立ち、PTPのSyncメッセージ間の間隔における基準時間に大きな変化 (すなわち大きなジッター) をもたらしません。†
この方法において、アキュムレーターは、次の図に示すようにTimestamp_Addendレジスターの内容を合計します。アキュムレーターが生成する算術のキャリーは、システムの時間カウンターをインクリメントするパルスとして使用されます。アキュムレーターと加数は32ビットのレジスターです。ここでアキュムレーターは、高精度の周波数乗算器または分周器として機能します。
システム時間更新ロジックで20nsの精度を達成するには、50Mhzのクロック周波数が必要です。周波数の分周比 (FreqDivisionRatio) は、リファレンス・クロック周波数と必要なクロック周波数の比率です。そのため、例えばリファレンス・クロック (clk_ptp_ref_i) が66MHzの場合、この比率は、66MHz / 50MHz = 1.32で計算されます。したがって、レジスターにプログラミングするデフォルトの加数値は、232 / 1.32、すなわち0xC1F07C1Fになります。
リファレンス・クロックが低く (例えば65MHzに) ドリフトする場合、比率は65 / 50、すなわち1.3であり、Addendレジスターに設定する値は、232 / 1.30、すなわち0xC4EC4EC4になります。クロックが高く (例えば67MHzに) ドリフトする場合は、Addendレジスターを0xBF0B7672に設定する必要があります。クロックのドリフトがない場合は、デフォルトの加数値0xC1F07C1F (232 / 1.32) をプログラミングする必要があります。†
上の図において、Sub-Secondレジスターの累積に使用される定数値は、10進数の43です。この値は、システム時間で20nsの精度を実現します (すなわち、20nsのステップでインクリメントされます)。
ソフトウェアでは、Syncメッセージに基づき周波数のドリフトを計算し、それに応じてAddendレジスターを更新する必要があります。†
FreqCompensationValue0 = 232 / FreqDivisionRatio†
MasterToSlaveDelayが連続するSyncメッセージにおいて同じであると最初に想定している場合は、次に説明するアルゴリズムを適用する必要があります。数回の同期サイクルが経過すると、周波数ロックが発生します。その後、スレーブクロックで正確なMasterToSlaveDelayの値を決定し、この新しい値を使用してマスターとの再同期を行うことができます。†
アルゴリズムは次のとおりです。†
- MasterSyncTimen 時に、マスターはスレーブクロックに同期メッセージを送信します。スレーブは、ローカルクロックがSlaveClockTimen の際にこのメッセージを受信し、MasterClockTimen を次のように計算します。†
MasterClockTimen = MasterSyncTimen + MasterToSlaveDelayn†
- 現在の同期サイクルのマスター・クロック・カウントMasterClockCountn は、次のように取得します。†
MasterClockCountn = MasterClockTimen – MasterClockTimen-1
(MasterToSlaveDelayが同期サイクルnおよびn – 1で同じであると仮定しています)†
- 現在の同期サイクルのスレーブ・クロック・カウントSlaveClockCountn は、次のように取得します。†
SlaveClockCountn = SlaveClockTimen – SlaveClockTimen-1†
- 現在の同期サイクルのマスター・クロック・カウントとスレーブ・クロック・カウントの差ClockDiffCountn は、次のように取得します。†
ClockDiffCountn = MasterClockCountn – SlaveClockCountn†
- スレーブクロックの周波数スケーリング係数FreqScaleFactorn は、次のように取得します。†
FreqScaleFactorn = (MasterClockCountn + ClockDiffCountn) / SlaveClockCountn†
- Addendレジスターの周波数補正値FreqCompensationValuen は、次のように取得します。†
FreqCompensationValuen = FreqScaleFactorn × FreqCompensationValuen-1 – 1†
理論的には、このアルゴリズムは1 Syncサイクルでロックを実現します。ただし、ネットワークの伝播遅延や動作条件が変動するため、数サイクルかかる場合があります。†
このアルゴリズムは自己訂正型です。何らかの理由により、マスターからの誤った値にスレーブクロックが最初に設定された場合、アルゴリズムはより多くのSyncサイクルを費やすことでそれを訂正します。†