fpga的开发流程分析与实施_FPGA的开发流程分析

FPGA的开发过程遵循ASIC的开发过程。到目前为止,FPGA的开发过程一般都是按照图1进行的,有些步骤比如静态仿真过程可能会因为当前项目中条件的宽度而被省略,以达到项目时间的优势。但是大部分的流程步骤还是需要我们遵循规则的,因为这些步骤的输入是上一步的结果,输出是下一步输入的关系,所以这样的步骤是必不可少的。

FPGA开发的具体难度对应的是软件开发中输入、编译、链接、执行的步骤,分别是设计输入、综合、布局布线、下载编写。FPGA开发只是增加了其他的修改(约束)和验证,以保证核心实现主干道各个环节的成功。下面将以核心干道为路线,介绍各个环节的物理意义和实现目标。

一、设计输入

1.设计输入模式

第一步设计输入的水平链接与图1中FPGA开发流程的主线分离,进一步处理细节,如图2所示。从图中可以看出,设计输入有三种形式,包括IP核、原理图和HDL,从中讨论设计输入方式。

1)原理图输入

原来数字系统电路的设计可能大家都想象不到,是用笔和纸用逻辑门甚至晶体管搭建的。这种方式称为原理图输入方式。那时候硬件工程师会围坐在一起,拿着图纸讨论电路。好在当时数字电路还不是很复杂。今天,稍微大一点的系统也算是一个庞大的工程。如果电路需要稍加修改,这个时候你如果不耐烦或者不耐烦,可能会对这个领域失去兴趣。另一方面,那个时代出来的老工程师,确实电路基础扎实。

事情总是朝着正确的方向发展。后来大型计算机出现了,工程师们开始把最原始的打孔编程方法应用到数字电路设计中,来记录我们手绘的电路设计。后来也开始使用存储设备,从卡片到文本文件。当时网表文件大致就是那个时候开始的。

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

在计算机的帮助下,数字电路的设计可以说有了很大的进步,但如果还是全部基于逻辑门晶体管,还是比较繁琐的。然后,出现了一个符号库,里面有一些常用的器件,比如D触发器等等。随着需求的发展,这些符号库不断丰富。对应于在原理图中利用这些符号库构造电路,从原理图中得到的网表文件的描述方法也有了相应的扩展,所以这里的网表文件中电路符号的描述就是最初的原语。

作为数字电路ASIC设计最原始的输入法,并且是从ASIC设计过程延续到FPGA设计过程的,它有其与生俱来的优点,即直观、简单,所以目前仍在使用。不过需要注意的是,这也是相对的。详情见下一节。

2)HDL输入

HDL的全称是硬件描述语言,这种输入法可以追溯到90年代初。当时的数字电路规模足以让门级抽象设计按照当时的输入方式粗心大意,一不小心就容易出错,需要多级切割原理图。最重要的是如何在更抽象的层次上描述数字电路。

于是一些EDA开始以文本的形式提供非常严谨无错的HDL输入法。特别是在1980年,美国军方启动了超高速集成电路(Very-High-Speed Integrated Circuit)计划,目的是为了给军队配备大规模数字电路的设计和开发效率,所以这个VHSIC硬件描述语言就是我们现在的VHDL语言,也是最早的硬件描述语言标准。相比之下,Verilog是民间发起的较晚,其第一版IEEE标准发布于1995年,但一直沿用至今。

上面提到的HDL语言有不同的抽象层次,包括开关级、逻辑门级、RTL级、行为级和系统级,如图3所示。其中开关级和逻辑门级也称为结构级,直接反映结构特征,大量使用原语调用,类似于最初的原理图转换成门级网表。RTL级也可以称为功能级。

除了上面提到的两种HDL语言,历史上还出现过其他HDL语言,比如阿贝尔、AHDL、硬件C语言(System C语言,Handle-C)、系统verilog等等。其中,亚伯语和AHDL语是早期语言,因为与前两种语言相比,它们或多或少都有致命的缺陷,一直被小范围使用或直接淘汰。由于VHDL和verilog存在仿真时间长的缺陷,所以产生了系统Verilog和硬件C语言。如图3所示,系统Verilog在系统级和行为级对Verilog进行了补充,硬件C语言也是因为将软硬件设计整合到一个平台的思想而产生的。

