FPGAは如何にしてRTLから物理回路へと自己変革するか

FPGA

こんにちは!TechTeku Noteへようこそ!今回は普段皆さんが開発で使用するFPGAがどのようにしてその柔軟な回路構造を変えているのか、というのを深堀したいと思います。

  1. 第一部:CPU、ASIC、そしてFPGAの違い
    1. 1.1 導入:アーキテクチャの棲み分け
    2. 1.2 CPU: 「逐次処理」のアーキテクチャ
    3. 1.3 ASIC: 「固定的」なハードウェア
    4. 1.4 FPGA: 「再構成可能」なハードウェア
  2. 第二部:設計の具現化プロセス — VivadoはRTLをどう解釈するか
    1. 2.1 概要:RTLから物理設計図へ
    2. 2.2 論理合成 (Synthesis): 「意図」から「抽象的な部品(プリミティブ)」への変換
      1. 2.2.1 合成の定義
      2. 2.2.2 プリミティブへのマッピング
      3. 2.2.3 「合成後ネットリスト」
    3. 2.3 実装 (Implementation): 「抽象的な部品」から「シリコン上の物理設計図」へ
      1. 2.3.1 配置 (Placement)
      2. 2.3.2 配線 (Routing)
      3. 2.3.3 「配線後ネットリスト」とビットストリーム生成
  3. セクション3:ビットストリーム — FPGAのための「実行可能ファイル」
    1. 3.1 ファイルフォーマットの解剖:単なるデータ羅列ではない「命令セット」
    2. 3.2 ビットストリームの基本構造
      1. 3.2.1 同期ワード (Sync Word)
      2. 3.2.2 ヘッダーとコマンド (Header / Commands)
      3. 3.2.3 データ・パケット (Data Packets)
      4. 3.2.4 フッター (Footer)
  4. 第四部:コンフィギュレーション・プロセス — FPGAはいかにして「自己変革」するか
    1. 4.1 起動と制御:コンフィギュレーション・エンジン
    2. 4.2 コンフィギュレーションのハンドシェイク
      1. 4.2.1 電源投入 (Power-On Reset, POR)
      2. 4.2.2 準備完了の確認
    3. 4.3 ビットストリームの「実行」:アドレスとデータ
      1. 4.3.1 フレームアドレスレジスタ (Frame Address Register, FAR)
      2. 4.3.2 フレームデータレジスタ (Frame Data Register, FDRI)
  5. 第五部:物理構造の変化 — ビットがハードウェアになる瞬間
    1. 5.1 概要:コンフィギュレーション・メモリ(CRAM)
    2. 5.2 ロジックの実現:LUTと真理値表としてのSRAM
      1. 5.2.1 LUTの正体:書き換え可能な「真理値表」
      2. 5.2.2 INIT属性によるプログラミング
      3. 5.2.3 物理的変化:LUT6のプログラミング例
    3. 5.3 配線の実現:スイッチマトリックスとパス・トランジスタ
      1. 5.3.1 配線ファブリックの構造
      2. 5.3.2 接続の物理的スイッチ:パス・トランジスタ
      3. 5.3.3 CRAMビットによる制御
    4. 5.4 変革の完了:汎用シリコンから専用回路へ
  6. まとめ

第一部:CPU、ASIC、そしてFPGAの違い

1.1 導入:アーキテクチャの棲み分け

Field Programmable Gate Array (FPGA) がどのように動作するかを深く理解しないまま使用している技術者もおられると思います。FPGAの「再構成可能性」は、現代のコンピューティングを支える他の主要なプロセッサ、すなわちCPUASICとは根本的に異なる思想に基づいています。

1.2 CPU: 「逐次処理」のアーキテクチャ

CPUは、そのアーキテクチャが設計・製造された時点で「固定的」です 。その動作原理は、メモリから「命令」を一つずつ読み出し(フェッチ)、解釈(デコード)、実行(エグゼキュート)するという「逐次処理」に基づいています 。 CPUが実現する「柔軟性」とは、この命令セット(ソフトウェア)を入れ替えることによって、異なるタスクを実行できる能力を指します 。しかし、ハードウェアの構造自体がタスクに応じて変化するわけではありません。近年ではマルチコア化による並列処理が一般化していますが、これは複数の逐次処理エンジンを並べることによる並列性であり、FPGAやGPUが提供する超並列性とはその性質と規模が異なります 。   

