FPGA设计过程可以和采用Altium Designer软件设计PCB的流程进行类比。图2-1所示为FPGA设计流程图。本节只是简单介绍各个设计流程的基本知识,后面再以一个完整的流水灯实例详细讨论FPGA设计过程。
1.设计准备
在进行一个设计之前,总要进行一些准备工作,好比在进行VC软件开发前需要进行需求分析,进行电路板设计前总要明确电路板的功能及对外接口。设计一个FPGA项目就好比设计一块电路板,只是设计的对象是一块芯片的内部功能结构。一个FPGA设计就是一块IC芯片设计,动手进行代码输入前必须明确这块IC芯片的功能及对外接口。电路板的对外接口是一些接口插座及信号线,IC芯片的对外接口反映在芯片的引脚上。FPGA灵活性最直接的体现,即在于每个用户引脚均可自由定义。也就是说,在没有下载程序文件前,FPGA所有引脚均没有任何功能,各引脚是输入还是输出,是复位信号还是LED驱动信号,这些完全由程序文件确定。这种功能对于常规的专用芯片来说是无法实现的。
2.设计输入
明确了设计功能及对外接口后,就可以开始设计输入了。设计输入就是指编写代码、绘制原理图、设计状态机等设计输入工作。当然,对于复杂的设计,在动手编写代码前还需要进行顶层设计、模块功能设计等一系列工作;对于简单的设计来讲就不用那么麻烦了,一个文件即可解决所有问题。设计输入的方式有多种,如原理图输入方式、状态机输入方式、HDL输入方式、IP核输入方式(高效率的输入方式,用经过测试的别人的劳动成果可确保设计的性能并提高设计效率)等。
图2-1 FPGA设计流程图
3.设计综合
大多FPGA设计的教材及参考书在讲解设计流程时,均把设计综合放在功能仿真之后,原因是功能仿真只是对设计输入的语法进行检查及仿真,不涉及具体的电路综合与实现。换句话说,即使写出的代码最终无法综合成具体电路,功能仿真也可能正确无误。作者认为,如果辛辛苦苦写出的代码最终无法综合成电路,即根本是一个不可能实现的设计,那么这种情况下不尽早检查设计并修改,而是费尽心思地追求功能仿真的正确性,岂不是在进一步浪费我们宝贵的时间?所以,在设计输入完成后,先对设计综合一下,看看我们的设计是否能形成电路,再去进行仿真可能会更好些。设计综合就是将HDL、原理图等设计输入翻译成由与门、或门、非门、触发器等基本逻辑单元组成的逻辑连接,并形成网表格式文件,供布局布线器进行实现。FPGA内部本身是由一些基本的组合逻辑门、触发器、存储器等组成的,综合的过程也就是将使用语言或绘图描述的功能电路自动编译成基本逻辑单元组合的过程。这好比用Altium Designer设计时,设计好电路原理图后,要将原理图转换成网表文件,如果没有为每个原理图中的元件指定器件封装,或者元件库中没有指定的元件封装,那么在转换成网表文件并进行后期布局布线时就无法进行下去。同样,如果HDL输入语句本身没有与之对应的硬件实现,自然也就无法将我们的设计综合成正确的电路,这样的设计即使在功能、语法上是正确的,在硬件上却无法找到与之对应的逻辑单元来实现。
4.功能仿真
功能仿真又称为行为仿真,顾名思义,即功能性仿真,用于检查设计输入语法是否正确,功能是否满足要求。由于功能仿真仅仅关注语法的正确性,因而即使功能仿真正确后,也无法保证最后设计实现的正确性。对于高速或复杂的设计来讲,在功能仿真正确后,还要做的工作可能仍然十分繁杂,原因在于功能仿真过程没有用到实现设计的时序信息,仿真延时基本忽略不计,处于理想状态,基本器件的延时正是制约设计的瓶颈。虽然如此,功能仿真在设计初期仍然是十分有用的,一般来讲,一个连功能仿真都不能通过的设计是不可能通过布局布线后仿真的,也不可能实现设计者的设计意图。功能仿真的另一好处是可以对设计中的每个模块进行单独仿真,这也是程序调试的基本方法,底层模块先分别进行仿真调试,再进行顶层模块综合调试。
5.设计实现
设计实现是指根据选定的芯片型号、综合后生成的网表文件,将设计配置到具体FPGA的过程。由于涉及具体的器件型号,所以实现工具只能选用器件厂商提供的软件。AMD的Vivado软件中的实现过程又可分为RTL(Resistor Transistor Logic,寄存器传输级逻辑)分析(RTL ANALYSIS)、综合(SYNTHESIS)、实现(IMPLEMENTATION)和编程调试(PROGRAM AND DEBUG)四个步骤。虽然看起来步骤较多,但在具体设计时,直接单击开发软件环境中的编程下载条目,即可自动完成所有实现步骤。设计实现的过程就好比Altium Designer软件根据原理图生成的网表文件进行绘制PCB的过程。绘制PCB可以采用自动布局布线及手动布局布线两种方式。对于FPGA设计来讲,FPGA实现工具同样提供了自动布局布线和手动布局布线两种方式,只是手动布局布线相对困难得多。对于常规或相对简单的设计,仅依靠开发软件自动布局布线功能即可得到满意的效果。
6.时序仿真
一般来说,无论软件工程师还是硬件工程师,都更愿意在设计过程中充分展示自己的创造才华,而不太愿意花过多的时间去做测试或仿真工作。对于一个具体的设计来讲,工程师们愿意更多地关注设计功能的实现,只要功能正确,差不多工作也就完成了。由于目前设计工具的快速发展,尤其仿真工具的功能日益强大,这种观念恐怕需要进行修正了。对于FPGA设计来讲,布局布线后仿真也叫作后仿真或时序仿真,具有十分精确的器件延时模型,只要约束条件设计正确合理、通过仿真、程序下载到芯片上,基本上也就不用担心会出现什么问题了。在介绍功能仿真时说过,功能仿真通过了,设计还离成功较远,但只要时序仿真通过了,设计离成功就很近了。
7.程序下载
时序仿真通过后就可以将设计生成的芯片配置文件写入芯片中进行最后的硬件调试,如果硬件电路板没有问题,那么在将程序下载到芯片后即可看到自己的设计已经在正确地工作了。
8.程序下载后在线调试
对于规模较小的设计来讲,程序下载后有可能功能正确。对于比较复杂的项目来讲,前期即使进行了详细的仿真,程序下载到芯片上仍然可能会出现各种各样的问题。将程序下载到芯片上实时调试,是FPGA工程师的一项必备技能。FPGA开发环境大多提供了使用灵活方便的在线调试工具,可以实时获取FPGA上电运行时的信号状态。与前面讨论的行为仿真或时序仿真相比,在线调试不仅可以更准确地通过获取芯片内部信号的状态来定位查找问题,而且调试获取信号的速度较快,与电路的实际运行时间相同,而仿真的速度一般要慢得多。当程序规模较大时,几秒钟的仿真波形可能需要几个小时的时间才能被观察到,在线调试则在几秒钟之内就可以获得所需信号的状态。
前面讨论的FPGA设计步骤比较多,实际设计工程中并非都要采用,可根据实际情况进行简化处理。例如,前面提到的时序仿真,虽然时序仿真的模型准确,但仿真速度慢、耗时长。如果工程师对设计的代码有透彻的理解,对代码所形成的电路了然于胸,对代码所形成电路的最高运行速度也有准确的估计,那么时序仿真的必要性就不大了。对于作者本人来讲,后期进行FPGA设计时,几乎不再进行时序仿真了。