当前位置:首页 > 新闻资讯 > FPGA之家动态 >

干货 | FPGA开发流程超级详解

时间:2025-01-28      来源:FPGA_UCY 关于我们 0

要知道,要把一件事情做好,不管是做哪们技术还是办什么手续,明白这个事情的流程非常关键,它决定了这件事情的顺利进行与否。

同样,我们学习FPGA开发数字系统这个技术,先撇开使用这个技术的基础编程语言的具体语法、使用工具和使用技巧不谈,咱先来弄清楚FPGA的开发流程是什么。

开发fpga的软件工具_FPGA开发_开发FPGA

FPGA的开发流程是遵循着ASIC的开发流程发展的,发展到目前为止,FPGA的开发流程总体按照上图进行,有些步骤可能由于其在当前项目中的条件的宽度的允许,可以免去,比如静态仿真过程,这样来达到项目时间上的优势。

但是,大部分的流程步骤还是需要我们循规蹈矩的去做,因为这些步骤的输入是上一个步骤的结果,输出是下一个步骤的输入的关系,这样的步骤就必不可少了。

有人看到这个流程图的时候,第一个发自内心的感叹是“啊,怎么这么麻烦啊,特别是之前从事软件开发转过来的。对于他们来讲,很少有接触到一种技术有如此多的环节来实现。

但是这并不能说明FPGA开发的具体难度,与软件开发有输入、编译、链接、执行步骤对应的就是设计输入、综合、布局布线、下载烧写,FPGA开发只是为了确保这核心实现主干路每一个环节的成功性加了其他的修饰(约束)和验证而已。

下面,我们将以核心主干路为路线,一一介绍每个环节的物理含义和实现目标。

01

设计输入

从下图看到,设计输入方式有三种形式,有IP核、原理图、HDL,由此展开设计输入方式的探讨。

开发FPGA_开发fpga的软件工具_FPGA开发

原理图输入

原始的数字系统电路的设计可能大家还不可能想象,是用笔纸一个个逻辑门电路甚至晶体管搭建起来的,这样的方式我们称作原理图的输入方式。那个时候,硬件工程师们会围绕的坐在一块,拿着图纸来讨论电路。

事情总是朝着好的方向发展的,后来出现了大型计算机,工程师们开始将最原始的打孔的编程方式运用到数字电路设计当中,来记录我们手工绘画的电路设计,后来存储设备也开始用上了,从卡片过度到了存储文本文件了,那个时候网表文件大致是起于那个时候。

需要注意的问题是原理图和网表文件的关系,原理图是我们最开始方便我们设计的一个输入方式,而网表文件是计算机传递原理图信息给下一道流程或是给仿真平台进行原理图描述仿真用的。设计输入方式不一样,但是对于功能仿真来讲,最终进度到仿真核心的应该是同一个文件,那么这个文件就是网表文件了。

作为最原始的数字电路ASIC设计输入的方式,并从ASIC设计流程延续到FPGA的设计流程,有着它与生俱来的优点,就是直观性、简洁性,以致目前依然还在使用。但是需要注意的是,这也是相对的。

HDL输入

HDL全称是硬件描述语言 ,这种输入方式要追溯的话得到20世纪90年代初了。当时的数字电路的规模已足以让按照当时的输入方式进行门级抽象设计顾左顾不了右了,一不小心很容易出错,而且得进行多层次的原理图切割,最为关键的是如何能做到在更抽象的层次上描述数字电路。

前面提到HDL语言具有不同层次上的抽象,这些抽象层有开关级、逻辑门级、RTL级、行为级和系统级,如图3。其中开关级、逻辑门级又叫结构级,直接反映的是结构上的特性,大量的使用原语调用,很类似最开始原理图转成门级网表。RTL级又可称为功能级。

开发FPGA_FPGA开发_开发fpga的软件工具

