配列インターフェイスを使用した FIR 関数 - 2023.2 日本語

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

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

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

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

STATIC_PARAM は、FIR の最もスタティックなパラメーターを定義するスタティック パラメーター指定構造体で、

入力データおよび出力データは、配列 (INPUT_DATA_ARRAY および OUTPUT_DATA_ARRAY) として関数に供給されます。最終的なインプリメンテーションでは、FIRT IP のこれらのポートは AXI4-Stream ポートとしてインプリメントされます。データフロー最適化 (set_directive_dataflow) を使用した領域では、配列がストリーミング配列としてインプリメントされるので、AMDでは常に FFT 関数を使用することを勧めします。または、両方の配列を set_directive_stream コマンドを使用してストリーミングとして指定します。

重要: FIR は、パイプラインされた領域では使用できません。高パフォーマンスの演算が必要な場合、FIR の前後でループまたは関数をパイプラン処理し、その領域のすべてのループおよび関数でデータフロー最適化を使用します。

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

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

次のコード例は、2 チャネルで、データがどのようにインターリーブされるかを示しています。最上位関数に入力データのチャネルが 2 つ (din_idin_q) および出力データのチャネルが 2 つ (dout_idout_q) 含まれています。フロントエンド (fe) とバックエンド (be) の 2 つの関数を使用して、FIR 入力配列のデータを正しく並べ、FIR 出力配列からそれを抽出しています。

void dummy_fe(din_t din_i[LENGTH], din_t din_q[LENGTH], din_t out[FIR_LENGTH]) {
    for (unsigned i = 0; i < LENGTH; ++i) {
        out[2*i] = din_i[i];
        out[2*i + 1] = din_q[i];
    }
}
void dummy_be(dout_t in[FIR_LENGTH], dout_t dout_i[LENGTH], dout_t dout_q[LENGTH]) {   
    for(unsigned i = 0; i < LENGTH; ++i) {
        dout_i[i] = in[2*i];
        dout_q[i] = in[2*i+1];
    }
}
void fir_top(din_t din_i[LENGTH], din_t din_q[LENGTH],
             dout_t dout_i[LENGTH], dout_t dout_q[LENGTH]) {   

 din_t fir_in[FIR_LENGTH];
    dout_t fir_out[FIR_LENGTH];
    static hls::FIR<myconfig> fir1;

    dummy_fe(din_i, din_q, fir_in);
    fir1.run(fir_in, fir_out);
    dummy_be(fir_out, dout_i, dout_q);
}