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_i
、din_q
) および出力データのチャネルが 2 つ (dout_i
、dout_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);
}