1.3 ASIC: 「固定的」なハードウェア

ASIC(特定用途向け集積回路)は、その名の通り、単一の特定のタスク(例えば、ビデオエンコード、ネットワークパケット処理、暗号通貨マイニングなど)を実行するためだけにカスタム設計された「固定的な回路」です 。 ASICは、特定の機能に最適化されているため、性能、電力効率、そしてチップ面積あたりの集積度において、あらゆるプロセッサの中で最も高い効率を誇ります 。しかし、その代償として「柔軟性」は完全にゼロです 。一度製造されると、その論理機能の変更は一切不可能であり、開発には膨大な初期費用(NRE: Non-Recurring Engineering cost)と長い開発期間が必要となります 。   

1.4 FPGA: 「再構成可能」なハードウェア

FPGAは、ASICの「固定的な高性能」とCPUの「ソフトウェア的な柔軟性」の中間に位置するアーキテクチャです 。FPGAの本質は、ASICが実現するような「特定の機能に最適化された専用ハードウェア回路」を、製造後、すなわち「現場 (Field)」で、ユーザーが「プログラム (Programmable)」によって「構築」できる点にあります。   

この「再構成可能性」は、FPGAのシリコンダイ上にあらかじめ大量に配置された「余分なゲートと配線」という「オーバーヘッド」によって実現されます 。このオーバーヘッドこそが、本レポートで解明するLook-Up Table (LUT) と配線マトリックス(Interconnect / Switch Matrix)の実体です。   


第二部:設計の具現化プロセス — VivadoはRTLをどう解釈するか

2.1 概要:RTLから物理設計図へ

設計者がVHDLやVerilogといったハードウェア記述言語(HDL)で記述するRTL (Register-Transfer Level) コード  は、回路が「どのように振る舞うべきか」という「意図」を記述した抽象的なドキュメントです。Xilinx (現AMD) のVivado  やIntel (旧Altera) のQuartus PrimeのようなEDA (Electronic Design Automation) ツールの役割は、この抽象的な「意図」を、特定のFPGAチップ上の「物理的な設定値」の集合へと変換することです。   

この変換プロセスは、大きく「論理合成 (Synthesis)」と「実装 (Implementation)」の2つの主要な段階に分けられます 。   

2.2 論理合成 (Synthesis): 「意図」から「抽象的な部品(プリミティブ)」への変換

2.2.1 合成の定義

論理合成は、RTLコード  を構文解析し、それをFPGAが物理的に保有する基本的な構成要素、すなわち「プリミティブ (Primitives)」のネットリスト(接続情報)に変換するプロセスです 。   

2.2.2 プリミティブへのマッピング

合成ツールは、RTLコード内の記述を、テクノロジーに依存した(あるいは汎用的な)論理プリミティブにマッピングします 。 例えば、RTLコード内の c <= a + b; という記述は、加算器(Adder)として認識されます。合成ツールはこの加算器を、ターゲットデバイスが保有するプリミティブ(例えば、多数のLUTや専用のDSPスライス)に最適にマッピングします 。   

主要なマッピングは以下の通りです。

  • 組み合わせ論理 (ANDORXOR, MUX, if文の条件分岐, case文など) → LUT (Look-Up Table)    
  • 順序論理 (クロック同期のレジスタ、always @(posedge clk) ブロックなど) → FF (Flip-Flop)    
  • メモリ (RAM, ROM) → BRAM (Block RAM) または Distributed RAM (LUT RAM)    
  • 算術演算 (特に乗算、積和演算) → DSPスライス (Digital Signal Processing slice)    

2.2.3 「合成後ネットリスト」