3)IP(知识产权)核心

什么是IP核?任何实现某种功能的模块都称为IP(知识产权)。这里把IP核单独列为输入法,主要是考虑到完全使用IP核确实可以形成项目。它的产生可以说是这样一个逆过程。

随着数字电路规模的不断扩大,面对一个超大型的项目,工程师们可能会达成共识,将这个庞大而复杂的设计中经常用到的功能分离出来,用于其他设计。在接下来的设计中,发现这些组装好的具有一定功能的模块确实很好用,于是越来越多的具有一定功能的模块被提取出来,甚至在工程师之间进行交流,人们也逐渐注意到了它的知识产权,于是出现了一个叫IP知识产权的东西,一个新的集成电路领域(IP设计)应运而生。

根据来源的不同,IP可以分为三类,第一类是来自之前设计的内部创建模块,第二类是来自FPGA厂商,第三类是来自IP厂商;后两个是我们关注的,是我们做零开发时考虑的现有资源问题。先抛开成本问题,IP模式的开发对项目周期非常有利,这也是FPGA应用领域章节中展示相关FPGA厂商IP资源的原因。

FPGA厂商和IP厂商可以在FPGA发展的不同时期为我们提供IP。暂且知道是未加密的RTL IP,加密的RTL IP,没有布局布线的网表IP,布局布线后的网表IP。在陆续介绍FPGA的开发步骤时,会突然明白它们的含义。需要注意的是,FPGA在靠近前端步骤时提供的IP越多,其二次开发越好,但性能可能是一个反向过程,越贵。毕竟任何一个提供商都不希望把自己的源程序提供给别人,但是为了防止客户去找其他商家,只能加价,加上一些法律协议保护。然后越到FPGA开发步骤的后端,就会出现相反的情况。越到后端,IP核会进一步优化,性能会越好,但是有些客户不要的功能就不好了。

FPGA厂商提供常用的IP核,毕竟是为了让人们使用他们的芯片,但是一些有特殊需求的IP核还是需要付费的。当然,这里需要说明的是,FPGA厂商的IP很少可以互换使用。很容易认为厂商不会对竞争对手做这种服务。IP供应商通常以高价提供未加密的RTL级源代码。有时候,FPGA厂商为了扩大芯片市场份额,会购买第三方ip进行进一步处理,免费送给FPGA芯片用户。

2.浅谈输入法的使用

上面介绍了三种输入法,有些地方会讲到第四种输入法,也就是门级网表文件输入的形式。我们在这里没有将其归类为输入法,因为这些门级网表文件的生成本身仍然源于所介绍的三种输入法中的一种或多种。所以这里不分类。

好了,在以上三种输入法介绍的基础上,我们来讨论一下这款让人眼花缭乱的输入法,目的是让我们更好的使用它们。

首先总结一下三者的优缺点,其实有两种,因为不管IP核是什么级别,都是以原理图中符号的形式或者以HDL中模块的形式实例化的。所以这里我们重点介绍原理图和HDL的优缺点。原理图的优点是结构直观,而HDL的优点是严谨、抽象描述层次广、易于移植、便于仿真和调试等。缺点是不具备对方的优点。当时HDL出现的时候,人们真的认为原理图应该退出历史舞台,但它今天依然存在。存在是有意义的,也是要用的,但是HDL也是要用的,所以有一种混合编程的形式。除了顶层模块的原理图,其他内部子模块都是用HDL描述的。HDL描述的模块可以通过工具转换成符号,然后在顶层模块中引用这些符号,从而完成混合编程。

很多初学FPGA的人很容易被原理图输入法迷惑,甚至深爱,再加上对其他输入法繁琐输入的厌恶,更是无法自拔。在强制要求之初形成多用HDL输入的习惯时,有的甚至有痛苦的经历,但随着学习的深入,事情越做越大,尝到HDL输入带来的甜头时,就会觉得痛苦并不自由。

