Visual Studio Codeを使ってプログラムを設計します。HLSコンパイラは、C言語で書いたプログラムをFPGAに実現するためのコンパイラです。C言語で、FPGAに書き込む回路と、動作検証用のプログラムを書きます。main()ルーチンはCのプログラムの本体が入りますが、HLSコンパイラでは検証用のプログラムを書きます。FPGAの回路は、componentで宣言された関数が回路になりますので注意してください。作ったブログラムファイルを添付しますので参考にしてください。(ダウンロードしてVisual Studio Codeで開きます。)
HLSコンパイラのドキュメントは、ここにありますので参考にしてください。私は、資料を参考にしました。
次のステップで回路設計を行います。
1.Visual Studio Codeの起動
2.プログラム設計(解説)
3.x86-64でのコンパイル検証
4.FPGA用のコンパイル
1.インストール時に作ったシェルをターミナルから次のように起動します。Vidual Studio CodeはLXDEメニューからも起動できますが、ファイルパスなどが切られていないためにHLSコンパイラが動作しない場合がありますので、必ず、シェルを使って起動してください。/home/lubuntuは、ホームディレクトリを指しています。初回起動時は、次のような画面が出てきます。
cd /home/lubuntu sudo chmod +x HLSinitial.sh |
プログラムを設計します。FPGAの回路をcomponentで宣言した関数(メソッド)で書き、検証用のプログラムをmain()に書きます。コマンドのすべての解説できないので、C言語のリファレンスとHLSコンパイラのリファレンスマニュアルを参考にて下さい。
1.プログラムを入力します。次のプログラムを参照してください。
プログラム | おぼえ |
// kinkon Program | |
#include "HLS/stdio.h" | ⇔ HLSコンパイラ用のヘッダファイル |
#include "HLS/hls.h" | |
#include "HLS/ac_int.h" | |
hls_stall_free_return hls_always_run_component | ⇔ hls_stall_free_return とhls_always_run_component の宣言でで入出力の制御が発生しないようにする。 |
component ac_int<2, false> kinkon(bool pushButton) | ⇔ componentで宣言して回路を定義 戻り値がoutputで()内がinput ⇔ ac_int<2, false> は、HLSコンパイラ用の型で 2ビットのunsigned型(false) |
{ | |
static ac_int<2, false> lamp2 = 1; | |
static bool beforButton = true; | |
if(pushButton and !beforButton) | ⇔ ボタンが押されたときにだけランプが変化 |
{ | |
lamp2 += 1; | |
if(lamp2 >= 3) lamp2 = 1 ; | ⇔ 2個のランプのどちらかを点灯するようにする のでlamp2は1または2の値のみ。 |
} | |
beforButton = pushButton; | |
return lamp2; | ⇔ lamp2の値を出力にする。 |
} | |
int main() | ⇔ ここからは検証プログラム |
{ | |
const int SIZE = 100; | ⇔ 100クロック分の検証実施。 |
unsigned int result[SIZE]; | ⇔ この変数に結果を格納。 |
int j = 0; | ⇔ このjは0〜4の値をとり20回繰りかえす。 3と4の時にボタンを押したときの入力。 |
for(int i=0;i | |
{ | |
if(j < 3) | |
{ | |
ihc_hls_enqueue(&result[i], &kinkon, false); | ⇔ ihc_hls_enqueueでcomponentの関数を呼び出す。 第一パラメータは出力(戻り値)、関数、入力。 |
} | |
else | |
{ | |
ihc_hls_enqueue(&result[i], &kinkon, true); | |
} | |
j++; | |
if(j==5) j=0; | |
} | |
ihc_hls_component_run_all(kinkon); | ⇔ ihc_hls_component_run_allまでで、 すべてのシミュレーション終了。 次は、シミュレーション結果の検証。 |
bool passJadge = true; | |
j=0; | ⇔ ここでは、jは0〜9の値。 シミュレーション時には3/5のタイミングで ボタンが押されるので、出力は3/10〜7/10が2に なります。他は1。 |
for(int i=0;i | |
{ | |
if(j>=3 and j <=7) | |
{ | |
if(result[i] != 2) | |
{ | |
printf("Error %d %d time\n",result[i],i); | |
passJadge = false; | |
} | |
} | |
else | |
{ | |
if(result[i] != 1) | |
{ | |
printf("Error %d %d time\n",result[i],i); | ⇔ 予定と違う結果の場合エラーが出るように仕込む。 |
passJadge = false; | |
} | |
} | |
j++; | |
if(j >= 10) j= 0; | |
} | |
if(passJadge) printf("\nPASSED\n"); | ⇔ 100回の検証ですべて正しければ結果はPASSED になって設計通り動作していることを通知。 |
else printf("\nFAILED\n"); | |
return 0; | |
} | |
※インデントをとるために、上のプログラムは全角スペースを使用しています。半角に直さないとコンパイルエラーになる可能性があります。 |
まず、プログラムが正しく動くかどうか、x86-64モードでコンパイル実行をします。main()のプログラムを動作させ検証します。HLSコンパイラでは、gccやg++の代わりにi++を使います。
1.Visual Studio Codeで[表示]-[統合ターミナル]を選択します。
2.下の部分にターミナルが開きますので、次のコマンドを入力してコンパイルします。(kinkon2.cppはさっき保存したプログラムのファイル名です。)
i++ kinkon2.cpp |
次に、FPGA用のコンパイルを行います。これが終了すると、FPGAに書き込むためのQsysファイルが作成されます。
1.下の部分にターミナルが開きますので、次のコマンドをと入力してコンパイルします。"10M08SAU169C8GES"は、Odysseyに使われているMAX10のデバイス名です。
i++ -march="10M08SAU169C8GES" --simulator none kinkon2.cpp |