mcpField
M
matlab-model-ams-systems

matlab-model-ams-systems

github.com/matlabその他1.2k53 回インストール1 日前に更新
リポジトリ

matlab-model-ams-systems について

matlab-model-ams-systemsは、Mixed-Signal Blocksetを使い、データシートやシステム仕様からPLL ICをモデル化するMATLAB・Simulinkユーザー向けのスキルです。アーキテクチャ選択とモデル構築を扱い、後続の検証フェーズは別ファイルで案内します。

主な機能

  1. 01データシートや仕様からPLLパラメーターを抽出
  2. 02Integer-N、Fractional-N、デュアルモジュラス方式を選択
  3. 03Mixed-Signal Blocksetで動作モデルを構築
  4. 04新しい目標に合わせて既存PLLモデルを調整
  5. 05使用前に必要な関数とライブラリを確認

活用シーン

  1. 01ICデータシートからSimulink PLLモデルを作成
  2. 02システム目標に基づいて周波数シンセサイザーを設計
  3. 03ロック時間やノイズ目標に合わせて既存PLLモデルを調整

MCP 対応

このスキルは使用前にMATLAB関数とSimulinkライブラリの利用可否を確認するよう求めますが、入力にはMCPサーバーのインターフェースは記載されていません。

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/matlab/matlab-agentic-toolkit --skill matlab-model-ams-systems

インストール後、Claude Code で/matlab-model-ams-systemsを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

manifest.yaml
references/
assembly-code.md
datasheet-extraction.md
iteration-algorithm.md
modeling-pll-datasheet-validate.md
pitfalls.md
probing-simulink-models.md
stability-analysis.md
validate.md
scripts/
probeSlxModel.m
quickProbe.m

詳細

スキル:PLL データシートのモデリング -- コア(フェーズ 1~4)

Mixed-Signal Blockset(MSB)の基盤ライブラリ msbPllFoundation の Simulink ブロックを使用して、データシートまたはシステム仕様から PLL IC をモデル化します。

関連ファイル:modeling-pll-datasheet-validate.md では、フェーズ 5~9(ループフィルターの設計、検証、測定、反復、注意点)を扱います。

使用する場面

  • データシートから PLL IC をモデル化する場合(パラメーターの抽出、アーキテクチャの選択)
  • システム仕様(fVco、fRef、ロック時間、位相ノイズの目標値)から周波数シンセサイザーを設計する場合
  • Mixed-Signal Blockset を使用して Simulink で動作モデルの PLL を構築する場合
  • データシートの測定値と照らし合わせて位相ノイズ性能を検証する場合
  • Integer-N、Fractional-N、Dual Modulus PLL アーキテクチャから選択する場合

使用しない場面

  • 回路レベルの PLL 設計(トランジスタレベルの VCO、チャージポンプ回路図)
  • Simulink モデルを構築せずに PLL を解析する場合(estimatePLLPhaseNoise を直接使用してください)
  • クロック分配またはジッタークリーニング(周波数シンセシスではありません)
  • MSB を使用しない PLL モデリング(Mixed-Signal Blockset を使用しないカスタム Simulink ブロックなど)