我觉得从现在的一些线索来看,原理图输入模式终有一天会结束服役。首先,我们为原理图本身找到了一个有优势的替代品,即主流FPGA集成环境中的合成器和第三方合成器都具有生成RTL视图的功能,完整展现了项目的结构组成,并且可以上下分层。最大的好处是,我们可以检查和验证集成电路的RTL级代码编写。还有一个线索,大家使用的仿真软件Modelsim并没有提供原理图输入的支持,但是原理图的设计必须转换成RTL级的代码或者集成到网表形式才能在集成环境下进行仿真,这也是一件繁琐的事情。示意图离开只是时间问题。

至于目前选择哪个HDL比较好,这个问题在HDL基础语法知识开头讨论。这里要说明的是,这里使用Verilog并不是否定其他HDL语言。关于HDL的各种争议从来没有停止过。现在还是有四种开发者,第一种是用Verilog/System Verilog的,第二种是用VHDL的,第三种是用System C的,第四种是混合的。可能是时间问题,时间会告诉一切。

二、综合

无论是单一输入法还是混合编程方式(很多跨公司合作项目都会遇到,可能A公司用的是VHDL,B公司用的是Verilog,所以这个项目很可能用的是混合编程),我们统称之为得到设计输入后可以匹配FPGA的硬件资源的描述。假设FPGA基于LUT结构,那么我们得到一个基于LUT结构的门级网表。如图所示,此过程可分为两个步骤。

需要注意的是,在Altera的开发过程中,编译和映射过程是根据我们的描述合成的,而在Xilinx的开发过程中,从设计输入中获取门级网表的过程称为合成,映射过程归结为一个子步骤,称为实现。不过整体流程还是遵循这个顺序,只是名字有些不同。

编译

原理图、HDL和IP核都会被编译生成门级网表。这里生成门级网表的过程,其实就是ASIC早起直接生成门级网表的步骤。此时,网表文件与具体器件无关,也就是说,生成的门网表也是一种平台移植介质。

2.绘图

在我们通过编译得到一个门级网表之后,不同于之前ASIC开发过程中对这个门级网表进行布线之后再进行掩膜,我们要考虑的是如何与我们选择的硬件平台相结合。毕竟我们用的硬件平台是lut组成的(假设这种FPGA)。那么这个组合过程就是映射过程。

这个过程其实很复杂。首先,我们需要将形成的网表逻辑门规划成一些小的组合,然后映射成LUT。在这个过程中,按照一定的算法和章程进行规划。不同的算法和规则会得到不同的映射,不同的映射会为后期的工艺提供不同的选择,最终生成不同性能的电路。

下面我们拿出基于SRAM技术的FPGA二合一复用器为例。如图6所示,二合一复用器可以按照红线完全拆分成两边,原表可以规划成另外两个表或者表内容,因为拆分的两部分可以单独做成表或者规划成其他电路形成的表。

映射项目复杂,计算量大,这也是为什么FPGA的开发一直存在一个问题。形成最终的可配置二进制文件需要很长时间,特别是对于一些较大的项目。消耗时间比较长的一点是映射,具体的映射算法不在本书范围内。同样,映射与设备相关。即使是同一个系列,不同类型的FPGA之间也有差异。比如从外面看都是一个单元楼里的单元房,但是每个单元房的内部装修和家具布置都不一样。

三、布局和布线

1.布局

说到这一块,正好有这样一个例子来解释这个概念。最近有消息称,朝鲜希望租用俄罗斯远东地区数十万公顷的土地来种植农产品。先抛开未来购买的成功与否,假设成功,有这个详细的我们希望培育的农作物的品种和数量,包括各种蔬菜,主食,家禽养殖场,果树等等。通过我们之前所做的过程获得的LUT门级网表如下所示。

得到这样的列表后,我们假设日照、水资源、温差都分布在这10万公顷的土地上。众所周知,农作物的生长和大量生产与阳关、水资源或温差有关,家禽养殖材料与农作物副产品有关。所以接下来要做的就是根据现有的自然条件和农产品所需的环境特点进行合理的布局,哪些地区适合做什么。

然后我们回到FPGA开发,我们通过前面的步骤得到的列表是LUT门级网表。网表中提供的只是一些LUT结构的逻辑连接。我们需要将这些LUT结构配置到FPGA的特定位置。需要注意的是,FPGA中的任何硬件结构都是根据横坐标和纵坐标进行校准的,图中选择了一个切片,其中存储了表格等结构,其位置在X50Y112上。不同资源的坐标不同,但坐标的零点是共有的。