この段階での出力は「合成後ネットリスト (post-synthesis netlist)」と呼ばれます 。 このプロセスは、RTLという「振る舞いの記述」から「論理的な実装」への最初の変換ステップです。合成は「何を (What)」作るかを決定するプロセスです。出力されるネットリストは、「この設計にはLUTがX個、FFがY個、BRAMがZ個必要であり、LUT-Aの出力はFF-Bの入力に接続される」といった、コンポーネント間の「論理的な」接続情報を含んでいます。   

しかし、この時点では、それらのLUTやFFが、FPGAチップという広大なシリコンダイの「どこに (Where)」配置されるべきかという物理的な位置情報は、まだ一切含まれていません 。このネットリストは、まだ「抽象的な設計図」の段階にあります。   

2.3 実装 (Implementation): 「抽象的な部品」から「シリコン上の物理設計図」へ

実装は、合成によって生成された「抽象的なネットリスト」を受け取り、それを「特定」のFPGAデバイスの「特定」の物理リソースにマッピングするプロセスです 。このプロセスは、主に「配置 (Placement)」と「配線 (Routing)」の2つのステップで構成されます 。   

2.3.1 配置 (Placement)

配置(またはプレースメント)は、合成ネットリスト内の個々のプリミティブ(LUT、FF、BRAM、DSPなど)を、FPGAチップ上の「特定」の物理的な位置(例えば「スライスX5_Y10のLUT_A」や「BRAM_X2_Y4」)に割り当てるプロセスです 。   

この配置は、設計が要求するタイミング制約(例:クロック周波数 200MHz)を満たす上で極めて重要です。EDAツールは、互いに密接に関連するロジック(例えば、あるFFの出力が次のFFの入力にすぐ接続される場合)を物理的に近い位置に配置しようと試みます。これにより、それらを接続する配線の長さを最小限に抑え、信号の伝播遅延を削減します 。   

2.3.2 配線 (Routing)

配線(またはルーティング)は、配置プロセスによってチップ上の特定の位置に置かれた各プリミティブ間を、FPGA内部に縦横無尽に張り巡らされた膨大な配線リソース(インターコネクト、スイッチマトリックス)を用いて、物理的に接続するプロセスです 。   

これは実装プロセス全体の中で最も計算量が多く、複雑な「組み合わせ最適化問題」の一つです。EDAツールは、数百万もの接続要求を満たしながら、配線の混雑(コンジェスチョン)を避け、かつ全ての信号がクロックの次のエッジまでに目的地に到達できるよう、配線長(=遅延)を最小化する経路を探索します 。このタイミング要求  を満たすプロセスは「タイミングクロージャ (Timing Closure)」と呼ばれ、FPGA設計における最大の課題の一つです 。   

2.3.3 「配線後ネットリスト」とビットストリーム生成

配置と配線の両方のプロセスが完了すると、その出力として「配線後ネットリスト (post-route netlist)」が生成されます 。   

合成が「何を作るか」を決定したのに対し、実装(配置・配線)は「それをシリコンのどこに (Where) 配置し」「どの配線を使ってどう (How) 接続するか」を最終的に決定しました。この「配線後ネットリスト」は、もはや抽象的ではありません。それは、「スライスX5_Y10のLUT_Aの内部SRAM(64bit)には、INIT=0x... という値を書き込むこと」「スライスX5_Y10の出力とスライスX6_Y12の入力Bを接続するため、スイッチマトリックスX5_Y11に存在するパス・トランジスタ(電子スイッチ)のNo.23を『オン』にすること」といった、物理的な設定値の「完全なリスト」です 。   

ユーザーのクエリにある「Bitstream(ビットストリーム)」ファイルは、この「配線後ネットリスト」という最終的な物理設計図を、FPGAのコンフィギュレーション・エンジン(セクション4で後述)が読み取り、実行できる「シリアルな命令フォーマット」に変換(シリアライズ)したものです 。   


セクション3:ビットストリーム — FPGAのための「実行可能ファイル」

3.1 ファイルフォーマットの解剖:単なるデータ羅列ではない「命令セット」