HDL语言除了前面提到的两种外,历史上也出现了其他的HDL语言,有ABEL、AHDL、硬件C语言( C语言、-C)、 等。其中ABEL和AHDL算是早期的语言,因为相比前面两种语言来讲,或多或少都有些致命的缺陷而在小范围内使用或者直接淘汰掉了。

而因为VHDL和在仿真方面具有仿真时间长的缺陷, 和硬件C语言产生了,从图3看, 是在系统级和行为级上为做补充,同时硬件C语言产生的原因还有就是有种想把软件和硬件设计整合到一个平台下的思想。

IP( )核

什么是IP核?任何实现一定功能的模块叫做IP( )。这里把IP核作为一种输入方式单独列出来,主要考虑到完全用IP核确实是可以形成一个项目。它的产生可以说是这样的一个逆过程。

在随着数字电路的规模不断扩大的时候,面对一个超级大的工程,工程师们可能是达到一种共识,将这规模巨大而且复杂的设计经常用到的具有一定通用性的功能给独立出来,可以用来其他设计。

当下一次设计的时候,发现这些组装好的具有一定功能的模块确实挺好用的,于是越来越多的这种具有一定功能的模块被提取出来,甚至工程师之间用来交换,慢慢大家注意到它的知识产权,于是一种叫做IP知识产权的东西出来了,于是集成电路一个全新领域(IP设计)产生了。

IP按照来源的不同可以分为三类,第一种是来自前一个设计的内部创建模块,第二种是FPGA厂家,第三种就是来自IP厂商;后面两种是我们关注的,这是我们进行零开发时考虑的现有资源问题,先撇开成本问题,IP方式的开发对项目周期非常有益的,这也是在FPGA应用领域章节陈列相关FPGA厂家IP资源的原因。

FPGA厂商提供一般常用的IP核,毕竟为了让大家用他们家的芯片,但是一些特殊需要的IP核还是需要付费的。当然这里需要说明的是FPGA厂商的IP是很少可以交叉用的,这一点很容易想,对厂家来讲不会做这种给竞争者提供服务事情的。

IP厂商一般会高价的提供未加密的RTL级源码,有时FPGA厂商为了扩大芯片市场占有率,会购买第三方的IP做进一步的处理后免费提给该FPGA芯片使用者的。

02

综 合

不管你是采用单一的输入方式,还是采用的是混合编程(这种在很多跨公司合作项目中会碰见,也许A公司用的是VHDL,B公司用的是,那这个项目中很大可能采用混合型),我们统称得到设计输入后,都得把设计输入得到一个可以和FPGA硬件资源相匹配的一个描述。假设FPGA是基于LUT结构的,那么我们就得到一个基于LUT结构门级网表。在这个过程中,又可以分为如图两个步骤。

开发fpga的软件工具_FPGA开发_开发FPGA

需要说明的是在的开发流程中,将编译、映射过程按照我们叙述的合称综合,而在开发流程中,由设计输入得到门级网表的过程叫做综合,而映射过程归结到其叫做实现的某一子步骤中。但是整体的流程还是遵循这个顺序的,只是叫法一些外表性的不一样而已。

编 译

原理图、HDL、IP核这些都将通过编译后生成门级的网表,这里生成门级网表的过程其实是早起ASIC的步骤,直接生成门电路网表。这个时候的网表文件和具体的器件无关,也就是说,生成的门电路网表也是一种平台移植的媒质。

映 射

我们通过编译得到一张门级网表之后,与早先ASIC开发流程中在这个门级网表布线后去做掩膜不同,接下来就得考虑如何与我们选择的硬件平台结合起来,毕竟我们使用的硬件平台是由一个一个的LUT(假设这类FPGA)组成的。那么这个结合的过程就是映射过程。

这个过程其实很复杂,首先需要把形成的网表逻辑门给规划成一些小的组合,然后再去映射到LUT中,这个过程中规划按照一定的算法和章程进行。不同的算法和章程就会得到不同的映射,不同的映射就会为后面的过程提供不同的选择,最终生成性能不一样的电路了。

