ストリーミング インターフェイス使用した FIR 関数 - 2023.2 日本語

Vitis 高位合成ユーザー ガイド (UG1399)

Document ID
UG1399
Release Date
2023-12-18
Version
2023.2 日本語

ストリーミング インターフェイスを使用し、config 入力を使用しない run() 関数は、次のように HLS 名前空間で定義されます。

 void run(
 hls::stream<in_data_t> &in_V,
 hls::stream<out_data_t> &out_V);

config 入力を使用する場合、次のように定義されます。

 void run(
 hls::stream<in_data_t> &in_V,
 hls::stream<out_data_t> &out_V,
 hls::stream<config_t> &config_V);

FIR 関数は、HLS 名前空間で定義され、次のように呼び出すことができます。

// Create an instance of the FIR
static hls::FIR<STATIC_PARAM> fir1;
// Execute the FIR instance fir1
fir1.run(INPUT_DATA_STREAM, OUTPUT_DATA_STREAM);

STATIC_PARAM は、FIR の最もスタティックなパラメーターを定義するスタティック パラメーター指定構造体で、入力データおよび出力データは hls::stream<> として関数に供給されます。FIRT IP のこれらのポートは AXI4-Stream ポートとしてインプリメントされます。

AMDでは、set_directive_dataflow または #pragma HLS dataflow を使用してデータフロー領域で FIR 関数を常に使用することを推奨しています。

重要: FIR は、パイプラインされた領域では使用できません。高パフォーマンスの演算が必要な場合、次の例のように、FIR の前後でループまたは関数をパイプラン処理し、その領域のすべてのループおよび関数で DATAFLOW プラグマまたは指示子を使用します。

FIR のマルチチャネル機能は、シングル入力およびシングル出力ストリームのデータをインターリーブすることでサポートされます。

  • 入力ストリームのサイズは、すべてのサンプル (num_channels * input_length) に十分な大きさである必要があります。
  • 出力ストリームのサイズは、すべての出力サンプル (num_channels * output_length) を含めるように指定する必要があります。

次のコード例は、FIR IP ファンクションの使用方法を示しています。

template<typename data_t, int LENGTH>
void process_fe(data_t in[LENGTH], hls::stream<data_t> &out)
{
    for(unsigned i = 0; i < LENGTH; ++i)
        out.write(in[i]);
}

template<typename data_t, int LENGTH>
void process_be(hls::stream<data_t> &in, data_t out[LENGTH])
{
    for(unsigned i = 0; i < LENGTH; ++i)
        out[i] = in.read();
}

// TOP function
void fir_top(
    data_t in[FIR1_LENGTH],
    data_out_t out[FIR2_LENGTH])
{

    #pragma HLS dataflow

    hls::stream<data_t> fir1_in;
    hls::stream<data_intern_t> fir1_out;
    hls::stream<data_out_t> fir2_out;

    // Create FIR instance
    static hls::FIR<config1> fir1;
    static hls::FIR<config2> fir2;

    //==================================================
    // Dataflow process
    process_fe<data_t, FIR1_LENGTH>(in, fir1_in);
    fir1.run(fir1_in, fir1_out);
    fir2.run(fir1_out, fir2_out);
    process_be<data_out_t, FIR2_LENGTH>(fir2_out, out);
    //==================================================
}
ヒント: FIR の実行中にバブルが発生しないようにするには、 config_dataflow -fifo_depth コマンドを使用して、FIFO の深さがデータフロー領域のデータ スループットに十分であることを確認する必要があります。また、PIPELINE プラグマまたは指示子で説明されるように、process_feprocess_be のループにループ巻き戻しを適用する必要があることがあります。