在FPGA布局时要考虑的问题是,如何在满足功能要求的情况下,将这些逻辑连接的lut和其他元件合理地放入现有的FPGA中,以保证质量。具体地,例如,诸如乘法器的电路适合于放置在RAM附近。当然,硬件乘法器的硬件布局一般在内存附近,有利于缩短乘法的延迟时间,高速需要配置什么样的电路。

10万公顷土地的布局规划好了,农产品就会有好收成。同样,随着FPGA开发的布局,FPGA构建的电路会更加稳定,可扩展性更强。

2.接线

上一节我们整理了10万公顷土地,这些土地要种。在具体实施之前,还有一些事情是必须要做的,比如给庄稼浇水。没有好的灌溉系统是个问题。再比如收获。这个时候,让大货车能够到达每一个农业用地的公路枢纽,也是一个需要解决的问题。灌溉系统和连接每个领域或相关领域的高速公路的建设就像我们的布线过程。

我们通过FPGA中的布局知道lut分配到哪个片上,但是一方面如何连接这些片,另一方面如何使输入信号到达对应的起始处理点,如何使输出到达输出IO,连接的电路整体性能好,这是布线环节需要完成的内容。为了实现最优布线,当然设计中涉及到很多细节问题,比如布线资源、PLL资源分配等。但是,这些对于我们理解布线的概念帮助并不大。暂且不深究,本质上是线路优化的问题。

四、约束条件

如图1所示,约束出现在综合和布局的过程链接中。我们暂且把它们定义为约束I和约束II,或者综合约束和布局约束。布局约束可分为位置约束和时间约束。约束是为这些链接定制规则。通常,开发环境会有这些约束的缺省设置,并且这些缺省设置在大多数情况下仍然适用,但是通常在每个项目中都必须给出布局和路由约束中的I/O约束。同时,开发工具开放了其他约束接口,允许我们设置这些规则,具体的约束如何做将在后面介绍工具使用时讨论。这里,先了解一下这些约束的基本概念。

1.综合制约因素

相信大家都下意识的把综合约束和综合过程联系起来了。是的,综合约束确实是在综合过程中做出的,用来指导综合过程,包括编译和映射。我们已经知道,综合过程是将RTL级电路描述转化为FPGA上的硬件单元(LUT),形成由FPGA中已有的硬件单元组成的电路。

我们拿前面的例子来说明,不同的约束会导致不同性能电路的产生。用* * *能量合成这样一个完美电路,没有资源共享得到的电路如图8左图所示,但是有资源共享约束,得到的电路结构如图8右图所示。

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

当然,这只是一个例子,但足以说明不同的综合指导原则,即综合约束,会产生不同的回路。当得到的电路性能不能满足要求时,要适当考虑综合约束,达到速度和面积转换的效果,提高性能。电路实现的速度和消耗的面积是贯穿FPGA发展的两个矛盾问题,综合约束是在小范围内实现速度移动和满足平衡点的途径之一。

2.位置约束

位置约束与布局有关,是指布局策略。根据所选FPGA平台的现有硬件资源分布,决定我们的布局。

最典型的位置约束是I/O约束。典型的系统既有输入又有输出,输入和输出都是从I/O端接的,输入从哪个端点进来,输出从哪个端点出去?输入需要支持什么样的电气特性,输出需要支持什么样的电气特定端点?这些都是I/O约束所做的事情。任何项目都必须有这样的约束。

另一个典型的位置约束是增量编译中涉及的物理定义。增量编译的出现是因为FPGA开发中耗时较长的综合和布局。思路是把FPGA切割成很多小FPGA,然后约定哪个小FPGA放什么模块,实现什么功能,物理定义。项目修改时,开发平台会检测哪些小FPGA没有修改,哪些修改了,然后对修改的部分再次进行全面的布局布线步骤。这样,与最初的修订相比,就再次经历那些过程而言,整个项目将被节省。

3.时间限制

估计没有太大悬念,时间限制很大程度上和布线有关。为什么要做这个约束?