我们把讲基于SRAM技术的FPGA的二选一多路器拿出来举个例子,如图6,可以按照红色线将二选一多路器完全劈成两边,原来的一个表就可以规划到其他两个表或表内容中,因为被劈成的两部分可单独成表,也可以被规划到其他电路形成的表里。

FPGA开发_开发fpga的软件工具_开发FPGA

映射的工程比较复杂,运算量也很大,也是为什么FPGA开发过程中,一直存在的一个问题,形成最终的可配置二进制文件的时间非常长,特别是一些大一点的项目,时间消耗比较长的一个点就是映射了,至于具体的映射算法就超出了书的范围了。

再强调的是,映射是和器件有关的,即使是同一个系列,不同型号的FPGA内部就够也是有区别的,好比从外观看都是一个单元楼内的单元房,但是每个单元房内装修、家具摆设等都是不一样的。

03

布局布线

我们通过前面的步骤得到的清单就是LUT门级网表。网表里提供的仅仅是从逻辑关系上一些LUT结构的连接。我们需要将这些LUT结构配置到FPGA具体的哪个位置。需要说明的是,FPGA里任何硬件结构都是按照横纵坐标进行标定的,图中选中的是一个SLICE,SLICE里面存放着表和其他结构,它的位置在上。不同的资源的坐标不一样,但是坐标的零点是公用的。

开发FPGA_FPGA开发_开发fpga的软件工具

在FPGA里布局需要考虑的问题是,如何将这些已有的逻辑上连接的LUT及其它元素合理的放到现有的FPGA里,达到功能要求的时候保证质量。具体点就比如,乘法器这样的电路适合放在RAM附近,当然,硬件乘法器的硬件布局一般也是在存储器附近,有利于缩短乘法的延时时间,什么样的电路需要配置高速等等。

我们在FPGA内通过布局,知道那些LUT具体分布到哪个SLICE,但是一方面如何让这些SLICE连接起来,二方面如何让输入的信号到达相应的开始处理点和如何让输出到达输出IO上,并且连接的电路整体性能好,这就是布线这个环节需要完成的内容。

要达到布线最优化,当然这里面设计到布线算法和很多细节问题,比如涉及到布线资源、PLL资源分布。但是这些对我们理解布线这个概念没有很多益处,暂且不深入,本质上就是一个线路求最优的问题。

04

约 束

约束,就是对这些环节操作定制规则。一般开发环境会对这些约束有个默认,这些默认的设置对大部分情况下还是适用的,但是通常布局布线约束中的I/O约束是我们每一个工程都必须给定的。同时开发工具开放其他约束接口,允许我们设置这些规则。

相信大家已经下意识的将综合约束和综合过程挂在一起了,没错,综合约束确实是在综合过程中做的,用来指导综合过程,包括编译和映射。我们已经知道综合过程是将RTL级电路描述转换到FPGA上的硬件单元(LUT)中,形成以FPGA存在的硬件单元构成的电路。

我们还是拿前面有过的例子来说明,不同的约束将导致生成性能不同的电路。没有加资源共享得到的电路如图8左边所示的电路,而加了资源共享的约束后,得到的电路结构如图8右边的电路。

FPGA开发_开发fpga的软件工具_开发FPGA

通过之前的分析,得到左边的电路结构资源消耗多但是速度快,而右边的结构消耗资源少,但是速度慢,乘法器需要分时复用。

当然这只是一个例子,但是足以说明,不同的综合指导原则也就是综合约束,将会产生不同的电路。当得到的电路性能不能满足需求的时候,适当考虑综合约束,来达到一个速度和面积的转换的效果,实现性能的提升。

电路实现的速度和消耗的面积是贯穿在FPGA开发过程中两个矛盾的问题,综合约束是其中一种小范围内实现速度和面见平衡点移动的方式。

