FPGAとマイコンの違い|同じ処理をCとVerilogで書き比べて分かる選定の5軸

FPGAとマイコンの違い|同じ処理をCとVerilogで書き比べて分かる選定の5軸

8本の入力ピンを見張り、立ち上がりを検出したら対応する出力を反転させる。この同じ処理を、マイコン(RP2040)のCコードとFPGA(iCE40 UltraPlus)のVerilogで書き比べると、FPGAとマイコンの違いがどこに出るかがはっきりします。違いは「並列か逐次か」という言葉の上の話ではなく、応答時間が保証されるかどうかです。この記事では、両方のコードと合成の手順を示したうえで、処理方式・応答時間・消費電力・単価・開発工数の5軸で公開仕様を並べた選定表を作り、FPGAへ進む前にマイコンのまま済ませる手段、FPGAを採用する条件と見送る場面までを扱います。FPGAの内部構造やCPLDとの境界はFPGAの仕組みとCPU・ASIC・CPLDとの違いを解説した記事に譲りました。

まとめ|まずマイコンで足りるかを確かめ・FPGAは応答の保証が要る箇所に限る

結論を先に置きます。新しい機器の方式を選ぶとき、最初の候補はマイコンです。C言語で書けて、ビルドは数秒、部品の選択肢も開発者も多い。内蔵のタイマー、DMA、RP2040のPIOのような周辺回路まで含めれば、独自の通信方式やマイクロ秒単位の波形生成もマイコンのまま実現できます。

FPGAに進むのは、入力の本数が増えても応答時間を一定に保つ必要があるとき、ナノ秒単位で決まった遅れしか許されないとき、そして仕様変更が続く少量の製品で回路そのものを書き換えたいときです。この条件に当てはまらないまま選ぶと、配置配線に数十分かかるビルドと、実装と同量以上の検証工数を背負うことになります。

両方の長所が要るなら、マイコンが全体を制御し、FPGAが高速な入出力だけを受け持つ分担にします。迷ったら、応答時間の要求を数値で書き出してください。それだけで答えの大半が決まります。

同じ処理をCとVerilogで書き比べる|8入力のエッジ検出で見る逐次と並列の差

比較に使うのは、8本の入力それぞれの立ち上がりを検出し、対応する出力LEDを反転させる処理です。小さな題材ですが、マイコンとFPGAの書き方の違いと、応答時間の違いがそのまま現れます。

マイコン側の実装|Pico SDKのGPIO一括読み出しで8入力を見張るCコード

マイコンはRP2040のデータシートにあるとおり、Cortex-M0+を2コア積み、最大133MHzで動く品種です。開発には公式のPico SDKを使います。GP0〜GP7を入力、GP8〜GP15を出力にした実装は次のとおりです。

// main.c
#include "pico/stdlib.h"

#define IN_MASK  0x000000FFu  // GP0〜GP7を入力
#define OUT_MASK 0x0000FF00u  // GP8〜GP15を出力

int main(void) {
    gpio_init_mask(IN_MASK | OUT_MASK);
    gpio_set_dir_out_masked(OUT_MASK);
    uint32_t prev = gpio_get_all() & IN_MASK;
    while (true) {
        uint32_t now  = gpio_get_all() & IN_MASK;
        uint32_t rise = now & ~prev;      // 立ち上がりだけを取り出す
        if (rise) {
            gpio_xor_mask(rise << 8);    // 対応する出力を反転
        }
        prev = now;
    }
}
# CMakeLists.txt(pico_sdk_import.cmake は SDK の external から複写する)
cmake_minimum_required(VERSION 3.13)
include(pico_sdk_import.cmake)
project(edge_toggle C CXX ASM)
pico_sdk_init()
add_executable(edge_toggle main.c)
target_link_libraries(edge_toggle pico_stdlib)
pico_add_extra_outputs(edge_toggle)

