HLSコンパイラによるプログラム設計

1.概要

  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用のコンパイル


2.Visual Studio Codeの起動

 1.インストール時に作ったシェルをターミナルから次のように起動します。Vidual Studio CodeはLXDEメニューからも起動できますが、ファイルパスなどが切られていないためにHLSコンパイラが動作しない場合がありますので、必ず、シェルを使って起動してください。/home/lubuntuは、ホームディレクトリを指しています。初回起動時は、次のような画面が出てきます。

cd /home/lubuntu
sudo chmod +x HLSinitial.sh


 

 2.ワークスペースフォルダを決め保存します。[ファイル]-[ワークスペースの保存]でワークスペースフォルダにワークスペースファイルを保存します。私は、/home/lubuntu/Quartus171Project/HLSkinkon2としました。

 3.[ファイル]-[新規ファイル]で新規ファイルを開きます。ファイルは拡張子をcppにして保存します。(私はkinkon2.cppで保存しました。)


3.プログラム設計(解説)

 プログラムを設計します。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;
}


※インデントをとるために、上のプログラムは全角スペースを使用しています。半角に直さないとコンパイルエラーになる可能性があります。


 2.入力が完了したらプログラムを保存します。(変更の度に必ず保存してください。)



4.x86-64でのコンパイル検証

 まず、プログラムが正しく動くかどうか、x86-64モードでコンパイル実行をします。main()のプログラムを動作させ検証します。HLSコンパイラでは、gccやg++の代わりにi++を使います。
 1.Visual Studio Codeで[表示]-[統合ターミナル]を選択します。
 2.下の部分にターミナルが開きますので、次のコマンドを入力してコンパイルします。(kinkon2.cppはさっき保存したプログラムのファイル名です。)

i++ kinkon2.cpp


 3.エラーがなくなるまで、バグを修正してください。
 4.エラーがなくったら、./a.outでプログラムを実行してください。PASSEDと表示されるまでバグを修正してください。
 5.PASSEDと表示されたら次のステップに行きます。




5.FPGA用のコンパイル

 次に、FPGA用のコンパイルを行います。これが終了すると、FPGAに書き込むためのQsysファイルが作成されます。
 1.下の部分にターミナルが開きますので、次のコマンドをと入力してコンパイルします。"10M08SAU169C8GES"は、Odysseyに使われているMAX10のデバイス名です。

i++ -march="10M08SAU169C8GES" --simulator none kinkon2.cpp


 2.エラーがなしで終了すればOKです。


 




   ⇒ Quartusプロジェクトの作成

top