一方面芯片内传输信号需要时间,另一方面大量的寄存器有反应时间,这在我们开发之初是理想化的。但是考虑到真实情况,如果运行速度比较高,达到200M的速度,当然这个高速度和具体的芯片有关,高性能芯片的运行速度可以达到很高的速度,而200M相对来说不是很高的速度,对于一些低性能芯片来说可能达不到200M。此时,当这些时间达到相同的系统时间顺序时,很可能会影响电路的性能。在某个时刻,期望的信号没有到来,默认的信号将被收集。

为了使这些硬件带来的延迟时间更加理想,我们应该优化这些决定时间延迟的因素来减少时间延迟。对于寄存器本身的响应时间,我们开发者无能为力,要做的优化就是布线。是否直行,除了取决于自身的路径,还取决于整个系统的布线,比如水桶原理,系统性能取决于最差路径延迟。

时序约束做这些事情,但是时序约束不是指具体连接每条线。这项工作是由软件实现的,就像前面的过程一样。首先,软件使用自己的默认原则进行布线,然后对结果进行分析。如果不符合时序要求,我们会对具体的问题路径做一些引导约束。时序约束的添加主要包括周期约束、输入偏移约束和输出偏移约束。具体流程会在后面章节介绍,使用工具时会有具体的动手指导。

五、FPGA开发模拟

在介绍了从设计输入到综合再到布局布线的流程之后,我们再来关注一下这些流程中涉及到的相应仿真。

模拟字面意思是模拟真实情况。我们FPGA设计中的仿真就是模拟真实电路,看看电路是不是我们需要的。如果我们把FPGA开发形成的电路看作一个产品的生产过程,那么FPGA开发过程中包含的三种仿真(RTL级仿真、静态仿真和时序仿真)就像是产品线中的三个检测站。如图9所示,如果这三个流程中的任何一个出现问题,修改设计后都要重新过一遍这三张卡,所以尽量在源头找到问题。

1.测试平台

所谓testbench,即测试平台,具体是指在待验证的设计中加入激励,观察输出响应是否满足设计要求。功能仿真、静态仿真和时序仿真所需的测试平台。刚开始的时候,对于一些初学者来说,遇到的都是简单的东西,测试平台也很简单,一个文件就能把测试结构清晰的呈现出来。对于一些复杂的项目,测试就没那么简单了,这也就产生了一个行业——测试行业。这时候我们就需要用到一个概念,就是结构化测试。

下面的图10显示了一个完整的测试平台,它由子结构组成。设计测试结果的判断不仅可以通过观察比较波形来获得,还可以灵活地使用脚本命令将有用的输出信息打印到终端或生成文本以供观察,还可以为它们编写一段代码来自动比较输出结果。

测试平台的设计多种多样,可以使用灵活的Verilog验证脚本。然而,它也是一种基于硬件语言但服务于软件测试的语言,有时是并行的,有时是顺序的。只有掌握了这些关键点,才能很好地服务于考试。需要注意的是,无论你是已经在使用Verilog编写测试平台,还是刚刚开始学习编写测试平台,建议你还是可以使用System Verilog中的新语法。系统Verilog是一种趋势,而且是向后兼容的第三代Verilog。

2.RTL级模拟

这里的RTL级模拟属于第一种测试,在某些情况下它被称为功能模拟。为了突出RTL级仿真和下面静态仿真的区别,避免后面介绍静态仿真时弄得头大,我们还是这样称呼它。它是在寄存器传输级描述时测试项目,在RTL级描述时检查其功能的正确性。

如果在设计中输入了原理图,某些仿真工具(如Modelsim)不支持RTL级仿真。这时候就需要进行功能验证,可以将原理图转换成HDL描述,也可以将整个工程直接转换成LUT门级网表,之后再完成静态仿真。

所有逻辑功能的验证预计在RTL级完成,问题应尽可能在RTL级仿真过程中发现,以减少后期发现问题造成的重复。

3.静态模拟

静态仿真,有些地方昵称门级仿真,应该是一个全面的LUT门级网表。模拟是在综合过程之后进行的。在一些开发平台中,静态模拟分为编译模拟和映射模拟。比如ISE就是这么做的,但个人觉得这种编译模拟应该很少做。静态仿真的目的是在用LUT门级网表描述项目时,从功能上验证验证项目的正确性。