使っている関数は、SDKのhardware_gpioのヘッダで定義を確かめられます。gpio_init_maskは指定したピンを入力として初期化し、gpio_get_allは全GPIOの値を1回の読み出しでビット列として返します。入力ピンが開放のまま使う配線なら、プルダウンを設定してから動かしてください。

FPGA側の実装|3段の同期化とエッジ検出を並べたVerilogモジュール

同じ処理をVerilogで書くと、次のモジュールになります。外部から入る非同期の信号は、2段のフリップフロップで内部のクロックに揃えてから扱うのが定石です。

// edge_toggle.v
module edge_toggle #(
  parameter N = 8
) (
  input  wire         clk,
  input  wire [N-1:0] din,
  output reg  [N-1:0] led
);
  reg [N-1:0] s1, s2, s3;
  initial begin
    s1 = 0; s2 = 0; s3 = 0; led = 0;
  end
  // N本ぶんの同期化・エッジ検出・反転が、同じクロックで一斉に動く
  always @(posedge clk) begin
    s1  <= din;
    s2  <= s1;
    s3  <= s2;
    led <= led ^ (s2 & ~s3);
  end
endmodule

Cとの決定的な違いは、alwaysブロックの4行が上から順に実行されるのではなく、クロックの立ち上がりごとに同時に確定する点です。Nを8から64に変えても、使う回路が8倍になるだけで、1回の処理にかかるクロック数は変わりません。

オープンソースのツールで合成する|yosysとnextpnrでiCE40向けに通す手順

FPGAの開発ツールはベンダー製が主流ですが、Lattice iCE40系ならオープンソースだけで書き込みまで通せます。論理合成にyosys、配置配線にnextpnr、ビットストリームの生成と書き込みにProject IceStormのicepackとiceprogを使います。対象はiCE40 UltraPlusのUP5K(48ピンのSG48パッケージ)です。

# edge_toggle.pcf(クロックのピンだけ固定。ボードの回路図に合わせて書き換える)
set_io clk 35

# 論理合成から書き込みまで
yosys -p "synth_ice40 -top edge_toggle -json edge_toggle.json" edge_toggle.v
nextpnr-ice40 --up5k --package sg48 --json edge_toggle.json \
  --pcf edge_toggle.pcf --pcf-allow-unconstrained --freq 12 --asc edge_toggle.asc
icepack edge_toggle.asc edge_toggle.bin
iceprog edge_toggle.bin

--pcf-allow-unconstrainedは、ピンを固定していない入出力をツールに自動で割り当てさせる指定です。実機の基板では、入力8本と出力8本もすべてset_ioで固定してください。yosysのsynth_ice40の説明にあるとおり、合成ログには使ったLUTとフリップフロップの数が出ます。nextpnrのログには、指定した12MHzに対して到達できる最大周波数が出ます。

書き比べて分かる差|処理の並べ方ではなく応答時間が保証されるかどうか

見落とされやすい点があります。Cの版も、gpio_get_allで8本を1語として読み、ビット演算で8本を同時に処理しています。この題材に限れば、マイコンも「並列に」処理できているわけです。

差が出るのは応答時間の保証です。FPGA版は、入力が変わってから出力が反転するまで最大3クロック。12MHzで動かせば250ナノ秒で、他の処理を何本追加しても変わりません。マイコン版の応答時間はループ1周の長さで決まり、割り込みが入れば、その処理が終わるまでループが止まります。通信やログ出力を同じコアに足していくほど、最悪値が読めなくなります。

チャネルごとの処理が重くなる場合も分かれ目です。各入力で立ち上がりの時刻を記録する、パルス幅を数える、といった処理を足すと、マイコンではループの処理量がチャネル数に比例して増えます。FPGAで増えるのは回路の量で、応答時間は伸びません。

5軸の比較表|処理方式・応答時間・消費電力・単価・開発工数で並べる選定表

ここからは、比較の軸を5つに分けて具体値を並べます。軸ごとの重みは用途で変わるので、自社の要件で一番効く軸から読んでください。