位置约束

没错,你又想对了,位置约束和我们布局有关系,它就是指布局的策略。根据所选择的FPGA平台现有硬件资源分布来决定我们布局。

其中最典型的位置约束就是I/O约束。一个典型的系统是既有输入也有输出的,而不管是输入还是输出,都是从I/O上为端点的。输入从哪个端点进来,输出从哪个端点出去,输入是需要支持什么样的电气特性的端点,输出又是需要支持什么样的电气特定的端点。这些都是I/O约束做的事情。任何一个工程,都必须有这么一个约束。

还有一种典型的位置约束是在增量编译里涉及的物理界定。增量编译的出现就是因为在FPGA开发过程中综合和布局布线的长耗时性而提出的。思想就是把FPGA切成很多个小块的FPGA,然后约定具体哪块小FPGA放置什么模块,实现什么样的功能,从物理上进行界定。

当修改工程后,开发平台就会检测哪些小FPGA内没有进行修改,哪些进行了修改,然后将修改过的部分重新进行综合布局布线步骤。这样一来,相比原来修改一点,全工程重新经过那些过程来讲,时间节省下来了。

时序约束

估计没有多少悬念了,时序约束很大程度上和布线有关。为什么要做这个约束?

由于一方面信号在芯片内传递是需要消耗时间的,另一方面大量存在的寄存器有反应时间,而我们开发的最开始的时候这些时间都是理想化的。但是考虑到真实情况下,如果跑的速度比较高,达到了200M这么个速度,当然这个高速和具体的芯片有关,高性能的芯片本身跑的速度可以达到很高,200M相对来说就不是高速,对一些低性能芯片还可能达不到200M。

这个时候,这些时间达到了同样一个系统时间数量级的时候,很可能影响电路的性能了。某一刻,该来的信号没有来,默认的话就会采集错误信号了。

为了让这些硬件本身带来的延时时间更理想化,我们就要对这些决定时间延时的因素优化来减少时间延时。对于寄存器本身的反应时间这个因素我们开发者是无能为力的,我们要做的优化就是布线了。是走直线还是走其他,不仅仅决定于自身这条路径,还和整个系统布线有关,好比水桶原理,系统性能决定于最差路径延时。

时序约束做的就是这些事情,但是时序约束并不是指具体去连接每一条线,这个工作就像前面那些流程一样都是由软件去实现的,先用软件自己默认原则布线,然后对其结果分析,不满足时序要求的,我们再对具体的问题路径做一些指导约束。

时序约束的添加,主要包括周期约束、输入偏移约束和输出偏移约束。具体的过程在后面章节介绍工具使用时会有具体动手的指导。

05

仿 真

仿真,字面上讲就是模拟真实状况。我们FPGA设计里面的仿真,就是模拟真实电路的状况,查看电路是不是我们需要的电路。如果我们把FPGA开发形成电路当作一个产品的生产过程,那么在FPGA开发流程中含有的三种仿真(RTL级仿真、静态仿真和时序仿真)就好比产品线中的三道检测站。

如图9,这三道工序任何一道出了问题,修改设计后都得重新走这三道卡,所以尽量在把问题发现在源头。

FPGA开发_开发FPGA_开发fpga的软件工具

测试平台

所谓,即测试平台,详细的说就是给待验证的设计添加激励,同时观察输出响应是否符合设计要求。测试平台,测试平台在做功能仿真、静态仿真和时序仿真的时候都需要用到。

刚开始的对于一些初学者,遇到的都是一些简单的东西,测试平台相应的也很简单,用一个文件就可以很清晰的呈现测试结构。对于一些复杂的项目,测试就没有那么简单了,由此还专门产生一个行业——测试行业。这个时候我们要用到一个概念就是结构化测试。

一个完整的测试平台如下图10所示,它是分结构组成的,其中对设计测试结果的判断不仅可以通过观察对比波形得到,而且可以灵活使用脚本命令将有用的输出信息打印到终端或者产生文本进行观察,也可以写一段代码让它们自动比较输出结果。

