第4章 Impulse C の導入 安達ほのか シグナルやストリーム 、メモリーは型だからそのまま訳す
はじめに Impulse Cは通信プロセスプログラミングモデルを使用することにより、並列で複雑なハードウェア/ソフトウェアアルゴリズムとアプリケーションの開発をサポートすることができる。 Impluse C の起源について ロスアラモス国立研究所のマヤ・ゴーカレー博士 Streams-Cの商用化であり、 FPGAベースの基盤レベルプラットホームで実現のアプリケーションを表現するメソッドを提供。 Streams-Cを使用することで、データ暗号化、イメージプロセッシング、天体物理学などの分野でアプリケーションが開発された。 ※ Streams-C 一般に公開されているC言語のコンパイラ
Impluse CとStreams-Cの相違点 Impluse Cライブラリは標準のC開発ツールを使用することで行動全体をシミュレートすることができる。 Impulse Cライブラリは、独自に連動している過程から成る並行なアプリケーションの編集とシミュレーションをするために、過程インタコネクト(ストリームなシグナルの相互連絡)を定義する機能を含み、スレッドを使用することで複数の過程(デスクトップシミュレーションの目的のための)の動きをエミュレートする。
Impulse Cツールはソフトウェアからハードウェアへのコンパイラを含んでいる。
4.1 Impulse Cの目的 高度な並行動作アプリケーションを可能にすること このマルチプロセッサ(並行アプローチ)はFPGA基盤の 高度な並行動作アプリケーションを可能にすること このマルチプロセッサ(並行アプローチ)はFPGA基盤の 組み込みシステムに適している ストリーム、シグナル、メモリーへのサポートは それぞれのデータタイプに関連付けられたCコンパチブル(互換性 のある)組み込み関数を経由してImpulse Cに提供する。 ハードウェアに写像する過程において、C言語はCの部分集合 に抑制される。一方ソフトウェアの過程は、ホストかImpulse C コンパイラの制限で抑制される。 並行が違う 部分集合とはなんぞや
Impulse Cソフトウェア・ライブラリはコンパイルに ビジュアルスタジオのようなスタンダードC Impulse Cコンパイラはハードウェアの過程のために、指定されたストリーム、シグナル、およびメモリーを実行しながら統合された HDL(ハードウェア記述言語)を作り出す。 コンパイラは命令スケジューリング、ループのパイプライン処理、およびループ変換(プログラムのサイズを犠牲に実行速度を最適化すること)を実行する。 Impulse Cソフトウェア・ライブラリはコンパイルに ビジュアルスタジオのようなスタンダードC 開発ツールを使うと、 Impulse Cアプリケーション の並列な動きのデスクトップエミュレーションや シミュレーションをサポートする。 ループ変換とはなんぞや
Impulse Cライブラリは複数の埋め込みプロセッサにおけるImpulse Cソフトウェア処理の実行をサポートする Xilinx MicroBlazeやパワーPCベースのFPGAsなどの特定のFPGAベースのターゲットに利用可能 ハードウェアがソフトウェア処理に連結しないモジュールを生成するのに使用できる →Impulse Cを利用するために埋め込み プロセッサを必ずしも含む必要はない
4.2 Inpulse Cは、通信プロセスの並行なプログラミングモデルを支持してCコンパチブル事前に定義されたライブラリ関数を使用することで、標準のANSI C(アメリカ国内の工業製品の規格を策定する団体の定めたC言語の規格)を拡張している。 Impulse Cでは、プログラミングモデルは永続的なCサブルーチンとして実装される独自に連動しているプロセスのコミュニケーションのプライマリメソッドとしてバッファリングされたデータ・ストリームの使用を強調する。 ※サブルーチン プログラミングにおいて、コード中で何度も 必要とされる定型的な処理を一つのプログラムに まとめて外部から呼び出せるようにしたもの。
構成されるFlFOsを使用するデータのこのバッファリングで、より高いレベルの抽象化で並列アプリケーションを書くことが可能になる。 Impulse Cは事前に定義されたCコンパチブルというライブラリ関数を使っているスタンダードANSI Cを拡張した。 そのライブラリ関数は、通信プロセスの並列なプログラミングモデルを支持している。 Impulse Cはストリーム指向のアプリケーションのために設計されているが、代替のプログラミングモデルをサポートするほど柔軟性があり、並行で、独自に連動しているプロセスの間の伝達方法としてシグナルと共有メモリの使用を含んでいる。
Impluse Cアプリケーションはデスクトップシミュレーションのために標準C開発ツールでコンパイルできる。 あるいはFPGAターゲットのためにImpluse Cコンパイラ でコンパイルできる。 Impulse Cコンパイラは、Impulse Cプログラムを適切な低レベル表現に翻訳して、最適化する。 そしてそれはFPGAへと統合できるVHDLハードウェア 記述と、広く利用可能なCクロスコンパイラの使用で 支持されたマイクロプロセッサにコンパイルできる スタンダードCを含んでいる。 完全なImpulse C環境はImpulse Cアプリケーションが標準のデスクトップコンパイラで編集されて、作成されるのを許容するライブラリのセットからなる。
4.3 HelloFPGAとは どういったプログラム? ソフトウェアテストベンチの関係
4.3 Impulse Cのプログラミング例① HelloFPGA _sw.c① 伝統的なプロセッサの上で動くソフトウェアを表す アプリケーションの一部 →伝統的はプロセッサとは? 目標システムの一部である埋め込み型プロセッサ デスクトップシミュレーションの間、ソフトウェアテストベンチ(試作品)として使用されるプロセッサ 結局何やってんの?あとあの図を解説する
HelloFPGA _sw.c② コメントヘッダ このプログラムにおける簡潔な説明 #include… マクロを含んでいる コメントヘッダ このプログラムにおける簡潔な説明 #include… co.hファイルはImpulse C関数ライブラリーを表す宣言と マクロを含んでいる extern co_architecture… 関数co_initialize(初期設定)の宣言 main関数で参照されるかもしれないので、アプリケーション のコンフィギレーション(構成)関数と同じファイルに 入っていなければならない特殊関数。
HelloFPGA _sw.c③ void Producer ソフトウェアソフトベンチのインプット側を表す いくつかの試験データ(この場合、“Hello FPGA!”という 文字を詳細に説明するキャラクタの簡単なストリーム) を生成 プロセス自体は、いくつかの宣言と、入力文字列を通して 繰り返しそして出力文字列として宣言されたストリームへと 文字を書きだす内部コードの繰り返し co_stream_open,co_stream_write,co_stream_close ImpulseCはこのようなプロセス走行関数定義を、 ハードウェアやソフトウェアの中で実際の実現や 具体化から引き離す。
HelloFPGA _sw.c④ void Consumer ソフトウェアテストベンチのアウトプット側を表す。 Producerプロセスのように、このプロセスはデータ ストリーム経由でアプリケーション(特にテストされる ハードウェアモジュール)の他の部分と相互に作用する。 また、キャラクタがモジュールでテストで生成されている 限り、このプロセスはinpute_streamからキャラクタを 読み込ませる内部コードのループをする。
HelloFPGA _sw.c⑤ main メイン関数。主な機能は単にコンソールに メッセージを表示することと、Impulse C関数である メイン関数。主な機能は単にコンソールに メッセージを表示することと、Impulse C関数である co_initializeとco_executeを呼び出すことで アプリケーションを実行する co_initialize あらゆるImpulse Cアプリケーションの必要な部分 (詳細は後に述べる) co_execute アプリケーションと、自身の構成するプロセスを実行する Impulse Cライブラリの関数
Impulse Cのプログラミング例② HelloFPGA_hw.c① HelloFPGA_hw.cはFPGA上で動くハードウェアを表すアプリケーションの一部が書かれている。 #Include… co.hファイルを読み込んでいる Extern宣言 HelloFPGA_sw.cで定義されたProducerとConsumer プロセスのための宣言。コンフィギュレーション関数は これらが処理する参照が必要なので、ここで必要となる。 Pruducer , Coustmer
HelloFPGA_hw.c② void DoHello プロセス走行関数。このプロセス走行関数は二つのストリーム プロセス走行関数。このプロセス走行関数は二つのストリーム オブジェクトを受け入れる。その片方である入力ストリームは、 8ビットの文字値の入ってくるストリームを表す。 このストリームはProducerプロセスの出力に関連づけられる。 もう片方の出力ストリームは処理データを表している。 そのデータもまた8ビットの文字値である。 このストリームはConsumerプロセスに関する入力ストリームに 関連づけられる。Consumerプロセスのように、データが入力に 現れる限り、このプロセスは入力ストリームを作動させる内部 コードをループする。 このストリーム操作はImpulse C関数である以下の co_stream_open, co_stream_read,co_stream_write, co_stream_closeを用いて説明される。
HelloFPGA_hw.c③ void config_subroutine このco_process_create関数コールはこのプロセスの インスタンスを一つ作成し、そのプロセスインスタンスの 名前を示す。このプロセスは実際に受信データで 何もしない。代わりに、入力ストリームに現れる各値は すぐに、co_stream_writeを通して出力ストリームに 書かれる。 void config_subroutine コンフィギュレーションサブルーチンは,アプリケーションの 構造をプロセスがどう相互接続されていることになっているか 使われたプロセスの観点から定義する。このコンフィギュ レーションサブルーチンは、3つのプロセスインスタンスを 作成するためにco_process_create関数を使う。そのイン スタンスは producer, consumer, helloという名が与えられる。
HelloFPGA_hw.c④ データをproducerからhelloへ、またhelloからconsmerへ それぞれ2つのストリームを作成するために co_stream_create関数を使った。最後に、明確に述べる ためにプロセスコンフィギュレーション関数の co_process_configを使った。 3つのプロセスのうちの一つ、helloは目標FPGAを表す PEOと呼ばれるハードウェアリソースに割り当てられる ことになっている。
HelloFPGA_hw.c⑤ co_archtecture co_initialize… コンフィギュレーションサブルーチンのように、 co_initialize関数はあらゆるImpulse Cアプリケーションで 必要とされる。この関数の中ではco_architecture_create 関数への唯一の呼び出しです。その関数は前もって アプリケーションの目標アーキテクチャへ(この場合では ジェネリックハードウェア・ソフトウェアプラットフォーム)の コンフィギュレーション関数を関連付けます。(特定の プログラム可能な編集の目標になるプラットフォームは ハードウェアコンパイラ設定の一部としてアプリケーション ソースファイルの外で定義される。)