5軸の比較表|RP2040とiCE40 UltraPlusの公開仕様で並べた具体値

表の数値は、RP2040のデータシートとLatticeの製品ページの公開値です(2026年10月時点)。単価は品種と数量で大きく動くため、方向だけを示しました。

軸 マイコン(RP2040) FPGA(iCE40 UP5K)
処理方式 Cortex-M0+×2が命令を順に実行 5,280個のLUTで組んだ回路が同時に動く
応答時間 ループ周期と割り込みで変動 クロック数で固定
消費電力 低消費電力モードを内蔵 静的電流75µA・動作時1〜10mA
単価 汎用品で安価な側 同じ機能なら高くなりやすい
開発工数 ビルド数秒・C言語 配置配線と検証で重い・HDL

表で見ると、マイコンが優位な軸が多く並びます。FPGAが明確に勝つのは応答時間の軸だけで、残りの軸は条件次第です。この偏りこそが、まずマイコンを検討すべき理由です。

応答時間の軸|割り込みとループ周期で揺れるマイコンと固定クロック数のFPGA

応答時間で問うべきは、平均ではなく最悪値です。マイコンの平均応答はクロック133MHzなら十分に速く、多くの制御用途では問題になりません。問題は、割り込み処理や通信処理が重なった瞬間に応答が伸び、その最悪値をコードから読み切るのが難しいことです。

判断の目安として、要求される応答時間がマイクロ秒より長く、多少の揺れを許せる用途ならマイコンで足ります。数百ナノ秒以下の決まった遅れを入力の本数に関係なく守らなければならない用途、たとえば複数のセンサーを同時刻で取り込む計測や、高速な通信規格の物理層に近い処理は、FPGAの領分です。

消費電力と単価の比較軸|待機電流の桁と量産単価で差が開く場面

FPGAは消費電力が大きいという印象がありますが、品種で桁が変わります。iCE40 UltraPlusは静的電流75µA、多くの用途で動作電流1〜10mAとLatticeが公表しており、電池駆動の常時監視にも使われる品種です。一方で、高速な入出力を多数持つ大規模品は、電源の設計から別物になります。

単価は、同じ機能を実現するならマイコンのほうが安く済むのが普通です。FPGAはデバイス単価に加えて、開発ツールのライセンス、IPコア、検証用の機材まで総額に乗ります。内訳と、量産数でASICへ切り替える分岐点の計算はFPGAの価格とコスト構造を整理した記事にまとめました。

開発工数の比較軸|ビルド時間と検証工数でFPGAが重くなる理由

工数の差は、言語の違いよりもビルドと検証で生まれます。マイコンのビルドは数秒で終わり、デバッガで変数を止めて見られます。FPGAは中規模の回路でも配置配線に数十分から数時間かかり、内部の信号は専用のロジックアナライザ機能を仕込まないと見えません。

そのため、FPGAではシミュレーションで品質を作り込み、実機は確認の場にする進め方になります。検証の工数は実装と同量以上を見込むのが前提です。工程ごとの成果物と期間の積み上げ方はFPGA設計の7工程と期間・体制の見積り方を扱った記事で詳しく扱っています。

FPGAへ進む前に試す手段|タイマー・DMA・PIOでマイコンのまま済ませる範囲

「マイコンでは間に合わない」と判断する前に、CPUを使わずに動く周辺回路で要件を満たせないかを確かめます。ここを飛ばしてFPGAを選ぶ案件は少なくありません。

内蔵タイマーとDMAで済む範囲|PWM16チャネルと周期的なデータ転送の上限

RP2040は16チャネルのPWMとDMAコントローラを内蔵しています。モーター制御のような周期的な波形の生成はPWMに、ADCの値を一定周期でメモリへ送る処理はDMAに任せれば、CPUのループの長さとは関係なく正確な時間で動きます。

前の章で挙げた応答時間の揺れは、CPUが処理するから起きる問題でした。周辺回路で完結する処理なら、この問題は出ません。チャネル数と周期の要求が内蔵の資源に収まるかどうかを、データシートの周辺回路の章で先に数えてください。