ワークフロー指示(必須)

  1. 仕様は一度に 1 つずつ確認する(必須 — 例外なし) -- PLL または周波数シンセサイザーの設計依頼(仕様に基づくものでも探索的なものでも)では、1 回の応答につき質問を必ず 1 つだけ尋ねてください。複数の質問を列挙したり、箇条書きの要件チェックリストを提示したりしないでください。これにより認知負荷が軽減され、会話形式でやり取りできます。質問する順序:

    1. 出力周波数(または周波数範囲)
    2. 基準周波数(N > 200 の場合は、帯域内ノイズのペナルティが大きいことを伝える)
    3. アーキテクチャ(Integer-N / Frac-N / 自動 — N によってあらかじめ決まる場合があります)
    4. ロック時間の目標値
    5. 位相ノイズ/ジッター/スプリアスの目標値(または「なし」を確認)
    6. チャージポンプ電流(既定値として一般的な値を提示)
    7. VCO の要件(Kvco、位相ノイズ特性 — 経験則を提示)
    8. ループフィルターの設定(次数、帯域幅の上書き)
    9. その他の要件
    10. 保存先(.slx と結果を保存するフォルダーのパス)

    ルール:

    • 質問は 1 つだけ尋ね、回答を待ってから次の質問をしてください。
    • ユーザーの最初のプロンプトですでに回答されている質問は省略してください。
    • ユーザーがそのまま確認できるよう、妥当な既定値を括弧内に提示してください。
    • すべての仕様を確認したら、設計計画を提示してください(指示 5、ステップ A)。
  2. 目標未達の場合に限り、自律的に反復する -- 最初の試行で目標を 3 倍以上の余裕をもって達成した場合は、そこで終了してください。帯域幅の計算式で適切な設計が得られるため、帯域幅のスイープや「念のため」の反復は行わないでください。最初の試行で不合格となった場合、または余裕が 2 倍未満の場合にのみ、スイープ/反復してください。反復が必要な場合は、パラメーターをスイープして、目標を満たすまで再シミュレーションしてください。

  3. 進捗を報告し、HTML サマリーを生成する -- 試行ごとに簡潔なステータスを表示してください(例:「BW=1MHz、PM=70 -> lock=5.2us X」)。すべての目標を達成したら、モデルと同じ場所に保存する HTML レポートを生成してください。必須セクション: レポートの内容(必須):

    • サマリーボックス:余裕度を含む合格/不合格の判定
    • モデルのスクリーンショット:print(['-s' model], path, '-dpng', '-r150')
    • アーキテクチャ図(テキストベース)
    • 設計パラメーターの一覧(fVCO、fRef、N、Icp、Kvco、フィルタータイプなど)
    • ループフィルターの部品表と時定数(τ_z = R2·C2、τ_p3 = R3·C3)
    • 伝達関数ボックス:Z(s)、G(s)=Icp·Kvco·2π·Z(s)/(N·s)、H(s)=G/(1+G)、 および主要な値:fc、PM、ゼロ周波数、極周波数
    • ボード線図(開ループ+閉ループ):pllOpenLoopPlot/ pllCloseLoopPlotからexportgraphics(fig, path, 'Resolution', 150)でエクスポートします。 Tagで図を検索します:'PllOpenLoopDynamicPlot'、'PllCloseLoopDynamicPlot'
    • Vctrl過渡応答:simOutのtimeseriesからプロットし、ロック時間のマーカーを表示します
    • シミュレーション結果表(仕様値と測定値)
    • シミュレーション設定(solver、stopTime、holdOff、平均回数)
    • セッションメトリクス:レポートのフッターに[COST]と[DURATION]のプレースホルダーを含めます。 タスク完了後、ユーザーがClaude Code UIからこれらを入力します(セッション終了時に表示されます)。

    プロットのエクスポート方法:

    pllOpenLoopPlot(Icp, Kvco, N, 0, R2, R3, 0, C1, C2, C3, 0);
    fig = findobj('Type','figure','Tag','PllOpenLoopDynamicPlot');
    exportgraphics(fig, fullfile(outDir,'open_loop_bode.png'), 'Resolution', 150);
    

    HTMLでは相対パスのsrc="filename.png"を使用します。web(reportPath, '-browser')でレポートを開きます。

  4. 図を表示すること — シミュレーション後にset(0,'DefaultFigureVisible','on')を呼び出し、すべてのプロット図で'Visible','on'が設定されていることを確認します。描画を強制するにはdrawnowを呼び出します。MCP MATLABサーバーの既定値はVisible='off'です。

  5. 各ステップで進捗を画面に表示すること — 重要なマイルストーンでステータスを出力します:

    • ステップA — 設計計画:構築前にASCIIブロック図とパラメーターを表示します
      [PLL TB]──▶[PFD]──▶[CP]──▶[Loop Filter]──▶[VCO]──┐
         ▲                                               │
         └─────────────[Divider ÷N]◀─────────────────────┘
      
      アーキテクチャ、fRef、N、Icp、Kvco、Fc、PM、フィルタータイプ、solverを含めます。 インピアメントを追加する場合は、実装前に更新後の図を表示します。
    • ステップB — フィルター+ボード線図:部品値を示してから、pllOpenLoopPlot/pllCloseLoopPlotを実行します
    • ステップC — シミュレーション開始:Simulating Pass 1 (lock time)... StopTime=9µs
    • ステップD — 結果:Lock time = 2.1 µs (target < 3 µs) ✓ [1.4× margin]
    • ステップE — パス2(PN仕様がある場合のみ):オフセット、測定値と目標値、合否

