• 官方微信

    CA800二维码微平台 大视野

  • 工控头条

    CA800二维码工控头条App

当前位置:自动化网>自动化文库>技术指导>基于FPGA的高性能图像处理硬件实现须知(五)

基于FPGA的高性能图像处理硬件实现须知(五)

发布时间:2009-12-31 来源:中国自动化网 类型:技术指导 人浏览
分享到:
关键字:

FPGA DSP 图像处理 信号处理

导读:

管当今的高性能FPGA具有专用硬件来实现乘累加(MAC)等数字信号处理(DSP)算法基本构建模块,但设计人员还需要在寄存器传送级(RTL)上加速算法的实现。那么,如何才能从ANSI C++建模算法迅速转换到运行在FPGA硬件中的RT...

管当今的高性能FPGA具有专用硬件来实现乘累加(MAC)等数字信号处理(DSP)算法基本构建模块,但设计人员还需要在寄存器传送级(RTL)上加速算法的实现。那么,如何才能从ANSI C++建模算法迅速转换到运行在FPGA硬件中的RTL呢?本文告诉你。

Stratix III FPGA芯片图。
Stratix III FPGA芯片图。

StratixIV FPGA芯片图。
StratixIV FPGA芯片图。

在本文第四部分的讨论中,我们将讨论Stratix III FPGA的主要技术优势。在接下来的第五部分讨论中,我们将介绍Altera加速库函数以及如何使用这些加速库函数重新编写FIR源代码。

Catapult综合Altera加速库提供C++函数库,直接映射到Altera FPGA专用硬件资源。表1、表2和表3列出了Altera器件使用的所有库。

 表1:所有Stratix和Cyclone器件支持的函数。
表1:所有Stratix和Cyclone器件支持的函数。

 表2:Stratix和Stratix II器件支持的其他函数。
表2:Stratix和Stratix II器件支持的其他函数。

 表3:Stratix III器件支持的其他函数。
表3:Stratix III器件支持的其他函数。

当Catapult工程中含有加速库时,C++函数被绑定至Catapult库运算符,这些运算符相应地绑定至参数化RTL模块,例化并配置专用Altera器件DSP宏。如果工程中不包含库,直接对C++代码综合,使用户能够将设计重新定位到其他没有内置DSP硬件的器件。

如图3所示,通过包含模板函数C++头文件来访问C++中的Altera加速库。用户利用模板函数来指定数据位宽度等参数,以及流水线寄存器等硬件参数。同时支持整数和定点Algorithmic C数据类型模板函数。

 图3: Altera操作符流程图。
图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结构。
图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数据类型进行饱和以及取整运算

在接下来的第六部分讨论中,我们将讨论固定走线延时时序问题以及加速库的按键式验证,敬请留意。








本文地址:本文地址: http://www.ca800.com/apply/d_1nrutga2l1e52_1.html

拷贝地址

上一篇:解决工业马达软启、晃电、断电及无扰流切换问题

下一篇:风电技术之3种方法结合为风电场选址

免责声明:本文仅代表作者个人观点,与中国自动化网无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容!