开发fpga的软件工具_FPGA开发_开发FPGA

RTL级仿真

这里RTL级仿真属于第一道检测,有些场合称作功能仿真,为了突出和后面的静态仿真的区别,以免在后面介绍静态仿真的时候大家弄的很头大,我们还是这样称呼。它是对工程在寄存器转送级进行的描述时进行测试,查看其在RTL级描述的时候实现的功能的正确性。

关于RTL级仿真,如果设计中设计到原理图输入的话,在一些仿真工具中是不支持的,比如,这个时候要进行功能上的验证,可以将原理图转换成HDL描述,或者直接把整个工程转换成LUT门级网表后进行后面要讲到的静态仿真完成。

所有逻辑功能的验证都希望在RTL级做,尽可能的将问题发现在RTL级仿真过程中,减少后面发现问题带来的反复。

静态仿真

静态仿真,有些地方给的外号叫门级仿真,确切的说应该是综合后的LUT门级网表。是在综合过程后做的仿真。有些开发平台下将静态仿真具体又分为编译仿真和映射仿真,比如ISE就是这样做的,但是个人觉得应该很少场合做这个编译仿真。静态仿真的目的就是验证当工程到了用LUT门级网表描述的时候,从功能上检查验证工程的正确性。

不管是还是的开发平台,都直接支持静态仿真,但是由于各自厂家的仿真器专业性不强,我们还是用第三方仿真工具比较多。这时候在第三方工具下的输入必须是经过综合工具综合出来的涵盖工程所有信息的LUT门级网表文件了。

一般专业一点的第三方综合工具是不具备综合功能的,至少我们在使用的时候,并没有要求我们添加工程用到的具体的哪一款型号FPGA的信息。这也是静态仿真的外号门级仿真指的是LUT门级网表仿真的依据。

时序仿真

时序仿真是在布局布线之后做的,在前面介绍时序约束的时候讲到,布线延时问题影响到了电路的性能的时候可以做时序约束。那么这个延时问题的获得就可以通过时序仿真获得,当然还有一种获得延时出现超载情况,这个属于下面小节介绍的静态时序分析了。

一般情况下,电路进行完布线过程后,会生成一个延时信息文件,我们简称SDF( dealy )文件,平台下是以.sdo文件形式存在的。里面含有三种延时信息,分别为最小值、典型值、最大值,存在的形式是最小值:典型值:最大值,一般缩写min:typ:max。

这里也体现了,在FPGA里的延时信息是不能够精确获得的,只能是逼近,因为本身同一器件中,不同的区域的逻辑门也很有可能和其他的区域内同种的逻辑门的延时不一样。我们这里举一个例子来说明一下这三种值的含义。

FPGA开发_开发FPGA_开发fpga的软件工具

如上图,这是一个描述一段延时线的延时信息,给的延时信息从in端点到out端点,输入发生跳变后,分别以最小值、典型值和最大值将信号跳变传递到out端点。

我们这里只是一段延时线,在延时信息文件里还有一类延时信息,就是一些具有逻辑功能的cell延时,这个时候信号跳变又分为由高变低和有低变高,因为这两种跳变在这些器件里的三种延时值是不一样的,得分别探讨,具体分别以某一种情况类推。

在做后仿真的时候,只需要在做完静态仿真后的基础上添加布线的延时信息后,再分析逻辑功能是否满足要求。后方针的平台 使用情况和前面一样,一般采用第三方仿真工具,典型的是,具体操作过程见软件相关操作章节。

06

静态时序分析

静态时序分析,简称STA( ),这个过程做的话一把是在是做后仿真前做的。

在布局布线后,会生成时序分析报告,该报告是分析工具利用从布线的路劲上提取出寄生参数后精确计算出来的。该报告中会提示出一些关键路径,所谓关键路劲就是指延时信息比较突出的信号节点流,通过分析可以得到不满足时序要求的路径,这个过程就是STA过程。