前提条件

  • 対象のPLL ICのデータシート(PDF)へのアクセス、または基本仕様(fVco、fRef、ロック時間)
  • Mixed-Signal Blocksetがインストールされていること(msbPllFoundationライブラリを提供)
  • Control System Toolbox(estimatePLLPhaseNoiseによる検証用、R2026b以降)

エントリーポイント

A. データシート主導(全ワークフロー、フェーズ1~4)

PLL ICのデータシートがある場合に使用します。以下のすべてのフェーズに従ってください。

B. 仕様主導(データシートなし)

基本的な PLL 仕様はあるものの、データシートがない場合に使用します。指示 1 に従って仕様を収集し、残りのパラメーターを導出します。

パラメーター導出ルール:

N = fVco / fRef  (or P*N+S for dual modulus)
BW = min(12/t_lock, fPFD/10)  (capped at fPFD/10 for stability)
Kvco: fVco/50 typical if not specified (e.g., 6 GHz → 120 MHz/V)
Icp: 1-5 mA typical (higher Icp → wider achievable BW with smaller R2)
PM: 50° default (60° if adding 4th-order pole)

アーキテクチャの選択:

条件アーキテクチャ
N が整数で、単一のプリスケーラーを使用するシングルモジュラスプリスケーラー付き整数 N PLL
N が整数で、P/P+1 の柔軟性が必要デュアルモジュラスプリスケーラー付き整数 N PLL
N が小数で、スプリアス要件が厳しいデルタシグマ変調器付きフラクショナル N PLL
N が小数で、シンプルな設計が必要アキュムレーター付きフラクショナル N PLL

DSM 次数の選択(Frac-N DSM を使用する場合):

  • 1 次:最もシンプルで、fPFD/denom におけるスプリアスが最大です
  • 2 次:ほとんどの設計でバランスが良好です
  • 3~4 次:スプリアスは最小になりますが、より多くの量子化ノイズエネルギーが高いオフセットへ移動します (十分なフィルター減衰が必要です)
  • データシートに DSM の次数が記載されている場合は、それに合わせます。既定値は 3 次です

R 分周器のトレードオフ(fRef ≠ fComp の場合):

  • R カウンターを使用:fComp = fRef/R → N_eff = fVco/fComp = N×R
  • 帯域内ノイズのペナルティ:+20×log10(N_eff) — N が大きいほど帯域内 PN が悪化します
  • R > 1 は、チャネル間隔で必要な場合にのみ使用します(fComp = チャネルステップ)

仕様主導の手順:

  1. 仕様を収集(指示 1)→ 設計計画を提示(指示 5、ステップ A)
  2. VCO の PN データがある場合:まず VCO 単体を検証します(下記参照)
  3. msbPllArchitectures からアーキテクチャブロックを選択(Strategy A — 既定)
  4. ループフィルターを設計:
    • N ≤ 50:Fc と Phi を指定して CompSelectionMethod='Automatic' を使用
    • N > 50(P79):thirdOrderPassiveFilterDesign → CompSelectionMethod='Manual'
    • N のしきい値は、小数部を含む実効 N に適用されます
  5. モデルを構築してシミュレーションを実行し、結果を提示します

