はじめに
Agilex™ 3 FPGA では動作中に PLL のレジスタにアクセスして、動的に出力クロックの周波数等の設定を変更することが可能です。 この機能はダイナミック・リコンフィグレーションと呼ばれます。 本記事では、開発キットを使用して、PLL の出力クロック周波数を変化させてみましたので、その手順について記載します。
今回確認した環境は以下になります。
使用ツール:Quartus® Prime v25.1.1 Pro Edition
使用開発キット:Terasic 社:Atum A3 Nano
1. Agilex™ 3 の I/O PLL のダイナミック・リコンフィグレーション
1-1. I/O PLL の種類
Agilex™ 3 には FPGA ファブリックで使用可能な I/O PLL は以下の二種類があります。
・ Fabric-feeding I/O PLLs
・ I/O bank I/O PLLs
それぞれの詳細については以下リンクをご参照ください。
参考資料:Clocking and PLL User Guide: Agilex™ 3 FPGAs and SoCs - 1.2. PLLs Overview
これらの PLL は図 1 のように HSIO バンクおよび HVIO バンクに配置されており、ダイナミック・リコンフィグレーションをおこなうための回路構成は配置されているバンクにより異なります。
【図 1】 Agilex™ 3 の I/O PLL の配置バンク
(出典:Clocking and PLL User Guide: Agilex™ 3 FPGAs and SoCs - 2.2.3. PLL Locations)
表 1 のように、HSIO バンクの I/O PLL は EMIF Calibration IP を接続します。 一方 HVIO バンクの I/O PLL は直接ポートにアクセスします。
【表 1】 ダイナミック・リコンフィグレーション回路の種類
| I/O バンク | I/O PLL | ダイナミック・リコンフィグレーション回路 |
| HSIO バンク | I/O Bank I/O PLL | EMIF calibration IP を接続して AXI4 Lite インターフェースで設定 |
| Fabric-Feeding I/O PLL | ||
| HVIO バンク | Fabric-Feeding I/O PLL | 直接 リコンフィグレーション・ポートにアクセスして設定 |
本記事では、HVIO バンクの Fabric-feeding I/O PLLs を使用したダイナミック・リコンフィグレーションを実行します。
1-2. ダイナミック・リコンフィグレーションを実施するための準備
I/O PLL のダイナミック・リコンフィグレーションをおこなうには、IP 生成時に GUI で設定する必要があります。 HVIO バンクの場合は、I/O PLL 設定画面の Dynamic Reconfiguration タブで "Enable dynamic reconfiguration of PLL" にチェックします。 一方、HSIO バンクの I/O PLL の場合は下側の "Enable dynamic reconfiguration of PLL using Calibration IP" にチェックします。
【図 2】 ダイナミック・リコンフィグレーションを有効にする設定 (HVIO バンクの I/O PLL)
1-3. ダイナミック・リコンフィグレーション実行手順
ダイナミック・リコンフィグレーションは、I/O PLL のレジスタに以下の手順で設定します。
① Enabling Reconfiguration (address 0x10 bit[0]=1 を write)
② 各レジスタ設定 (複数の設定も可能)
③ Reset PLL (address 0x80、bit[2] = 1 を write)
④ PLL Recalibration (address 0x88、bit[11] = 1 を write)
上記手順は、以下リンクを参考にしています。
Clocking and PLL User Guide: Agilex™ 3 FPGAs and SoCs - 6.4.3. Reconfiguring The I/O PLL
なお、各レジスタ詳細は、以下リンクをご参照ください。
Clocking and PLL User Guide: Agilex™ 3 FPGAs and SoCs - 6.6.1. Divide Settings and the Corresponding Data Bit Setting for Reconfiguration
上記手順により、I/O PLL の設定が変更されます。 なお、レジスタ設定は、Read-Modify-Write で、設定箇所以外のビットは read 値を変更せずに write します。 その他の注意点については、以下リンクをご参照ください。
Clocking and PLL User Guide: Agilex™ 3 FPGAs and SoCs - 6.3. Implementing HVIO I/O PLL Reconfiguration
2. 実機動作確認
2-1. サンプルデザイン作成
今回は System Console を使用して I/O PLL のレジスタ設定をおこない、ダイナミック・リコンフィグレーション動作を確認します。作成デザインのブロック図を図 3 に示します。 PLL の出力クロック周波数は C0 : 10MHz、C1 : 20 MHz、C2 : 40 MHz、と設定しました。 各クロックで動作するカウンターを実装し、その上位ビットを LED に出力し、LED 点滅が確認できるようにしました。
System Console でアクセスするには、JTAG to Avalon-MM Master Bridge という IP を使用しますが、インターフェースは 32 bit です。 一方で I/O PLL のレジスタアクセス用のインターフェースは 8 bit なので、データ幅が異なります。 そのため、32 bit と 8 bit ×4 を変換するモジュール(図中の "translator")を新規に作成しました。
【図 3】 作成デザインブロック図
2-2. System Console の実行
まずデザインをコンパイルし、プログラミング・ファイル (.sof) を FPGA に書き込みます。 プログラミングについての詳細は以下リンクをご参照ください。
参考資料:Quartus® はじめてガイド - デバイス・プログラミングの方法
次に System Console を起動します。 起動は、Quartus Prime の Tools メニュー → System Debugging Tools → System Console を選択します。 System Console の詳細については、以下リンクをご参照ください。
参考資料:FPGA システム・デバッグ・ツール "System Console" を使ってみよう
参考資料:Quartus® Prime Pro Edition User Guide: Debug Tools
-7. Analyzing and Debugging Designs with System Console
起動すると図 4 のような画面が表示されます。 コマンドは Tcl Console Pane に入力しますので、タブをダブルクリックして拡大しておきます。
【図 4】 System Console 起動画面
つづいて、前記の手順を実行します。 今回は、I/O PLL の各レジスタ・アクセス用に簡単な Tcl (ファイル名:reg_set.tcl) を作成したので、これを使用します。 この Tcl は system_console フォルダーにあるので、
cd ./system_console
source reg_set.tcl
と入力します。
これにより、reg_set.tcl に記載の各プロシージャ―を実行できるようになりますので、それらを用いて C0、C1、C2 の出力クロック周波数を変更します。 今回は図 5 のように入力し、C0, C1, C2 が同じ周波数になるようにしました。
【図 5】 System Console 入力内容
これで、C0、C1、C2 のレジスタ値は同じになったので、出力クロックの周波数も同じになります。
本デザインでは各カウンタの bit[23] を LED に出力していますので、C0, C1, C2 の周波数を合わせると点滅周期が同じになります。 一度リセット・スイッチを押下すると、各カウンターがリセットされ、同一タイミングで点滅するようになります。
【図 6】 開発キットのリセット・スイッチと LED
2-3. Signal Tap での確認
PLL の出力クロック周波数の変化は LED で確認できますが、Signal Tap でも確認できます。 各カウンターの bit[2] をモニターしました。 Signal Tap の詳細については、以下リンクをご参照ください。
参考資料:FPGA オンチップ・デバッグ "Signal Tap" をやってみよう
図7 は初期設定での結果、図 8 は ダイナミック・リコンフィグレーション実行後の結果です。 サンプリング・クロックが各カウンターのクロックとは非同期なので、波形が歪みますが、C0, C1, C2 のカウンター周期が、図 8 では同じになっていることが確認できます。
【図 7】 初期設定でのカウンタ―出力
【図 8】 ダイナミック・リコンフィグレーション実行後のカウンタ―出力
参考として、I/O PLL の各レジスタへのアクセス波形も添付いたします。
図 9 は C0 レジスタ (address 0x5c) に 0x0F00081E を write する波形です。 LSB 側から 8 bit ずつ write します。
【図 9】 C0 レジスタ (address 0x5c) に 0x0F00081E を write する波形
図 10 は C0 レジスタ (address 0x5c) の read 波形です。 readdata は、先頭に 00h が 付加され、その後 LSB 側から順番に出力されます。
【図 10】 C0 レジスタ (address 0x5c) の read 波形
図 11 は Reset PLL レジスタ (address 0x80) の bit[2] に 1 を write する波形です。
【図 11】 Reset PLL レジスタ (address 0x80) の bit[2] に 1 を write する波形
図 12 は 図11 の波形の全体図です。 Reset PLL レジスタ (address 0x80) の bit[2] に 1 を write したことで、I/O PLL がリセット状態となり、クロック出力が停止するのでカウンタも停止します。 その後 bit[2] に 0 を write することでリセット解除されます。
【図 12】 Reset PLL レジスタ (address 0x80) の bit[2] に 1 を write した際の波形の全体図
おわりに
Agilex™ 3 の I/O PLL のダイナミック・リコンフィグレーションのご説明と Signal Tap の波形より動作を確認できました。 使用したデザインを記事末尾に添付いたします。 本記事が参考になれば幸いです。
「Agilex™ 3 でやってみた」シリーズ一覧はこちら