Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Cyclone V SoC の Ether MAC をベアメタルアプリから使ってみた話 / U...
Search
homelith
November 09, 2019
Programming
1.7k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Cyclone V SoC の Ether MAC をベアメタルアプリから使ってみた話 / Using EMAC peripherals on HPS bare metal apps for Cyclone V SoC
homelith
November 09, 2019
Other Decks in Programming
See All in Programming
そのリトライ、死んだコネクションを使い回していませんか ── GoのHTTPクライアントとHTTP/2を実プロダクト障害から学び直す
myus4a
0
220
WebRTC映像をAirPlayに対応させる挑戦.pdf
monolithic_adam
0
290
標準パッケージに uuid が追加された 背景から見る Go らしい意思決定 / go_127_uuid_decision
convto
5
8.1k
wkhtmltopdfの次どうするか問題2026
willnet
2
1.6k
Are APIs Still Relevant in the AI Era?
soyuka
0
290
Security issues being discussed on Web Platforms
petamoriken
0
1.1k
App Storeの外へ──日本のiOSサイドローディング入門 for iOSDC Japan 2026
yuukiw00w
0
230
AI × TiDD / 2026.09.05 Redmine 大阪
tokudiro
1
180
UPDATE をやめる — EF Core でマスタをバージョン管理する
panda728
PRO
0
340
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
260
Workers Cache を知る
syumai
0
180
IBM Bob Dojo #1 仕様駆動開発入門
oniak3ibm
PRO
0
110
Featured
See All Featured
The Pragmatic Product Professional
lauravandoore
37
7.4k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.7k
We Have a Design System, Now What?
morganepeng
55
8.3k
The Language of Interfaces
destraynor
162
27k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
Test your architecture with Archunit
thirion
2
2.4k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Design in an AI World
tapps
1
330
Color Theory Basics | Prateek | Gurzu
gurzu
1
470
GitHub's CSS Performance
jonrohan
1033
470k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
18k
KATA
mclloyd
PRO
35
15k
Transcript
Cyclone V SoC の Ether MAC を ベアメタルアプリから使ってみた話 @homelith 2019/11/09
RTLを語る会(16) Using EMAC peripherals on HPS bare metal apps for Cyclone V SoC
本日のお話 ARM コア CPU と FPGA が一緒になった SoC FPGA を触り始めました
ARM コア用に用意されたハードマクロのペリフェラル群 (Ethernet / SDCard / USB ...)を使い倒すために 頑張ろうとした話です
導入 Terasic DE10-Nano ・SoC FPGA 搭載品で 比較的安価&入手性高い ・SD Card にイメージを焼いて
差し込むと Linux 起動とお手軽 FPGA 部のみを使って PID 制御で GPS 同期周波数源 (GPSDO) を作ったりしました “GPSと仲良くなってNTPサーバを作ろう” (第二版出ました) https://chofutech.booth.pm/items/1310612
イーサネットが使いたい RJ45 コネクタがついている Linux を起動すると eth0 として見える 1. FPGA 部から直接アクセスして使えな
いか? 2. ギガビットイーサなので、 なるたけ高速に使いたい!
説明書を見ないでGO! DE10_NANO_SoC_GHRD.v の構造 (CPU 利用時のデザインテンプレート) クロックとか トップモジュール Ethernet RGMII PHY
接 続ピン hps_io (CPU 部の ポート定義) クロックとか トップモジュール Ethernet RGMII PHY 接 続ピン hps_io 自作 ネットワーク処 理 安直に考えた構造
ダメでした クロックとか トップモジュール 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
cv_5v4.pdf (Cyclone V Hard Processor System Technical Reference Manual) のブロック図
説明書を読む Ethernet MAC HPS 本体 メイン AXI インターコネクト FPGA 部 とのブリッジ
Connectivity Matrix (8章 System Interconnect) を見る限り、 FPGA to HPS Bridge
から Ether MAC まで のアクセス経路はありそう FPGA -> EMAC 直接 アクセス可能か? ※ FPGA 部とのブリッジは HPS 側 からの開通が必要なので、最低限 開通用のプログラムを書き込む必 要がある
Ethernet MAC peripheral は port 0 : 0xFF700000 port 1
: 0xFF702000 にマッピングされており、 FPGA-to-HPS bridge から見 える模様 (右図 Peripherals and L3 GPV 領域) FPGA -> EMAC 直接 アクセス可能か?
考えられるアプローチ 作業1 MAC の初期化 作業2 EMAC <-> FPGA 間 パケット転送
特徴 性能 Linux のネットワークド ライバに任せる Linux 上のプログラムとして実装 (libpcap 等使用?) 実装が簡便、 起動に少々時間が掛かる (数十秒) ARM ベアメタルアプリ ケーションで実装 ARM ベアメタルアプリとして実装 HWLib 使えば実装も容易 か? FPGA 側から直接 AXI バスを通じて アクセス ↑ 構成からアップグレードで きる FPGA 側から直接アク セスして初期化 FPGA 側から直接 AXI バスを通じて アクセス 参考にできそうなコードが無 く大変かも知れない (多分) 低 高
考えられるアプローチ 作業1 MAC の初期化 作業2 EMAC <-> FPGA 間 パケット転送
特徴 性能 Linux のネットワークド ライバに任せる Linux 上のプログラムとして実装 (libpcap 等使用?) 実装が簡便、 起動に少々時間が掛かる (数十秒) ARM ベアメタルアプリ ケーションで実装 ARM ベアメタルアプリとして実装 HWLib 使えば実装も容易 か? FPGA 側から直接 AXI バスを通じて アクセス ↑ 構成からアップグレードで きる FPGA 側から直接アク セスして初期化 FPGA 側から直接 AXI バスを通じて アクセス 参考にできそうなコードが無 く大変かも知れない (多分) 低 高
Linux を起動して性能にアタリを付ける sftp (暗号化負荷、ディスク書き込み)込みで 80Mbps 程度
もうちょっと欲しい 1ポート上り下り計 80Mbps → 2ポート間の中継では 40Mbps 程度となる可能性あり もう少し高速化したい
考えられるアプローチ 作業1 MAC の初期化 作業2 EMAC <-> FPGA 間 パケット転送
特徴 性能 Linux のネットワークド ライバに任せる Linux 上のプログラムとして実装 (libpcap 等使用?) 実装が簡便、 起動に少々時間が掛かる (数十秒) ARM ベアメタルアプリ ケーションで実装 ARM ベアメタルアプリとして実装 HWLib 使えば実装も容易 か? FPGA 側から直接 AXI バスを通じて アクセス ↑ 構成からアップグレードで きる FPGA 側から直接アク セスして初期化 FPGA 側から直接 AXI バスを通じて アクセス 参考にできそうなコードが無 く大変かも知れない (多分) 低 高
早速スタート マクニカ社の ”SoC FPGA ベアメタル All-in-One アプリケーション・サンプル” ( https://www.macnica.co.jp/business/semiconductor/articles/intel/131910/ )
を動かしてみる ARM DS-5 デバッガ(有償ライセンス)を使用して ・ARM コアへの命令ロード&起動 ・デバッグコンソールの使用 ・ブレークポイントの設定 等を行う方法が解説されているが、 実機の UART シリアルコンソールが開通している DE10-Nano なら、 デバッガ無し& printf デバッグ前提で無償環境のみで開発可能
実機 + 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.自作アプリを起動する 自作アプリの バイナリ
いざイーサネット サンプルを使ってボタン押下 -> LED 点灯等の GPIO ペリフェラルの動作を確認 【大まかな手順】 GPIO ペリフェラルを
qsys 上で接続してアドレスを割り当て、 ARM ベアメタルプログラムから該当ペリフェラルの HWLib ヘッダファイルを ロードして、API を叩けば OK → いざイーサネットの HWLib をロードして・・・
None
イーサネットは未対応 ※本当にこの時点まで気づきませんでした・・
フォーラムにもこんな投稿が・・ 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年音沙汰無し・・・ (※意訳)
仕方ないので u-boot/drivers/net/designware.c u-boot/drivers/net/dwmac_socfpga.c u-boot/drivers/net/phy/micrel_ksz90x1.c あたりを見ながら、レジスタアクセスを IOWR / IORD 等のプリミティブな関数で 置き換えて、頑張って移植
動いた レイテンシも 1 ミリ秒以下と優秀? ※ FPGA 部で折り返した時の ping パケット
性能測定してみる FPGA 部にループバックのコードを書いて試験 ※ ARP 応答しないと ping 等が送れず面倒なので、i++ 高位合成で ARP
応答コードを作成 RJ45 コネクタ Micrel Ether PHY チップ ARM コア 試験機PC (ostinato) DDR3 メモリ ARPパケット 抽出分離 出力合流器 ARPパケット 応答生成器 IPv4パケットは全て跳ね返す ARP リクエストには応答を返す ARM HPS 部 FPGA 部 ボード上デバイス
測定結果 102 bytes Ping Echo Request パケットで 6kpps / 4.4Mbps
測定結果 1518 bytes までパディングしたパケットで 445pps / 5.3Mbps
遅い・・
原因 EMAC <-> HPS 間 : DMA 有効なので、速い (※ EMAC ペリフェラルに
DMA コントローラが内蔵されている) HPS <-> FPGA 間 : IOWR / IORD レジスタアクセス(32bit)で逐次処理 されているため、遅い → mSGDMA(modular Scatter-Gather DMA)等を FPGA 側に付けて、 FPGA 側に SDRAM とのデータ転送作業を押し付ければ解決
その前に ARM ベアメタルアプリ自体のポテンシャルを見てみることに RJ45 コネクタ Micrel Ether PHY チップ 試験機PC
(ostinato) DDR3 メモリ ARM HPS 部 ARM コア HPS 内で 全パケットを折り返す ボード上デバイス
測定結果(HPS のみ) 102 bytes Ping Echo Request パケットで 82kpps /
69.8Mbps
測定結果(HPS のみ) 1518 bytes までパディングしたパケットで 17kpps / 208Mbps
考察 DMA 有効下で 1 ポート上り下り計 200Mbps 程度 → 2 ポート間の中継の場合、 100
Mbps 程度まで落ちる可能性も → 一旦 SDRAM を経由せずダイレクトに FPGA に転送 できればさらに高速化可能か
考えられるアプローチ 作業1 MAC の初期化 作業2 EMAC <-> FPGA 間 パケット転送
特徴 性能 Linux のネットワークド ライバに任せる Linux 上のプログラムとして実装 (libpcap 等使用?) 実装が簡便、 起動に少々時間が掛かる (数十秒) ARM ベアメタルアプリ ケーションで実装 ARM ベアメタルアプリとして実装 HWLib 使えば実装も容易 か? FPGA 側から直接 AXI バスを通じて アクセス ↑ 構成からアップグレードで きる FPGA 側から直接アク セスして初期化 FPGA 側から直接 AXI バスを通じて アクセス 参考にできそうなコードが無 く大変かも知れない (多分) 低 高
考えられるアプローチ 作業1 MAC の初期化 作業2 EMAC <-> FPGA 間 パケット転送
特徴 性能 Linux のネットワークド ライバに任せる Linux 上のプログラムとして実装 (libpcap 等使用?) 実装が簡便、 起動に少々時間が掛かる (数十秒) ARM ベアメタルアプリ ケーションで実装 ARM ベアメタルアプリとして実装 HWLib 使えば実装も容易 か? FPGA 側から直接 AXI バスを通じて アクセス ↑ 構成からアップグレードで きる FPGA 側から直接アク セスして初期化 FPGA 側から直接 AXI バスを通じて アクセス 参考にできそうなコードが無 く大変かも知れない (多分) 低 高 今後の課題としました (汎用性も低いので・・)
まとめ ・DE10-Nano イーサネットポートに FPGA 部から直接アクセスす るための ARM ベアメタルアプリを作りました ・100Mbps 程度まで出そうですが、まだまだ要改善です
・EMAC アクセス用のライブラリが出来たので、 他にも色々使って遊べそうです