VCO 単体の検証(PN データが提供されている場合):

% 1. Create VCO testbench model
vcoModel = 'VCO_Validation';
new_system(vcoModel); open_system(vcoModel);
set_param(vcoModel, 'Solver', 'VariableStepDiscrete');
add_block('msbPllFoundation/Ring Oscillator VCO', [vcoModel '/VCO']);
add_block('msbPllMeasurements/VCO Testbench', [vcoModel '/VCO TB']);
add_line(vcoModel, 'VCO TB/1', 'VCO/1', 'autorouting', 'smart');
add_line(vcoModel, 'VCO/1', 'VCO TB/1', 'autorouting', 'smart');

% 2. Get PeriodJitter and CornerFrequency from PN data
[pJitter, cFreq] = msblks.VCO.estimatePhaseNoiseCore(fVco, Foffset, PN_dBc);
set_param([vcoModel '/VCO'], 'Fo', num2str(fVco), ...
    'PeriodJitter', num2str(pJitter), 'CornerFrequency', num2str(cFreq));

% 3. Simulate and compare to datasheet (accept ±3 dB)
sim(vcoModel);
ud = get_param([vcoModel '/VCO TB'], 'UserData');

パラメーターを導出したら、Phase 4.0(Strategy A による組み立て)へ進みます。

C. 既存モデルの調整(新しい仕様への適合)

ユーザーが既存の .slx モデルを提供し、ゼロから再構築せずに目標(ロック時間、位相ノイズ、スプリアス)を満たしたい場合に使用します。

ワークフロー:

  1. 調査 — 現在のパラメーターを抽出します:Fc、Phi、N、OutputCurrent、Kvco、 CompSelectionMethod、get_param によるフィルターコンポーネント
  2. PLL テストベンチの確認 — テストベンチがない場合、または PLL 入力が未接続の場合は、ユーザーに fComp を尋ねます(P104)。必要に応じて PLL テストベンチを追加します。
  3. ベースラインシミュレーション — sim(model) を実行し、get_param(tbBlk, 'UserData') からロック時間、周波数、位相ノイズを読み取ります。これが唯一有効なベースラインです(P103)。
  4. 調整項目を特定:
    • ロック時間が長すぎる → Fc を増やします(BW ≈ 12/t_lock)
    • 帯域内の位相ノイズが高すぎる → Fc を下げる、Icp を増やす、または N を減らします
    • スプリアスが大きすぎる → フィルター次数を増やすか、Fc を狭めます
  5. 再設計 — 新しい Fc(必要であれば Phi も)を設定し、 CompSelectionMethod='Automatic' を維持して、ブロックにフィルターコンポーネントを再計算させます
  6. 再シミュレーション — テストベンチの UserData を読み取ります。仕様を満たすまで繰り返します。
  7. 報告 — トレードオフに関する注記を添えて、変更前後を比較します

主なルール:

  • Vctrl の整定からロック時間を推定してはいけません(P103)
  • Fo/N や RefFreq パラメーターから fComp を推測してはいけません(P104)
  • 安定性を確保するため、Fc は fPFD/10 以下にします
  • lock_time ≈ 12/Fc は初期サイジングにのみ使用し、その後テストベンチで検証します

利用可能性の確認(必須)

関数またはブロックを使用する前に、必ず存在を確認してください。主要な関数(thirdOrderPassiveFilterDesign、estimatePLLPhaseNoise、 phaseNoiseMeasure、phaseNoiseToJitter)については exist(func,'file') を、ライブラリ(msbPllFoundation、msbPllMeasurements、msbPllArchitectures)については exist(lib,'file')==4 を確認します。見つからない場合は使用せず、依存する手順をスキップしてください。


