5000字!FPGA开发必须知道的五件事
5000字!FPGA开发必须知道的五件事
FPGA(Field Programmable Gate Array 现场可编程门阵列)是一种可以重构电路的芯片,是一种硬件可重构的体系结构。它是在PAL(可编程阵列逻辑)、GAL(通用阵列逻辑)等可编程器件的基础上进一步发展的产物,是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。
鉴于其可编辑,更灵活;产品上市时间短,节省了ASIC流片周期;避免一次性工程费用,用量较小时具有成本优势等特点,FPGA现已广泛应用于原型验证、通信、汽车电子、工业控制、航空航天、数据中心等领域。
一、FPGA的技术发展历程
FPGA技术从发明到现在已经经历了三十多年的发展历程,其核心价值是可编程性和灵活性。随着工艺技术、系统设计和应用创新的不断进步,FPGA技术也在不断创新和集成,实现了从逻辑器件到系统平台的转变。
根据智慧芽研发情报库生成的技术路线图可见,在近十多年间,随着5G、人工智能、云计算等新技术的快速发展和广泛应用,对于FPGA等可编程逻辑器件的需求也越来越大,代表性技术详见下图:
为了解决系统设计问题,FPGA越来越多地整合系统模块:高速收发器、存储器、DSP处理单元和完整处理器。同时还进一步集成了重要控制功能:比特流加密与验证、混合信号处理、电源与温度监控以及电源管理等。这些特性在Xilinx的Zynq系列和Intel的Arria系列中得到了充分体现。同时,器件也推动了工具的发展。系统FPGA需要高效的系统编程语言,现可利用OpenCL和C语言以类似软件的流程来编程。FPGA正在越来越多地取代传统上ASIC,在小批量、个性化的产品市场方面具有明显优势。
二、FPGA的基本架构
自Xilinx公司于1984年发明了世界首款基于SRAM可编程技术的FPGA至今,FPGA的基本架构已经确定,主要包括以下几个部分:
可编程输入输出单元(IOB):IOB是FPGA与外部设备进行信号交互的接口,可以支持多种电气标准和协议,如LVCMOS、LVDS、PCIe等。IOB可以配置为输入、输出或双向模式,可以实现信号缓冲、锁存、延迟等功能。
可配置逻辑块(CLB):CLB是FPGA实现逻辑功能的基本单元,每个CLB由两个SLICE组成,每个SLICE包含4个LUT(查找表)、8个寄存器、3个MUX(多路选择器)和一个CARRY4(进位链)。LUT可以实现任意6输入1输出的布尔函数,也可以用作分布式RAM或移位寄存器。寄存器可以实现数据锁存和同步功能。MUX可以将LUT扩展为7输入或8输入的选择器。CARRY4可以实现高速的加法、减法、比较等算术运算。
嵌入式块RAM(BRAM):BRAM是FPGA内部提供的大容量存储资源,可以用作数据缓存、队列、FIFO等应用。BRAM有18K和36K两种规格,可以配置为不同的位宽和深度,支持单口或双口模式,也可以级联成更大的存储空间。
布线资源:布线资源是FPGA内部连接各种资源的网络,包括水平布线、垂直布线、长线、超长线等不同类型和长度的布线。布线资源通过开关矩阵(switch matrix)进行连接和分配,开关矩阵由可编程的开关组成,可以实现灵活的布线方案。
底层内嵌功能单元:底层内嵌功能单元是FPGA内部提供的一些特殊功能模块,如数字时钟管理(DCM)、相位锁定环(PLL)、延迟锁定环(DLL)、全局时钟网络(GCLK)、全局置位网络(GRST)等。这些功能单元可以实现时钟生成、分频、相位调整、延迟补偿、时钟分配、复位分配等功能,提高了FPGA的性能和稳定性。
内嵌专用硬核:内嵌专用硬核是FPGA内部集成的一些专用功能模块,如乘法器、除法器、DSP(数字信号处理器)、微处理器、PCIe控制器、以太网控制器等。这些硬核可以提供高效的计算和通信能力,降低了FPGA的逻辑资源消耗和功耗。
三、FPGA开发流程
FPGA的开发流程是利用EDA(Electronic Design Automation)开发软件和编程工具对FPGA芯片进行开发的过程,主要步骤如下:
1)功能定义/器件选型:这个步骤主要进行方案验证、系统设计和FPGA芯片选型等准备工作。根据任务要求,评估系统的指标和复杂度,对工作速度和芯片本身的资源、成本等方面进行权衡,选择合理的设计方案和合适的器件类型。这个阶段往往会花费大量的时间,这个阶段之后一般已经完成了系统建模,功能划分,模块划分以及设计文档的撰写等工作。
2)设计输入:这个步骤是将划分好的各功能模块用硬件描述语言(HDL)表达出来,常用的硬件描述语言有Verilog HDL和VHDL。以后的教程中我们主要讲解如何使用Verilog HDL进行FPGA设计。设计输入方式有三种形式:IP核、原理图、HDL。IP核是实现一定功能的模块,可以形成一个项目。原理图是一种最直接的描述方式,在可编程芯片发展的早期应用比较广泛,它将所需的器件从元件库中调出来,画出原理图。HDL是利用文本描述设计,可以分为普通HDL和行为HDL。普通HDL有ABEL、CUR等 ,支持逻辑方程、真值表和状态机等表达方式, 主要用于简单的小型设计 。而在中大型工程中,主要使用行为HDL,其主流语言是Verilog HDL和VHDL 。这两种语言都是美国电气与电子工程师协会 (IEEE)的标准,其共同的突出特点有:语言与芯片工艺无关,利于自顶向下设计,便于模块的划分与移植,可移植性好,具有很强的逻辑描述和仿真功能,而且输入效率很高。
3)功能仿真:这个步骤是在编译之前对用户所设计的电路进行逻辑功能验证,此时的仿真没有延迟信息,仅对初步的功能进行检测。仿真前,要先利用波形编辑器和HDL等建立波形文件和测试向量 (即将所关心的输入信号组合成序列),仿真结果将会生成报告文件和输出信号波形,从中便可以观察各个节点信号的变化。如果发现错误,则返回设计修改逻辑设计。
4)逻辑综合:这个步骤是将高级抽象层次的语言描述转化成较低层次的电路结构。也就是说将硬件描述语言描述的电路逻辑转化成与门、或门、非门、触发器等基本逻辑单元的互连关系,也就是我们常说的门级网表。综合是创造性的转化过程,它不但能翻译我们的电路,还能够优化我们的电路,比如去除电路描述中冗余的电路结构,或者复用功能相同的电路结构。综合的目标和要求可以通过约束文件来指定,比如时序约束、面积约束、功耗约束等。
5)前仿真:这个步骤也叫做综合后仿真,仿真时,把综合生成的标准延时文件反标注到综合仿真模型中去。因为综合后只能体现基本的逻辑门之间的互连关系,并不是实物电路,没有连线长度信息,所以前仿真只能评估门延时带来的影响,不能估计路径延时,前仿真结果和布线后实际情况还有一定的差距,并不十分准确。目前的综合工具较为成熟,一般的设计可以省略这一步。但如果布局布线后发现电路功能与设计意图不符,就需要回溯到前仿真来确定问题所在。
6)实现与布局布线:这个步骤是将综合生成的逻辑网表配置到具体的FPGA芯片上,布局布线是其中最重要的过程。布局将逻辑网表中的硬件原语和底层单元合理地配置到芯片内部的固有硬件结构上,并且往往需要在速度最优和面积最优之间作出选择。布线根据布局的拓扑结构,利用芯片内部的各种连线资源,合理正确地连接各个元件。布局布线后就可以进行静态时序分析了,静态时序分析的方法是在布局布线后的实际电路中寻找寄存器和寄存器之间的最长路径延迟,通过最大延迟可以得出系统最大时钟速率。
7)后仿真:这个步骤也称为时序仿真,是将布局布线的延时信息反标注到设计网表中来检测有无时序违规现象(即不满足时序约束条件或者器件固有的时序规则,如建立时间、保持时间等)。经过布局布线后,门与门之间的连线长度也确定了,所以后仿真包含的延迟信息最全,也最精确,能更好地反映芯片的实际工作情况。
8)板级仿真与验证:这个步骤主要应用于高速电路设计中,对高速系统的信号完整性、电磁干扰等特征进行分析。板级仿真需要利用专业的软件工具和仪器设备来进行。
9)芯片编程与调试:这个步骤是设计的最后一步,将EDA软件产生的数据文件(位数据流文件)下载到FPGA芯片中,进行实际的测试。芯片编程需要满足一定的条件,如编程电压、编程时序和编程算法等方面。调试时,需要利用逻辑分析仪、示波器等仪器设备来观察和分析芯片的工作状态,检查是否有功能错误或性能问题,如果有,就需要返回到前面的步骤进行修改和优化。
四、FPGA的设计方法和技巧
FPGA的设计方法有两种:自上而下和自下而上。自上而下是指从整体功能出发,逐步细化到各个模块,再实现每个模块的细节。这种方法有利于保持设计的一致性和完整性,但可能导致资源浪费和性能降低。自下而上是指从最基本的模块开始,逐步组合成复杂的功能,再整合到整体设计中。这种方法有利于优化资源和性能,但可能导致设计的复杂度和难度增加。无论采用哪种方法,都需要注意以下几个技巧:
1)遵循良好的编码规范:编码规范是指一套约定俗成的编写HDL代码的规则和习惯,它可以提高代码的可读性、可维护性和可重用性,也可以避免一些常见的错误和问题。一些常用的编码规范有:使用有意义的变量名、注释和空格;使用一致的缩进和对齐方式;使用明确的赋值语句和运算符优先级;使用合理的信号类型和范围;使用同步复位和时钟边沿触发等。
2)使用层次化和模块化的结构:层次化和模块化是指将一个复杂的设计分解为若干个相对简单的子模块,然后将这些子模块按照一定的逻辑关系连接起来,形成一个完整的设计。这样做可以提高设计的清晰度和可管理性,也可以方便地进行测试、修改和重用。一些常用的层次化和模块化的方法有:使用顶层模块、中间层模块和底层模块;使用总线、接口和协议;使用库、包和组件等。
3)利用参数化和生成语句:参数化和生成语句是指使用一些特殊的语法或关键字来定义一些可变的参数或条件,然后根据这些参数或条件来生成不同的代码或结构。这样做可以提高代码的灵活性和通用性,也可以减少代码的冗余和重复。一些常用的参数化和生成语句有:使用generic、parameter、define等定义参数;使用for loop、generate、case等生成结构等。
4)避免时序冒险和组合逻辑回路:时序冒险是指由于信号在不同路径上传输延迟不同,导致输出信号在一个时钟周期内发生多次跳变或错误变化的现象。组合逻辑回路是指由于信号在多个组合逻辑门之间形成环路,导致输出信号依赖于自身状态而不稳定或振荡的现象。这些现象都会影响FPGA的正确性和稳定性,甚至导致硬件损坏或故障。一些常用的避免时序冒险和组合逻辑回路的方法有:使用同步设计原则;使用触发器、锁存器、寄存器等存储元件;使用延迟器、滤波器、去抖动器等处理元件;使用状态机、计数器、定时器等控制元件等。
5)使用有效的调试手段:调试是指在设计过程中检查和修正错误或问题的过程,它是保证FPGA正确工作的重要环节。调试可以分为软件调试和硬件调试两种。软件调试是指在仿真环境中使用一些工具或方法来观察和分析FPGA的运行情况,找出潜在的错误或问题。硬件调试是指在实际的硬件设备上使用一些工具或方法来观察和分析FPGA的运行情况,找出实际的错误或问题。一些常用的调试手段有:使用断点、单步执行、变量监视、波形显示等软件工具;使用示波器、逻辑分析仪、信号发生器等硬件工具;使用测试平台、测试向量、测试套件等测试方法等。
五、FPGA技术研发趋势
如今,FPGA技术依然在不断演进,主要从以下四个维度在不断突破研发瓶颈。首先,制程技术的进步:制程技术是影响FPGA性能、功耗、成本和可靠性的重要因素。随着制程技术的不断发展,FPGA可以采用更小的晶体管尺寸,从而提高集成度、降低功耗、缩小芯片面积、提高运行速度和信号完整性。目前,主流的FPGA厂商如赛灵思(Xilinx)和英特尔(Intel)已经推出了基于7nm和10nm工艺的FPGA产品,未来还有望进入5nm甚至3nm工艺。
第二,系统级集成的需求:随着应用领域的不断拓展,FPGA需要与其他类型的芯片进行系统级集成,以提供更强大和更灵活的功能。例如,在人工智能、云计算、边缘计算等领域,FPGA需要与CPU、GPU、DSP、ASIC等芯片进行协同计算,以提高性能和效率。为了实现系统级集成,FPGA需要采用更先进的封装技术,如2.5D或3D堆叠技术,以实现高密度、高带宽和低延迟的互连。
第三,平台化和可编程性的提升:为了满足不同应用场景和用户需求,FPGA需要提供更高层次的抽象和可编程性,以降低开发门槛和时间。例如,赛灵思推出了ACAP(Adaptive Compute Acceleration Platform)平台,它是一种新型的FPGA架构,可以通过软件工具和库来配置和优化不同类型的计算引擎,如逻辑、存储、DSP、AI等。ACAP平台可以实现更快速、更灵活、更智能的计算加速。
第四,新兴应用领域的驱动:随着科技的进步和社会的发展,FPGA面临着新兴应用领域的挑战和机遇。例如,在5G通信、物联网、自动驾驶、医疗设备等领域,FPGA需要提供更高的带宽、更低的延迟、更强的安全性和更好的适应性。为了适应这些应用领域,FPGA需要不断创新和优化其架构、功能和接口。
身为FPGA开发大军的一员,希望本文给你带来了或多或少的帮助。FPGA作为一种灵活、高效的数字电路解决方案,在各个领域发挥着越来越重要的作用。未来,我们可以期待更多更先进的FPGA应用出现,为我们的生活带来更多的改变和便利。