集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 820|回复: 0

闲谈我眼中的FPGA与DSP

[复制链接]
羽蒙 发表于 2014-8-7 14:08:11 | 显示全部楼层 |阅读模式
DSP和FPGA是嵌入式开发处理器的三大巨头之二,很多刚刚接触嵌入式的朋友都会心存疑问,到底DSP和FPGA哪个牛一点,学哪种好一点?FPGA与DSP相比较,哪个更有前途?今天,我就以自己的经验,和大家通俗介绍一下吧:
FPGA是英文Field Programmable Gate Array(现场可编程门阵列)的缩写,它是在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(digital singnal processor)是一种独特的微处理器,有自己的完整指令系统,是以数字信号来处理大量信息的器件。一个数字信号处理器在一块不大的芯片内包括有控制单元、运算单元、各种寄存器以及一定数量的存储单元等等,在其外围还可以连接若干存储器, 并可以与一定数量的外部设备互相通信,有软、硬件的全面功能,本身就是一个微型计算机。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平方)时间,当窗口较大时计算量很大,较费时。

(原文件名:c0ede33e-2caa-4f78-9ba8-256692c19d8d.jpg)
以下是采用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行…..
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2024-12-26 02:43 , Processed in 0.055519 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表