フェーズ 1:データシートのパラメーターを抽出する

1.0 データシート PDF の読み取り

MATLAB の extractFileText を使用してください(Read ツールで PDF を直接読み取ってはいけません)。

pdfPath = 'path/to/datasheet.pdf';
txtContent = extractFileText(pdfPath);
txtPath = strrep(pdfPath, '.pdf', '_extracted.txt');
fid = fopen(txtPath, 'w'); fprintf(fid, '%s', txtContent); fclose(fid);
fprintf('Extracted %d characters to: %s\n', strlength(txtContent), txtPath);
1.1 アーキテクチャの特定

機能ブロック図から PLL トポロジーを特定します。

質問代表的な選択肢
Integer-N ですか、Fractional-N ですか?整数のみ、アキュムレーターを使用する Fractional、DSM を使用する Fractional
DSM の次数(Fractional の場合)は?1 次、2 次、3 次、4 次
プリスケーラーの種類は?単一モジュラス、デュアルモジュラス(P/P+1)
VCO は内蔵されていますか?はい/いいえ(外付け)
基準信号の経路は?直接、R カウンターを使用、逓倍器を使用、分周器を使用
出力分周器はありますか?なし、プログラマブル分周チェーン
フィードバックのタップ点は?出力分周器の前(VCO)、出力分周器の後
1.2-1.4 詳細なパラメーター抽出

パラメーター表の全体については、references/datasheet-extraction.md を参照してください。

  • 1.2:PLL のコアパラメーター(PFD、CP、分周器、VCO、出力段)
  • 1.3:ノイズパラメーター(VCO PN、PNSYNTH、フリッカー、ジッター、スプリアス)
  • 1.4:周波数プランの計算例

フェーズ 2:アセンブリー戦略の選択

判断ツリー(必ず従ってください)
START
  │
  ├─ Does the PLL topology match an msbPllArchitectures template?
  │   ├─ YES ──► Strategy A (Architecture block) ◄── DEFAULT
  │   └─ NO ───► Strategy B (Foundation blocks)
  │
  └─ Do you need EXTERNAL custom noise injection (BLWN, spur sources wired
     into the signal path OUTSIDE the PLL subsystem)?
      ├─ NO ───► Strategy A (Architecture block) ◄── DEFAULT
      └─ YES ──► Strategy A + editSystem (flatten, then inject)
                 OR Strategy B (if injection point is before CP or after VCO)

戦略 A は、仕様主導かデータシート主導かを問わず、すべての設計のデフォルトです。トポロジーに一致するアーキテクチャーテンプレートがない場合(例:デュアルループ、注入同期、標準外のフィードバックを使用する外付け VCO)にのみ、基礎ブロック(戦略 B)が必要です。

戦略使用する状況性能複雑さ
A:アーキテクチャーブロックデフォルト。 標準的な Int-N、Frac-N、デュアルモジュラス PLLシミュレーションが 3.3 倍高速(5 GHz PLL で 212 秒から 65 秒)4 ブロック、4 接続
A + editSystemCP の広帯域ノイズを注入する、またはカスタムのインペアメントを追加する必要がある場合フラット化されるまでは同じ速度フラット化すると内部ブロックが約 5 個追加
B:基礎ブロック標準外のトポロジー、外付け VCO、デュアルループ、または学習・可視化を目的とする場合基準(最も低速)9 個以上のブロック、11 個以上の接続
プローブ優先のパターン(set_param の前に必ず実施)

ブロックパラメーターを設定する前に、マスクをプローブして正確なパラメーター名を確認してください。ドキュメントや記憶を頼りに、パラメーター名を推測してはいけません。プローブの手順全体については、references/probing-simulink-models.md を参照してください。