Altera和Xilinx开发平台都直接支持静态仿真,但由于各自厂商的仿真器并不专业,我们还是更多使用第三方仿真工具。此时,第三方工具下的输入必须是一个LUT门级网表文件,该文件覆盖了项目的所有信息,并由一个综合工具合成。一般专业的第三方综合工具不具备综合功能。至少,当我们使用Modelsim时,我们不需要添加项目中使用哪个特定FPGA的信息。这也是静态模拟的别称,指的是LUT门级网表模拟的基础。

4.时间序列模拟

时序仿真是在布局和布线之后进行的。正如在时序约束的介绍中提到的,当布线延迟影响电路的性能时,可以进行时序约束。那么这个延迟问题就可以通过时间序列模拟得到,当然在得到延迟上也存在过载的情况,这属于下一节介绍的静态时间序列分析。

一般来说,电路接线后会生成一个延时信息文件,简称SDF(standrad dealy格式)文件,以。Quartus平台下的sdo文件。它包含三种延迟信息,即最小值、典型值和最大值。它以最小值:典型值:最大值的形式存在,一般缩写为minmax。也说明了FPGA中的延迟信息是无法精确获得的,只能近似获得,因为不同区域的逻辑门的延迟很可能与同一器件中其他区域的相同逻辑门的延迟不同。这里举个例子来说明这三个值的意义。

如上图所示,这是描述延迟线的延迟信息。给定的延迟信息从入端点传递到出端点。输入跳变后,信号分别跳变到最小值、典型值和最大值的输出端点。我们这里只是一个延迟线,延迟信息文件中有一种延迟信息,就是一些具有逻辑功能的单元延迟。这时候信号跳变又分为高到低和低到高,因为这两种跳变在这些器件中的三个延时值是不一样的,所以我们要分别讨论,具体的例子是根据某一种情况。

做后期仿真时,只需要在静态仿真后添加布线的延时信息,然后分析逻辑功能是否满足要求。后一种政策的平台使用与前一种相同。一般采用第三方仿真工具,典型的是Modlesim。具体操作过程参见软件的相关操作章节。

六、静态时间序列分析

静态时序分析,简称STA(静态时序分析),在后仿真之前完成。布线完成后,会生成时序分析报告,从布线刚度中提取寄生参数后,由分析工具精确计算。该报告将提示一些关键路径。所谓关键路径强度,是指延迟信息突出的信号节点流。通过分析,可以得到不满足时序要求的路径。这个过程就是STA过程。

静态时序分析的特点是无输入向量穷尽所有路径,运行速度快,占用内存少。它不仅可以检查芯片设计的整体时序功能,还可以利用时序分析的结果优化设计。许多设计可以基于功能验证的成功,加上良好的静态时序分析,这可以取代后仿真,这是一种非常支持简化过程的方法。相对于静态时序分析,后仿真也有逻辑验证,在加入延迟信息的基础上分析逻辑。

七、在线调试

在线调试又称板级调试,是将项目下载到FPGA芯片后,对代码运行进行分析。有人会觉得我们已经做了模拟,连时间序列模拟都过去了。还会有问题吗?在实践中,有些情况下我们需要使用在线调试:

由于模拟不完整,未发现FPGA设计错误。很多情况下,要实现100%的代码覆盖率太复杂;

在板级交互中,存在异步事件,导致模拟困难,或者模拟时间长,无法运行;

除了自身FPGA之外,还可能存在板上互连的可靠性、电源以及IC之间的信号干扰等问题,可能导致系统运行错误;

其他潜在问题。

在线调试主要有两种方式。一种是用外部测试设备将内部信号传输到FPGA管脚,然后用示波器或逻辑分析仪观察信号。另一种是使用嵌入式逻辑分析仪,将逻辑分析仪嵌入到设计中,使用JTAG edge数据扫描和开发工具完成数据交互。

嵌入式逻辑分析仪的原理相当于在FPGA中打开了一个环形存储器。内存的大小决定了可以查看的数据深度,可以人为设置,但一定不能超过资源。在FPGA中,根据设定的要查看的信号节点信息和驱动器的采样时钟对信息进行采样,并放入设定的存储空间中,存储空间为环形,内容随时间更新。然后通过判断触发点来检查采集的数据。一旦满足触发条件,此时会停止扫描,然后将触发点前后的一些数据返回给PC端的测试工具进行波形显示,供开发人员调试。

目前所有的调试工具都链接到自己的FPGA开发平台上。不同的FPGA厂商会有开发软件平台,嵌入式逻辑分析仪也会不同。Altera厂商提供SignalTapII,Xilinx厂商提供ChipScope。以下工具解释了这些工具的具体用法。

当然,除了嵌入式逻辑分析仪,厂商还提供一些其他的在线调试工具,如SignalProbe等。但或多或少用的人不多。感兴趣的人可以找到使用该功能的说明手册。

八、配置和固化

好了,我们可以在最后一个环节完成FPGA的流程了。这一部分分为四节。首先是针对很多人不是很清楚的FPGA配置流程进行安排。然后为了更深入的理解,引用了altera的FPGA来描述整个配置过程。第三部分讨论FPGA的主要配置方式。最后一节是比较和选择这些配置模式。

1.FPGA配置流程

FPGA正常工作时,配置数据存储在SRAM中,也叫配置RAM。由于SRAM是易失性存储器,因此在FPGA上电后,外部电路需要将配置数据重新加载到芯片中的配置RAM中。芯片配置完成后,必须初始化内部寄存器和I/O引脚。初始化完成后,芯片会按照用户设计的功能正常工作,即进入用户模式。

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

2.举例说明——altera FPGA配置的全过程。

一个设备完整的配置过程会经历三个过程:复位、配置、初始化。FPGA正常上电后,当其nCONFIG引脚拉低时,器件处于复位状态,此时所有配置RAM内容被清零,所有I/O处于高阻态,FPGA的状态引脚nSTATUS和CONFIG_DONE也会输出为低电平。当FPGA的nCONFIG引脚从低电平变为高电平时,配置开始。同时,芯片将采样MSEL引脚的信号状态,并决定接受哪种配置模式。随后,芯片将释放开漏输出的nSTATUS引脚,该引脚将被片外上拉电阻上拉,从而指示FPGA可以接收配置数据。在配置之前和配置期间,FPGA的用户I/O处于高阻态。

在接收配置数据的过程中,配置数据由数据引脚发送,配置时钟信号由DCLK引脚发送。配置数据在DCLK的上升沿锁存到FPGA中。当配置数据完全载入FPGA时,FPGA上的CONF _完成信号将被释放,开漏输出的CONF _完成信号也将被外部上拉电阻拉高。因此,CONF _完成引脚由低变高意味着配置的完成和初始化过程的开始,而不是芯片的正常工作。

INIT_DONE是初始化完成的指示信号,在FPGA中是可选信号,需要通过Quartus II工具中的设置来决定是否使用这个管脚。初始化期间,内部逻辑、内部寄存器和I/O寄存器将被初始化,I/O驱动器将被启用。初始化完成后,INIT_DONE引脚(开始从器件的上漏极输出)被释放,并被外部上拉电阻拉高。此时FPGA完全进入用户模式,所有内部逻辑和I/O按照用户的设计运行。此时,FPGA配置过程中那些弱I/O上拉将不复存在。然而,有些器件在用户模式下也有可编程弱上拉电阻用于I/O。配置后,DCLK信号和数据引脚不应悬空,而应拉至固定电平,高电平或低电平。

如果需要重新配置FPGA,需要先把nCONFIG再拉低一段时间,然后再拉高。当nCONFIG被拉低时,nSTATUS和CONF_DONE会立即被FPGA芯片拉低,配置RAM会被清零,所有I/O会进入三态。当nCONFIG和nSTATUS都变为高电平时,重新配置开始。

3.配置模式

这个块分为两个部分,一个是在线调试配置,一个是固化,即将项目配置到相应的存储单元中,上电后通过内存中存储的内容对FPGA进行配置。

1)在线配置

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

JTAG接口是一种工业标准接口,主要用于芯片测试等功能。FPGA基本可以支持JTAG命令对FPGA进行配置,JTAG配置模式的优先级高于其他任何模式。JTAG接口由四个必要信号TDI、TDO、TMS、TCK和一个可选信号TRST组成,其中:

TDI,用于测试数据的输入;

TDO,用于输出测试数据;

