Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Cyclone V SoC の Ether MAC をベアメタルアプリから使ってみた話 / Using EMAC peripherals on HPS bare metal apps for Cyclone V SoC

homelith
November 09, 2019

Cyclone V SoC の Ether MAC をベアメタルアプリから使ってみた話 / Using EMAC peripherals on HPS bare metal apps for Cyclone V SoC

homelith

November 09, 2019
Tweet

Other Decks in Programming

Transcript

  1. Cyclone V SoC の Ether MAC を ベアメタルアプリから使ってみた話 @homelith 2019/11/09

    RTLを語る会(16) Using EMAC peripherals on HPS bare metal apps for Cyclone V SoC
  2. 本日のお話 ARM コア CPU と FPGA が一緒になった SoC FPGA を触り始めました

    ARM コア用に用意されたハードマクロのペリフェラル群 (Ethernet / SDCard / USB ...)を使い倒すために 頑張ろうとした話です
  3. 導入 Terasic DE10-Nano  ・SoC FPGA 搭載品で   比較的安価&入手性高い  ・SD Card にイメージを焼いて

      差し込むと Linux 起動とお手軽 FPGA 部のみを使って PID 制御で GPS 同期周波数源 (GPSDO) を作ったりしました “GPSと仲良くなってNTPサーバを作ろう” (第二版出ました) https://chofutech.booth.pm/items/1310612
  4. 説明書を見ないでGO! DE10_NANO_SoC_GHRD.v の構造 (CPU 利用時のデザインテンプレート) クロックとか トップモジュール Ethernet RGMII PHY

    接 続ピン hps_io (CPU 部の ポート定義) クロックとか トップモジュール Ethernet RGMII PHY 接 続ピン hps_io 自作 ネットワーク処 理 安直に考えた構造
  5. ダメでした クロックとか トップモジュール Ethernet RGMII PHY 接 続ピン hps_io (CPU

    部の ポート定義) ここは Cyclone V SoC においては HPS に接続固定 Arria 10 SoC などでは可能と思われる   Shared Pin Multiplexer に接続されており、   HPS への接続と FPGA 部への接続を   バンク単位で切り替え出来る 参考: Intel Arria 10 Hard Processor System Technical Reference Manual 26章 Hard Processor System I/O Pin Multiplexing
  6. cv_5v4.pdf (Cyclone V Hard Processor System Technical Reference Manual) のブロック図

    説明書を読む Ethernet MAC HPS 本体 メイン AXI インターコネクト FPGA 部 とのブリッジ
  7. Connectivity Matrix (8章 System Interconnect) を見る限り、 FPGA to HPS Bridge

    から Ether MAC まで のアクセス経路はありそう FPGA -> EMAC 直接 アクセス可能か? ※ FPGA 部とのブリッジは HPS 側 からの開通が必要なので、最低限 開通用のプログラムを書き込む必 要がある
  8. Ethernet MAC peripheral は port 0 : 0xFF700000 port 1

    : 0xFF702000 にマッピングされており、 FPGA-to-HPS bridge から見 える模様 (右図 Peripherals and L3 GPV 領域) FPGA -> EMAC 直接 アクセス可能か?
  9. 考えられるアプローチ 作業1 MAC の初期化 作業2 EMAC <-> FPGA 間 パケット転送

    特徴 性能 Linux のネットワークド ライバに任せる Linux 上のプログラムとして実装 (libpcap 等使用?) 実装が簡便、 起動に少々時間が掛かる (数十秒) ARM ベアメタルアプリ ケーションで実装 ARM ベアメタルアプリとして実装 HWLib 使えば実装も容易 か? FPGA 側から直接 AXI バスを通じて アクセス ↑ 構成からアップグレードで きる FPGA 側から直接アク セスして初期化 FPGA 側から直接 AXI バスを通じて アクセス 参考にできそうなコードが無 く大変かも知れない (多分) 低 高
  10. 考えられるアプローチ 作業1 MAC の初期化 作業2 EMAC <-> FPGA 間 パケット転送

    特徴 性能 Linux のネットワークド ライバに任せる Linux 上のプログラムとして実装 (libpcap 等使用?) 実装が簡便、 起動に少々時間が掛かる (数十秒) ARM ベアメタルアプリ ケーションで実装 ARM ベアメタルアプリとして実装 HWLib 使えば実装も容易 か? FPGA 側から直接 AXI バスを通じて アクセス ↑ 構成からアップグレードで きる FPGA 側から直接アク セスして初期化 FPGA 側から直接 AXI バスを通じて アクセス 参考にできそうなコードが無 く大変かも知れない (多分) 低 高
  11. 考えられるアプローチ 作業1 MAC の初期化 作業2 EMAC <-> FPGA 間 パケット転送

    特徴 性能 Linux のネットワークド ライバに任せる Linux 上のプログラムとして実装 (libpcap 等使用?) 実装が簡便、 起動に少々時間が掛かる (数十秒) ARM ベアメタルアプリ ケーションで実装 ARM ベアメタルアプリとして実装 HWLib 使えば実装も容易 か? FPGA 側から直接 AXI バスを通じて アクセス ↑ 構成からアップグレードで きる FPGA 側から直接アク セスして初期化 FPGA 側から直接 AXI バスを通じて アクセス 参考にできそうなコードが無 く大変かも知れない (多分) 低 高
  12. 早速スタート マクニカ社の ”SoC FPGA ベアメタル All-in-One アプリケーション・サンプル” ( https://www.macnica.co.jp/business/semiconductor/articles/intel/131910/ )

    を動かしてみる ARM DS-5 デバッガ(有償ライセンス)を使用して  ・ARM コアへの命令ロード&起動  ・デバッグコンソールの使用  ・ブレークポイントの設定 等を行う方法が解説されているが、 実機の UART シリアルコンソールが開通している DE10-Nano なら、 デバッガ無し& printf デバッグ前提で無償環境のみで開発可能
  13. 実機 + printf デバッグで開発していくために SoC はじめてガイド - DS-5 によるベアメタル・アプリケーション・デバッグ (

    https://www.macnica.co.jp/business/semiconductor/articles/intel/118693/ ) の 8 章 “ベアメタル・アプリケーションを SD カードからスタンドアローン実行する例 ” を参考に、ベアメタルアプリケーションバイナリを生成し、 FAT パーティションに配置 ブートシーケンスは @ikwzm さん “FPGA+SoC+Linuxのブートシーケンス” ( https://qiita.com/ikwzm/items/c22d15803ed98f0e52ab ) を参考にセットアップ BootROM (ハードコード) u-boot-spl (preloader-mkpimage.bin) 2nd stage プリローダ u-boot 1.FPGA 部を   コンフィグレーション 2.自作アプリを起動する 自作アプリの バイナリ
  14. いざイーサネット サンプルを使ってボタン押下 -> LED 点灯等の GPIO ペリフェラルの動作を確認 【大まかな手順】 GPIO ペリフェラルを

    qsys 上で接続してアドレスを割り当て、 ARM ベアメタルプログラムから該当ペリフェラルの HWLib ヘッダファイルを ロードして、API を叩けば OK   → いざイーサネットの HWLib をロードして・・・
  15. フォーラムにもこんな投稿が・・ Q. HWLib に Ethernet 関連らしき関数が   無いのだけど。 A. なさそう。

      Altera さんが整備してくれることに期待。 A. Xilinx 環境にはあるのに!!!!! orz https://forums.intel.com/s/question/0D50P00003yySHOSA2 /altera-emac-hwlib-for-cyclone-v-soc?language=en_US Q. u-boot から移植しようと頑張ってるんだけど   色々詰まっている。 A. cv_5v4.pdf をちゃんと読み込むことだね。   俺はできた。君も頑張れ! https://forums.intel.com/s/question/0D50P00003yyQrYS AU/hps-baremetal-emac-driver?language=en_US その後3年音沙汰無し・・・ (※意訳)
  16. 性能測定してみる FPGA 部にループバックのコードを書いて試験 ※ ARP 応答しないと ping 等が送れず面倒なので、i++ 高位合成で ARP

    応答コードを作成 RJ45 コネクタ Micrel Ether PHY チップ ARM コア 試験機PC (ostinato) DDR3 メモリ ARPパケット 抽出分離 出力合流器 ARPパケット 応答生成器 IPv4パケットは全て跳ね返す ARP リクエストには応答を返す ARM HPS 部 FPGA 部 ボード上デバイス
  17. 原因 EMAC <-> HPS 間 : DMA 有効なので、速い       (※ EMAC ペリフェラルに

    DMA コントローラが内蔵されている) HPS <-> FPGA 間 : IOWR / IORD レジスタアクセス(32bit)で逐次処理            されているため、遅い   → mSGDMA(modular Scatter-Gather DMA)等を FPGA 側に付けて、     FPGA 側に SDRAM とのデータ転送作業を押し付ければ解決
  18. その前に ARM ベアメタルアプリ自体のポテンシャルを見てみることに RJ45 コネクタ Micrel Ether PHY チップ 試験機PC

    (ostinato) DDR3 メモリ ARM HPS 部 ARM コア HPS 内で 全パケットを折り返す ボード上デバイス
  19. 考察 DMA 有効下で 1 ポート上り下り計 200Mbps 程度   → 2 ポート間の中継の場合、     100

    Mbps 程度まで落ちる可能性も   → 一旦 SDRAM を経由せずダイレクトに FPGA に転送     できればさらに高速化可能か
  20. 考えられるアプローチ 作業1 MAC の初期化 作業2 EMAC <-> FPGA 間 パケット転送

    特徴 性能 Linux のネットワークド ライバに任せる Linux 上のプログラムとして実装 (libpcap 等使用?) 実装が簡便、 起動に少々時間が掛かる (数十秒) ARM ベアメタルアプリ ケーションで実装 ARM ベアメタルアプリとして実装 HWLib 使えば実装も容易 か? FPGA 側から直接 AXI バスを通じて アクセス ↑ 構成からアップグレードで きる FPGA 側から直接アク セスして初期化 FPGA 側から直接 AXI バスを通じて アクセス 参考にできそうなコードが無 く大変かも知れない (多分) 低 高
  21. 考えられるアプローチ 作業1 MAC の初期化 作業2 EMAC <-> FPGA 間 パケット転送

    特徴 性能 Linux のネットワークド ライバに任せる Linux 上のプログラムとして実装 (libpcap 等使用?) 実装が簡便、 起動に少々時間が掛かる (数十秒) ARM ベアメタルアプリ ケーションで実装 ARM ベアメタルアプリとして実装 HWLib 使えば実装も容易 か? FPGA 側から直接 AXI バスを通じて アクセス ↑ 構成からアップグレードで きる FPGA 側から直接アク セスして初期化 FPGA 側から直接 AXI バスを通じて アクセス 参考にできそうなコードが無 く大変かも知れない (多分) 低 高 今後の課題としました (汎用性も低いので・・)