blk = [model '/PLL'];
m = Simulink.Mask.get(blk);
paramNames = {m.Parameters.Name};
fprintf('Available params (%d):\n', numel(paramNames));
cellfun(@(p) fprintf('  %s\n', p), paramNames);

これにより、'Icp'(誤り)の代わりに 'OutputCurrent'(正しい)を使用する、または 'DividerRatio'(誤り)の代わりに 'N'(正しい)を使用するといったエラーを防げます。

2.1 msbPllArchitectures — 事前構築済み PLL テンプレート(戦略 A)
アーキテクチャーブロックトポロジー分周器のパラメーター
単一モジュラス・プリスケーラーを使用する Integer N PLLPFD->CP->LF->VCO->単一プリスケーラーNmin、N(整数)— 最初に N を設定
デュアルモジュラス・プリスケーラーを使用する Integer N PLLPFD->CP->LF->VCO->デュアルプリスケーラーProgramCounter(P)、PrescalerDivider(N)、SwallowCounter(S) — 制約:P > S > 0(P105)
アキュムレーターを使用する Fractional N PLLPFD->CP->LF->VCO->Frac Divider (Accum)N(小数)、Nmin
デルタシグマ変調器を使用する Fractional N PLLPFD->CP->LF->VCO->Frac Divider (DSM)N(小数)、Nmin、dsm(次数)

主な昇格パラメーター(すべてに共通):

カテゴリーパラメーター
VCOKvco、Fo、Amplitude、AddPhaseNoise、Foffset、PhaseNoise、PeriodJitter、CornerFrequency、FlickerExponent
チャージポンプOutputCurrent、EnableCurrentImpairments、CurrentImbalance、LeakageCurrent、EnableTimingImpairments
ループフィルターCompSelectionMethod(Automatic/Manual)、Fc、Phi、FilterType、C1~C4、R2~R4、LfEnableImpairments、Temperature
PFDDeadbandCompensation、EnableImpairments
解析ol_opt、cl_opt、estimatePn
プローブpfd_up_dn、cp_out、lf_out、ps_out

組み込みコールバック:

  • msblks.PLL.editSystem(gcb) — 編集可能なサブシステムにフラット化
  • msblks.PLL.estimatePhaseNoise(gcb) — 解析的な PN 推定
  • msblks.VCO.plotMaskFigure(gcb) — PN のフィッティングとデータをプロット
2.2 msbPllFoundation -- 個別の構成ブロック(戦略 B)

ブロックの一覧とパラメーターの全容については、references/assembly-code.md を参照してください。 主なブロック:PFD、チャージポンプ、ループフィルター、リングオシレーター VCO、DSM 搭載フラクショナル分周器。

2.3 ギャップ分析

アーキテクチャブロックは、PFD、CP、LF、VCO、分周器に対応しています。R カウンター、 基準周波数逓倍器、RF 出力分周器、または CP の広帯域ノイズについては、 editSystem でフラット化してから、サブシステム内にカスタムブロックを追加してください。


フェーズ 3:カスタムブロックの作成/アーキテクチャのカスタマイズ

3.0 フラット化(msblks.PLL.editSystem)

すべてのマスクパラメーターを先に設定してから、フラット化してください。フラット化すると、サブシステムに個別のブロック(PFD、CP、LF、VCO、分周器)が含まれ、変更できるようになります。

blk = [model '/PLL'];
set_param(blk, 'Kvco','40e6', 'Fo','4.225e9', 'OutputCurrent','5e-3', ...
    'N','422.52', 'CompSelectionMethod','Automatic', 'Fc','60e3', 'Phi','48');
msblks.PLL.editSystem(blk);  % Flatten AFTER setting params
3.1-3.4 カスタムブロックのレシピ

CP の広帯域ノイズ(3.1)、基準周波数パス(3.2)、RF 出力分周器(3.3)、フィードバック選択マルチプレクサー(3.4)については、references/assembly-code.md を参照してください。


フェーズ 4:モデルの組み立て

