インテル® Agilex™ ハード・プロセッサー・システムのテクニカル・リファレンス・マニュアル

ID 683567
日付 1/19/2023
Public
ドキュメント目次

17.6.4.2. システム時間のレジスターモジュール

64ビット時間はこのモジュールで維持され、入力リファレンス・クロックclk_ptp_refを使用して更新されます。このクロックは、HPSからのemac_ptp_clk、もしくはFPGAからのf2h_ptp_ref_clkにすることが可能です。HPSのemac_ptp_clkosc1_clkから派生するもので、クロック・マネージャーでコンフィグレーションされます。この入力リファレンス・クロックは、PHYインターフェイスで送信または受信されるイーサネット・フレームのスナップショット (タイムスタンプ) を取得するためのソースです。

システムの時間カウンターは、粗補正の方法を使用して初期化または補正することができます。この方法では、初期値またはオフセット値が、Timestamp Updateレジスターに書き込まれます。初期化の場合は、各EMACのシステム時間カウンターがTimestamp Updateレジスターの値で書き込まれます。システム時間の補正の場合は、システム時間にオフセット値が加算または減算されます。

微補正の方法の場合、マスタークロックに対するスレーブクロックの周波数ドリフトは、粗補正のような1クロックではなく、一定の期間にわたって補正されます。このプロトコルは、線形時間の維持に役立ち、PTPのSyncメッセージ間の間隔における基準時間に大きな変化 (すなわち大きなジッター) をもたらしません。

この方法において、アキュムレーターは、次の図に示すようにTimestamp_Addendレジスターの内容を合計します。アキュムレーターが生成する算術のキャリーは、システムの時間カウンターをインクリメントするパルスとして使用されます。アキュムレーターと加数は32ビットのレジスターです。ここでアキュムレーターは、高精度の周波数乗算器または分周器として機能します。

注: 指定されている精度に必要な周波数よりも高い周波数のPTPクロックを接続する必要があります。
図 76. 微補正の方法を使用するシステム時間更新のアルゴリズム

システム時間更新ロジックで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レジスターを更新する必要があります。

最初に、スレーブクロックは、AddendレジスターのFreqCompensationValue0で設定されます。この値は次のようになります。
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サイクルを費やすことでそれを訂正します。