1. はじめに
この「SoC はじめてガイド」シリーズは、Altera®(Intel®)SoC FPGA を使用する初心者ユーザ向けの技術コンテンツです。
SoC FPGA は、Arm® Cortex®-A9 MPCore プロセッサーと FPGA とがデバイス内でバス接続されています。デバイス内で接続されているため、プロセッサーと FPGA 間の転送レート不足の解消や、基板上の実装面積の縮小が期待されます。
この記事では、Cyclone® V SoC FPGA や Arria® V SoC FPGA における、Hard Processor System(以下 HPS)と FPGA 間のアクセス方法を説明します。なお、この記事内では特に断りが無い場合、Cyclone® V SoC FPGA や Arria® V SoC FPGA のことを SoC FPGA と呼ぶことにします。
2. HPS-FPGA 間のインターフェイス
SoC FPGA の内部構造は下図の通りです。図の上方の緑色部分が FPGA ファブリックで、その下方の水色部分を含む破線部分内が HPS です。
【図 2-1】 SoC FPGA の内部構造
SoC FPGA には、FPGA と HPS との間に 4 つのインターフェイスがあります。
HPS 側がバスマスターとなって FPGA 側にアクセスするインターフェイスとしては、最大 128bit 幅の高帯域な HPS-to-FPGA(H2F)インターフェイスと、32bit 幅の Lightweight HPS-to-FPGA(LWH2F)インターフェイスがあります。
H2F は、HPS と FPGA 間の比較的大容量のデータを転送するインターフェイスです。
LWH2F は、制御信号など比較的低速でのアクセスに適しています。
HPS からは、これらのインターフェイスは、後述するアドレスマップ上でメモリーマップド I/O としてアクセスできます。
FPGA 側がバスマスターとなって HPS 側にアクセスするインターフェイスとしては、最大 128bit の FPGA-to-HPS(F2H)インターフェイスがあります。
また、FPGA 側から HPS 側にある SDRAM コントローラーに直接アクセスするインターフェイスとしては、FPGA-to-SDRAM(F2S)があります。
各インターフェイスの概要を次表に示します。
| 名称 | HPS to FPGA Bridge |
Lightweight HPS to FPGA Bridge |
FPGA to HPS Bridge | FPGA to HPS SDRAM Interface |
| 略称 | H2F | LWH2F | F2H | F2S |
| 機能概要 | HPS がバスマスターとなり FPGA 側にアクセスするインターフェイス | HPS がバスマスターとなり FPGA 側にアクセスするインターフェイス | FPGA がバスマスターとなり HPS 側にアクセスするインターフェイス | FPGA がバスマスターとなり HPS 側の SDRAM へ直接アクセスするインターフェイス |
| バス幅 | 32 / 64 / 128bit | 32bit | 32 / 64 / 128bit | 32 / 64 / 128 / 256 bit |
| 空間サイズ | 960MB | 2MB | 4GB | 4GB |
| I/F タイプ | AXI3™ | AXI3™ | AXI3™ | AXI3™ / Avalon®‐MM |
| 最大ポート数 | 1 | 1 | 1 | AXI3™:3 Avalon®-MM:6 |
| 主な使用方法 | FPGA 側とのデータ転送(広帯域を必要とする大きなサイズのデータを扱う場合) | FPGA 側のコントロール・ステータス・レジスタ(CSR)の読み書き(H2F のデータ・トラフィックに影響されずに低遅延でアクセスしたい場合) | HPS 側とのデータ転送および CSR 読み書き | HPS 側の SDRAMに対する高速アクセス(HPS 内のメインスイッチを介さずに SDRAM へアクセスしたい場合) |
Platform Designer(旧 Qsys)がバスプロトコルの相互変換を行うためのインターコネクト回路を自動生成するため、Avalon® インターフェイスのコンポーネントを I/F タイプが AXI3™ の ブリッジ/インターフェイスへ接続することも可能です。このため今までの設計資産を流用することが可能です。
3. アドレスマップ
Arm プロセッサーから見た FPGA は、メモリーマップド・デバイスとしてアクセスすることができます。アドレスマップは、「どこからアクセスをするか」によって、以下の 3 種類の概念に分かれます。
- Arm プロセッサーからアクセスする場合に使用する「MPU ビュー」
- L3 インターコネクトに接続されたマスタから使用する「L3 ビュー(別称、non-MPU ビュー)」(F2H に接続された FPGA 側のマスターデバイスも L3(non-MPU)ビューの概念が適用されます)
- F2S に接続されたマスタから使用する「SDRAM ビュー」
各ビューの概念を下図に示します。
【図 3-1】 各ビューの概念
【図 3-2】 各ビューに対するアドレスマップ
上図が、3 種類の各ビューに対するアドレスマップとなります。
- MPU ビューと L3(non-MPU)ビューには、H2F、LWH2F アクセス用に固定の領域が割り当てられます。
- HPS 側から H2F ブリッジを介して FPGA にアクセスする際は、0xC000_0000~ 番地にアクセスします。
- HPS 側から LWH2F ブリッジを介して FPGA にアクセスする際は、0xFF20_0000~ 番地にアクセスします。
Arm プロセッサーのソフトウェアから FPGA にアクセスする方法は、「5. ソフトウェアからのアクセス」をご参照ください。
L3 ビュー(non-MPU ビュー)の 0x8000_0000 番地以降にマッピングされているのは、Accelerator Coherency Port(以下 ACP)です。このポートを介してアクセスをすると、L3 に接続されたマスターからとプロセッサーとの間でコヒーレントなアクセスを行うことができます。
ACP を介したアクセスは、使用するデバイスファミリー用の Hard Processor System Technical Reference Manual の ACP に関する記述をご参照ください。
4. ハードウェアの設定
ハードウェアの設定は、Platform Designer によって行います。設定は、「HPS コンポーネントの設定」、「HPS と他のコンポーネントとの接続」 および 「インターフェイスの初期化」 の 3 つが必要です。
4-1. HPS コンポーネントの設定(AXI Bridges / FPGA-to-HPS SDRAM Interface)
HPS コンポーネントの設定を Platform Designer の GUI にて行います。
FPGA Interfaces タブの AXI Bridges(下図赤枠)および FPGA-to-HPS SDRAM Interface(下図青枠)が、該当のオプションとなります。
次に、AXI Bridges の設定では、F2H, H2F, LWH2F の各インターフェイスに対して、データバス幅および使用の有無を選択します。
そして、FPGA-to-HPS SDRAM Interface の設定では、F2S インターフェイスで利用するポートを 0 個(未使用)から条件により最大 6 個まで複数のポートを登録できます。
各ポートには、バスの種類、およびデータバス幅を選択します。F2S に登録可能なポート数の詳細は 「4-1-5. F2S のポート数」 をご参照ください。
【図 4-1】 FPGA Interfaces タブの設定
4-1-1. FPGA-to-HPS インターフェイス(F2H)
FPGA-to-HPS インターフェイスは、FPGA 内にあるバスマスターが、HPS 内のペリフェラルやメモリーにアクセスするために使用します。
このインターフェイスは 4GB のアドレス空間を有しています。32bit アドレスをサポートできないバスマスターは、Platform Designer の IP カタログにある Address Span Extender(ウィンドウブリッジ)を使用してアドレス拡張することにより接続できます。
データバス幅は、32bit / 64bit / 128bit から選択することが可能です。
【図 4-2】 FPGA-to-HPS インターフェイス(F2H)
4-1-2. HPS-to-FPGA インターフェイス(H2F)
HPS-to-FPGA インターフェイスは、HPS 内にある Arm プロセッサーや DMA コントローラー等のバスマスターが、FPGA 内のペリフェラルにアクセスするために使用します。
最大 128bit のデータバス幅を選択できるため、大容量のデータ転送に適します。
このインターフェイスは 960MB(0xC000_0000 ~ 0xFBFF_FFFF)のアドレス空間を有しています。960MB より大きい空間にアクセスする場合、Platform Designer の IP カタログにある Address Span Extender(ウィンドウブリッジ)を使用してアドレス拡張することによりアクセスできます。
データバス幅は、32bit / 64bit / 128bit から選択することが可能です。
【図 4-3】 HPS-to-FPGA インターフェイス(H2F)
4-1-3. Lightweight HPS-to-FPGA インターフェイス(LWH2F)
Lightweight HPS-to-FPGA インターフェイスは、HPS 内にある Arm プロセッサーや DMA コントローラー等のバスマスターが、FPGA 内のペリフェラルにアクセスするために使用します。
データバス幅が 32bit 固定のため、LED 等の各種レジスター制御用や、状態の確認のためのレジスターアクセスに適します。
このインターフェイスは 2MB(0xFF20_0000 ~ 0xFF3F_FFFF)のアドレス空間を有しています。
2MB 以上の空間にアクセスする場合、Platform Designer の IP カタログにある Address Span Extender(ウィンドウブリッジ)を使用してアドレス拡張することによりアクセスできます。
データバス幅は、32bit 幅のみとなります。
【図 4-4】 Lightweight HPS-to-FPGA インターフェイス(LWH2F)
4-1-4. FPGA-to-HPS SDRAM インターフェイス(F2S)
FPGA-to-HPS SDRAM インターフェイス(F2S)は、FPGA 内のバスマスターが、HPS 内の L3 インターコネクトを介すことなく、HPS 内の SDRAM にアクセスができるインターフェイスです。
このポートは、最大6 ポートまで持つことが可能で、4GB のアドレス空間を有します。アドレス空間は 4GB 存在しますが、メモリーの実体がない空間へのアクセスは行わないでください。
インターフェイスの種類は、4 種類選択できます。
-
- AXI-3
- Avalon-MM Bidirectional
- Avalon-MM Write-Only
- Avalon-MM Read-Only
データバス幅は、32bit / 64bit / 128bit / 256bit から選択できます。
【図 4-5】 FPGA-to-HPS SDRAM インターフェイス(F2S)
4-1-5. F2S のポート数
FPGA-to-HPS SDRAM インターフェイス(F2S)は、複数のポートを持てることはご紹介しました。ここでは、ポート数の考え方についてご紹介します。
F2S は、コマンドポート(6 ポート)、64bit read data ポート(4 ポート)、64bit の write data ポート(4 ポート)にて実装されます。
以下の表に示す通り、AXI バスの場合、コマンドポートを 2 本、Avalon®-MM バスの場合、コマンドポートを 1 ポート使用します。このため、AXI バスの場合、最大 3 ポート、Avalon®-MM バスの場合、最大 6 ポート実装できます。
データバス幅で考えると、256bit のバスは最大 1 ポート、128bit のバスは最大 2 ポート、64bit もしくは 32bit のバスの場合は最大 4 ポート実装できます。
Avalon®-MM の read only ポートおよび write only ポートを組み合わせることにより、最大 6 ポート実装できることになります。
【図 4-6】 F2S のポート種別とポート数
【図 4-7】 バスプロトコル別のポート数
4-1-6. SDRAM コントローラーの優先度
HPS に実装されている SDRAM コントローラーは、複数ポートからのアクセスを可能にするため、アービトレーション・ロジックを実装しています。これは重みづけのできるラウンドロビン方式で実装されており、下図に示すコマンドポート単位で重みづけができます。
詳細は、使用するデバイスファミリー用の Hard Processor System Technical Reference Manual の SDRAM Controller Subsystem の項をご参照ください。
【図 4-8】 SDRAM コントローラーのブロック図
【図 4-9】 コマンドポート単位での重みづけ
4-2. 他のコンポーネントとの接続
HPS と他のコンポーネントとを接続するには、Platform Designer の GUI 上での設定を行います。
HPS の各インターフェイスは、Platform Designer 上でポートとして見ることができます。このポートと接続先のポートを結線することにより接続できます。
HPS のインターフェイスは AXI インターフェイスですが、Platform Designer が自動的に変換するため、Avalon®-MM インターフェイスも AXI インターフェイスもどちらも接続可能です。
Platform Designer 内のコンポーネントのアドレスも GUI にて設定可能です。ここで設定したアドレスをもとにソフトウェアからアクセスを行います。
【図 4-10】 Platform Designer での HPS と他のコンポーネントの接続
4-3. インターフェイスの初期化
HPS - FPGA 間のインターフェイスを使用するためには、HPS 内にあるレジスターを設定する必要があります。次の条件を満たす場合には、Preloader と呼ばれるブートローダーを使用することにより設定されるので、ユーザーはあまり気にする必要はありません。
- Preloader 実行前に FPGA のコンフィグレーションが完了している
- Preloader 実行中に FPGA のコンフィグレーションを行う
4-3-1. F2H, H2F, LWH2F の初期化
HPS2FPGA(H2F)/ LWHPS2FPGA(LWH2F)/ FPGA2HPS(F2H)ブリッジを利用するには、以下の 2 つのステップが必要です。
① ブリッジリセットの解除
brgmodrst レジスター(0xFFD0_501C 番地)に 0x0 をライトします(bit0: H2F / bit1: LWH2F / bit2: F2H の各ビットに 0:Reset 解除をセット)。詳細は以下を参照ください。
② L3 インターコネクトの設定
remap レジスター(0xFF80_0000 番地)に 0x18 をライトします(bit3: H2F / bit4: LWH2F の各ビットに 1: Visible to L3 Master をセット)。詳細は以下をご参照ください。
書き込む値はデザイン依存になりますので、各レジスターの詳細をご確認の上設定してください。
これらの初期化は、次にご紹介する U-Boot のブリッジ開放コマンド(bridge_enable_handoff / bridge enable)で設定することが可能です。
4-3-2. F2S の初期化
Preloader により SDRAM の初期化が行われていない場合、ブリッジへのアクセスができません。
また、F2S の設定を変更する場合は、SDRAM が Idle 状態である必要があります。
このため、U-Boot に実装されているブリッジ開放コマンド(bridge_enable_handoff / bridge enable)を実行することをお勧めします。
-
- u-boot-socfpga_v2013.01.01 の場合 :
$ run bridge_enable_handoff
-
- u-boot-socfpga_v2017.09 以降の場合 :
$ bridge enable
U-Boot の HPS-FPGA 間のブリッジ開放コマンドについては、下記のページでご紹介していますので併せてご参照ください。
参考情報:SoC FPGA 向け U-Boot の HPS-FPGA 間のブリッジ開放コマンドについて
5. ソフトウェアからのアクセス
Arm® Cortex®-A9 MPCore プロセッサーと FPGA とが、デバイス内でバス接続されています。Arm プロセッサーから FPGA 内部のペリフェラルは、メモリマップド I/O として見ることができます。
【図 5-1】 デバイス内でのバス接続
5-1. アドレスの考え方
メモリーマップより、HPS-to-FPGA(H2F)インターフェイスのベースアドレスは 0xC000_0000、Light Weight HPS-to-FPGA(LWH2F)インターフェイスのベースアドレスは 0xFF20_0000 であることが分かります。
Arm プロセッサーから見た FPGA コンポーネントのアドレスは、以下のように計算できます。
|
ARM から見た FPGA コンポーネントのアドレス: HPS-FPGA ブリッジのベースアドレス + Platform Designer 上のオフセットアドレス ---------------------------------------------------------------- = FPGA コンポーネントのアドレス |
例えば、Platform Designer 上で、LWH2F の 0x0002_0040 に接続された LED に対してアクセスするには、以下のアドレスにアクセスします。
|
Arm プロセッサーから PIO_LED にアクセスする際のアドレス: 0xFF20_0000(LWH2F ベースアドレス) + 0x0002_0040(Platform Designer 上のオフセットアドレス) ---------------------------------------------------------------- |
【図 5-2】 Arm プロセッサーから PIO_LED にアクセスする際のアドレス
【図 5-3】 Arm プロセッサーから PIO_LED にアクセスするコード例
5-2. システムヘッダー・ファイル
先ほどの例では、ソースコード上に LED_PIO のアドレスを定義しアクセスを行いました。この方法では、ハードウェアの情報が変更される毎に、ソースコードの変更が必要になる場合があります。
SoC FPGA では、ハードウェアの情報をソフトウェア担当者に引く次ぐための仕組みを提供しております。その仕組みが、システムヘッダー・ファイル生成ツールです。
SoC EDS Command Shell 上で、<qsys system>.sopcinfo ファイルのあるディレクトリに移動して、“sopc-create-header-files” コマンドを実行します。
$ sopc-create-header-files <qsys subsystem>.sopcinfo
「どのマスタから見るか」という観点で、いくつかヘッダーファイルが生成されるのでご利用ください。ヘッダーファイルの例を以下に示します。
【図 5-4】 システムヘッダー・ファイルの例
6. 参考情報
この記事では、Cyclone® V SoC FPGA / Arria® V SoC FPGA における、HPS と FPGA 間のアクセス方法を紹介しました。この記事を参考に SoC FPGA をお使いいただければ幸いです。
SoC FPGA には各種サンプルデザインも用意されていますので、初めて SoC FPGA を使用される場合は開発キット等でサンプルデザインをベースに動かしてみると、理解への近道になるかと思います。
サンプルデザインは下記ので紹介されていますので併せてご参照ください。
参考情報:Altera® SoC FPGA まとめページ
参考情報:HPS-to-FPGA Bridges Design Example
参考情報:SoC FPGA Bare-metal Developer Center
参考情報:RocketBoards.org