医疗电子技术网|技术阅读
登录|注册

您现在的位置是:医疗电子技术网 > 技术阅读 > FPGA会不会取代DSP?对比两者后明白了...

FPGA会不会取代DSP?对比两者后明白了...

广告

DSP这几年有点背,逐渐远离主流话题,所以有人就有了这样的问题:


DSP会被FPGA取代吗?
 知乎网友有如下的评论:独立的DSP不会被FPGA替代,但是会被增强了信号处理功能的ARM处理器替代。现在基本已经是这个趋势,DSP变成ARM的一个协处理器。FPGA会挤压掉DSP的一部分高速信号处理的市场。(网友其实我是老莫) 在高端领域基本都用FPGA了。通讯、雷达、视觉、航空都是如此。DSP由于性能和灵活性比FPGA差太多,只能往低端领域渗透。说个不中听的话 DSP就是贵一点、快一点的单片机,大部分DSP还没目前手机上的多核arm快,你自己实际(注意是实际不是理论)写个算法一测便知。另外DSP的优化也很浪费时间,有这个功夫还不如用gpu了,比DSP不知道快多少倍。性能能和FPGA能拼的只有gpu。但是目前的嵌入式gpu内存带宽和输出延迟严重拖后腿,功耗发热巨高,所以目前FPGA才是嵌入式高端领域的王者。(网友黄宇) DSP只是一种技术,硬件上的DSP,可以说是一种称谓。传统意义上的DSP迟早是要退出江湖的。因为通用架构目前基本已经满足设计需求了。(网友陈上天)


看来也没什么确切的答案。

那我们就来比较下FPGA和DSP。FPGA在PAL、GAL、PLD等可编程器件的基础上进一步发展的产物,是专用集成电路(ASIC)中集成度最高的一种。FPGA采用了逻辑单元阵列LCA(Logic Cell Array)这样一个新概念,内部包括可配置逻辑模块CLB(Configurable Logic Block)、输出输入模块IOB(Input Output Block)和内部连线(Interconnect)三个部分。用户可对FPGA内部的逻辑模块和I/O模块重新配置,以实现用户的逻辑。它还具有静态可 重复编程和动态在系统重构的特性,使得硬件的功能可以像软件一样通过编程来修改。作为专用集成电路(ASIC)领域中的一种半定制电路,FPGA既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。可以毫不夸张的讲,FPGA能完成任何数字器件的功能,上至高性能CPU,下至简单的74电路,都可以用FPGA来实现。FPGA如同一张白纸或是一堆积木,工程师可以通过传统的原理图输入法,或是硬件描述语言自由的设计一个数字系统。通过软件 仿真,我们可以事先验证设计的正确性。在PCB完成以后,还可以利用FPGA的在线修改能力,随时修改设计而不必改动硬件电路。使用FPGA来开发数字电 路,可以大大缩短设计时间,减少PCB面积,提高系统的可靠性。 DSP是一种独特的微处理器,有自己的完整指令系统,是以数字信号来处理大量信息的器件。一个数字信号处理器在一块不大的芯片内包括有控制单元、运算单元、各种寄存器以及一定数量的存储单元等等,在其外围还可以连接若干存储器, 并可以与一定数量的外部设备互相通信,有软、硬件的全面功能,本身就是一个微型计算机。DSP采用的是哈佛设计,即数据总线和地址总线分开,使程序和数据 分别存储在两个分开的空间,允许取指令和执行指令完全重叠。也就是说在执行上一条指令的同时就可取出下一条指令,并进行译码,这大大的提高了微处理器的速 度 。另外还允许在程序空间和数据空间之间进行传输,因为增加了器件的灵活性。其工作原理是接收模拟信号,转换为0或1的数字信号,再对数字信号进行修改、删除、强化,并在其他系统芯片中把数字数据解译回模拟数据或实际环境格式。它不仅具有可编程性,而且其实时运行速度可达每秒数以千万条复杂指令程序,远远超过通用微处理器,是数字化电子世界中日益重要的电脑芯片。它的强大数据处理能力和高运行速度,是最值得称道的两大特色。由于它运算能力很强,速度很快,体 积很小,而且采用软件编程具有高度的灵活性,因此为从事各种复杂的应用提供了一条有效途径。根据数字信号处理的要求
上面都是一些基本概念的介绍,下面我就来通俗介绍一下,在DSP里,你是一个软件设计者,硬件已经完全固化,你所要做的,就是在这个固定的硬件平台实现其功能的最优化,一般TI的DSP涉及最多的是一些基本的BIOS操作系统之间的任务调度,以及算法改进与优化等待, DSP的关键优势包括其对于新型及复杂算法时的更短的开发时间,以及能够运行多种算法的灵活性。
而对于FPGA来说,你是一个硬件设计者,FPGA就是一张白纸,上面写什么,画什么都取决于你。同样一片FPGA,菜鸟和高手实现的功能会是天壤之别,FPGA的最大优势在于硬件实现已及通过并行处理实现的效率增益。使用FPGA,您大多的时间并非进行算法设计与优化,而是逻辑设计与时序约束等等。
下面再举一个最通俗的例子,同样使用FPGA与DSP,对图像进行处理,这里的算法采用中值滤波,中值滤波是数字图像处理中十分常见也是非常有用的一种图像处理算法,其基本步骤如下:

中值滤波法将每一象素点的灰度值设置为该点某邻域窗口内的所有象素点灰度值的中值.


实现方法:1 通过从图像中的某个采样窗口取出奇数个数据进行排序
2  用排序后的中值取代要处理的数据即可


