FPGA设计的各个阶段,FPGA厂商和EDA软件公司提供了很多优秀的EDA工具,尤其是FPGA厂商提供的集成开发环境。熟练掌握这些设计工具能够有效提高设计的效率,但是必须明白这些EDA软件只是一个工具,核心的FPGA设计流程是不变的。
FPGA设计软件:
我们可以将FPGA的开发过程大致分为设计、验证和实现三个阶段。
下图显示了开发生命周期中的各个阶段以及它们是如何相互关联的。
FPGA设计流程
FPGA开发的第一阶段是设计。 我们通常从设计芯片开始。这涉及到将设计分解成许多更小的块来简化编码。 这可能是一个正式的过程,包括框图和与其他工程师的讨论。如果我们正在以专业的能力进行复杂的设计,这尤其可能。 类似地,如果我们在一个小项目中工作,我们可以使用伪代码来创建一个基本的设计思路。 下一阶段是创建我们设计的功能模型。我们通常使用一种主要的HDL语言来实现这个目的。 我们在这个过程中使用了两种主要的建模风格。这些通常被称为寄存器传输级别(RTL)和门级别。 当我们使用RTL方法时,我们描述了在FPGA中数据如何在触发器之间流动。 这意味着我们正在编写代码,从逻辑、RAM和状态机的角度明确描述FPGA的行为。 我们使用门级建模来定义不同预先存在的组件的互连。这些组件是集成FPGA元素的实例,如锁相环、lut或寄存器单元。 虽然我们在FPGA设计工作中使用了RTL,但大多数项目都混合使用了这两种方法。
关于FPGA设计更详细的介绍参见FPGA设计过程
在编写了我们的设计模型之后,我们需要证明它是可行的。我们用于此的过程被称为验证。 我们的设计模拟的第一阶段。为此目的,我们创建了一个测试平台,它为我们的设计生成了许多输入。 然后,通过手工检查或自检代码,检查FPGA输出是否符合我们的预期。 我们可以在函数代码和发布地点和路由列表上重复这个过程。这是FPGA的一个模型,是在我们实现FPGA时由我们的软件工具创建的。这个模型包含了关于FPGA内部时序的信息,因此更能代表最终的实现。 通常,仿真是验证设计的主要过程。我们通常还通过硬件测试来补充这一点,以确保FPGA接口与所有外部电路符合预期。 然而,随着FPGA设计变得越来越复杂,其他技术也开始流行起来。 更现代的验证活动包括硬件在循环(HiL)和仿真。 在这两种情况下,这都涉及到在目标设备上运行代码,并向模拟软件反馈数据。这使得我们能够在设备上近乎实时地运行特定的、结构化的测试。 这是一个优势,因为post place和route netlist与函数代码相比模拟起来非常慢。用函数代码运行一个小时的模拟可以很容易地用一天或更多的时间运行一个post place和route netlist。
一旦我们编写了代码并证明它是有效的,我们就需要在FPGA上编写这个设计。 这个过程实际上包括三个阶段:合成、位置和路径以及编程文件生成。 合成过程将我们的功能代码转换成许多相互关联的门级宏。这些是内部FPGA单元的模型。 这个过程创建一个描述编程FPGA的内容的网表。我们可以把它想象成传统电路设计中的电路图。 在综合我们的设计之后,我们将网表映射到实际的FPGA资源。 第一部分是使用放置过程将宏映射到FPGA中的物理单元。当我们在传统的电子设计中设计pcb时,我们可以把这看作是把元件放在电路板上。 第二阶段包括在称为路由的过程中路由不同细胞之间的互连。这个过程相当于在PCB中布线。 为了满足我们设计的时间要求,通常需要多次运行场地和路线过程。地点和路线工具负责根据我们的配置安排这些多次运行。 作为地点和路线过程的一部分,我们还执行静态时间分析(STA)。该分析计算FPGA中所有时序路径的延迟,并确保我们的设计满足时序要求。 如果我们的设计失败了STA,那么我们不能保证FPGA将可靠地工作。当这种情况发生时,我们要么必须使用不同的设置再次运行实现流程,要么必须更改设计。 在实现过程的最后阶段是生成配置FPGA的编程文件。 下面的框图给出了整个FPGA实现流程的概述。
关于FPGA实现更详细的介绍参见FPGA实现过程
在设计FPGA逻辑中有两种硬件设计语言(HDL)可以选择,一种是Verilog HDL,还有一种是VHDL,在我们的设计中选用普及率更广,更容易上手的Verilog,具体如何使用,可以参考文章末尾的几个PPT教程。
规范的代码风格一方面能体现你足够专业,另一方面也是最重要的一方面,代码的规范性有利于开发交流,让代码的可读性大大增强,也有利于降低代码的出错率。
这里的面积指的是FPGA的芯片资源,包括逻辑资源和I/O资源等;这里的速度指的是FPGA工作的最高频率(和DSP或者ARM不同,FPGA设计的工 作频率是不固定的,而是和设计本身的延迟紧密相连)。 在实际设计中,使用最小的面积设计出最高的速度是每一个开发者追求的目标,但是“鱼和熊掌不可兼得”,取舍之间展示了一个开发者的智慧。
FPGA设计通常会使用HDL语言,比如Verilog HDL或者VHDL。当采用HDL语言来描述一个硬件电路功能的时候,一定要确保代码描述的电路是硬件可实现的。 Verilog HDL语言的语法与C语言很相似,但是它们之间有着本质的区别。C语言是基于过程的高级语言,编译后可以在CPU上运行。而Verilog HDL语言描述的本身就是硬件结构,编译后是硬件电路。因此,有些语句在C语言的环境中应用是没有问题的,但是在HDL语言环境下就会导致结果不正确或者 不理想。如:
for(i=0;i<16;i++) DoSomething();
在C语言中运行没有任何问题,但是在Verilog HDL的环境下编译就会导致综合后的资源严重浪费。
同步电路和异步电路是FPGA设计的两种基本电路结构形式。 异步电路的最大缺点是会产生毛刺。同步设计的核心电路是由各种触发器构成的。这类电路的任何输出都是在某个时钟的边沿驱动触发器产生的。所以,同步设计可以很好地避免毛刺的产生。
FPGA在各个领域都是必不可少的一种硬件工具,掌握并有效使用FPGA对当代的电子设计工程师来讲是非常必要的,要做到较好的FPGA设计需要具备如下的一些技能:
5.6.1 硬件设计
5.6.2 代码开发
5.6.3 FPGA学习和使用要借助的资源
5.6.4 IP Cores的有效使用 随着电子系统越来越复杂,我们不可能任何一个设计都从头自己写代码,必须学会站在巨人的肩上,充分利用现有的资源,尽快地完成自己的设计。经过几十年可编程逻辑技术的发展,可以说几乎所有的常见功能都能够找到可以参考甚至可以直接调用的IP内核,获取这些IP、能够争取地使用这些IP就是一种非常重要的能力。到哪里去找到可靠使用的内核呢?推荐如下几个途径: