然而,FPGA 并不是万能的。相对于串行结构处理器,其设计的灵活性是以工作量的增加为代价的。FPGA 与 ARMDSP(如下图所示)的比较如下。
 
第一,从语言本身的差异来看,基于 Verilog HDL 和 VHDL 的硬件语言与 C/C++相比,在代码灵活性、开发效率等方面还有较大差距。通常一段十几行的 C 语言代码使用硬件语言实现后,代码量会增加到几十行之多。同时,在进行硬件语言描述时,一个合格的 FPGA 工程师不仅要实现相应的逻辑功能,还要在头脑里浮现编写的代码所生成的逻辑结构,并考虑到门延时对系统时序的影响。这样才能够设计出稳定高效的逻辑结构,减少后期时序调整的工作。
 
 
第二,从资源配置来看,ARM、DSP 等处理器集成了运算单元、存储单元及大量的总线接口,工程师通过正确配置各个寄存器参数后即可使总线接口工作在相应的模式下。而 FPGA 内部为大量逻辑资源,总线接口需根据需要自行设计,其内部仅有部分专用模块,如 PLL、DSP 单元等。由于在一个由 FPGA 搭建的系统中,众多接口需要自行设计,因此会占用开发者大量的时间。
 
第三,从工作频率来看,ARM、DSP 等处理器采用的是成熟的内核结构,具有较好的时序特性,其最高频率通常为 600MHz~1.25GHz。为提高处理能力,TI 等芯片厂商采用多核的设计方式,设计了具有 8 核 DSP、8 核 ARM 的处理器,每个核心的最大工作频率可 达 1.25GHz,通过设置可以开启和关闭其中的内核来灵活地协调功耗与处理能力之间的矛盾。目前 TI 公司正在设计具有 8 核 ARM+8 核 DSP 的处理器,来满足高速系统中集中运算的需求。而在 FPGA 的设计中,不同的系统具有不同的最高工作频率,该频率可以在编译报告中获得。对于 Altera 公司的 FPGA,通过 TimeQuest 工具调整时序,可以提升设计工程的最高频率。一个具有良好设计的 FPGA 工程的最高频率可达 150MHz 以上。
 
第四,从执行方式来看,基于嵌入式平台的 C/C++语言在已有的硬件结构中执行,只需正确配置相关寄存器即可。而使用硬件语言的设计需自行设计硬件结构,在生成结构前还要经过前仿真、综合、布局布线、后仿真等步骤,开发周期较长。这一情况在较为复杂的 FPGA 工程设计中尤为严重。例如,一个添加了 4 个 DDR2 的 IP 的工程在 i5 处理器、4G 内存的计算机上,编译时间甚至在 20min 以上。
 
第五,从算法应用来看,ARM、DSP 等处理器中集成了加法器、乘法器等运算单元,尤其是在 DSP 中,可以在一个周期内进行 8×8 位甚至 16×16 位的乘法运算。同时,这些处理器还支持浮点运算能力。而 FPGA 对这部分运算并不擅长,即使在较为简单的加法运算中,若进行加法的两个数据具有较高的位宽,由于传统的加法中的进位方式是串行结构,所以在其生成的结构中会产生较长的门延时,从而会降低时序的余量,甚至会降低系统编译后的最高工作频率。
 
第六,从算法设计来看,在 ARM、DSP 等处理器中设计算法前,需要提前构思算法的流程图,然后进行代码的编写。而在 FPGA 设计中,主要包含三种设计方式:面向状态的设计,面向活动的设计和面向结构的设计。
 
(1)面向状态的设计是以状态机为代表的设计方式,即通过控制信号和时序信号触发状态机进行状态的迁移。状态机的设计是 FPGA 开发中必不可少的环节,这部分内容将  在 7.2.2 节中详细叙述。
 
(2)面向活动的设计是以数据流和流程图为代表的设计方式。尤其是在传输系统、实时算法设计中,常使用基于数据流的设计方式。常见的数据流的操作方式包括数据的寄存器同步缓冲、数据传递、数据运算与流水设计、数据的存取等。
 
