PYNQ を使って Python で手軽に FPGA を活用 (1)

みなさんこんにちは。ACRi ブログの1番目のコースでは5回にわたるブログ記事を通して、Python で FPGA を手軽に利用できる PYNQ とその活用方法を紹介していきます。扱いやすい Jupyter Notebook の環境を使いながら、Python で手軽に FPGA の開発を体験するのがゴールです。

第1回のこの記事では「そもそも FPGA ってなに?」という疑問に答えていきます。

FPGAって何?

FPGA こと Field Programmable Gate Array は、使われる場所で (Field) 書き換え可能な (Programmable) 論理回路 (Gate) の集まり (Array)という集積回路 (LSI) です。

FPGAを搭載したボードの例

パソコンやスマートフォンのプロセッサの上でプログラムを実行することで、プロセッサに好きな処理をさせることができます。でも、これは、プロセッサ自体のハードウェアのロジックが変わっているわけではありません。パソコンのプロセッサが、あるプログラムを動かすときには Intel アーキテクチャで、別のプログラムを動かしはじめたら ARM アーキテクチャで、またあるときには RISC-V アーキテクチャになる、ことはありません。

プログラムを変えると動作は変わるがプロセッサ自体は変わらない

FPGA を使う場合、自分自身で設計したハードウェアロジックを LSI の上に設定して、あたかも、オリジナルの LSI のように処理させることができます。しかも、多くの FPGA は何度でも好きなタイミングでハードウェアロジックを書き換え可能です。そのため、一つの FPGA を色々な用途で利用する、失敗しても簡単にやりなおせるという手軽さがあります。

FPGA では、アプリ向けのハードウェアロジックをあたかもオリジナル LSI のように実現できる

FPGA は何に使う?

自分で設計したハードウェアの実装に使える FPGA は、普通に入手できるプロセッサや LSI では達成できない処理を実現できる可能性をもっています。たとえば、普通のプロセッサは 32ビットや 64ビットのデータに対する演算が用意されていますが、画像処理のプロセッサでは、 赤・緑・青 (RGB) の各 8ビットで合計24ビットという中途半端なビット数のデータを高速に処理する演算があると便利です。

FPGA の利用例には、普通のプロセッサでは達成できない高い計算処理の性能が必要な分野での利用、普通のマイコンでは対応できない程たくさんの入出力を一度に制御するための利用、入力信号に対する信号処理を短い時間で行なう実験装置を実現する例、低消費電力な装置を実現する例などがあります。

「普通のプロセッサではちょっと手に負えないかな」という課題があれば、FPGA を使うことで解決できるかもしれません。

CPUも作れる

CPU、つまり、プロセッサもハードウェアロジックとして FPGA の上に実装できます。いつもの慣れ親しんだパソコン向けにプログラムを書いて実行させるのではなく、自分で作ったプロセッサの上で自分のプログラムを書いて実行させるのも大変楽しいものです。また、すでに販売が終了してしまったゲーム機を自らの手で蘇らせるという試みに挑戦している人も沢山います。産業用途でも、生産中止になってしまったプロセッサを置き換えるために FPGA が使われています。

FPGA の中には、ハードウェアロジックを構成するための構成要素 (ロジックスライスとかアダプティブロジックモジュールとか呼ばれる) が沢山敷き詰められています。構成要素に適切な値を設定 (コンフィギュレーション) し、また構成要素同士を接続することで、実現したいハードウェアロジックを FPGA の上に実現します。とはいえ、人間が一つ一つの構成要素のことを考える必要はありません。プログラムのような設計言語と開発ツールを使うことで、ハードウェアロジックを FPGA の構成要素の設定データに変換できます。

FPGA の制限

ユーザが設計したハードウェアロジックを実装できる FPGA ですが、制限もあります。それは規模速さです。LSIのサイズは有限なので、搭載されている素子の数も決まってきます。そのため、 FPGA の中に搭載されている素子の個数を越える大規模なハードウェアロジックを実装することはできません。

また、 FPGA の上で動くハードウェアロジックの速さや電子信号の伝達速度にも制限があります。大きなハードウェアロジックではたくさんの構成要素を必要とします。その場合、少し遠い構成要素同士を一緒に使わないといけなくなり、信号の伝達に時間がかかってしまいます。つまり、ハードウェアロジックの動作が遅くなります。

FPGA は構成要素がたくさん並んでいる LSI です。そのため、 LSI の上に直接ハードウェアロジックを実装する場合 (特定用途向け集積回路とか Application Specific Integrated Circuit, ASIC とかと呼ばれるハードウェアを開発する場合) と比べて、性能と回路密度の点での不利になる覚悟が必要です。およそ、FPGA の性能と回路密度の上限は共に ASIC と比較して 1/10程度のようです。

プロセッサ 内蔵 FPGA のススメ

アプリケーションに必要な機能を全部 FPGA に実装できれば、システムはすっきりします。でも、実際に FPGA を使う場面では、アプリケーションにボトルネックがあって、そこだけ FPGA に実装したいことも多いものです。そういう、処理の一部分の実装にだけ FPGA を使いたい、という要求に応えてくれるデバイスがプロセッサ内蔵 FPGAです。

プロセッサ内蔵 FPGAでは、一つの LSI に ASIC として作られたプロセッサとプログラマブルロジックの両方が搭載されています。プロセッサはプログラマブルではない専用回路として実装されているのでそこそこ高速です 。 プロセッサとプログラマブルロジックの間は、データのやりとりや共有ができるように高速なインターフェース (I/F) で接続されます。

