FPGAおよびASIC用の汎用画像処理コアを開発しています。アイデアは、標準のプロセッサをそれに接続することです。私が抱えている問題の1つは、それを「プログラム」する方法です。説明させてください:コアには、私の「カスタム」拡張機能用の命令デコーダーがあります。例えば:
vector_addition $vector[0], $vector[1], $vector[2] // (i.e. v2 = v0+v1)
そしてもっとそのようなものがたくさんあります。この操作は、次のようなプロセッサforループ、非ベクトル操作などを使用して、プロセッサによってバスを介してコアに送信されます。
for (i=0; i<15;i++) // to be executed in the processor
vector_add(v0, v1, v2) // to be executed in my custom core
プログラムはC/C++で書かれています。コアは、マシンコードでの命令自体のみを必要とします
- オペコード=vector_add= 0x12h
- register_src_1 = v0 = 0x00h
- register_src_2 = v1 = 0x01h
register_dst = v2 = 0x02h
マシンコード=opcore| v0 | v1 | v2 = 0x7606E600h
(または何でも、バイナリで命令を構築するためのさまざまなフィールドの単なる組み合わせ)
バスを介してコアに送信すると、コアは専用バスを使用してメモリからすべてのデータを要求し、プロセッサを使用せずにすべてを処理できます。大きな手がかりは、前の命令を16進表現に変換するにはどうすればよいかということです。(バスを介して送信しても問題ありません)。頭に浮かぶいくつかのオプションは
- インタプリタされたコードを実行する(プロセッサで実行時にマシンコードに変換する)->ある種のインラインマクロを使用しても、非常に遅い
- カスタムセクションを外部カスタムコンパイラでコンパイルし、外部メモリからバイナリをロードして、独自の命令でコアに移動します->ソースコードの読み取り/理解が難しい、SDK統合が不十分、コードが非常にセグメント化されている場合はセクションが多すぎる
- JITコンパイル->これだけで複雑になりますか?
- コンパイラの拡張->悪夢!
- ループ、ポインタ、メモリ割り当て、変数など、すべてを処理するためにカスタムコアに接続されたカスタムプロセッサ...->作業が多すぎる
問題はソフトウェア/コンパイラに関するものですが、このトピックに関する深い知識を持っている人にとっては、これはFPGAのSoCであり、メインプロセッサはMicroBlazeであり、IPコアはAXI4バスを採用しています。
正しく説明できたらいいのに…よろしくお願いします!