ストリーミング インターフェイスを使用し、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_fe
と process_be
のループにループ巻き戻しを適用する必要があることがあります。