関数がHDLに変換され動作する事を確認しました
前回の確認ではカウントアップした変数のアウトプットのみを確認しました
今回は、インプットも確認してみようと思います
そこでこんな感じのプログラムを書いてみました
#include "HLS/hls.h"
#include <stdio.h>using namespace ihc;
component unsigned int count(unsigned int a, unsigned int b) {
unsigned int cnt;
cnt = a * b;
return cnt;
}int main() {
const int SIZE = 100;
unsigned int result[SIZE];
for(unsigned int i=0; i<SIZE; ++i) {
result[i] = count(i, i+1);
}bool pass = true;
for(unsigned int i=0; i < SIZE; ++i) {
if (result[i] != (i*(i+1))) {
printf("ERROR: Expected %u, found %u\n", i, result[i]);
pass = false;
}
}if (pass) {
printf("PASSED\n");
}
else {
printf("FAILED\n");
}return 0;
}
ビルドして実行
.\build.bat
.\test-fpga.exe
シミュレーションの結果も出ました
ちゃんと掛け算が出来ている様です
ここでふと疑問になったのが、C言語でmain関数部に書かれる引数を用意する部分は
どうやって記述されるのだろうか?という事でした。
延々と自分が記述したテストパターンを繰り返し保存するプログラムが出来ても
使えない訳ですので、counterと言う名前のコンポーネントが独立して使える事を確認しようと思います。
生成されたQuartusPrimeのプロジェクトをコンパイルしてみます
quartus_compileと言うトップモジュールの下にcount_instと言うインスタンスができています
シミュレーションではtbの下にcount_instと言うインスタンスができています
ここが等価になっています
quartus_compileからcount_instまではワイヤー(レジスタ)が直結しています
と言うことは、外部からの入力がなければ何もしない=外部からの入力により動的に動作する様に作られている
トップレベルエンティティの外からデータを与えられる様になっていますね
ここから後2つの事を調べたいと思っています
1つは、データのINPUTからOUTPUTまでの効率をもう少し上げたいと思います
もう一つは、作成されたIPが実際のFPGA上で動作する事です