RP2040のPIOという中間解|8本のステートマシンで独自の入出力を作る

RP2040には、PIOと呼ばれるプログラマブルな入出力ブロックがあり、ステートマシンを合計8本持っています。専用の短い命令でピンの読み書きをクロック単位で制御でき、CPUとは独立して動きます。標準の周辺回路に無い独自の通信方式や、決まったタイミングの波形を、FPGAを使わずに作れる手段です。

ただし、PIOは命令を順に実行する小さな処理装置で、任意の論理回路を組めるわけではありません。ステートマシンの本数を超える独立したチャネル、チャネルごとの計算を伴う処理は収まりきりません。PIOで書き切れない、と判明した時点がFPGAを検討する合図です。

採用条件と見送り場面|FPGAを選ぶ三条件とマイコンで十分な場面の線引き

ここまでの比較を、採用と見送りの判断として言い切ります。条件の数は意図して絞りました。

FPGAを採用する条件|並列入力・ナノ秒単位の応答・仕様変更が続く少量品

FPGAを選ぶのは、次の三つのうち少なくとも一つが要件として数値で書ける場合です。

  • 入力の本数を増やしても、すべての入力で同じ応答時間を守る必要がある
  • 数百ナノ秒以下の決まった遅れで入出力を処理する必要がある
  • 年間数千台規模までの少量品で、出荷後も回路の仕様変更が続く見込みがある

三つ目は見落とされがちですが、FPGAは書き換えで回路を直せるため、規格の改版や顧客ごとの仕様差に追従できます。量産数が大きく仕様が固まった製品なら、ASICに寄せたほうが単価で勝ちます。画像や音声の推論をFPGAで回すかGPUにするかの判断は、FPGAによるAI推論とGPUとの使い分けを扱った記事を参照してください。

マイコンで十分な場面|逐次の制御処理と数ミリ秒で間に合う応答

逆に、次のような場面ではFPGAを選びません。処理の中身が条件分岐の多い逐次の制御である、要求される応答が数ミリ秒単位で揺れを許せる、通信やファイル操作のようにソフトウェアの資産を使いたい処理が中心である。いずれもマイコンの得意分野で、FPGAに載せると工数だけが増えます。

リアルタイム性の要求をマイコン側でどこまで満たせるかは、使うOSによっても変わるものです。組み込みOSの3分類と選定判断をまとめた記事で整理したRTOSの使い方を先に確認すると、FPGAが本当に必要かを切り分けやすくなります。方式の選定から迷っている段階なら、センサーからエッジ機器までを含むAI・IoTソリューションの開発支援で、要件の数値化と方式の切り分けから引き受けています。

両方を載せる構成|マイコンが制御しFPGAが高速な入出力を受け持つ分担

実際の製品では、どちらか一方を選ぶとは限りません。全体の制御、通信、画面表示はマイコンが担い、FPGAは高速な信号の取り込みや前処理だけを受け持つ。両者の間はSPIやパラレルバスでつなぎ、FPGA側にレジスタを用意してマイコンから読み書きします。

この分担なら、FPGAの回路は小さく保て、仕様変更の多い部分はマイコンのソフトウェアで吸収できます。CPUコアとプログラマブルロジックを1チップに統合したSoC FPGAも、基板の部品点数を減らせる選択肢です(構成とLinuxからの操作手順はSoC FPGAとは何かを解説した記事を参照)。分担を決めるときは、レジスタの割り当て表を両チームの間の仕様書として最初に作っておくと、結合の段階での手戻りが減ります。

ASICとCPLDの位置づけ|量産数と規模で分かれる二つの選択肢

FPGAとマイコンの比較には、隣接する選択肢が二つ顔を出します。ASICは専用に設計するチップで、初期費用は大きいものの量産時の単価と消費電力で有利になります。量産数がどこを超えたらASICに切り替えるかは、前述のコスト構造の記事で計算の手順を示しました。

