1. はじめに
この記事では、Cyclone® V SoC / Arria® V SoC を対象に、FPGA-HPS 間のインターフェイスを構築するための設定とアクセスを可能にするコマンドを紹介します。
Intel® SoC FPGA デバイスでは FPGA と HPS(Hard Processor System)が共存しています。HPS から FPGA へは HPS-to-FPGA もしくは Lightweight HPS-to-FPGA という専用のインターフェイスを通ってアクセスします(図 1)。インターフェイスを構築しただけではアクセスすることはできず、特定のコマンドによりアクセスを可能にする手続きが必要になります。
【図 1】AXI Bridges の設定画面
2. FPGA から HPS へのインターフェイスを有効化
HPS から FPGA へアクセスするには、両者を繋ぐインターフェイスを有効化する必要があります。
インターフェイスには HPS-to-FPGA と Lightweight HPS-to-FPGA の 2 種類があり、少なくとも一方を選択する必要があります。 HPS-to-FPGA と Lightweight HPS-to-FPGA の概要は下記となります(表1)。
【表 1】HPS-to-FPGA と Lightweight HPS-to-FPGA の概要
インターフェイス | ビット幅 | 主な用途 |
HPS-to-FPGA | 32-bit, 64-bit, 128-bit |
大容量のデータ転送 |
Lightweight HPS-to-FPGA | 32-bit |
レジスタアクセス |
設定方法は、 Platform Designer 内の HPS の Parameters → FPGA Interfaces タブ → AXI Bridges フィールド内で、 HPS-to-FPGA interface width もしくは Lightweight HPS-to-FPGA interface width を unuse 以外に設定します(図 2)。設定可能なビット数は表1を参考にしてください。
【図 2】AXI Bridges フィールドの設定
上記設定により HPS-to-FPGA/Lightweight HPS-to-FPGA を有効にすると Platform Designer の Arria® V / Cyclone® V Hard Processor System に AXI マスターのピンが出力されます。その AXI マスターピンをアクセスしたいペリフェラルに接続し Platform Designer で Generate することにより、インターフェイスの構築は完了です。
※ Platform Designer が自動挿入する AXI と Avalon-MM のブリッジで AXI マスターと Avalon-MM スレーブは直接接続することができます。
3. ブリッジの開通
ハードとして HPS と FPGA の間にインターフェイスを作成したら、ソースコードにて明示的にブリッジを開通する必要があります。ブリッジの開通は Preloader もしくは U-boot にて行うことができます。
3-1. Preloader でブリッジを開通する方法
3-1-1. 標準 Preloader
Preloader にはデフォルトで FPGA 側がコンフィグレーション済みの場合ブリッジを開通するコードが組み込まれています。具体的な記述は reset_manager.c 内の下記記述です。
ファイル所在:uboot-socfpga\arch\arm\cpu\armv7\socfpga\reset_manager.c
00297| if (is_fpgamgr_fpga_ready()) {
00298| DEBUG_MEMORY
00299| /* enable the axi bridges if FPGA programmed */
00300| writel(brgmodrst, &reset_manager_base->brg_mod_reset);
00301|
00302| /* remap the enabled bridge into NIC-301 */
00303| writel(remap_val, SOCFPGA_L3REGS_ADDRESS);
00304| }
上記コードでは、is_fpgamgr_fpga_ready() にて FPGA がコンフィグレーション済みか判断しています。もしコンフィグレーション済みの場合、
writel(brgmodrst, &reset_manager_base->brg_mod_reset);
でブリッジを開通しています。
注記:
この時点で FPGA のコンフィグレーションが完了していない場合ブリッジは開通されません。
Preloader でブリッジが開通しない場合は、以下に記載している U-boot での開通が必要になりす。
ブートフローで U-Boot を使用しない場合は、Preloader の後段で動作するユーザー・アプリケーション上でブリッジの開通を行うか、もしくは、FPGA コンフィグレーションが完了するまで待った後でブリッジを開通させるように Preloader をカスタマイズする方法もあります。
3-1-2. Preloader のカスタマイズで対応
Preloader のカスタマイズで対応したい場合は、前述の is_fpgamgr_fpga_ready() を poll_fpgamgr_fpga_ready() に差し替えるのみで対応可能です。
以下、参考までに is_fpgamgr_fpga_ready と poll_fpgamgr_fpga_ready の内容も掲載しておきます。
ファイル所在:uboot-socfpga\arch\arm\cpu\armv7\socfpga\fpga_manager.c
00065|/* Check whether FPGA is ready to be accessed */
00066|int is_fpgamgr_fpga_ready(void)
00067|{
00068| /* check for init done signal */
00069| if (is_fpgamgr_initdone_high() == 0)
00070| return 0;
00071| /* check again to avoid false glitches */
00072| if (is_fpgamgr_initdone_high() == 0)
00073| return 0;
00074| if (fpgamgr_get_mode() != FPGAMGRREGS_MODE_USERMODE)
00075| return 0;
00076| return 1;
00077|}
00078|
00079|/* Poll until FPGA is ready to be accessed or timeout occurred */
00080|int poll_fpgamgr_fpga_ready(void)
00081|{
00082| unsigned long i;
00083| DEBUG_MEMORY
00084| /* If FPGA is blank, wait till WD invoke warm reset */
00085| for (i = 0; i < FPGA_TIMEOUT_CNT; i++) {
00086| /* check for init done signal */
00087| if (is_fpgamgr_initdone_high() == 0)
00088| continue;
00089| /* check again to avoid false glitches */
00090| if (is_fpgamgr_initdone_high() == 0)
00091| continue;
00092| return 1;
00093| }
00094| DEBUG_MEMORY
00095| return 0;
00096|}
3-2. U-boot でブリッジを開通する方法
下記コマンドを U-Boot スクリプト(u-boot.scr)に記述するとブリッジを開通することができます。
run bridge_enable_handoff;
この方法でブリッジを開通させる場合においても、事前に FPGA のコンフィグレーションが済んでいる必要があります。
参考: 以下の記事で U-Boot スクリプトの編集方法について解説しています。