プロセッサ内蔵 FPGA では、プロセッサとプログラマブルロジックが一つの LSI に

プロセッサのスペック

2020年3月現在、入手しやすいプロセッサ内蔵 FPGA には 600MHz から 2GHz 程度の動作周波数で動作するプロセッサとして ARM アーキテクチャの Cortex-A9 あるいは Cortex-A53 が搭載されています。メモリは別途に接続する必要がありますが、 512MB から 4GB 程度の容量のメモリが接続されているケースが多いです。たとえば、下の写真の FPGA ボード PYNQ-Z1 では、 512MB のメモリがプロセッサ内蔵 FPGAに接続されています。

プロセッサ内蔵 FPGA を搭載したボードの例

プロセッサ内蔵 FPGA は、プロセッサの上でアプリケーションソフトウェアを直接的に実行させる (ベアメタル実行と呼びます) ことはもちろん、 オペレーティングシステムとして Linux を動作させることもできます。また、通信のためのイーサネット、ディスプレイ出力のためのHDMI、USB ホストやシリアルポートなどの入出力装置 (I/O) が搭載されています。そのため、ネットワーク経由で プロセッサ内蔵 FPGA を利用したり、ラズベリーパイ (ARMプロセッサを搭載するシングルボードのコンピュータシステム) のような小型の Linux 実行環境ボードとして利用することもできます。

プロセッサ内蔵 FPGA の上で Linux が動作している様子

プロセッサ内蔵 FPGA の活用パターン

プロセッサ内蔵 FPGA は、プロセッサとプログラマブルロジックが一つの LSI にパッケージされていて、しかも高速なインターフェースで接続されているためデータの共有も簡単です。プロセッサだけ、あるいはプログラマブルロジックだけを使うというのは勿体ない話です。

プロセッサのソフトウェアとプログラマブルロジックを協調して動作させるスタイルは、次の3つに大きく分けられます。

  1. ソフトウェアの一部の処理をプログラマブルロジックにオフロードして高速化する。
  2. プログラマブルロジックがメインで 、 繁雑な設定やユーザーインターフェースをソフトウェアで実装する。
  3. ソフトウェア処理がメインで 、 複雑あるいは制御間隔がクリティカルなI/O操作をプログラマブルロジックに実装する。

1のタイプの開発では OpenCL (と呼ばれるアプリケーションを開発するためのインターフェースの1つ) を使った開発環境が FPGA ベンダによって整えられつつあります。また、アクセラレータ部分の開発に Halide (と呼ばれる画像処理に強いプログラミングの環境) などのドメイン固有言語 (Domain Specific Language, DSL) を活用するケースも出てきており注目が集まっている分野です。

3のケースにロボット制御への活用があります。画像処理などの制御のための分析や判断にかかる処理はソフトウェアで実装し、実際の制御にはプログラマブルロジックを使うというようなケースです。ロボット制御用のフレームワーク ROS (Robot Operating System) を使ってプログラマラブルロジック上のモジュールを制御する試みもすすめられています。

「Python で FPGA を使う」とは?

プロセッサ内蔵 FPGA のプロセッサで Linux が走るので、その上で Python や Ruby、node.js といったスクリプト処理系を実行できます。したがって、ソフトウェア処理を Python で記述しておいて、プログラマブルロジックで実行したい処理を呼び出すこともできます。

もちろん、プログラマブルロジック上のハードウェアロジックはあらかじめ用意しておく必要があります。しかし、必要なハードウェアロジックの実装さえ用意しておけば、FPGA のことをよく知らないソフトウェアプログラマでも FPGA を利用できるというのはとても魅力的です。まずは、Python で FPGA に慣れながら、必要に応じてハードウェアロジックを設計・実装するというステップで FPGA に親しんでいきましょう。Python なので、冒頭で紹介したように Jupyter Notebook を使って Web ブラウザで FPGA を利用できます。

まとめと次回

Python を使って FPGA を手軽に活用できる PYNQ の紹介をしていくコースの第1回として、 FPGA と、このシリーズで利用するプロセッサ内蔵 FPGA を紹介しました。次回は PYNQ って何?をテーマに、Python を使ったプロセッサ内蔵 FPGA の具体的な操作方法を見ていきます。

ACRi ブログでは、実際にハードウェアロジックを開発する手順について紹介するコースも用意されています。自分で ハードウェアロジックを設計してみたい人は、それらの記事も参照してください。また、FPGA について詳しく勉強してみたくなった人には、FPGA の原理と構成がオススメです。中級、上級者向けの書籍ですが、ぜひ手に取ってみてください。

おまけ: 〇〇内蔵 FPGA は時代の流れ?

プロセッサだけではなく、いろいろな特殊なブロックが FPGA に搭載されています。メモリや積和演算器などのアプリケーションの実装に必要で基本的な要素だけではなく、数十Gbps という高速なデータ転送ブロック、100GbE のパケット生成回路、数Gsps の AD コンバータあるいは DA コンバータや行列演算のためのベクトル演算器群などといったモジュールを搭載する FPGA も登場してきています。

オリジナリティが必要な部分は自分でロジックを設計し、性能が不足する部分は内蔵の専用ブロックを使うという FPGA の活用方法が、今後ますます重要になっていくでしょう。

わさらぼ合同会社 三好健文

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