#pragma HLS loop_tripcount min=<int> max=<int> avg=<int>

当HLS不知道相应的循环上界,无法确定时延(运行循环所需要的周期)

可以运用tripcount指令,或者将上限定义为c中的宏。 tripcount指令可以定义一个最小或者平均或者最大的循环上限,它表示循环迭代的次数。

void foo (num_samples, ...) {
  int i;
  ...
  loop_1: for(i=0;i< num_samples;i++) {
   #pragma HLS loop_tripcount min=12 max=16
   ...
    result = a + b;
  }
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这段代码是一个用于实现FIR滤波器的函数。下面是对每个部分的详细注释: ```cpp #include "./fir.h" ``` 这行代码包含了一个名为"fir.h"的头文件,用于定义FIR滤波器所需的数据类型和常量。 ```cpp coef_t c[N]; ``` 这行代码定义了一个长度为N的系数数组c,用于存储滤波器的系数。 ```cpp void fir(data_t *y, data_t x) ``` 这行代码定义了一个名为fir的函数,它接受一个指向输出结果y的指针和一个输入x作为参数。 ```cpp #pragma HLS ARRAY_PARTITION variable=c complete dim=0 ``` 这行代码使用HLS指令,将系数数组c按照完全分区的方式进行分区。 ```cpp static data_t shift_reg[N]; ``` 这行代码定义了一个静态的长度为N的移位寄存器数组shift_reg,用于存储滤波器的历史输入数据。 ```cpp #pragma HLS ARRAY_PARTITION variable=shift_reg complete dim=0 ``` 这行代码使用HLS指令,将移位寄存器数组shift_reg按照完全分区的方式进行分区。 ```cpp acc_t acc; int i; acc = 0; ``` 这行代码定义了一个累加器acc和一个整型变量i,并将累加器初始化为0。 ```cpp #pragma HLS PIPELINE II=1 ``` 这行代码使用HLS指令,指示编译器将以下for循环展开为流水线,每个步骤的间隔为1个时钟周期。 ```cpp for (i = N - 1; i >= 0; i--) { if (i == 0) { acc += x * c[0]; shift_reg[0] = x; } else { shift_reg[i] = shift_reg[i - 1]; acc += shift_reg[i] * c[i]; } } ``` 这段代码是FIR滤波器的核心算法部分。它使用一个for循环遍历滤波器的系数数组和移位寄存器数组,根据当前的系数和移位寄存器的值计算累加器的值,并更新移位寄存器中的值。 ```cpp *y = acc; ``` 这行代码将累加器的值赋给输出结果y。 ```cpp void fir_wrap(data_t *y, data_t *x, int len, coef_t *coef) ``` 这行代码定义了一个名为fir_wrap的函数,它接受指向输出结果y、输入x、输入长度len和系数数组coef的指针作为参数。 ```cpp #pragma HLS INTERFACE m_axi port=coef offset=slave depth=99 #pragma HLS INTERFACE m_axi port=x offset=slave depth=100 #pragma HLS INTERFACE m_axi port=y offset=slave depth=100 #pragma HLS INTERFACE s_axilite port=len bundle=CTRL #pragma HLS INTERFACE s_axilite port=return bundle=CTRL ``` 这段代码使用HLS指令,定义了函数fir_wrap的接口。它指定了系数数组coef、输入数组x和输出数组y的访问方式和传输深度,以及输入长度len和返回值的传输方式。 ```cpp data_t res; for (int i =0; i < N; i++) { #pragma HLS PIPELINE II=1 c[i] = *coef++; } ``` 这段代码使用一个for循环将系数数组coef的值赋给数组c。在循环中使用HLS指令,将赋值操作展开为流水线,每个步骤的间隔为1个时钟周期。 ```cpp for (int i = 0; i < len; i++) { #pragma HLS PIPELINE II=1 fir(&res,*x++); *y = res; y++; } ``` 这段代码使用一个for循环对输入数组x中的每个元素进行滤波操作,并将结果存储在输出数组y中。在循环中使用HLS指令,将滤波操作展开为流水线,每个步骤的间隔为1个时钟周期。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值