(3)面向结构的设计常用于较大的系统设计中,用于描述模块与模块、单元与单元之间的互联关系,主要包括数据信号与控制信号。根据不同的层次描述,主要可以分为系统级结构描述、寄存器级结构描述、门级结构描述等。
 
为了解决这些硬件工程师所面临的问题,Altera Xilinx 等 FPGA 公司不遗余力地对开发平台进行了完善,如下以 Altera 的解决方案为例。
 
针对第一点提及的设计语言的问题,Altera 推出了 Qsys(SOPC)等片上软核,使工程师在 FPGA 中同样可以使用更为灵活的 C 语言进行编程。Qsys(SOPC)中包含了片内、片外存储器、定时器及各种接口等 IP,使工程师可以按需定制自己的片内处理器。使用这种方式,在一定程度上缓解了硬件描述语言开发周期过长的缺点,也成为一种对 FPGA 系统进行前期功能验证的有效手段。
 
针对第二点提及的通用模块或接口占用开发周期的问题,Altera 和供应商设计了大量具有知识产权的 IP(Intellectual Property,知识产权),包括运算类、通信类、数字信号处理类、门类、输入 / 输出类、接口类、JTAG 扩展类、存储类等多种类别。这些 IP 是经过严格测试和优化过的,其中部分 IP 免费,上面提到的 SOPC 中应用的大部分 IP 都是免费的。
 
值得注意的是,尽管大部分基本功能的 IP 可以在不同系列的 FPGA 间通用,依然有一些 IP 并不支持所有系列的 FPGA,使用这些 IP 在不同系列的 FPGA 间进行工程移植时需要注意。所使用的 IP 是否支持当前芯片,可以在 Quartus II 的 MegWizard 管理器中查阅,也可以在官网中查阅。
 
对于第三点提到的工作频率的问题,不同的处理器具有不同的应用领域。在高速数据处理过程中,ARM、DSP 等固然可达到较高的工作频率,然而相对于 FPGA,其高速的优势仅体现在串行结构的算法中。在 FPGA 的设计中,可利用其硬件设计的灵活性,采用并行算法或将串行算法改造为并行算法,然后在 FPGA 中实现。经测试,在工作频率为 1GHz 的 DSP 中(TMS320C6416),对 SDRAM 中分辨率为 2048×2048 的图像进行中值滤波后重新写入 SDRAM,耗时为 7s;而在 FPGA 中,完全可以在图像输入时进行实时处理,仅消耗几个时钟周期的处理,近似可认为 0 延时—实时。
 
对于第四点提及的编译时间过长的问题,Altera 致力于开发新版本的平台,提升编译效率的同时,增加了增量编译的功能。配合区域锁定,可以锁定已编译过且在后续修改中没有改动过的模块,对这部分模块不进行重新编译,从而可减少编译时间。
 
针对第五点提及的运算能力的问题,Altera FPGA 中内嵌了多个 DSP 块。每个 DSP 块中包含加法器和乘法器结构,根据系列不同,具有不同的数据位宽。多个 DSP 块中的加法器和乘法器可以互相拼接,从而支持更高位宽的运算。结合相关的运算类 IP,可以流水线的形式完成运算,每个周期输出一次计算结果。表 1.10 为 Cyclone III 系列 FPGA 的资源列表。可以看到,与 DSP 相比,Cyclone III 的乘法器资源还是比较丰富的,这使得在 FPGA 内部进行并行运算成为可能。
 
 
最后,Altera 又推出了嵌入了双核 28nm 的 ARM Cortex-A9 的 FPGA,同时以足够的 DSP 块和足够的乘法器资源,完善了 FPGA+DSP+ARM 架构,并以单片 SoC FPGA 的模式,解决了过往 FPGA 力所不能及的缺陷,解决了未来多 IC 集成的前瞻性问题,如图 1.28 所示。而这却仅仅只是一个开始,在未来 Altera FPGA 的发展中,更多的以实现 FPGA+DSP+ARM 为架构,并行实现高速运算,解决过去的难题,不断地突破极限。在未来的数字系统设计中,这必然是一种趋势。