中值的计算在于对滑动窗口内像素的排序操作。要进行排序,就必须对序列中的数据像素做比较和交换,数据元素之间的比较次数是影响排序速度的一个重要因素。传统的排序串行算法是基于冒泡排序法,若窗口内像素为m个,则每个窗口排序需要做m(m-2)/2次像素的比较操作,时间复杂度为O(M平方) 。此外,常规的滤波算法使窗口每移动一次,就要进行一次排序,这种做法实际上包含了大量重复比较的过程。若一幅图像的大小为N*N ,则整个计算需要O(M平方)时间,当窗口较大时计算量很大,较费时。


以下是采用TI C6000系列的DM642上,采用内联函数优化过的中值滤波算法void IMG_median_Row( const unsigned short *restrict i_data, int n, unsigned  short *restrict o_data){    const    int     *line0,       *line1,       *line2;    int              *line_y;    int              i;    unsigned int     R00,          R10,          R20;    unsigned int     R01,          R11,          R21;    unsigned int     x0_01,        x1_01,        x2_01;    unsigned int     R_max1,       R_min1,       R_min2;    unsigned int     row0_pk,      row1_pk,      row2_pk;    unsigned int     min_max,      med_med,      max_min;    unsigned int     med_max1,     med_min1,     med_min2;    unsigned int     median2;     line0  = (int *) i_data;    line1  = (int *) (i_data + n);    line2  = (int *) (i_data + n * 2);    line_y = (int *) o_data;     R00    = 0x00000000;    R10    = 0x00000000;    R20    = 0x00000000;     _nassert(          n       >= 4);    _nassert(          n  % 4  == 0);    _nassert((int) line0  % 8  == 0);    _nassert((int) line1  % 8  == 0);    _nassert((int) line2  % 8  == 0);    _nassert((int) line_y % 8  == 0);     #pragma MUST_ITERATE(2,,2)    #pragma UNROLL(2)    for (i = 0 ; i < n; i += 2)    {                 x0_01    = *line0++;        x1_01    = *line1++;        x2_01    = *line2++;          R_max1   = _max2(x0_01,x1_01);          R_min1   = _min2(x0_01,x1_01);        R_min2   = _min2(R_max1,x2_01);         R01      = _max2(R_max1,x2_01);        R11      = _max2(R_min1,R_min2);        R21      = _min2(R_min1,R_min2);         row0_pk  = _packlh2(R01,R00);        row1_pk  = _packlh2(R11,R10);        row2_pk  = _packlh2(R21,R20);            min_max  = _min2(R00,R01);        min_max  = _min2(min_max,row0_pk);          med_max1 = _max2(R10,R11);        med_min1 = _min2(R10,R11);        med_min2 = _min2(med_max1,row1_pk);        med_med  = _max2(med_min1,med_min2);         max_min  = _max2(R20,R21);        max_min  = _max2(max_min,row2_pk);         med_max1 = _max2(min_max,med_med);        med_min1 = _min2(min_max,med_med);        med_min2 = _min2(med_max1,max_min);        median2  = _max2(med_min1,med_min2);         *line_y++ = median2;             R00 = R01;        R10 = R11;        R20 = R21;        }} void MedianFliter(const unsigned short *restrict Image_In, unsigned short *restrict Image_Out,int Row,int Column){    int i;                                        for(i = 0; i < Row; i++)     {       IMG_median_Row((Image_In+ i * Column), Column, (Image_Out+ i * Column));      }}再看看ALTERA FPGA实现的中值滤波,共用LE 692个,FIFO,D触发器若干,代码约4000行….. 

对比一下速度,3*3 中值滤波器,图像大小1024*768,灰度图像。
执行效果 DSP——帧延时>1帧,计算时间:未优化前C代码,24毫秒;算法流程,循环等优化后 7毫秒;内联函数优化后 1.6毫秒 线性汇编优化后 272微秒。

执行效果 FPGA——帧延时=2行像素,计算时间由输入时钟定,如果像素时钟大于50M整个图像处理时间不足1微秒,但是像素时钟受整个系统时序的约束,过快会使逻辑工作在不稳定状态。


现在大家估计也知道FPGA与DSP的最大区别了吧,呵呵。DSP——编程速度快,方便,适合做算法验证,如果想用好DSP,那么大部分时间都在做算法与语言优化工作。FPGA——编程速度慢,实现麻烦,不适合做算法验证,但是一旦实现后,可以进行流水线操作,延时非常低。综上所述,FPGA与DSP优缺点十分明显,所以现在音视频处理,移动通信或者整个通信行业等大量信号处理的工程项目中,流行的解决方案都是FPGA+DSP,FPGA做逻辑控制,DSP做浮点算法,如果算法不是很占资源的,也有直接用FPGA来做的,但两大FPGA厂商都最近都推出了带DSP平台的FPGA产品,以后FPGA与DSP的界限将越来越模糊,会慢慢的合二为一, 总之,目前而言,由DSP和FPGA结合而成的混合式方案常常能够为高性能多处理应用提供最好的方案,让每个器件都发挥其作用。FPGA和DSP是两项互补的技术,而不是互相竞争的对手。对于长远来看,我认为是个殊途同归的过程,最后的产物,到底叫FPSP 还是叫DSGA,那就要看各位IC厂商的造化了,呵呵……

广告

关于立创商城

立创商城(WWW.SZLCSC.COM)是嘉立创集团旗下一家品种齐全、自营库存、质量有保障的电子元器件垂直商城,自建6000多平米现代化元器件仓库,现货库存超35000种。立创商城所有元器件均由原厂或代理商正规渠道采购,保证原装正品。

采购元器件推荐上立创商城,注册后可领取15元无门槛使用优惠券,如需业务编号请填写“N”,或直接点击阅读原文