Vengineerの妄想(準備期間)

人生は短いけど、長いです。人生を楽しみましょう!

Impulse C本、レビュー、いや、内容紹介


Impulse C本、出版C言語による実践的FPGAプログラミングのレビューというより、私の場合は内容紹介です。

最初に、この本は日本語としては、非常に読みやすいと思います。

この本の原書(Practical FPGA Programming in Cは、2005年に出版されています。
今年は2011年ですので、6年も昔です。本当に昔です。
ですから、この本に出てくるFPGAは、XilixnのVIrtex IIやAlteraのStratix(オリジナル)です。
また、開発ツールもその時のバージョンです。この点を除けば、本書はいまでも十分使えます。

アマゾンでは、この本のなか見!にて、目次抜粋をみることができます。

ここに目次を引用します。
目次
  序文
  第1章 コンピューティングプラットフォームとしてのFPGA
  第2章 プログラマブルプラットフォーム小史
  第3章 FPGAアプリケーションのプログラムモデル
  第4章 Impulse C入門
  第5章 FIRフィルタの設計
  第6章 FPGA上のハードウェアの生成
  第7章 ステートメントレベル並列性の増加
  第8章 レガシーアプリケーションのImpulse Cへの移植
  第9章 組み込みテストベンチの作成
  第10章 FPGAを考慮したCの最適化
  第11章 システムレベル並列性の記述
  第12章 組み込みOSとImpulse Cの協調動作
  第13章 マンデルブル画像生成
  第14章 FPGAコンピューティングの将来
  付録A 組み込みFPGAプロセッサの最大限の活用
  付録B streamインターフェースのカスタマイズ
序文から第3章までは、一般的な内容です。
第4章~第8章までは、Impulse Cにおける実装についての説明です。
第9章~付録Bは、Impulse Cを利用したアプリケーションについてです。

第1章の3までは、アマゾンのなか見の抜粋で見ることができますが、
できれば第1章はすべてなか見にしてもいいかもしれません。

第2章はFPGAの歴史です。昔懐かしいPALASMやABELのコードが出てきます。
今でもフラッシュベースのCPLDであれば、ABELのような言語で回路設計している人は少なくないと思います。が、SRAMベースのFPGAはHDL(Verilog HDL/VHDL)での実装が主流でしょう。
Impulse Cは、データの流れ(ストリーム)をベースにしたシステムです。
一方向に個々の処理がなされるような処理をするプロセス間をストリームを使って接続し、データのパイプラインを構成して全体の処理を実行します。

第3章はImpulse Cに導入されているプログラミングモデルについての説明です。
各プロセスはソフトウェアおよびハードウェアにて実装できますが、
シミュレーションでは、すべてのプロセスをソフトウェアにて実行されます。

Impulse C独自の内容については、第4章の「Impulse C入門」で説明しています。
また、ストリームの他に、信号を表現するシグナル、レジスタ、共有メモリについても、
第4章で説明しています。

第5章の「FIRフィルタの設計」は、実際にFIRフィルタをImpulse Cで実装する例です。
ストリームタイプの画像処理の典型例ですね。
シミュレーションは、Visual Studio(Impulse CのツールはWindowsのみをサポート)を使って行います。
各プロセス間のストリームの状態は専用のApplication Monitorを使うことで確認できます。
コンソールベースのシミュレーションだけでなく、Application Monitorのようなツールが
利用できるのは非常に便利です。
Application Monitorは、HDLシミュレータの波形ビューアのようなものですね!

いよいよ第6章では、FPGAへの実装です。
ハードウェアに割りつけられたプロセスはHDLファイルとしてツールから出力されます
生成されるHDLは、入力データおよび出力データのポートに対応した信号群が外部インターフェースとして記述されています。
ハードウェアとしてのストリームのプロトコルを理解するためにHDLシミュレーションを行っています。生成されたHDLがどのようにして動くかを確認するのは非常に重要ですね!
第6章の後半では、ハードウェアに影響を与えるプラグマ(パイプライン、アンロールなど)やStage Master Explorerというツールについての説明です。
このStage Master Explorerに関しては、次の第7章で処理の並列性を抽出し、検証するためにも利用しています。

第8章から第10章はImpulse Cを利用したアプリケーションです。C言語で実装されている暗号化プログラム(Triple-DES)をImpulse Cにて実装するための修正を行います。暗号部をハードウェアとして実装しますので、プロセス(関数)として実装し直し、入出力はストリームに置き換えます。MicroBlaze上ですべてをソフトウェアで実行するより、Virtex IIにてハードウェア実装した方が10.6倍速くなったようです。MicroBlazeでは、Xilinx FSLバスという特殊パスを利用することでMicroBlazeとハードウェアの通信オーバーヘッドを少なくできるようです(私、XilinxのFSLバスっていうの知りませんでした。勉強になりました)。
同じものをVirtex II ProのPowerPCやAlteraのNiosベースに実装した場合は、違った結果が出るでしょう!

第9章では、FPGA内部のプロセッサを使ってテストベンチを作成するというものです。
第8章の暗号化部をソフトウェア(MicroBlazeプロセッサ上で動くプログラム)とハードウエア(FPGA似実装)の結果を比較するものです。

第10章では、第8章の暗号部のプログラムをFPGAでの性能向上のために改良していきます。
5つの改造を行い、ソフトウェア実装に対して10.6倍程度高速だったのが、
最終的には425倍の高速化を実現する。つまり、5つの改良の結果、40倍速くなったということ。

第11章では、RGB24ビットのBMPファイルをエッジ検出したのち、再びBMPファイルするものを題材にエッジ検出を改良していきます。改良は8ビットx3の並列フィルタとパイプライン化です。
FPGAとしては、AlteraのStratixを利用し、NiosにソフトウェアをFPGA分にハードウェアを実装しています。

第12章は、MicroBlazeuClinux上でソフトウェアのテストベンチを動作させ、第11章でFPGAのハードウェアに実装したエッジ検出を行うものです。
uClinuxのTFTPクライアントを利用し、WindowsPC上のTFTPサーバーから画像を入出力します。
簡単なシステムではありますが、デモシステムとしてはわかりやすいものだと思います。
ただし、このデモのプログラムが載っていないのが残念です。

第13章は、あのマンデンブロ集合をFPGAに実装するものです。
C言語のプログラムでは浮動小数点演算を行っていますが、FPGA化するために固定小数点化していきます。
これはハードウェア化ではごく一般的に行われていることですね!
その後、Impulse C対応のためにストリーム対応を行います。

付録については、省略します。

以上、FPGA実践的プログラムの簡単な紹介でした。

Impulse Cは、合成用のC言語ではありません。システム全体を表現できます。
Impulse Cは、ストリームとプロセスという考えで全体を構成します。
プロセスはソフトウェアあるいはハードウェアに実装でき、ハードウェアの割り当ては非常に簡単です。

XilinxとAlteraがARMコアを内蔵したFPGAを出します。
Impulse Cがそれらをサポートすれば、結構いろいろなことが出来ると思います。
また、FPGAの動的再構築と組み合わせることにより、面白いものができると思います。

是非みなさんの試してくださいね。Impulse Cを。

代理店は、インターリンクです。

検証、Verification、HLS、Impulse C