デバイス・ボード

FPGA

回路を書き換えられる半導体。高速・並列処理に強い。

概要

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-728nm6K〜102K低コスト入門向け
AMD(Xilinx)Artix-728nm12K〜215Kバランス型
AMD(Xilinx)Kintex-728nm65K〜478K高性能
AMD(Xilinx)Zynq-700028nm17K〜444KARM + FPGA
AMD(Xilinx)Zynq UltraScale+16nm29K〜600KARM64 + FPGA + AI Engine
Intel(Altera)Cyclone V28nm5K〜301K低コスト・SoC版あり
Intel(Altera)Stratix 1014nm338K〜2.8M最高性能・HBM2
LatticeiCE4040nm1K〜8K超小型・低消費電力
LatticeECP528nm12K〜84K低コスト・オープンソースツール
GowinGW1N55nm1K〜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 SuiteAMD(Xilinx)設計・合成・実装・デバッグ
Vitis / Vitis HLSAMD(Xilinx)HLS・AI推論デプロイ
Quartus PrimeIntel(Altera)設計・合成・実装
RadiantLattice低消費電力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

項目FPGAASIC
開発コスト低い(設計ツールのみ)非常に高い(マスク代数億円〜)
量産コスト高い(チップ単価1,000円〜数万円)低い(大量生産後)
性能70〜80%程度最高(最適化)
消費電力高め低い(最適化)
書き換え何度でも不可
向いている量産数数千〜数万台以下数十万台以上

FPGA vs MCU

マイコン(MCU)がシーケンシャルにプログラムを実行するのに対し、FPGAは並列ハードウェア回路として動作します。10Gbpsのデータ処理・ナノ秒応答が必要な場合はFPGA、通常の制御処理・通信・UI管理はMCUが適します。

関連用語

参考リンク