第二章 FPGA开发流程
FPGA 的设计流程就是利用 EDA 开发软件和编程工具对 FPGA 芯片进行开发的过程。原理图和HDL(Hardware description language,硬件描述语言)是两种最常用的数字硬件电路描述方法。其中,运用 HDL 设计方法具有更好的移植性、通用性以及利于模块划分的特点,在工作学习中被广泛使用。典型 FPGA 的开发流程一般如下图所示,其包括功能定义/器件选型、设计输入、功能仿真、综合优化、综合后仿真、实现、布线后仿真、板级仿真以及芯片编程与调试等主要步骤。
第1节 功能定义/器件选型
在 FPGA 设计项目开始之前需要进行方案论证、系统设计和 FPGA 芯片的选型等准备性工作,在确定并评估好方案后需要进行系统功能的定义和模块的划分。根据方案中任务要求,如方案中所确定的系统功能以及复杂度,对硬件的工作速度和器件自身的资源、成本、以及性能指标等各个方面进行综合考虑,选择出较合适的器件类型。在设计方法上,一般都采用自顶向下的设计方法,首先将整个系统划分成若干个基本模块,然后再将每个基本模块划分为下一层次的基本单元,这样依次划分后确定好各个模块的功能以及各个模块需要设计的输入输出信号,再通过 EDA 工具进行各个模块的设计。最终要实现的目标是:针对每个输入信号,利用 EDA 工具以及 FPGA 的资源设计出需要的输出信号逻辑。
第2节 设计输入
设计输入是指在 EDA 工具中,通过使用该开发软件设计出所希望得到的系统或电路的一个过程。
在日常工作学习中最常使用的方式是通过硬件描述语言(HDL)的方式来描绘设计出最终的数字电路。以此方式设计电路的过程需要在 EDA 软件上通过文本描述,将实际的电路用硬件语言表述出来。设计好文本后,编译器会将硬件语言进行综合、布局布线,最后转换成一个个的逻辑门、寄存器、数据选择器等实际电路。设计师接触比较多的 HDL 语言是行为 HDL,其主流语言是 Verilog HDL 和 VHDL,这两种语言都是 IEEE 的标准,虽然两者在语法结构以及设计标准上存在差别,但是都有一个共同的特点:语言与芯片工艺无关。在任一款 FPGA 芯片上,使用任何一种语言都可以设计出想要的数字电路。
另一种设计方式是使用原理图输入的方法进行设计输入。原理图输入方式是一种最直接的描述方式,通过从元件库中调出来需要的器件,画出原理图。这一方式有点类似于硬件开发过程中设计原理图的过程,其在可编程逻辑阵列发展的前期应用的比较广泛。使用这种方法具有设计直观且易于仿真的优势,但是设计效率不高,且难以维护改动,对模块的构造和重用的支持度极不友好。当芯片升级后,所有的原理图需要重新进行一定的改动,可移植性很差。
除了这 IEEE 标准语言外还有厂商自己的语言,在实际的设计中也可以用 HDL 为主,原理图为辅的混合设计方式,以发挥两者的各自特色与优势。
第3节 功能仿真
功能仿真也称为综合前仿真,用户设计好数字逻辑后需要检查自己的设计是否符合预期,在不需要综合之前通过仿真软件对电路进行逻辑验证。在功能仿真器件电路可以不用考虑延迟等因素,仅对初步的功能进行检验。通过建立测试平台即 Testbench,利用波形编译器(仿真软件)和硬件描述语言建立好波形文件和激励信号,在仿真软件上会模拟实际电路的波形显示出输出波形信号,并生成报告文件。用户通过观察各个时间点信号的变化情况来验证自己所设计逻辑的正确性。综合前仿真在 FPGA 开发过程中不是一定要进行的步骤,但却是极为关键的一步。在实际的工作学习中,充分利用好仿真工具,能够提高设计的效率并及时发现设计缺陷,从而为后续的开发过程提供保障。常用的硬件描述语言的仿真工具有 Model Tech 公司的 ModelSim、VCS、Ncsim 以及 NC-VHDL 等软件。
第4节 综合优化
所谓综合即针对给定的电路实现功能和实现该电路的约束条件,如速度、功耗、成本及电路类型等,通过计算机进行优化处理获得一个能满足上述要求的电路设计方案。也就是说,被综合的文件是HDL 文件(或其他相应文件),综合的依据是逻辑设计的描述和各种约束条件,综合的结果则是一个硬件电路的实现方案,该方案必须同时满足预期的功能和约束条件。对于综合来说,满足要求的方案可能有多个,综合器将产生一个最优的或接近最优的结果。因此,综合的过程也就是设计目标的优化过程,最后获得的结构与综合器的工作性能有关。常用的综合工具有 Synplicity 公司的Synplify/Sy nplify Pro 软件以及各个 FPGA 厂家自己推出的综合开发工具。
第5节 综合后仿真
综合后仿真是用来检查综合结果是否和原设计一致。后仿真与前仿真的区别在于:前仿真是指综合前的仿真,如在 Modelsim 对撰写的代码直接进行仿真,而后仿真是综合后的仿真,也就是功能仿真。假设设计师在 Modelsim 中用 HDL 编写了一个计数器代码,其通过了行为级的仿真后被加载到 quartus 或者其他的综合工具中进行综合,完成综合后会生成功能网表,将行为语言转换成寄存器传送级语言,此时设计师再将其加载到 Modelsim 中进行的仿真被叫做后仿真。后仿真成功后还需要在 quartus 中进行映射和布局布线,并进行时序分析生成时序网表,描述器件里门或者布线的延时。最后将延时网表和功能网表一起加载到 Modelsim 中仿真,这一仿真为门级仿真,而在实际的设计过程中,一般来说不做综合后仿真也不会带来太大的影响。
第6节 布局布线
布局布线可理解为利用实现工具把逻辑映射到目标器件结构的资源中从而决定逻辑的最佳布局,选择逻辑与输入输出功能链接的布线通道进行连线,并产生相应文件(如配置文件与相关报告)。实现是将综合生成的逻辑网表配置到具体的 FPGA 芯片上,布局布线是其中最重要的过程。在完成综合之后,就是相当于有了各种元件,但如何建立元件之间的连接,就像在 PCB 上把元件放在哪里,元
件之间的连接以及相连关系又是怎么样的,这个都是布局布线完成的工作,综合的结果可能每次都一样,但是布局布线的结构基本每次都不会一样。布局将逻辑网表中的硬件原语和底层单元合理地配置到芯片内部的固有硬件结构上,并且往往需要在速度最优和面积最优之间作出选择。布线根据布局的拓扑结构,利用芯片内部的各种连线资源,合理正确地连接各个元件。目前,FPGA 的结构非常复杂,特别是在有时序约束条件时,需要利用时序驱动的引擎进行布局布线。布线结束后,软件工具会自动
生成报告,提供有关设计中各部分资源的使用情况。由于只有 FPGA 芯片生产商对芯片结构最为了解,所以布局布线必须选择芯片开发商提供的工具。
第7节 时序仿真
时序仿真,也称为后仿真,是指将布局布线的延时信息反标注到设计网表中来检测有无时序违规(即不满足时序约束条件或器件固有的时序规则,如建立时间、保持时间等)现象。时序仿真使用布局布线后器件给出的模块和连线的延时信息,在最坏的情况下对电路的行为作出实际地估计。时序仿真使用的仿真器和功能仿真使用的仿真器是相同的,所需的流程和激励也是相同的,唯一的差别是:时序仿真加载到仿真器的设计包括基于实际布局布线设计的最坏情况的布局布线延时,并且在仿真结果波形图中时序仿真后的信号加载了时延,而功能仿真没有。由于不同芯片的内部延时不一样,不同的布局布线方案也给延时带来不同的影响。因此在布局布线后,通过对系统和各个模块进行时序仿真,分析其时序关系,估计系统性能,以及检查和消除竞争冒险是非常有必要的。在功能仿真中介绍的软件工具一般都支持综合后仿真。
第8节 板级仿真与验证
板级仿真主要应用于高速电路设计中,对高速系统的信号完整性、电磁干扰等特征进行分析,一般都以第三方工具进行仿真和验证,在实际的工作中一般接触较少。
第9节 编程和调试
设计的最后一步就是芯片的编程与调试。编程是指将 FPGA 开发工具最后产生使用的数据文件(位数据流文件,Bitstream Generation)加载到 FPGA 芯片中。其中,芯片编程需要满足一定的条件,如编程电压、编程时序和编程算法等,而这些条件一般厂家都会事先完成设计,设计师直接按照规范操作即可。数据文件下载到 FPGA 芯片中以后还需要进行调试验证,逻辑分析仪(Logic Analyzer,LA)便是 FPGA 设计的主要调试工具。使用 LA 需要引出大量的测试管脚,且 LA 价格昂贵,但是当工程较大、所需要调试观察的信号过多时,仍旧需要 LA 来对芯片内部的信号进行观察验证。目前,主流的 FPGA 芯片生产商都提供了内嵌的在线逻辑分析仪(如 Xilinx ISE 中的ChipScope、Altera QuartusII 中的 SignalTapII 以及 SignalProb),它们只需要占用芯片少量的逻辑资源便可达到同样的效果,在实际的工程调试中发挥了极大的作用。
以后将会详细介绍 SIGNALTAP 工具的使用。