パフォーマンスに関する指示 — モデルの一括組み立て モデルの組み立て全体を、1 回の mcp__matlab__evaluate_matlab_code 呼び出しで実行してください (new_system、set_param、add_block、add_line、スコープの設定をすべて 1 つのスクリプトに含めます)。 MCP のラウンドトリップごとに約 10~15 秒のオーバーヘッドが発生します。一括処理なら約 30 秒ですが、個別に実行すると 5 分以上かかります。 手順:(1)パラメーターを計算する、(2)組み立てスクリプトを保存フォルダー内の .m ファイルに書き込む、 (3)mcp__matlab__run_matlab_file で実行する(コードのダンプがなく、ターミナルがすっきりします)、 (4)検証する。大きなスクリプトには evaluate_matlab_code の代わりに run_matlab_file を使用すると、ライブデモ中に未処理のコードがユーザーの画面を埋め尽くすのを防げます。

4.0 戦略 A:アーキテクチャブロックの組み立て(デフォルト)

アーキテクチャブロックは、シミュレーションが 3.3 倍高速で、ブロック数が 56%少なく、接続数が 64%少なくなります。 組み立てコードの完全なテンプレートは references/assembly-code.md を参照してください。主な手順:

  1. new_system +ソルバー設定(VariableStepDiscrete、ReturnWorkspaceOutputs='on')
  2. msbPllArchitectures/<type> から add_block
  3. 分周器を設定:最初に Nmin='1'、次に N、最後に Nmin を最終値に設定(P57/P92)
  4. VCO パラメーターを設定:Kvco、Fo、OutputCurrent、AddPhaseNoise、RefFreq
  5. ループフィルター:N>50 の場合は thirdOrderPassiveFilterDesign(P79)、それ以外は Automatic
  6. PFD タイミング:PropDelay = max(50e-12, min(5e-12, 1/(2*fVCO)/10))、MaxFreqInterest = 2*fVCO(50ps が下限です。ブロックはこれより小さい値を受け付けません)
  7. Vctrl プローブ用に lf_out='on' を有効にする
  8. PLL テストベンチを追加(Fo=fPFD、ExpectedFreq=fVCO、SampleRate=8*fVCO)
  9. SpectralAverages='2' を設定(P102:マスクのデフォルトは 4)、LockTimeOption='on'、PhaseNoiseOption='off'(P83)
  10. StopTime = min(3*t_lock, 50e-6)、HoldOffTime = min(1.5*estLock, 0.8*StopTime)
  11. Simulink.Mask.get でペアになったベクトルを設定:PhaseNoiseFreqOffset、TargetPhaseNoiseVector(P71、P100:目標値がない場合は -999 を使用します。マスクは -inf を受け付けません)
  12. 接続:TB/1→PLL/1、PLL/1→TB/1、PLL/2→Scope+ToWorkspace
  13. Simulink.BlockDiagram.arrangeSystem(model); drawnow; set_param(model,'ZoomFactor','FitSystem'); drawnow;(P95)
4.1 戦略 B:基盤ブロック

標準外のトポロジーに限って使用してください。references/assembly-code.md を参照してください。

4.2 安定性解析(時間領域シミュレーションの前に必ず実行)

本格的なシミュレーションを実行する前に、PM が 45°を超え、閉ループのピーキングが 1 dB を超えないことを確認してください。

  • pllOpenLoopPlot(Icp,Kvco,N,Fc,R2,R3,R4,C1,C2,C3,C4) / pllCloseLoopPlot(...)
  • 3 次受動フィルターの場合:R4=0、C4=0。references/stability-analysis.md を参照してください。
  • pllOpenLoopPlot がクラッシュする場合(位相 <= -180°で ylim エラー):P106 に従って手動のボード線図で代替してください。logspace の掃引で Z(s)、G(s) を計算します。Control System Toolbox(tf、bode)は使用しないでください。必須ではありません。
