SoC FPGAは、ArmなどのプロセッサとFPGAのプログラマブルロジックを1つのチップに統合した半導体デバイスです。AMDのZynqでは、プロセッサ側をPS(Processing System)、ロジック側をPL(Programmable Logic)と呼び分けます。この記事では、PSとPLが内部のAXIバスでどうつながるかを押さえたうえで、ポートの使い分け、LinuxからPLのレジスタを読み書きするデバイスツリーとCコード、ハードとソフトを並行して作る進め方までを扱います。なお、ここでのSoCはSystem on Chipの略で、セキュリティ監視の運用組織を指すSOC(Security Operation Center)とは別物です。後者はセキュリティ運用のSOCを解説した記事で扱っています。
まとめ|Linuxと回路を1チップで組みPSとPLの境界はレジスタマップで先に決める
SoC FPGAを選ぶのは、Linuxで通信や画面を動かしながら、マイクロ秒単位の制御や並列処理を回路で受け持たせたい案件です。外付けのCPUと単体FPGAを基板でつなぐ構成に比べ、チップ間の配線と部品が減り、PSとPLは内部のAXIで直接やり取りできます。
設計の要は、PSとPLの境界の引き方です。少量のレジスタ操作は汎用ポート、大量のデータはDMAと高性能ポート、キャッシュとの整合が要る転送は一貫性ポート、と経路を分けます。境界はレジスタマップとして文書にし、ハード担当とソフト担当が同じ表を見て並行で作り始めます。
逆に、PLで受け持つ処理が無い、あるいはマイコン1個で周期が間に合う案件では採用しません。回路とLinuxの両方を保守する体制の費用が、部品点数の削減を上回るからです。
SoC FPGAの構成|プロセッサ部PSとロジック部PLを内部バスでつなぐ1チップの中身
SoC FPGAの中には、CPUコアとメモリコントローラ、USBやEthernetなどの周辺回路を固めたハードの領域と、利用者が回路を書き込むFPGAの領域が同居しています。FPGAの領域そのものの仕組みはFPGAがLUTと配線で回路を組む仕組みを解説した記事に譲り、ここでは両者の組み合わせ方を見ます。
PSとPLの呼び分け|主要ベンダーの製品系統とプロセッサ構成の比較
呼び方はベンダーごとに違います。AMDはPSとPL、Alteraはプロセッサ側をHPS(Hard Processor System)と呼び、ロジック側はFPGAファブリックと呼びます。主な製品系統は次のとおりです。
| 系統 | ベンダー | プロセッサ側の構成 | プロセッサ側の呼び名 |
|---|---|---|---|
| Zynq 7000 | AMD | Arm Cortex-A9(2コア) | PS |
| Zynq UltraScale+ MPSoC | AMD | Cortex-A53系+R5F系 | PS |
| Cyclone V/Agilex 5 | Altera | A9/A76とA55(詳細は後述) | HPS |
| PolarFire SoC | Microchip | RISC-Vの5コア | MSS |
Zynq UltraScale+ MPSoCの構成はArm Cortex-A53系+Cortex-R5F系です。Alteraの2系統はCyclone V SoC・Agilex 5 SoCで、構成はArm Cortex-A9(Cyclone V)、Cortex-A76とA55の混成(Agilex 5)という対応になります。PolarFire SoCとともに、製品系統ごとの違いを表に示しました。
Zynq 7000のPSが2コアのCortex-A9であることは、AMDの電力見積りガイドUG440のZynq 7000の節に書かれています。ArmとRISC-Vのどちらを選ぶかは、使いたいLinuxディストリビューションと既存のソフト資産で決まる場合が大半です。ベンダーごとの製品レンジと供給条件はFPGAメーカー4社の製品レンジと開発ツールを比べた記事にまとめました。
外付けCPUと単体FPGAの2チップ構成と比べて変わる3つの点
同じ機能は、CPUと単体FPGAを基板上で配線しても作れます。1チップにすると変わる点は、1つ目が転送経路で、基板の配線やPCIeを経由せずにチップ内のAXIで直接つながります。2つ目は部品点数と基板面積で、電源とメモリの系統をまとめられる点です。3つ目は起動の仕方で、PSが先に立ち上がり、ブートローダーやLinuxからPLの回路を書き込む順序になります。
この3点目は見落とされがちです。PLの回路が無い状態でもLinuxは起動できるため、回路を入れ替えながらソフトを開発でき、製品出荷後に回路だけを更新する設計も組めます。
PSとPLをつなぐAXIポートの使い分け|汎用・高性能・一貫性ポートの選び方
PSとPLの間の設計で最初に決めるのは、どの処理をどのポートに通すかです。ここを誤ると、回路が正しくても転送が遅い、あるいはデータが古いという不具合になります。
Zynq 7000の9本のAXI|GPはレジスタ操作・HPはDMA転送・ACPは整合
UG440によると、Zynq 7000のPSとPLの間には9本のAXIがあります。内訳は、キャッシュと整合するACPが1本、PL側がマスターになる高性能なHPが4本、汎用のGPが4本(マスター2本・スレーブ2本)です。PS側はAXI3の仕様に基づいています。
使い分けの基本は、PYNQのPS/PLインタフェースの解説が示すとおりです。PSから見てスレーブになるGPポートにつないだIPはメモリマップに載り、少量の読み書きを行うMMIOに向きます。バーストに対応しないため、画像のような大きなデータには使いません。大量のデータはPLのDMAからHPポート経由でDDRメモリへ流します。
Zynq UltraScale+のHP・HPC・ACP・ACE|キャッシュ整合の選択
Zynq UltraScale+ MPSoCでは、ポートの種類が増えました。PSの製品ガイドPG201(v3.5)のスレーブインタフェースの節によると、PLがマスターになるポートは次の5系統です。
| ポート | キャッシュとの関係 | 向く使い方 |
|---|---|---|
| S_AXI_HP0〜3_FPD | 非コヒーレント | DDRへの大量転送 |
| S_AXI_HPC0・1_FPD | CCIとI/Oコヒーレント(L2割り当てなし) | キャッシュ操作を省きたいDMA |
| S_AXI_ACP_FPD | L2割り当てありのI/Oコヒーレント | CPUと小さなデータを密に共有 |
| S_AXI_ACE_FPD | 双方向コヒーレント | PL側にキャッシュを持つ設計 |
| S_AXI_LPD | 非コヒーレント | 低電力ドメインの周辺回路への経路 |
HP系のポートは32・64・128ビットのデータ幅に対応します。実務ではまずHPとHPCの2つを押さえれば足ります。ACEはPL側にキャッシュを実装する場合だけの選択肢で、通常の案件では使いません。
キャッシュ整合の失敗パターン|非コヒーレントなHPでDMAした古いデータ
よくある不具合は、PLのDMAがHPポートでDDRに書いたデータを、CPUが自分のキャッシュに残った古い値のまま読んでしまうものです。回路のシミュレーションでは再現せず、実機で「ときどき前のフレームが混ざる」という症状で表れます。
対処は2通りです。HPを使う場合は、Linuxのドライバで転送の前後にキャッシュの書き戻しと無効化を行う、つまりDMA用のAPIでバッファを確保して同期させます。キャッシュ操作をソフトに任せたくなければ、Zynq UltraScale+ではHPCポートに切り替えます。どちらにするかは、ポートを決める段階でハード担当とソフト担当が合意しておく事項です。
LinuxからPLの回路を動かす手順|デバイスツリーとUIOでレジスタを読み書きする
ここからは、Zynq 7000でPLに置いたAMDのAXI GPIOを、Linuxのユーザー空間から操作する最小の例を示します。専用のカーネルドライバを書かずに、UIO(Userspace I/O)の汎用ドライバでレジスタをmmapする方法です。
Vivado側の準備|AXI GPIOをGPポートにつなぎアドレスを割り当てる
VivadoのブロックデザインでPSを置き、AXI GPIOのIPをM_AXI_GP0の先に接続します。アドレスエディタで割り当てたベースアドレス(ここでは例として0x41200000、範囲64KB)を控え、割り込みを使う場合はAXI GPIOの割り込み出力をPSのIRQ_F2Pにつなぎます。AXI GPIOのレジスタ配置は製品ガイドPG144(v2.0)のレジスタ空間の節にあり、チャネル1のデータがオフセット0x0000、入出力方向の設定(GPIO_TRI)が0x0004です。
デバイスツリーにUIOのノードを足しカーネルの起動引数で結び付ける
/ {
chosen {
bootargs = "console=ttyPS0,115200 root=/dev/mmcblk0p2 rw rootwait uio_pdrv_genirq.of_id=generic-uio";
};
};
&amba_pl {
led_gpio: gpio@41200000 {
compatible = "generic-uio";
linux,uio-name = "led_gpio";
reg = <0x41200000 0x10000>;
interrupt-parent = <&intc>;
interrupts = <0 29 4>; /* IRQ_F2P[0](SPI 61)、レベル検出 */
};
};
汎用ドライバのuio_pdrv_genirqは、モジュールパラメータof_idに書いた文字列と同じcompatibleを持つノードを受け持ちます。この仕組みとlinux,uio-nameでデバイス名を付けられる点は、Linuxカーネルの「Userspace I/O HOWTO」に記載された仕様です。ツールが生成したPL用のデバイスツリーに同じノードがある場合は、そのノードのcompatibleだけを上書きします。
ユーザー空間のCプログラムでmmapしLEDを順に点灯させる
// uio_led.c:/dev/uio0 を mmap して AXI GPIO を操作する
#include <fcntl.h>
#include <stdint.h>
#include <stdio.h>
#include <sys/mman.h>
#include <unistd.h>
#define GPIO_DATA 0x0000
#define GPIO_TRI 0x0004
int main(void) {
unsigned long size = 0;
FILE *f = fopen("/sys/class/uio/uio0/maps/map0/size", "r");
if (!f || fscanf(f, "%lx", &size) != 1) { perror("size"); return 1; }
fclose(f);
int fd = open("/dev/uio0", O_RDWR | O_SYNC);
if (fd < 0) { perror("open"); return 1; }
// map0 を使うのでオフセットは 0 × ページサイズ
volatile uint32_t *gpio = mmap(NULL, size, PROT_READ | PROT_WRITE,
MAP_SHARED, fd, 0 * getpagesize());
if (gpio == MAP_FAILED) { perror("mmap"); return 1; }
gpio[GPIO_TRI / 4] = 0x0; // 全ビットを出力にする
for (int i = 0; i < 8; i++) {
gpio[GPIO_DATA / 4] = 1u << i; // LEDを1つずつ点灯
usleep(200000);
}
printf("GPIO_DATA=0x%08x\n", gpio[GPIO_DATA / 4]);
munmap((void *)gpio, size);
close(fd);
return 0;
}
# クロスコンパイル用SDKの環境を読み込んだ端末で
$CC -O2 -o uio_led uio_led.c
# 実機で
ls /sys/class/uio/uio0/maps/map0/ # addr と size が見えればノードは有効
./uio_led
UIO HOWTOによると、N番目のマッピングはmmapのオフセットに「N×ページサイズ」を渡して選び、各マッピングの物理アドレスと大きさは/sys/class/uio/uioX/maps/mapY/のaddrとsizeで読めます。物理アドレスを直に書く/dev/memと違い、デバイスツリーに書いた範囲の外へは触れません。試作の段階ではこの方式で回路の動作を確かめ、量産に向けて割り込みやDMAの扱いが増えた段階でカーネルドライバへ移すのが手堅い順序です。
割り込みを待つ|4バイトのreadで受けて1の書き込みで再び有効にする
uint32_t on = 1, count;
gpio[0x128 / 4] = 0x1; // IP IER:チャネル1の割り込みを許可
gpio[0x11C / 4] = 0x80000000; // GIER:全体の割り込みを許可
for (;;) {
write(fd, &on, sizeof on); // 割り込み線を再び有効にする
read(fd, &count, sizeof count); // 割り込みまでブロック。値は累計回数
gpio[0x120 / 4] = 0x1; // IP ISR:1を書いて要因を解除
printf("irq count=%u\n", count);
}
UIO HOWTOでは、/dev/uioXへのreadは4バイト単位で、戻り値は割り込みの累計回数です。前回の値から2以上増えていれば、取りこぼしがあったと判断できます。uio_pdrv_genirqは割り込みのたびに線を無効にするため、0x00000001を書き込んで有効に戻します。AXI GPIO側の許可とクリアのレジスタは、PG144のレジスタ表にあるとおりGIERが0x011C、IP ISRが0x0120、IP IERが0x0128です。
PL書き込みとLinux構築|FPGA ManagerとEDFへの移行
この章では、FPGA ManagerによるPLの書き込みと、Linuxイメージの作り方、PetaLinuxからEDFへの移行を扱います。回路とソフトの両方を1つの製品として届けるには、PLへの書き込み方法とLinuxのイメージを作る道具を決めておく必要があります。
Linux起動後の回路更新|FPGA Manager・Bridge・Region
LinuxにはFPGAを起動後に書き換えるための枠組みがあります。カーネルのFPGAサブシステムの解説によると、FPGA Managerがデバイスごとの書き込み方法を持ち、FPGA Bridgeが書き込み中にPLから余計な信号が出ないよう経路を切り離し、FPGA Regionが両者を束ねて全体または部分再構成の領域を表します。デバイスツリーのオーバーレイを適用すると、それに合わせて回路が書き込まれ、新しいデバイスが認識される流れです。
この仕組みを使えば、用途ごとに回路を差し替える製品や、出荷後に回路だけを更新する運用が組めます。書き込み中はブリッジが閉じるため、PLのレジスタを読んでいるアプリケーションを先に止める手順を運用に組み込みます。
AMDはPetaLinuxからYocto系のEDFへ|新規案件はEDFで始める
AMDのSoC FPGAでLinuxのイメージを作る道具は、切り替わりの途中です。Zynq UltraScale+のソフトウェア開発ガイドUG1137(2026.1版・2026年7月22日)は、Yocto Projectを基盤とするEDF(Embedded Development Framework)がPetaLinuxツールを置き換えると明記しています。PetaLinuxの製品ページも、EDFがVivado 2025.1で初めて提供され、PetaLinuxは提供終了に向かうと案内しています。
新規案件か既存製品かが、移行時期を判断する基準です。2026年10月時点で新しく始める案件はEDFで組み、PetaLinuxで作った既存製品は次の版上げの機会に移行を計画します。手順はEDFのドキュメントサイトの移行ガイドにまとまっています。
ハードとソフトの協調開発の進め方|PLに載せる処理の線引きと並行開発の段取り
SoC FPGAの案件が遅れる原因の多くは、回路の難しさよりも、ハードとソフトの間の取り決めの遅れです。
PLに載せる処理を決める3つの判断基準|周期・並列度・専用I/O
処理をPLに置くかPSのソフトで書くかは、次の3つで決めます。1つ目は周期で、マイクロ秒単位で揺らぎなく応答する必要があるモーター制御やセンサー取り込みはPLに置きます。2つ目は並列度で、画素ごと・チャネルごとに同じ演算を同時に回す処理ではPLのほうが高速です。3つ目は専用のI/Oで、独自の通信規格やカメラの生データの受信はPLでしか受けられない場合があります。
どれにも当たらない処理はPSのソフトで書きます。PLに置く処理を増やすほど、回路の検証とタイミング詰めの工数が膨らむためです。推論処理をPLに載せるかどうかの判断はFPGAで推論を回す実装とGPUとの使い分けを扱った記事、C++から回路を作る選択肢は高位合成の仕組みと手書きHDLとの使い分けを扱った記事を参照してください。
レジスタマップを設計初期に固めハードとソフトを並行で作る段取り
並行開発の起点は、PLの回路ごとのベースアドレス、レジスタのオフセットとビットの意味、割り込みの番号をまとめたレジスタマップです。これを設計の初期に固めてソフト担当へ渡せば、ソフト側は先に示したUIOのコードと同じ形でアクセス層を書き始められます。回路が出来上がる前は、同じレジスタ構成を持つ模擬の関数でアプリケーションを試験します。
結合試験では、回路の版番号を読めるレジスタを1つ用意しておくと、ビットストリームとソフトの組み合わせの取り違えをすぐに見つけられます。工程全体の期間と体制の見積り方はFPGA設計の7工程と期間の見積り方を扱った記事、PS側でLinuxとリアルタイムOSのどちらを使うかは組み込みOSの3分類と選定判断を整理した記事で整理しています。
SoC FPGAを採用する条件と見送る場面|単体FPGAやマイコンとの分かれ目
最後に、SoC FPGAを選ぶかどうかの判断を条件で示します。
採用する条件|Linuxの機能と回路のリアルタイム処理を同時に要する案件
次の2つを両方満たすなら、SoC FPGAを第一候補にします。1つはLinuxが必要なことで、Ethernetでの通信、Webの管理画面、ファイルシステム、既存のLinux向けライブラリを使いたい場合です。もう1つは、先に挙げた周期・並列度・専用I/Oのいずれかに当たる処理があることです。典型例には、産業機器のコントローラ、画像検査装置、計測器が挙げられます。CPUとFPGAの間で大量のデータをやり取りする構成なら、チップ内のAXIで済む利点がさらに大きくなります。
見送る場面|マイコンで周期が間に合う・PLの処理が無い・保守要員がいない
反対に、制御周期がミリ秒単位でマイコンの割り込みで間に合う案件は、SoC FPGAを使いません。判断の軸はFPGAとマイコンを同じ処理で書き比べた記事にまとめました。PLに載せる処理が見当たらず、Linuxを動かしたいだけの案件も、汎用の組み込みプロセッサのほうが安く済みます。
もう1つの見送り条件は保守の体制です。SoC FPGAの製品は、回路・ブートローダー・Linuxの3つを長期に保守し続けることになります。社内にも委託先にも回路を読める人がいない場合、部品点数で得をしても保守で損をします。デバイスと開発ツールを含めた総額の見方はFPGAの総コストの内訳を扱った記事を参照してください。
ハード担当とソフト担当を1つのチームに置く体制と外部への相談先
体制の要は、回路の担当とLinuxの担当を別の会社や部署に分けず、レジスタマップを共同で持つ1つのチームにすることです。最低でも、PLの回路とタイミングを見る担当、デバイスツリーとドライバを書く担当、アプリケーションを書く担当の3役が必要です。小さな案件では1人が2役を兼ねても構いませんが、デバイスツリーの担当を置かない体制は結合試験で必ず詰まります。センサーや機器の制御からクラウドへのデータ連携までを含めて相談したい場合は、一創のAI・IoTソリューションの開発支援で、PSとPLの切り分けから整理できます。
SoC FPGAでよくある質問|評価ボード・OS・開発言語・ASICとの違い
SoC FPGAについて、検索されることの多い質問に答えます。
SoC FPGAとASICやスマートフォン向けSoCは何が違いますか?
ASICやスマートフォン向けのSoCは、製造時に回路が固定されたチップです。SoC FPGAは、プロセッサの部分は固定されていますが、PLの部分の回路を後から何度でも書き換えられます。そのため少量生産や仕様が変わりやすい装置に向き、同じ処理をASICで作った場合より消費電力と単価は大きくなります。数十万個規模の量産は、ASICが有利になる分岐点が出てくる領域です。
SoC FPGAではLinux以外のOSも動きますか?
動きます。選択肢は、OSを使わないベアメタルのプログラムや、FreeRTOSなどのリアルタイムOSです。Zynq UltraScale+のようにアプリケーション用とリアルタイム用のコアを別に持つ品種では、一方でLinux、もう一方でリアルタイムOSを動かす構成も組めます。Linuxが要らず、制御だけを確実に回したい場合はリアルタイムOSのほうが起動も速く、保守の対象も減ります。
SoC FPGAの開発にはどんな言語とツールが必要ですか?
PLの回路はVerilogやVHDLなどのHDL、またはC++からの高位合成で作り、PSのソフトはCやC++で書くのが一般的です。ツールはAMDならVivadoとVitis、Linuxのイメージ作りにEDF、AlteraならQuartus Primeを使います。HDLの選び方はFPGA開発言語の選び方を扱った記事で整理しています。
SoC FPGAを学ぶにはどの評価ボードから始めればよいですか?
最初は、PYNQやEDFの公式サポートに含まれる評価ボードから選ぶと、Linuxのイメージと回路の見本がそろっていて手戻りが少なくなります。Zynq 7000系の小型ボードなら価格を抑えて、PSとPLの接続とUIOでのレジスタ操作までを一通り試せます。製品に使うデバイスが決まっている場合は、同じ系統の評価ボードで試作を始めるのが近道です。
SoC FPGAとエッジAI向けのモジュールはどう使い分けますか?
推論だけが目的なら、GPUやNPUを積んだモジュールのほうが開発は早く済みます。SoC FPGAが勝るのは、推論の前後にカメラの生データの受信や独自の前処理、マイクロ秒単位の制御が入る装置です。推論の処理系をどこに置くかの考え方はエッジAIの仕組みと実装の判断基準を扱った記事にまとめています。
関連記事
- FPGAとは?LUTと配線で回路を組む仕組みとCPU・ASIC・CPLDとの違い:PLの中身であるFPGAの原理を扱う親記事です。
- FPGA設計の流れ|7工程の進め方とソフト開発との違い・期間と体制の見積り方:PLの回路を作る工程と工数の見積り方です。
- 高位合成(HLS)とは:C++からRTLを作る仕組みとpragmaの効き方・手書きHDLとの使い分け:ソフト技術者がPLの回路を作るときの選択肢です。
- FPGAメーカー比較|主要4社の製品レンジ・開発ツール・供給条件で選ぶ基準:SoC FPGAを含む各社の製品レンジの比較です。
- FPGAによるAI推論とは?量子化・推論IP実装とGPUとの使い分けを実装視点で解説【2026年版】:PLに推論処理を載せるときの実装です。