管当今的高性能FPGA具有专用硬件来实现乘累加(MAC)等数字信号处理(DSP)算法基本构建模块,但设计人员还需要在寄存器传送级(RTL)上加速算法的实现。那么,如何才能从ANSI C++建模算法迅速转换到运行在FPGA硬件中的RTL呢?本文告诉你。
Stratix III FPGA芯片图。
StratixIV FPGA芯片图。
在本文第四部分的讨论中,我们将讨论Stratix III FPGA的主要技术优势。在接下来的第五部分讨论中,我们将介绍Altera加速库函数以及如何使用这些加速库函数重新编写FIR源代码。
Catapult综合Altera加速库提供C++函数库,直接映射到Altera FPGA专用硬件资源。表1、表2和表3列出了Altera器件使用的所有库。
表1:所有Stratix和Cyclone器件支持的函数。
表2:Stratix和Stratix II器件支持的其他函数。
表3:Stratix III器件支持的其他函数。
当Catapult工程中含有加速库时,C++函数被绑定至Catapult库运算符,这些运算符相应地绑定至参数化RTL模块,例化并配置专用Altera器件DSP宏。如果工程中不包含库,直接对C++代码综合,使用户能够将设计重新定位到其他没有内置DSP硬件的器件。
如图3所示,通过包含模板函数C++头文件来访问C++中的Altera加速库。用户利用模板函数来指定数据位宽度等参数,以及流水线寄存器等硬件参数。同时支持整数和定点Algorithmic C数据类型模板函数。
图3: Altera操作符流程图。
一个实例函数是Alt_4Mult_add,它将Stratix III DSP模块配置为4个18x18乘法器,以及随后的两个加法器级。
#pragma map_to_operator "Alt_4mult_add"
template bool sign_a, int width_b, bool sign_b>
ac_int Alt_4mult_add
(
ac_int a0, ac_int b0,
ac_int a1, ac_int b1,
ac_int a2, ac_int b2,
ac_int a3, ac_int b3
)
{
return ((a1*b1 + a0*b0) + (a3*b3 + a2*b2));
}
“map_to_operator”编译语句说明如果有加速库,该函数直接映射至硬件。模板参数包括以下行为:
· use_extra_input_reg – 在DSP模块之外加入其他的输入寄存器,以解决走线延时时序问题。
· use_mult_reg – 寄存乘法器输出。有效值是0 (无寄存器)或者1 (一个寄存器)。
· output_register – 设置输出寄存器的数量。有效值是0 (无寄存器)或者1 (一个寄存器)或者2 (两个寄存器)。
· Width_a – A输入位宽度。最大支持18位位宽。
· Sign_a – 输入的符号。
· Width_b - B输入位宽度。最大支持18位位宽。
图4所示为Altera Stratix III DSP模块,以及怎样根据C++函数模板参数来配置它。
图4:Altera DSP模块Alt_4mult_add结构。
使用Altera加速库函数很容易重新编写FIR源代码:
#include
#include "Altera_accel.h"
#include "stdio.h"
#define NUM_TAPS 32
#pragma design top
void fir_filter (ac_int<18> *input, ac_int<18> coeffs[NUM_TAPS], ac_int<18> *output ) {
static ac_int<18> regs[NUM_TAPS];
ac_int<38> temp = 0;
int i;
SHIFT:for ( i = NUM_TAPS-1; i>=0; i--) {
if ( i == 0 )
regs[i] = *input;
else
regs[i] = regs[i-1];
}
MAC:for ( i = 0; i< NUM_TAPS; i+=4) {
temp += Alt_4mult_add<1,1,1>(
coeffs[i],regs[i],
coeffs[i+1],regs[i+1],
coeffs[i+2],regs[i+2],
coeffs[i+3],regs[i+3]);
}
*output = temp>>18;
}
在上面的FIR实例中,只需要指定寄存器设置的模板参数。模板匹配自动置入宽度和符号模板参数。
· 库C++模板函数
· 通过模板参数配置DSP模块
· 使用ac_fixed数据类型进行饱和以及取整运算
在接下来的第六部分讨论中,我们将讨论固定走线延时时序问题以及加速库的按键式验证,敬请留意。