如果说用一个词来描述FPGA的特性,灵活性肯定名列前茅。
FPGA的灵活性在于:
(一)I/O的灵活性,其可以通过其I/O组成各种接口与各种器件连接,并且支持不同的电气特性。
(二)内部存储器灵活性,可以通过IP生成工具生成各种深度和宽度的RAM或者FIFO等。
(三)逻辑的灵活性,内部逻辑通可生成的各种类型IP。
对于I/O接口来说,FPGA的I/O可以支持不同类型的电平和驱动能力,各I/O未定义之前其地位平等,例如一个数据信号可将其约束在任意引脚,只要其电平符合连接的规范。因此硬件工程师基于这种认识,在PCB布线时,基于布线需要,便调整其布线的顺序,例如互换两个信号的位置。通常情况上,这种调整是没有任何问题的。但是随着FPGA的接口IP核硬核化的趋势,逐渐由很多的接口IP不能支持这种调整。例如对于较早的SDRAM或者DDRSDRAM来说,在xilinx和ALTERA的FPGA上,其数据、地址信号等都是可调的。但是随着DDR2,DDR3接口的出现,其IP接口,只能支持在某个BANK并且例化结束后直接生成相应的约束文件,而这些的改动将会导致布局布线的错误。另一些例子则是一些高速SERDES的组合。例如对于XAUI接口来说,其硬核IP(ALTERA)上就不支持4组SERDES的顺序互换,这将会影响其硬核FCS的编码。如果板级连接上与PHY的顺序与FPGA例化IP的约束不一致,则其硬核PCS就不能布局布线通过(软核FCS可以支持调整)。这种灵活性认识导致硬件板级互联的问题可谓屡见不鲜,特别是系统复杂度的上升,板级连线的增加,将会导致设计人员疏忽从而掉入“灵活性的陷阱”。解决此类问题的方法。包括(1)预评估,在设计之前就在FPGA上评估所需的接口的逻辑占用、约束位置、时钟需求等等,预先评估给系统设计提供相应的数据支撑和设计参考。(2)沟通,对于设计的变更,要进行有效沟通,不能使铁路警察,各管一段。(3)设计评审,虽然老套,但每个环节上的评审能有效减少掉入类似陷阱的几率。
对于内部存储资源,大多数FPGA工程师就是拿来就用的状态。而缺少整体内部memory规划,一般来说,对于单端口、双端口、假双端口,各型芯片手册中都有明确的定义,例如xilinx的SPATAN3系列中最小RAM单元为18K。一个RAM例化最小单位就是18K。而新的器件中最小单位一般为9K。也就是说虽然工程师例化的较小的RAM,例如256*16.只有4K,但是其也占用一个最小单元,根据器件的不同而不同。而乱用双端口导致RAM资源的过分占用则是更常见的设计问题。FPGA内部对于单个RAM能够支持的真双端口是有限制的。举例说明,对于ALTERA的9K的存储单元一般支持512*18的双端口RAM。但如果是一个256*32的双端口则需要占用2个9K的存储RAM。也就是说,RAM器件的能力是有限的,这取决于RAM的外部互联线是有限的,以刚才说的256*32的双端口RAM来说,其需要数据线就是64根(双端口),对于单个RAM的连线资源来说,这是FPGA内部逻辑资源难以承受的。所以根据器件特定,合理规划内部memory资源,才能在最大限度的达到高效的利用。
FPGA内部可以例化各型IP,基于IP的复用的可以大大增加研发的进度。但是各种IP的互联之间则需对IP的特性了解清楚,明确IP是否为业务所需的IP。有的IP和工程所需可能只是名称一致,但其功能却不是你想要的。例如网口IP在MII连接方式下,是用于FPGA连接PHY的操作。如果FPGA与CPU通过MII连接,现有的IP则难以满足需求。这是因为MII连接PHY其所有的时钟都是PHY提供的。CPU的设计也是与PHY连接,其时钟也有PHY提供。而如果二者连接,就变成都等着对方提供时钟,则就变成没有时钟。这种调试问题相对来说容易解决,不过在系统规划是,就需要对整个IP是否能够满足系统的设计要求,有着明确的判断。
灵活性是FPGA最大的特性,在设计中避开那些灵活性的陷阱,才能从FPGA整体上提升设计能力,而不是做只会写Verilog的码农。毕竟FPGA设计不是软件设计,其最终要成为变成硬件承载的,每一行语句都要考虑其综合后的电路,才能真正领会FPGA设计的精髓。