← 講義ポータルへ戻る 第2回講義:FPGAの正体

第1章:FPGAとは何か ― Basys 3 のArtix-7を分解する

序章では「FPGAは何度でも書き換えられる回路で、ASICを焼く前の試し焼きに使う」とお話ししました。本章では、その「書き換えられる回路」の正体を、実物のチップを分解してのぞいてみます。題材は、本講座で使う Basys 3 の心臓部、Artix-7(XC7A35T)です。むずかしい計算は出てきません。「中に何が、どれくらい入っていて、どうして書き換えられるのか」を、絵で見て腑に落とすのが本章のゴールです。

※前提とする知識について: 本講座は、Verilog HDLの基礎(modulewireregalways などの読み書き)に少し触れたことがある方を想定していますが、難しくは進めません。とくに大切なのは「Verilogで regalways と書くと、それが“フリップフロップ(1ビットを記憶する部品)”になる」という一点で、これは本章で実物のチップの中の部品と直接つながります。Verilogが初めての方も、always @(posedge clk) の基本だけ先に眺めておけば大丈夫です(本講座でも要所で補足します)。

1.0 「書き換えられる回路」とは、結局どういうことか

FPGAは Field Programmable Gate Array の略です。直訳すると「現場(Field)で、後から書き換え(Programmable)できる、論理回路(Gate Array)」となります。名前そのものが性質を言い当てています。

ここで大事なのは、FPGAが書き換えているのは「プログラム(命令の並び)」ではなく「回路そのもののつなぎ方」だという点です。ふつうのマイコンは、回路は固定で、その上で動くソフトウェアを入れ替えます。FPGAはその一段下――回路の配線図そのものを入れ替えます。

ふつうのマイコン(回路は固定)

あらかじめ決まった回路(CPU)が焼かれていて、変えられるのはその上で動くソフトウェアだけ。料理にたとえると「キッチンの設備は固定、作る料理(レシピ)を替える」イメージ。

FPGA(回路そのものを書き換え)

回路の配線図そのものを入れ替えられる。今日はLチカ回路、明日はCPU回路、と中身の回路を別物に作り変えられる。たとえるなら「キッチンの設備のレイアウトごと組み替える」イメージ。

たとえるなら(複数の比喩で): FPGAの中身は、「差し込み口だらけの配線盤(昔の電話交換台)」に近いとされます。部品はあらかじめ盤面にびっしり用意されていて、どの部品とどの部品をつなぐかを後から差し替える、というイメージです。あるいは 「方眼紙にスタンプを押して回路を組む」とも言えます。マス目(部品)は最初からあって、どこに何を押し、どう線で結ぶかを決めるのが設計データの役目です。素の定義に戻すと:FPGAとは「論理回路の部品(後述のLUTやフリップフロップ)と配線網があらかじめ大量に作り込まれていて、その“中身の設定”と“結線”を設計データで繰り返し書き換えられる集積回路」です。

1.1 Basys 3 のArtix-7を分解する ― 中に何が入っているか

では実物です。Basys 3 に載っているFPGAチップ Artix-7(型番 XC7A35T) の中身を、ブロック図で分解してみます。市販のチップを開けて中身を眺めるように、「このチップはどんな部品の集合体なのか」を見ていきましょう。

        Basys 3 のFPGA = Artix-7(XC7A35T)の中身(概念図)
 ┌────────────────────────────────────────────────────────────┐
 │ I/Oブロック:外部ピンとの出入口(LED・スイッチ・クロック 等) │
 │  ┌──────────────────────────────────────────────────────┐  │
 │  │ CMT(クロック管理タイル):時計の整え役。各々 PLL+MMCM │  │
 │  │  ┌──────────────┐ ┌──────────────┐ ┌──────────────┐   │  │
 │  │  │ CLB          │ │ BRAM         │ │ DSP          │   │  │
 │  │  │ 論理回路の本体│ │ ブロックRAM   │ │ 掛け算・足し算│   │  │
 │  │  │ =スライスの  │ │ まとまった   │ │ 専用の計算器  │   │  │
 │  │  │   集まり      │ │ メモリ        │ │              │   │  │
 │  │  └──────────────┘ └──────────────┘ └──────────────┘   │  │
 │  │     ↑これらの間を、縦横に走る「配線網」がつなぐ          │  │
 │  └──────────────────────────────────────────────────────┘  │
 └────────────────────────────────────────────────────────────┘
   設計データは「各部品の中身の設定」と「部品どうしの結線」を決める

ざっくり言うと、Artix-7 の中には次のような部品が、種類ごとにたくさん敷き詰められています。データシート上の XC7A35T の規模は、おおむね以下のとおりです(数値は公称値)。

CLB(論理回路の本体)