CPLDは小規模で不揮発の論理デバイスで、電源投入直後から動く小さなつなぎの論理に使われてきました。CPLDとFPGAの境界は製品ごとの分類で見るほうが確実で、詳しくは親記事のCPLD・PLDとの違いの章で扱っています。ベンダーごとの製品レンジはFPGAメーカー4社の比較が参考になります。

よくある質問

FPGAとマイコンの違いについて、方式の選定時に寄せられやすい質問を5つ挙げます。

FPGAとマイコンはどちらが速いのですか?

平均の処理速度ではマイコンが劣るとは限りません。差が出るのは応答時間の最悪値と、入力の本数を増やしたときの伸び方です。FPGAは決まったクロック数で応答し、入力を増やしても応答時間は変わりません。マイコンはループ周期と割り込みで応答が揺れ、処理を足すほど遅くなります。数百ナノ秒以下の決まった遅れが要件にあるかどうかで判断してください。

FPGAでマイコンの代わりはできますか?

マイコンの代替は可能です。FPGAの中にCPUの回路を組み込むソフトコアプロセッサという方法があり、マイコンと同じようにCのプログラムを実行できる構成です。ただし、同じ性能のCPUを得るなら、マイコンを1個載せるほうが安く、消費電力も小さく済みます。FPGAの中にCPUを置くのは、高速な入出力の回路と同じチップに制御を収めたい場合に限られます。

マイコンの開発経験だけでFPGAを始められますか?

Cの経験は、テストベンチを書く場面や、マイコンと組み合わせる構成で役立ちます。難所は言語の文法ではなく、記述がすべて同時に動く回路になるという考え方の切り替えです。どのHDLから始めるかは、FPGA開発言語の選び方|Verilog・VHDL・SystemVerilogの違いと判断表で比べています。クロックとタイミング、外部入力の同期化、リセットの扱いを先に押さえてください。iCE40系ならyosysとnextpnrで、ライセンスの手続き無しに合成から書き込みまで試せます。

FPGAとマイコンを組み合わせる場合、どうつなぎますか?

SPIやパラレルバスでつなぎ、FPGA側に用意したレジスタをマイコンから読み書きする形が一般的です。FPGAが取り込んだデータが溜まったら割り込み信号でマイコンに知らせ、まとめて読み出します。レジスタの割り当て、割り込みの発生条件、リセットの解除順序を仕様書として固めてから両側の実装に入ると、結合時の手戻りを抑えられます。

FPGAとマイコンの違いを確かめるのに、最初に用意するものは何ですか?

マイコン側はRP2040を載せたボードとPico SDK、FPGA側はiCE40 UltraPlusを載せたボードとyosys、nextpnr、IceStormがあれば、この記事の2つのコードをそのまま試せます。どちらもオープンソースのツールで揃うため、ライセンスの費用はかかりません。比べるときは、処理を足したときにマイコン側の応答がどう揺れるかを、オシロスコープで入出力の両方を測って確かめてください。

関連記事

お気に入りに入れた記事の一覧

この記事は以下の記事からリンクされています

資料請求

今日のトレンド記事 直近 24 時間で、いつもより多く読まれている記事

  1. 2026.10.23 テックブログ Renta!不正アクセスでサービス停止:再開未定の現状と運営側の停止判断・証拠保全・段階的再開
  2. 2025.01.09 コラム アドレサブルCM(Addressable CM)とは?フジテレビで出る表示の意味・仕組みと視聴データの扱い
  3. 2026.07.09 テックブログ Muse Imageとは?Metaの画像生成AIの使い方・API料金(1枚0.01ドル)と日本での提供状況【2026年10月】
  4. 2026.10.21 テックブログ ふるさとチョイス不正アクセスで445万件流出:対象確認・パスワード変更と再開時期
  5. 2025.12.10 コラム 今の50代は何世代?バブル世代・団塊ジュニア・氷河期の境目と特徴

RELATED POSTS 関連記事

目次