使用 FIR 函数 - 2021.2 Chinese

Vitis 高层次综合用户指南 (UG1399)

Document ID
UG1399
Release Date
2021-12-15
Version
2021.2 Chinese

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_ARRAYOUTPUT_DATA_ARRAY)提供给函数。在最终实现中,FIR IP 上的这些端口将作为 AXI4-Stream 端口来实现。赛灵思建议始终在使用数据流最优化 (set_directive_dataflow) 的区域内使用 FIR 函数,因为这样可确保阵列作为串流阵列来实现。另一种方法是使用 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);
}