目录

FPGA的开发及工具

FPGA设计的各个阶段,FPGA厂商和EDA软件公司提供了很多优秀的EDA工具,尤其是FPGA厂商提供的集成开发环境。熟练掌握这些设计工具能够有效提高设计的效率,但是必须明白这些EDA软件只是一个工具,核心的FPGA设计流程是不变的。

FPGA设计软件:


1. FPGA的开发流程

我们可以将FPGA的开发过程大致分为设计、验证和实现三个阶段。

  1. 在设计阶段,我们专注于将最初的概念或想法转换到实际的FPGA设备中。这通常包括设计芯片,或者把它分解成更小的块来形成一个完整的设计。然后,我们使用HDL语言或其他方法实现这些较小的块。
  2. 实现阶段采用我们的HDL设计,并将其转换为FPGA的编程文件。
  3. 验证过程提供给这两个过程。这包括测试和分析我们的设计和实现,以确保它能正确运行。

下图显示了开发生命周期中的各个阶段以及它们是如何相互关联的。 FPGA设计流程

FPGA设计流程

1.1 FPGA设计过程

FPGA开发的第一阶段是设计。 我们通常从设计芯片开始。这涉及到将设计分解成许多更小的块来简化编码。 这可能是一个正式的过程,包括框图和与其他工程师的讨论。如果我们正在以专业的能力进行复杂的设计,这尤其可能。 类似地,如果我们在一个小项目中工作,我们可以使用伪代码来创建一个基本的设计思路。 下一阶段是创建我们设计的功能模型。我们通常使用一种主要的HDL语言来实现这个目的。 我们在这个过程中使用了两种主要的建模风格。这些通常被称为寄存器传输级别(RTL)和门级别。 当我们使用RTL方法时,我们描述了在FPGA中数据如何在触发器之间流动。 这意味着我们正在编写代码,从逻辑、RAM和状态机的角度明确描述FPGA的行为。 我们使用门级建模来定义不同预先存在的组件的互连。这些组件是集成FPGA元素的实例,如锁相环、lut或寄存器单元。 虽然我们在FPGA设计工作中使用了RTL,但大多数项目都混合使用了这两种方法。

关于FPGA设计更详细的介绍参见FPGA设计过程

1.2 FPGA验证过程

在编写了我们的设计模型之后,我们需要证明它是可行的。我们用于此的过程被称为验证。 我们的设计模拟的第一阶段。为此目的,我们创建了一个测试平台,它为我们的设计生成了许多输入。 然后,通过手工检查或自检代码,检查FPGA输出是否符合我们的预期。 我们可以在函数代码和发布地点和路由列表上重复这个过程。这是FPGA的一个模型,是在我们实现FPGA时由我们的软件工具创建的。这个模型包含了关于FPGA内部时序的信息,因此更能代表最终的实现。 通常,仿真是验证设计的主要过程。我们通常还通过硬件测试来补充这一点,以确保FPGA接口与所有外部电路符合预期。 然而,随着FPGA设计变得越来越复杂,其他技术也开始流行起来。 更现代的验证活动包括硬件在循环(HiL)和仿真。 在这两种情况下,这都涉及到在目标设备上运行代码,并向模拟软件反馈数据。这使得我们能够在设备上近乎实时地运行特定的、结构化的测试。 这是一个优势,因为post place和route netlist与函数代码相比模拟起来非常慢。用函数代码运行一个小时的模拟可以很容易地用一天或更多的时间运行一个post place和route netlist。

1.3 FPGA实现过程

一旦我们编写了代码并证明它是有效的,我们就需要在FPGA上编写这个设计。 这个过程实际上包括三个阶段:合成、位置和路径以及编程文件生成。 合成过程将我们的功能代码转换成许多相互关联的门级宏。这些是内部FPGA单元的模型。 这个过程创建一个描述编程FPGA的内容的网表。我们可以把它想象成传统电路设计中的电路图。 在综合我们的设计之后,我们将网表映射到实际的FPGA资源。 第一部分是使用放置过程将宏映射到FPGA中的物理单元。当我们在传统的电子设计中设计pcb时,我们可以把这看作是把元件放在电路板上。 第二阶段包括在称为路由的过程中路由不同细胞之间的互连。这个过程相当于在PCB中布线。 为了满足我们设计的时间要求,通常需要多次运行场地和路线过程。地点和路线工具负责根据我们的配置安排这些多次运行。 作为地点和路线过程的一部分,我们还执行静态时间分析(STA)。该分析计算FPGA中所有时序路径的延迟,并确保我们的设计满足时序要求。 如果我们的设计失败了STA,那么我们不能保证FPGA将可靠地工作。当这种情况发生时,我们要么必须使用不同的设置再次运行实现流程,要么必须更改设计。 在实现过程的最后阶段是生成配置FPGA的编程文件。 下面的框图给出了整个FPGA实现流程的概述。

关于FPGA实现更详细的介绍参见FPGA实现过程