後述するスライスが集まったもの。ここで論理回路(AND/OR、カウンタ、CPUなど)を組み立てます。XC7A35Tには2,600個のCLB=計5,200スライスがあるとされます。本講座のLチカ・カウンタ・CPUは、主にここを使います。

BRAM(ブロックRAM)

まとまったデータを置く専用メモリ。36Kbのブロックが50個(計1,800Kbit)とされ、各ブロックは18Kb×2に分けても使えます。CPUの命令やデータを置くときに効いてきます(第5章)。

DSP(計算の専用部品)

掛け算・足し算を高速に行う専用回路(DSP48E1)が90個。信号処理やAI的な計算で活躍しますが、本講座のLチカ・カウンタでは基本的に使いません。「こういう部品もある」とだけ覚えておけば十分です。

CMT(クロック管理タイル)

チップ全体の「時計」を整える部品。各CMTがPLLとMMCMを1基ずつ内蔵し、入力クロックから必要な周波数を作ります。Basys 3 のオンボード発振器の信号を扱う土台になります(具体的な周波数・ピンは第4章で確認)。

つまずきどころ: 「これ全部、自分で配線するの?」と身構える必要はありません。これらの部品をどう使い・どうつなぐかは、第4章以降で使う開発ソフト(Vivado)が自動で割り付け・配線してくれます。私たちは設計(RTL)と、外部ピンとの対応(後の章で扱う .xdc)を用意するだけです。

1.2 一番の主役「スライス」 ― 6入力LUT×4 と フリップフロップ×8

本講座でいちばん使うのは、上の図の CLB の中身=スライス(slice)です。ここがFPGAの「論理回路を作る最小の作業場」にあたります。1個のスライスの中身を開けると、こうなっています。

        スライス(slice)1個の中身
 ┌──────────────────────────────────────────────┐
 │   6入力LUT ×4              フリップフロップ ×8   │
 │  ┌─────┐┌─────┐┌─────┐┌─────┐  ┌─┐┌─┐┌─┐┌─┐    │
 │  │ LUT ││ LUT ││ LUT ││ LUT │  │F││F││F││F│    │
 │  └─────┘└─────┘└─────┘└─────┘  └─┘└─┘└─┘└─┘    │
 │                                ┌─┐┌─┐┌─┐┌─┐    │
 │  LUT = 論理(AND/OR…)を作る   │F││F││F││F│    │
 │  FF  = 1ビットを記憶する        └─┘└─┘└─┘└─┘    │
 └──────────────────────────────────────────────┘
        ↓ このスライスが XC7A35T には 5,200個ある
   = 6入力LUT 20,800個 / フリップフロップ 41,600個

1個のスライスには、6入力LUTが4個と、フリップフロップが8個入っています。スライスがチップ全体で5,200個あるので、単純にかけ算すると、Artix-7(XC7A35T)の中にはLUTが約20,800個、フリップフロップが約41,600個、物理的に存在していることになります。

★ここが最重要ポイント: Verilogで reg [23:0] counter; のように書いて always @(posedge clk) の中で値を更新すると、その counterフリップフロップ(1ビットの記憶素子)の集まりになります。そのフリップフロップの実物が、いま分解した Artix-7 のスライスの中に、4万個以上も並んでいるのです。たとえば本講座の第4章で書く「24ビットのカウンタ(Lチカ)」は、フリップフロップ24個でできています。それを Basys 3 で動かすとは、この4万個のうちの24個を実際に使う、ということ。抽象的だった「reg=フリップフロップ」が、ここで手に取れる“物の数”につながります。

1.3 LUTとは何か ― 「計算せず、答えの表を引くだけ」の部品

スライスのもう一方の主役、LUT(ルックアップテーブル)を見ておきます。名前のとおり「look up(引く)+ table(表)」、つまり表を引く部品です。

ふつう、論理回路はANDゲートやORゲートを組み合わせて作ります。ところがLUTは発想が逆で、「入力の全パターンに対する答えを、あらかじめ表にして丸ごと記憶しておく」のです。入力が来たら、計算せずに表から答えを引いて出すだけ。6入力LUTなら、入力6本の組み合わせ(64通り)すべてに対する出力を、表として持っています。

たとえるなら(複数の比喩で): LUTは「九九の早見表」に似ています。「7×8は?」と問われて毎回計算するのではなく、表のマス目を引いて「56」と即答する――あれと同じです。あるいは「テストのカンニングペーパー(答えを全部書いた一覧)」とも言えます。問題(入力)に対する答え(出力)が全部書いてあるので、その場で考えずに引くだけ。素の定義に戻すと:LUTとは「任意の論理関数について、入力の全組み合わせに対する出力をあらかじめ記憶しておき、入力に応じてその答えを返す小さなメモリ」です。