4.3 シミュレーションを実行して結果を読み取る
simOut = sim(model);
delete(findall(0,'Type','figure','Tag','Msgbox_Warning'));
% Read lock time from PLL Testbench model workspace
sid = Simulink.ID.getSID([model '/PLL Testbench']);
sidParts = split(sid, ':'); sidSuffix = sidParts{2};
mdlWs = get_param(model, 'ModelWorkspace');
lockTime = evalin(mdlWs, ['LockTime_' sidSuffix]);
freq = evalin(mdlWs, ['Frequency_' sidSuffix]);

% Alternative: read from UserData (works after sim completes)
ud = get_param([model '/PLL Testbench'], 'UserData');
lockTime = ud.lockTime;  % seconds
freq = ud.freq;          % Hz
pnLevels = ud.phaseNoiseLevel; % dBc/Hz vector

P103:Vctrl のセトリングからロック時間を推定してはいけません。 PLL Testbench では、周波数誤差に基づく検出(FreqErrorTol)を使用します。これが有効な唯一のロック時間測定方法です。Vctrl を手動で分析すると、誤った結果になります。

P104:モデルに PLL Testbench がない場合、またはリファレンス入力が未接続の場合、fComp を特定できません。 RefFreq パラメーターは PN 推定専用であり、実際のリファレンスクロックを定義するものではありません。先に進む前に、ユーザーに fComp を尋ねてください。推測したり、Fo/N から計算したりしないでください。

VCO 出力ポート 1 の後に続くプローブタブのポート:pfd_up、pfd_dn、cp_out、lf_out、ps_out。 測定を行うには、HoldOffTime を StopTime より小さくする必要があります。


クイックリファレンス

f_PFD = f_REFIN*(1+D)/(R*(1+T))  |  f_VCO = f_PFD*(INT+FRAC/MOD)  |  f_OUT = f_VCO/RF_DIV
N_eff = INT+FRAC/MOD (from VCO)  |  N_eff = (INT+FRAC/MOD)*RF_DIV (from divider output)
In-band PN  = PNSYNTH + 10*log10(f_PFD) + 20*log10(N)
1/f PN at f = PN1_f + 10*log10(10kHz/f) + 20*log10(f_RF/1GHz)
Divider effect = -20*log10(RF_DIV) on output phase noise

ハッピーパス早見表(仕様 → ロック時間の検証)

最も一般的なワークフローは約 20 ステップです。

1. User gives: fVCO, fRef, lock time target
2. Derive: N = fVCO/fRef, Fc = 12/t_lock (cap at fPFD/10), Kvco = fVCO/50
3. Present Design Plan (block diagram + params)
4. Build model (ONE mcp call):
   - new_system, VariableStepDiscrete solver
   - add_block msbPllArchitectures/Integer N PLL...
   - set Nmin='1', N, Nmin=N
   - set Kvco, Fo, OutputCurrent, Fc, Phi='50'
   - add PLL Testbench (Fo=fRef, ExpectedFreq=fVCO, SampleRate=8*fVCO)
   - set LockTimeOption='on', SpectralAverages='2'
   - connect TB↔PLL, enable lf_out, add scope
   - StopTime = min(3*12/Fc, 50e-6), HoldOff = 1.5*12/Fc
   - arrangeSystem + FitSystem
5. Plot Bode: pllOpenLoopPlot(...), confirm PM > 45° (if ylim crash, use manual fallback P106)
6. sim(model)
7. ud = get_param(tbBlk, 'UserData'); lockTime = ud.lockTime;
8. Report: lock_time vs target, margin, PASS/FAIL
9. If margin > 3x → DONE. If not → increase Fc by 50%, repeat from step 5.

ライブラリ名(正式名称): msbPllArchitectures、msbPllFoundation、 msbPllMeasurements、msbUtilities


Copyright 2026 The MathWorks, Inc.

コメント