静态时序分析的特点就是不需要输入向量就能穷尽所有的路径,且运行速度很快、占用内存较少,不仅可以对芯片设计进行全面的时序功能检查,而且还可利用时序分析的结果来优化设计。

很多设计都可以在功能验证的成功的基础上,加上一个很好的静态时序分析,就可以替代耗时非常长的后仿真了,这是一种很有保障性的化简流程方式。后仿真相对静态时序分析来说还具有逻辑验证,在加上延时信息的基础上分析逻辑。

07

在线调试

在线调试也称作板级调试,它是将工程下载到FPGA芯片上后分析代码运行的情况。有人会以为,我们不是已经做了仿真了,甚至是时序仿真都通过了,还会存在问题么?在实际中,存在这么些情况我们需要用到在线调试:

FPGA开发_开发FPGA_开发fpga的软件工具

仿真不全面而没有发现的FPGA设计错误。很多情况下,由于太复杂,无法做到100%的代码覆盖率。在板级交互中,存在异步事件,很难做仿真,或者仿真起来时间很长,无法运行。除了本身FPGA外,还可能存在板上互连可靠性问题、电源问题和IC之间的信号干扰问题,都可能导致系统运行出错。

在线调试的方式主要有两种,一种是利用外部测试设备,把内部信号传送到FPGA针脚上,然后用示波器或者逻辑分析仪观察信号;另一种就是利用嵌入式逻辑分析仪,在设计中插入逻辑分析仪,利用JTAG边缘数据扫描和开发工具完成数据交互。

08

配置及固化

在FPGA正常工作时,配置数据存储在SRAM中,这个SRAM单元也被称为配置存储器( RAM)。由于SRAM是易失性存储器,因此在FPGA上电之后,外部电路需要将配置数据重新载入到芯片内的配置RAM中。

在芯片配置完成之后,内部的寄存器以及I/O管脚必须进行初始化(),等到初始化完成以后,芯片才会按照用户设计的功能正常工作,即进入用户模式。

FPGA上电以后首先进入配置模式(),在最后一个配置数据载入到FPGA以后,进入初始化模式(),在初始化完成后进入用户模式(user-mode)。在配置模式和初始化模式下,FPGA的用户I/O处于高阻态(或内部弱上拉状态),当进入用户模式下,用户I/O就按照用户设计的功能工作。

这一块分成两部分,一部分是在线调试配置,另一块是固化,即将工程配置到相应存储单元中,上电后,通过存储在存储器中的内容配置FPGA。

第一部分在线调试配置过程是通过JTAG模式完成的,如图13所示,在JTAG模式中,PC和FPGA通信的时钟为JTAG接口的TCLK,数据直接从TDI进入FPGA,完成相应功能的配置。

开发fpga的软件工具_FPGA开发_开发FPGA

JTAG接口是一个业界标准接口,主要用于芯片测试等功能。FPGA基本上都可以支持JTAG命令来配置FPGA的方式,而且JTAG配置方式比其他任何方式优先级都高。

第二部分固化程序到存储器中的过程可以分为两种方式,主模式和从模式。主模式下FPGA器件引导配置操作过程,它控制着外部存储器和初始化过程;从模式下则由外部计算机或控制器控制配置过程。主、从模式从传输数据宽度上,又分别可以分为串行和并行。

—————END—————

加入开发圈, 一起学习吧

开发fpga的软件工具_开发FPGA_FPGA开发

戳戳下载学习资料 · 点点在看一起学习

开发fpga的软件工具_开发FPGA_FPGA开发


注明:本内容来源网络,不用于商业使用,禁止转载,如有侵权,请来信到邮箱:429562386ⓐqq.com 或联系本站客服处理,感谢配合!

用户登陆

    未注册用户登录后会自动为您创建账号

提交留言