TMS,模式控制引脚,决定JTAG电路内部TAP状态机的跳转;

TCK,测试时钟,其他信号线必须与之同步;

TRST,可选。如果不使用JTAG电路,可以说它连接到GND。

2)固化

在第二部分中,将程序固化到内存中的过程可以分为两种方式,主模式和从模式。在主模式下

FPGA器件指导配置操作过程,控制外部存储器和初始化过程。在从机模式下,配置过程由外部计算机或控制器控制。主机模式和从机模式从数据传输的宽度上可以分别分为串行模式和并行模式。

I)主弦模式

主弦模式是最简单的固化模式。如图14所示,该模式过程不需要为外部存储器提供一系列地址。它使用一个简单的脉冲信号来指示数据读取的开始,然后FPGA向存储器提供时钟,存储器在时钟的驱动下,将数据输入到FPGA的CDATA _ in端口。

II)主合并模式

实际上,主并行模式与主串模式具有相同的机制,只是在主串的基础上,在相同循环数内传输的数据变为8位或更高,如图15所示。这样,主并行的优先级高于主串行的数量。近代一些地方已经采用这种方式配置FPGA。

III)奴隶联盟模式

从上面可以看出,main模式下的连接还是很简单的。但有时,系统可能会使用其他微处理器来配置FPGA。这里的微处理器可以指嵌入FPGA的处理器,比如Nios。微处理器控制何时配置FPGA以及从哪里读取配置文件。如图16所示,这种方式的优点是处理器可以随时灵活改变FPGA配置,配置速度也快。微处理器首先从外部存储设备中读取一个字节数,然后将其写入FPGA。

IV)从串模式

了解了从机并行模式后,就不需要解释从机串行模式了,其特点是节省FPGA管脚I/O。

v)多芯片级联

多芯片有两种模式。一种是菊花链的思想,多个FPGAs共用一个存储器。另一个是不同的FPGAs可以配置其他存储器。如果显示是共享结构,则开始显示。这里分为主FPGA和从FPGA。主FPGA和存储器配置为串行主机模式,后者的配置由第一个配置的FPGA上的微处理器协调。

4.方式选择

今天FPGA应该可以支持以上五种配置模式,通过三个mode引脚实现。具体映射如下表所示,以后可能会增加模式。

在PS模式下,如果你用一根线缆在板上配置一个FPGA芯片,而这个FPGA芯片在板上已经有一个配置芯片,那么你必须隔离线缆和配置芯片的信号。一般调试时不会焊接配置芯片。这时候用有线下载程序。只有调试完了,把配置芯片里的程序烧了,然后再焊接芯片。或者配置芯片是那种很容易拆下来焊接的。这样,如果出了问题,可以方便地调试。

在FPGA芯片的配置中,可以采用AS模式。如果EPCS芯片是通过下载线路烧录的,那么初始的“nCONFIG,nSTATUS”应该被拉出来。如果考虑多种配置模式,可以采用跳线设计。让配置模式切换到跳线,上拉电阻的阻值可以是10K。在制作FPGA实验板时,一般采用JTAG模式,这样就可以用JTAG模式进行调试。最后,在程序调试正确后,用AS模式将程序烧录到配置芯片中。

:开发工具概述

围绕图1完成FPGA开发流程后,这里总结了各个环节设计的相关软件,如下表所示。毕竟充分利用各种工具的特点,进行各种EDA工具的协同设计,对于FPGA的开发是非常重要的。充分利用这些EDA工具的优势,可以提高开发效率和系统性能。

表中列出的每种EDA工具都有自己的特点。一般FPGA厂商提供的集成开发环境,如Altera Quartus II、Xilinx ISE等,在逻辑综合和设计仿真方面都不是很好,所以一般都会提供第三方EDA工具的接口,以便用户更方便地使用其他EDA工具。为了提高设计效率,优化设计结果,很多厂商提供各种专业软件,配合FPGA芯片厂商提供的工具,进行更高效的设计。

常见的使用方式是将FPGA厂商提供的集成开发环境、专业的逻辑仿真软件和专业的逻辑综合软件一起使用,进行各种EDA工具的协同设计。比如Quartus II+Modelsim+FPGA编译器II,ISE+Modelsim+Synplify Pro等等。

审核编辑:李倩