「どんな論理関数でも表にできる」というのがLUTの強みです。AND回路が欲しければANDの答えの表を、OR回路が欲しければORの表を、同じLUTに書き込む内容を変えるだけで作れます。この「表の中身を書き換えれば、別の論理回路になる」ことこそが、FPGAが書き換え可能な理由の核心です。

1.4 なぜ「何度でも書き換えられる」のか ― 設定をSRAMに覚えさせている

ここまでで、FPGAの中身が「LUT+フリップフロップ+配線網+専用部品」の集まりだと分かりました。最後に、なぜそれが何度でも書き換えられるのかを押さえます。

答えはシンプルで、「LUTの表の中身」も「どの部品とどの部品をつなぐか(配線網のスイッチ)」も、すべてチップ内部の小さなメモリ(SRAM)に記憶させているからです。設計データ(序章で触れたビットストリーム)は、この無数のメモリに「表はこう、結線はこう」と一斉に書き込む指示書です。メモリの中身を入れ替えれば、チップは別の回路に早変わりします。

つまずきどころ(電源を切ると消える): Artix-7 のようなSRAM方式のFPGAは、電源を切ると設定(ビットストリーム)が消えます。毎回、電源投入時に設定を読み込み直す必要があります。Basys 3 では、PCからUSB経由で書き込む方法のほかに、ボード上の不揮発メモリ(フラッシュ)に焼いておいて電源投入時に自動で読み込ませる方法もあります。この使い分けは、実際に書き込みを行う第4章で扱います。いまは「FPGAの設定は、電源を切ると消える“書き換え可能”な性質のものだ」とだけ押さえておけば十分です。

1.5 RTLは「設計図」、FPGAはそれを「LUT+FF」で実現する

ここまでで、FPGAの中身が「LUT+フリップフロップ+配線網」の集まりだと分かりました。では、私たちがVerilogで書く回路は、どうやってこの部品たちに姿を変えるのでしょうか。最後にその橋渡しを押さえます。

私たちが書くVerilogコード(RTL=回路の設計図)は、それ自体は文字の並びにすぎません。これを開発ソフト(Vivado)が読み取り、「どのLUTにどんな表を入れ、どのフリップフロップを使い、それらをどう結線するか」へと自動的に翻訳します。第4章以降で私たちがやるのは、この設計図(RTL)を書くことと、外部ピンとの対応づけ(.xdc)を用意することだけ。あとはVivadoが、第1章で見た部品たちの上に回路を組み立ててくれます。

   自分で書く                    Vivado が自動でやる
 ┌──────────────┐            ┌────────────────────────────┐
 │ RTL          │   合成      │ LUTに表を入れる             │
 │(Verilogの   │ ─────────► │ フリップフロップを割り当てる │
 │  設計図)     │  配置配線   │ 配線網でつなぐ              │
 └──────────────┘            └────────────────────────────┘
        ↓                                ↓
   「何をしたいか」を書く          第1章で見た部品の上に回路が組まれる

※「FPGA以外の実現方法」もあります: 同じRTL(設計図)は、FPGAのLUT+FFではなく、専用チップ(ASIC)として実際のゲートに焼くこともできます。FPGAが「既製の部品に割り当てる(何度でも書き換え可)」のに対し、ASICは「専用に焼く(一発勝負)」という違いです。本講座はFPGAだけで完結しますが、この2つを行き来させる話に興味がある方は、第7章【連携編】にまとめています(読み飛ばしても本編には支障ありません)。

💡 コラム:「33,280ロジックセル」って、どう数えた数字?

Artix-7(XC7A35T)の規模を表す数字として、しばしば「33,280ロジックセル」という値が使われます。これはどこから来た数でしょうか。本文で見たとおり、このチップには 6入力LUTが20,800個(5,200スライス×4)あります。33,280はそれより多い数です。

からくりは「ロジックセル」という単位の定義にあります。ロジックセルは、昔ながらの“4入力LUT+フリップフロップ1個”を1単位として数える、世代をまたいで規模を比べるためのものさしです。いまのFPGAは6入力LUTを使っており、6入力LUTは4入力LUTより多くの論理を表現できます。そこで、その「お得さ」をおよそ1.6倍として換算するのが通例とされます。実際、20,800 × 1.6 = 33,280 となり、本文の公称値と一致します。

つまり「ロジックセル数」は物理的な部品の個数そのものではなく、規模感を世代横断で比べるための換算値だということです。本講座のLチカ・カウンタ程度では、この巨大な数のごく一部しか使いません。「広大な作業場の、ほんの片隅から始める」と捉えておけば十分です。

次の第2章では、いよいよ手を動かす準備に入ります。本章で中身を分解した Artix-7 を載せた Basys 3 を実際に用意し、最初に触る前の全体像を確認しましょう。