2. Verilog语言

在设计FPGA逻辑中有两种硬件设计语言(HDL)可以选择,一种是Verilog HDL,还有一种是VHDL,在我们的设计中选用普及率更广,更容易上手的Verilog,具体如何使用,可以参考文章末尾的几个PPT教程。

规范的代码风格一方面能体现你足够专业,另一方面也是最重要的一方面,代码的规范性有利于开发交流,让代码的可读性大大增强,也有利于降低代码的出错率。

4. FPGA设计的3大法则

4.1 面积与速度的互换

这里的面积指的是FPGA的芯片资源,包括逻辑资源和I/O资源等;这里的速度指的是FPGA工作的最高频率(和DSP或者ARM不同,FPGA设计的工 作频率是不固定的,而是和设计本身的延迟紧密相连)。 在实际设计中,使用最小的面积设计出最高的速度是每一个开发者追求的目标,但是“鱼和熊掌不可兼得”,取舍之间展示了一个开发者的智慧。

  1. 速度换面积: 速度优势可以换取面积的节约。面积越小,就意味着可以用更低的成本来实现产品的功 能。速度换面积的原则在一些较复杂的算法设计中常常会用到。在这些算法设计中,流水线设计常常是必须用到的技术。在流水线的设计中,这些被重复使用但是使 用次数不同的模块将会占用大量的FPGA资源。对FPGA的设计技术进行改造,将被重复使用的算法模块提炼出最小的复用单元,并利用这个最小的高速代替原 设计中被重复使用但次数不同的模块。当然,在改造的过程中必然会增加一些其他的资源来实现这个代替的过程。但是只要速度具有优势,那么增加的这部分逻辑依 然能够实现降低面积提高速度的目的。可以看到,速度换面积的关键是高速基本单元的复用。
  2. 面积换速度: 在这种方法中面积的复制可以换取速度的提高。支持的速度越高,就意味着可以实现更高的产品性能。一些注重产品性能的应用领域可以采用并行处理技术,实现面积换速度。

4.2 硬件可实现原则

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的环境下编译就会导致综合后的资源严重浪费。

4.3 同步设计原则

同步电路和异步电路是FPGA设计的两种基本电路结构形式。 异步电路的最大缺点是会产生毛刺。同步设计的核心电路是由各种触发器构成的。这类电路的任何输出都是在某个时钟的边沿驱动触发器产生的。所以,同步设计可以很好地避免毛刺的产生。

5. FPGA设计需要的技能

FPGA在各个领域都是必不可少的一种硬件工具,掌握并有效使用FPGA对当代的电子设计工程师来讲是非常必要的,要做到较好的FPGA设计需要具备如下的一些技能:

5.1 具备自己设计高速数字电路板(PCB)的能力并且掌握DSP的基础理论

5.2 还要掌握至少一门硬件描述语言(HDL)

5.3 从系统高度设计你的系统

5.4 具体实现 - 通过软件/DSP设计

5.5 FPGA的选型决策原则

  1. 功能/资源:逻辑单元、存储器、处理能力、IO、处理器内核、DSP
  2. 封装:满足管脚数量以及板卡的物理尺寸要求
  3. 功耗:满足系统对供电的限制需求
  4. 开发工具/难度:影响设计难度和开发时间,尽可能选择易于开发、调试的器件架构
  5. 系统成本:包括配置RAM、外供电源、时钟等,除了器件成本之外还要考虑实现成本、支持成本等。
  6. 购买难度:价钱/数量/供货渠道
  7. 灵活性:便于将来的产品修改和升级
  8. 技术支持:供应商是否能够提供良好的技术支持,乃至培训

5.6 FPGA应用中的注意事项

5.6.1 硬件设计

  1. 管脚分配:输入/输出类型,预留功能管脚,方便布线
  2. 时钟:全局时钟 vs 局部时钟,PLL vs DLL,是否驱动
  3. 电源:内核电压/接口电压及其相应电流,上电时序
  4. 编程:JTAG、配置、在线更新
  5. 测试点:关键信号 - 时钟、电源、关键IO

5.6.2 代码开发

  1. 善用IP Core:调用原厂提供的经过验证过的IP内核
  2. 硬件设计概念:并行工作、时延
  3. 充分仿真:功能仿真、时序仿真、TestBench
  4. 调试:使用原厂提供的片上逻辑分析工具

5.6.3 FPGA学习和使用要借助的资源

5.6.4 IP Cores的有效使用 随着电子系统越来越复杂,我们不可能任何一个设计都从头自己写代码,必须学会站在巨人的肩上,充分利用现有的资源,尽快地完成自己的设计。经过几十年可编程逻辑技术的发展,可以说几乎所有的常见功能都能够找到可以参考甚至可以直接调用的IP内核,获取这些IP、能够争取地使用这些IP就是一种非常重要的能力。到哪里去找到可靠使用的内核呢?推荐如下几个途径: