概要
FPGA(Field-Programmable Gate Array:フィールドプログラマブルゲートアレイ)は、製造後も論理回路を書き換えられる半導体デバイスです。数万〜数百万のロジックセル(LUT:Look-Up Table)・フリップフロップ・BRAM(ブロックRAM)・DSPブロック・高速I/Oを内蔵し、HDL(ハードウェア記述言語:VerilogまたはVHDL)もしくは高位合成ツール(HLS)で論理回路を定義することで、ASICに近い専用回路をフィールドで実装できます。
マイコンやMPUがソフトウェア(プログラム)で処理を行うのに対し、FPGAはハードウェアそのものを書き換えます。これにより:
- 超高速処理: クロック毎に全回路が並列動作するため、特定処理でCPUより桁違いに高速
- 厳密なタイミング制御: ハードウェアで直接信号を制御するため、ナノ秒精度のタイミング
- 大規模並列処理: 数千のDSPブロックが同時動作
- プロトタイプASIC: ASIC量産前のプロトタイプ検証に使用
主な用途は通信(5G基地局・光通信)・画像処理・信号処理・高頻度取引(HFT)・ASICプロトタイプ・エッジAI推論です。
歴史・背景
FPGAはXilinxとAlteraの2社が市場を創出しました。
1985年、Xilinxの共同創業者Ross FreemanがFPGAの概念を特許出願。同年、Xilinx XC2064が世界初の商用FPGAとして発売されました。64個のロジックブロックと85,000個のトランジスタという今では信じられないほど小規模なデバイスでしたが、「製造後に回路を書き換えられる」という革命的なコンセプトを実現しました。
Altera(現Intel PSG)も同時期に参入し、2社による激しい競争が続きました。2010年代には微細化プロセスの進歩で大幅に集積度が向上。2012年にXilinxが「All Programmable SoC」としてZynq-7000(ARM Cortex-A9 + 7 Series FPGA)を発売し、FPGAとCPUを統合した「SoC FPGA」の時代が始まりました。
2022年にはAMDがXilinxを約350億ドルで買収し、AMD製品ラインに組み込まれました。同時期にIntelもAlteraを買収(後に分社化)。現在は低コスト市場でLattice Semiconductor・Microchip(旧Microsemi)・Gowin(中国)も競争しています。
技術仕様
主要FPGA製品ラインナップ
| メーカー | 製品ファミリー | プロセス | LUT規模 | 特徴 |
|---|---|---|---|---|
| AMD(Xilinx) | Spartan-7 | 28nm | 6K〜102K | 低コスト入門向け |
| AMD(Xilinx) | Artix-7 | 28nm | 12K〜215K | バランス型 |
| AMD(Xilinx) | Kintex-7 | 28nm | 65K〜478K | 高性能 |
| AMD(Xilinx) | Zynq-7000 | 28nm | 17K〜444K | ARM + FPGA |
| AMD(Xilinx) | Zynq UltraScale+ | 16nm | 29K〜600K | ARM64 + FPGA + AI Engine |
| Intel(Altera) | Cyclone V | 28nm | 5K〜301K | 低コスト・SoC版あり |
| Intel(Altera) | Stratix 10 | 14nm | 338K〜2.8M | 最高性能・HBM2 |
| Lattice | iCE40 | 40nm | 1K〜8K | 超小型・低消費電力 |
| Lattice | ECP5 | 28nm | 12K〜84K | 低コスト・オープンソースツール |
| Gowin | GW1N | 55nm | 1K〜8K | 低コスト・中国製 |
FPGAの内部アーキテクチャ
FPGAの主要内部リソース:
┌────────────────────────────────────┐
│ CLB(Configurable Logic Block) │
│ ┌──────────────────────────────┐ │
│ │ LUT(Look-Up Table) │ │
│ │ 6入力 → 1出力の真理値表 │ │
│ │ あらゆる6入力論理関数を実現 │ │
│ └──────────────────────────────┘ │
│ ┌──────────────────────────────┐ │
│ │ フリップフロップ(D-FF) │ │
│ │ クロックエッジで値をラッチ │ │
│ └──────────────────────────────┘ │
├────────────────────────────────────┤
│ BRAM(Block RAM) │
│ 36Kbit デュアルポートRAM × 多数 │
├────────────────────────────────────┤
│ DSP48(乗算・加算専用ブロック) │
│ 18×27bit乗算 + 加算 = 1クロック │
├────────────────────────────────────┤
│ 高速I/O(SerDes) │
│ LVDS・GTX/GTP・PCIe・10GbEなど │
├────────────────────────────────────┤
│ クロッキング(PLL/MMCM) │
│ クロック生成・位相調整 │
└────────────────────────────────────┘
ルックアップテーブル(LUT)の動作原理
6入力LUTの例:
6入力 A,B,C,D,E,F → 64ビットの真理値表 → 1ビット出力
AND ゲートの実装:
入力: A=1,B=1 → 真理値表[A][B] = 1(High)
入力: A=1,B=0 → 真理値表[A][B] = 0(Low)
より複雑な論理式も1クロックで実行:
Y = (A & B) | (C ^ D) | (!E & F)
動作原理
FPGAの開発フローはソフトウェア開発と根本的に異なります:
1. RTL設計(Verilog/VHDL)
↓
2. シミュレーション(ModelSim / Verilator)
↓
3. 論理合成(Synthesize)
↓ コードをゲート回路(ネットリスト)に変換
4. 実装(Implement)
↓ ゲートをFPGAのLUT・FF・BRAMに配置
5. 配線(Place & Route)
↓ セル間の配線を決定
6. タイミング解析(Timing Analysis)
↓ セットアップ/ホールドタイム検証
7. ビットストリーム生成(Bitstream)
↓
8. FPGAへの書き込み(JTAG / SPI Flash)
// Verilogでの8ビットカウンターの例
module counter (
input wire clk, // クロック入力
input wire rst_n, // 非同期リセット(負論理)
output reg [7:0] count // 8ビットカウント値
);
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
count <= 8'b0; // リセット時はゼロクリア
else
count <= count + 1'b1; // 毎クロック+1
end
endmodule
// FIFOを使ったデータ受信バッファの例
module uart_rx_buffer (
input wire clk,
input wire rst_n,
input wire uart_rx,
output reg [7:0] data_out,
output reg data_valid
);
// UARTデコード → FIFOへ書き込み
// この内部ロジックを全て並列ハードウェアで実装
// ...
endmodule
高位合成(HLS: High-Level Synthesis)
C/C++コードからFPGAロジックを自動生成するツールも普及しています:
// AMD Vitis HLS でのC++によるFIR フィルター実装
#include "ap_int.h"
#include "hls_stream.h"
void fir_filter(
hls::stream<ap_int<16>>& data_in,
hls::stream<ap_int<32>>& data_out,
const ap_int<16> coeff[16]
) {
#pragma HLS PIPELINE II=1 // パイプライン化(毎クロック1出力)
#pragma HLS ARRAY_PARTITION variable=coeff complete // 係数を並列化
static ap_int<16> shift_reg[16] = {0};
ap_int<32> acc = 0;
ap_int<16> new_sample = data_in.read();
// シフトレジスタ更新
for(int i = 15; i > 0; i--) {
#pragma HLS UNROLL // ループを展開して並列実行
shift_reg[i] = shift_reg[i-1];
}
shift_reg[0] = new_sample;
// FIR演算(全tap同時計算)
for(int i = 0; i < 16; i++) {
#pragma HLS UNROLL
acc += shift_reg[i] * coeff[i];
}
data_out.write(acc);
}
用途・ユースケース
FPGAが選ばれる主な用途:
- 5G基地局: 変復調・LDPC符号化・ビームフォーミング等のリアルタイム信号処理
- 光通信: 100GbE〜400GbEのラインカード。PAM4変復調・FEC
- 高頻度取引(HFT): 注文処理レイテンシーをマイクロ秒からナノ秒へ短縮
- 医療画像処理: CTスキャン・超音波の信号処理・画像再構成
- レーダー・ソナー: パルス圧縮・ドップラー処理のリアルタイム実装
- ビデオプロセッシング: 8K映像のリアルタイムエンコード・デコード・フォーマット変換
- ASICプロトタイプ: チップ量産前の機能検証・ソフトウェア開発
- エッジAI: CNNアクセラレータをFPGAに実装(Intel OpenCL / AMD VART)
実装・開発のポイント
開発ツール
| ツール | ベンダー | 用途 |
|---|---|---|
| Vivado Design Suite | AMD(Xilinx) | 設計・合成・実装・デバッグ |
| Vitis / Vitis HLS | AMD(Xilinx) | HLS・AI推論デプロイ |
| Quartus Prime | Intel(Altera) | 設計・合成・実装 |
| Radiant | Lattice | 低消費電力FPGA向け |
| Yosys + nextpnr | オープンソース | iCE40・ECP5向けオープンソースフロー |
FPGA設計の注意点
クロックドメイン問題(Clock Domain Crossing):
// 異なるクロックドメインのデータ受け渡しは
// 2段フリップフロップ同期化が必要
reg [7:0] sync_ff1, sync_ff2;
always @(posedge clk_b) begin
sync_ff1 <= async_data; // 第1段
sync_ff2 <= sync_ff1; // 第2段(メタステーブル解消)
end
assign safe_data = sync_ff2;
タイミング制約(XDC/SDC):
# 100MHz クロック制約(Vivado XDC例)
create_clock -period 10.0 -name sys_clk [get_ports sys_clk]
# 入力遅延制約
set_input_delay -clock sys_clk 2.0 [get_ports data_in[*]]
SoC FPGA(Zynq)の活用
AMD Zynq UltraScale+のようなSoC FPGAは、LinuxとFPGA論理回路を組み合わせた開発が可能です:
PS(Processing System): ARM Cortex-A53×4 + R5×2
PL(Programmable Logic): UltraScale+ FPGA
AXI-HP(高性能AXIバス)でPS↔PL間を高速データ転送
→ LinuxからFPGAロジックをメモリマップI/Oで制御
他技術との比較
FPGA vs ASIC
| 項目 | FPGA | ASIC |
|---|---|---|
| 開発コスト | 低い(設計ツールのみ) | 非常に高い(マスク代数億円〜) |
| 量産コスト | 高い(チップ単価1,000円〜数万円) | 低い(大量生産後) |
| 性能 | 70〜80%程度 | 最高(最適化) |
| 消費電力 | 高め | 低い(最適化) |
| 書き換え | 何度でも | 不可 |
| 向いている量産数 | 数千〜数万台以下 | 数十万台以上 |
FPGA vs MCU
マイコン(MCU)がシーケンシャルにプログラムを実行するのに対し、FPGAは並列ハードウェア回路として動作します。10Gbpsのデータ処理・ナノ秒応答が必要な場合はFPGA、通常の制御処理・通信・UI管理はMCUが適します。