Vivadoによって生成されたビットストリーム(.bitファイル)は、単なる0と1のランダムな羅列ではありません。それは、FPGA内部にハードウェアとして組み込まれた「コンフィギュレーション・エンジン(またはステートマシン)」 によって解釈され、実行される、「アセンブリのような命令セット (assembly-like instruction set)」を持つ一種の「実行可能プログラム」です 。   

このファイルには、FPGAのロジック機能(LUTの初期値)、配線接続、I/Oピンの設定、ブロックRAMの初期値など、チップの動作を定義するために必要なすべての構成情報が含まれています 。   

3.2 ビットストリームの基本構造

ビットストリーム・ファイルフォーマットはベンダーやデバイス世代(例:Xilinx 7-Series, UltraScale)によって異なりますが、その基本構造は「パケット」のシーケンスとして構成されています 。   

3.2.1 同期ワード (Sync Word)

ビットストリームのデータは、SPIフラッシュメモリやJTAGなど、シリアルなインターフェースから読み込まれます。FPGAのコンフィギュレーション・エンジンは、このシリアルなデータストリームの「開始点」と「ワードの区切り」を見つける必要があります。同期ワードは、このアライメント(同期)のために使用される特殊な固定パターンです(例:Xilinx 7-Seriesでは 0xAA995566。エンジンがこのパターンを検出すると、後続のデータを「命令」または「データ」として処理し始めます。   

3.2.2 ヘッダーとコマンド (Header / Commands)

同期ワードの後には、設定プロセス自体を制御するための一連のヘッダーパケットやコマンドパケットが続きます 。 これらのコマンドは、FPGA内部に存在する多数の「コンフィギュレーション・レジスタ」に対して、読み書きを行います 。これらのレジスタは、CPUが内部の状態を制御するために持つコントロール・レジスタ(x86のCRnやMSRなど)に類似したものです 。コマンドには、例えば「特定のレジスタに値を書き込め」「設定モードを初期化せよ」といった命令が含まれます。   

3.2.3 データ・パケット (Data Packets)

これが、FPGAの物理構造(セクション5で詳述するLUTや配線スイッチ)を実際に定義する「構成ビット」の本体を含むパケット群です 。 このデータパケットのシーケンスは、通常、特定のレジスタ(例:FDRI – Frame Data Register In)への書き込み命令としてマークされ、その後に続く膨大な量のデータが、チップの構成メモリへとロードされます 。   

3.2.4 フッター (Footer)

全ての構成データがロードされると、ビットストリームの末尾にはフッターパケット群が配置されています 。これらには、設定プロセスをクリーンアップし(例えば、内部レジスタをリセットし)、FPGAの「スタートアップ・シーケンス」(ユーザーロジックの動作を開始させるための最終ステップ)を起動するためのコマンドが含まれます 。   


第四部:コンフィギュレーション・プロセス — FPGAはいかにして「自己変革」するか

4.1 起動と制御:コンフィギュレーション・エンジン

FPGAがビットストリームを読み込み、自己の構造を変革するプロセスは、チップ内部にLUTなどとは別に「ハードロジック」として実装されている「コンフィギュレーション・エンジン」または「コンフィギュレーション・コントローラ」によって、厳密に管理されます 。   

このエンジンは、ユーザーが選択したコンフィギュレーション・モードに応じて、適切なインターフェースを介してビットストリームのデータを受け取ります 。   

4.2 コンフィギュレーションのハンドシェイク

4.2.1 電源投入 (Power-On Reset, POR)

システムに電源が投入されると、まずPOR (Power-On Reset) シーケンスが実行されます 。この時点で、FPGAは「ブランク」な状態です。SRAMベースのFPGAの場合、内部のコンフィギュレーション・メモリ(CRAM)は揮発性であるため、その内容は不定です。そのため、PORシーケンスの一部として、まずCRAM全体をクリア(リセット)するプロセスが実行されます 。   

4.2.2 準備完了の確認

コンフィギュレーション・コントローラは、FPGAの外部ピンの状態を監視し、コンフィギュレーションを開始するタイミングを計ります。ここで重要な役割を果たすのが、nSTATUS(FPGAが設定データを受け入れ準備完了かを示す)とCONF_DONE(設定が完了したかを示す)という2つのステータスピンです 。   

コントローラは、nSTATUSピンがHigh(準備完了)であり、かつCONF_DONEピンがLow(未完了)であることを確認すると、コンフィギュレーション・プロセスを開始し、ビットストリームのデータ転送(クロックの供給とデータの読み込み)を開始します 。   

4.3 ビットストリームの「実行」:アドレスとデータ

コンフィギュレーション・エンジンは、第三部で述べたビットストリーム・プログラムの「実行」を開始します。このプロセスの核心は、シリアルな(1次元の)ビットストリーム・データを、FPGAの広大な2次元のファブリック(ロジックブロックと配線)に、正確にマッピングするための「アドレッシング」です。

4.3.1 フレームアドレスレジスタ (Frame Address Register, FAR)

FARは、FPGA内部の広大なコンフィギュレーション・メモリ(CRAM)空間における「アドレスポインタ」として機能する、極めて重要な内部レジスタです 。 2.3で述べた「配置・配線」の結果は、FPGAの2次元グリッド上の特定の位置(例:行5、列10のCLB)に対応します。FARレジスタは、この物理的な位置を指定するために、いくつかのフィールド(ビット領域)に分割されています。   

例えば、Xilinx UltraScaleアーキテクチャのFARは、以下のようなフィールドで構成されます :   

  • ブロックタイプ (Block type): 書き込み対象がCLB(ロジック)か、BRAM(メモリ)か、I/Oかなどを指定します。
  • 行アドレス (Row address): チップ内のどの「行」か。
  • 列アドレス (Column address): チップ内のどの「列」か。
  • マイナーアドレス (Minor address): ブロック内のさらに詳細な位置。

4.3.2 フレームデータレジスタ (Frame Data Register, FDRI)

FDRIは、FARによって指定された「アドレス」に対して、実際に書き込む「データ」(=構成ビット)を保持するための一時的なデータレジスタです 。   

このアーキテクチャが意味することは、1次元のビットストリーム・ファイルが、2次元のFPGAチップの構造にどのようにマッピングされるか、というプロセスの核心を示しています。

VivadoのP&Rツールは、「行5、列10のCLBにあるLUT」に特定の値(INIT値)を設定する必要があることを知っています。ビットストリーム生成ツール(BitGen)は、この情報を次のような「アセンブリ・プログラム」に変換します。

  1. ビットストリーム内のコマンドパケット: 「FARレジスタに、{ブロックタイプ:CLB, 行:5, 列:10} を示すアドレス値を書き込め」
  2. ビットストリーム内のデータパケット: 「FDRIレジスタに、{そのCLBのLUTのINIT値や配線スイッチの値} を含むデータフレームを(シリアルに)書き込め」

ビットストリームは、本質的にこの「アドレス設定 (FAR) → データ書き込み (FDRI)」という一連の命令を、チップ全体が設定されるまで何千、何万回と繰り返すシリアル・プログラムです 。この巧妙なアドレッシング機構により、1次元の.bitファイルが、2次元のFPGAファブリック全体を正確に「塗りつぶす」ように構成できるのです。   


第五部:物理構造の変化 — ビットがハードウェアになる瞬間

5.1 概要:コンフィギュレーション・メモリ(CRAM)

「FPGAは自身の構造をどのように変化させているのか」という問いに対する直接的な答えは、FPGA全体に網の目のように分散して配置されている「コンフィギュレーション・メモリ (Configuration Memory)」 にあります。   

このメモリは、SRAM (Static RAM) 技術で製造されており、電源を切ると内容が消える「揮発性」のメモリセルです 。これらのSRAMセル群は、総称して「CRAM (Configuration RAM)」 とも呼ばれます。   

FPGAの「再構成可能」な要素、すなわちロジック(論理機能)とインターコネクト(配線)は、これら何百万、何億という膨大な数のCRAMセルの「値(0か1か)」によって、その動作や接続が物理的に制御されています 。第四部で述べた「ビットストリームのロード」とは、このCRAMセル群に、設計図通りの0と1を書き込むプロセスに他なりません。   

5.2 ロジックの実現:LUTと真理値表としてのSRAM

5.2.1 LUTの正体:書き換え可能な「真理値表」

FPGAのロジックを実現する基本ブロックはCLB (Configurable Logic Block)  であり、その中核を成すのがLUT (Look-Up Table) です 。 LUTは、その本質において、小さなメモリ(SRAMまたはROM)として機能します 。   

近年の主要なFPGA(例:Xilinx 7-Series, UltraScale)は、6入力LUT(LUT6)を標準的に採用しています 。   

  • LUT6は、6本の入力線 (I0~I5) と、1本(または複数)の出力線 (O) を持ちます。
  • その内部は、64ビット(=26)のSRAM(CRAMセル)で構成されています 。   
  • LUTの6本の入力線は、この64ビットSRAMの**「アドレス線」**として機能します 。   
  • SRAMに格納されている64ビットのデータ(真理値表)のうち、6本の入力線が示すアドレスによって選択された**「1ビット」**の値が、LUTの出力 (O) として物理的に選択され、出力されます 。   

5.2.2 INIT属性によるプログラミング

セクション2.2で述べた合成ツール(Vivado)は、設計者がRTLで記述した任意の論理関数(例:y = (a & b) | (c & d))を実現するために、この64ビットSRAMに書き込むべき「真理値表」のデータパターンを自動的に計算します。

この64ビットのデータパターンは、INIT属性(通常、64ビットの16進数値)として定義されます 。   

例 (Xilinx 7-Series  に基づく):   

  1. 6入力ANDゲート:
    • 論理関数: y=I0&I1&I2&I3&I4&I5
    • 動作: 出力 y が 1 になるのは、6つの入力がすべて 1 の場合、すなわち入力アドレスが 6'b111111(10進数で63)の時のみです。
    • 真理値表: アドレス63のSRAMセルに 1 を、他の0~62のアドレスのセルにはすべて 0 を書き込みます。
    • INIT属性: このデータパターンは、64'h8000000000000000 となります。
  2. 6入力ORゲート:
    • 論理関数: y=I0∣I1∣I2∣I3∣I4∣I5
    • 動作: 出力 y が 0 になるのは、6つの入力がすべて 0 の場合、すなわち入力アドレスが 6'b000000(10進数で0)の時のみです。
    • 真理値表: アドレス0のSRAMセルに 0 を、他の1~63のアドレスのセルにはすべて 1 を書き込みます。
    • INIT属性: このデータパターンは、64'hFFFFFFFFFFFFFFFE となります。

5.2.3 物理的変化:LUT6のプログラミング例

コンフィギュレーション・プロセス(セクション4)において、ビットストリームは、FARレジスタで指定された特定のLUTの、64ビットのCRAM(SRAM)セル群に、これらのINIT値を物理的に「ロード」します 。   

論理関数 (RTLの意図)入力例 (I5..I0)出力 (O)真理値表のアドレス (10進)INIT属性 (ビットストリームの内容) 
6入力 AND6'b11111116364'h8000000000000000
6入力 AND(上記以外)00-62(同上)
6入力 OR6'b0000000064'hFFFFFFFFFFFFFFFE
6入力 OR(上記以外)11-63(同上)

この書き込みが完了した瞬間、そのLUTは、もはや汎用的なロジックセルではなく、物理的に「6入力ANDゲート」または「6入力ORゲート」として動作する「専用回路」に「変革」します。

5.3 配線の実現:スイッチマトリックスとパス・トランジスタ

5.3.1 配線ファブリックの構造

FPGAは、CLB(ロジックブロック) という「島」がマトリックス状に配置され、その周囲を膨大な配線チャネル(水平および垂直の金属ワイヤ)という「海」が取り囲む「アイランド・スタイル(島形式)アーキテクチャ」 を採用しています。   

これらのワイヤが交差する点や、ワイヤがCLBに接続する点には、「スイッチマトリックス (Switch Matrix)」または「スイッチボックス (Switch Box)」と呼ばれる、プログラム可能な接続ポイント(交差点)が配置されています 。   

5.3.2 接続の物理的スイッチ:パス・トランジスタ

これらのスイッチマトリックス内部で、あるワイヤを別のワイヤに接続するための「スイッチ」は、物理的には「パス・トランジスタ」(通常はNMOSトランジスタ) または「トランスミッション・ゲート」(NMOSとPMOSのペア)によって実装されています。これらは、ゲート電圧によってON/OFFが切り替わる、極めて単純な電子スイッチです。   

5.3.3 CRAMビットによる制御

ここが、FPGAの「配線の再構成」の核心です。 セクション2.3のP&Rツールは、「LUT-Aの出力」を「FF-Bの入力」に接続することを決定しました。この接続を実現するために、物理的には「ワイヤX」と「ワイヤY」を「スイッチマトリックスZ」で接続する必要があります。

スイッチマトリックスZ内部で、ワイヤXとワイヤYが交差する点には、パス・トランジスタが配置されています 。このパス・トランジスタの「ゲート」端子(スイッチのON/OFFを制御する端子)は、FPGAファブリック内に散在する「配線制御専用のSRAMセル(CRAMビット)」 に、1対1で物理的に接続されています。   

ビットストリームが、この特定のCRAMビット(もちろんFARレジスタによってアドレス指定されます)に「1」を書き込むと、そのSRAMセルは「1」を記憶します。このSRAMセルの出力(High電圧)がパス・トランジスタのゲートに印加され、トランジスタが「オン」になります 。これにより、ワイヤXとワイヤYが物理的に導通し、信号が流れるようになります。   

もしビットストリームがそのCRAMビットに「0」を書き込めば、SRAMセルは「0」を記憶し、トランジスタのゲート電圧はLowのまま「オフ」となり、ワイヤXとYの接続は切断されます。

P&Rツールは、設計上の全ての接続を実現するために、どのCRAMビットを「1」に(接続)し、どれを「0」に(切断)すべきかを計算し、その結果がビットストリームにエンコードされます。

5.4 変革の完了:汎用シリコンから専用回路へ

コンフィギュレーション・エンジンがビットストリームの最後まで(フッター命令まで) 実行し、チップ上の何百万というCRAMセル(LUTの真理値表SRAMと、配線スイッチの制御SRAM) がすべてプログラムされると、CONF_DONEピンがHighに遷移し、コンフィギュレーションの完了を外部に通知します 。   

この瞬間、FPGAは「ブランク」な状態から「変革」を遂げています。もはや「汎用の」ロジックと配線の集合体ではありません。それは、ビットストリームによって設定された通りの、RTLで記述された通りの「専用デジタル回路」そのものになっています 。   

FPGAは「スタートアップ・シーケンス」と呼ばれる最終段階に入り、グローバルクロックが(設計者が指定したクロックが)解放され、設計した回路が動作を開始します。この物理的な「専用回路」としての状態は、次に電源が切られるか、あるいは新しいビットストリームがロードされて再構成されるまで、維持されます 。   


まとめ

FPGAが「どのように動いているのか」という根本的な問いに対し、EDAツールによる「コンパイル」プロセスと、ビットストリームによる「物理的再構成」プロセスの両面から、そのメカニズムを順を追って解明しました。

  1. EDA (Vivado): 抽象的な「意図(RTL)」は、まず「論理的な部品リスト(合成ネットリスト)」 に変換されました(論理合成)。次に、その部品リストは、チップ上の「物理的な配置・配線図(配線後ネットリスト)」 へと変換されました(実装:配置・配線)。   
  2. ビットストリーム: この最終的な物理設計図は、FPGAの「コンフィギュレーション・エンジン」 が実行可能な「シリアル・プログラム(命令セット)」 へとエンコードされました。   
  3. コンフィギュレーション: FPGAは、電源投入後にこのプログラムを実行し、「FAR(アドレス)」 と「FDRI(データ)」 といった内部レジスタを介して、チップ全体に散在する何百万もの「CRAMセル」に0と1を書き込みました。   

コメント

タイトルとURLをコピーしました