英语原文共 39 页,剩余内容已隐藏,支付完成后下载完整资料
先进的FPGA设计
前言
在设计咨询业务中,我接触过无数的FPGA(现场可编程门阵列)设计、方法和设计技术诀窍。无论我的客户是在财富100强名单上,还是刚刚起步的公司,他们都会不可避免地做一些正确的事情和很多错误的事情。在接触了广泛行业的各种设计之后, 我开始从这些经验的综合知识中开发自己的技术和启发库。在指导新的FPGA设计工程师时,我从这些经验中得出我的建议。到目前为止,其中许多建议都参考了讨论FPGA设计的具体实践方面的特定白皮书和应用说明。这本书的目的是凝结众多公司和团队的工程师经验以及白皮书和应用说明的智慧成一本书,用来提高一个设计师的知识并帮助其成为一个先进的FPGA设计者。
有一些关于FPGA设计的书籍,但其中很少真正详细地讨论高级的现实世界主题。这本书试图删去大量不必要的理论,对未来技术的推测,以及过时技术的细节。它的格式简明扼要,涉及各种主题,又不浪费读者的时间。本书的许多章节都假定读者已经理解了某些基本原理,为了简单起见,本书并不总是详细介绍背景信息和/或理论框架。相反,本书涵盖了现实世界设计中遇到的深入主题。在某些方面,这本书取代了有限的行业经验和获得一个经验丰富的导师,有望防止读者通过艰难的方式学习一些东西。这是先进的,实用的方法,使这本书独特。
关于这本书有一点需要注意,那就是它不会像小说那样从头到尾地写。对于一系列没有内在联系的高级主题,这种流程是不可能的,除非用一些无用的东西填满它。相反,为了组织这本书,我按照一种典型的设计流程来安排章节的顺序。第一章讨论架构,然后是模拟,然后是综合,最后是规划等。这在本书开头提供的内容流程图中有说明。为了将来便于参考,这些章节与流程图中的相关块并列列出。
这本书剩下的章节都是大量的例子。简洁起见,我选择Verilog作为默认的HDL(硬件描述语言),Xilinx是默认的FPGA供应商,Synplicity是默认的综合和布局规划工具。本书中涉及的大多数主题都可以很容易地映射到VHDL、Altera、Mentor Graphics等,但是为了完整性而包含所有这些内容只会使重点变得模糊。即使这本书的读者使用这些其他的技术,这本书仍然会传递它的价值。如果你有任何反馈,好的或坏的,随时给我发邮件steve.kilts@spectrumdsi.com
致谢
在我的职业生涯中,我有幸与许多优秀的数字设计工程师一起工作。我与这些才华横溢的工程师的接触始于美敦力公司,并在接下来几年担任公司的顾问。如Honeywell、Guidant、Teradyne、Telex、Unisys、AMD、ADC,以及一些涉及FPGA的应用程序的规模较小、刚成立的公司。我的大部分知识主要归功于FPGA供应商发布的应用说明和白皮书。这些资源包含了没有包含在标准工程课程中的无价的启发。
具体到这本书。我非常感谢Xilinx和Synplicity,它们都提供了贯穿本书的FPGA设计工具,以及一些关键的审阅人。审核人包括Synplicity公司的Peter Calabrese、Pete Danile、Ashok Kulkarni。Sunburst Design公司的Cliff Cummins,Axcon公司的Anders Enggaard, Spectrum Design Solutions公司的Mike Fette、Rod Landers,还有Fliptronics 的Philip Freidin,Fliptronics的Paul Fuchs、Xilinx 公司的Don Hodapp、Logic的Ryan Link,Verein的Dave Matthews,Roman-Jones的 Lance Roman,Polybus的B. Joshua Rosen,以及Xilinx 公司的Jim Torgerson和Larry Weegman。
1.设计速度
如果使用任意编码样式,复杂的工具优化通常不足以满足大多数设计约束。本章讨论数字设计的三个主要物理特性中的第一个:速度。本章还讨论了FPGA中架构优化的方法。
根据问题的上下文,速度有三种主要定义:吞吐量、延迟和计时。在FPGA处理数据的上下文中,吞吐量是指每个时钟周期处理的数据量。吞吐量的一个常见度量是位/秒。延迟是指数据输入到处理后的数据输出之间的时间。延迟的典型度量是时间或时钟周期。计时是指连续元素之间的逻辑延迟。当我们说一个设计没有“满足时间”时,我们指的是关键路径的延迟,也就是触发器之间最大的延迟(由组合延迟、时钟延迟、路由延迟、设置时间、时钟倾斜等组成)大于目标时钟周期。计时的标准度量是时钟周期和频率。
在本章的课程中,我们将详细讨论以下主题:用于最大限度提高每秒可处理的比特数的高吞吐量体系结构;用于最小化从模块输入到输出的低延迟架构;时间优化以减少关键路径的组合延迟,添加寄存器层来划分组合逻辑结构,将顺序执行的操作分隔成并行操作的并行结构,针对优先级编码信号的平坦化逻辑结构,寄存器平衡为流水线寄存器重新分配组合逻辑;重新排序路径,将关键路径中的操作转移到非关键路径。
1.1高通量
高吞吐量设计关心的是稳态数据速率,而不太关心特定数据块在设计中传送所需的时间(延迟)。高通量设计的理念和福特大量生产汽车的理念是一样的:一条组装生产线。在处理数据的数字设计世界中,我们用一个更抽象的术语来指代它:流水线。
流水线设计在概念上与装配线非常相似,即原材料或数据输入进入前端,经过不同的操作和处理阶段,然后作为成品或数据输出而输出。流水线设计的美妙之处在于新数据可以在之前的数据完成之前开始处理,就像在装配线上处理汽车一样。几乎所有的高性能设备都使用流水线,而且特定架构的多样性是无限的。示例包括CPU指令集、网络协议栈、加密引擎等等。
从算法的角度来看,流水线设计中的一个重要概念是“展开循环”。作为一个例子,考虑下面的代码很可能被用于软件实现X的三次方,术语“软件”在这里指的是代码,即将在一个微处理器执行的一组程序。
注意上面的代码是一个迭代算法。在计算完成之前,将访问相同的变量和地址。因为一个微处理器一次只执行一条指令(为了便于讨论,只考虑单核处理),所以并行性没有任何用处。可以在硬件中创建类似的实现,考虑以下相同算法的Verilog实现(不考虑输出缩放):
在上面的例子中,相同的寄存器和计算资源被重用,直到计算完成,如图1.1所示。
使用这种类型的迭代实现,在以前的计算完成之前不能开始新的计算。这种迭代方案非常类似于软件实现。还要注意,需要某些握手信号来指示计算的开始和完成。外部模块也必须使用握手将新数据传递给模块并接收完成的计算。这个实现的性能是:吞吐量=8/3或2.7位/时钟,延迟= 3时钟,计时=关键路径上的一个乘法器延迟。将此与相同算法的流水线版本进行对比:
在上面的实现中,X的值被传递到两个流水线阶段,在这两个阶段中,独立的资源计算相应的乘法运算。注意,当在第二个流水线阶段中使用X来计算最后一个次方时,X的下一个值会被发送到第一个流水线阶段,如图1.2所示。
X3 的最终计算(XPower3资源)和X的下一个值的第一次计算(XPower2资源)同时进行。这个设计的性能是:吞吐量= 8/1或8位/时钟,延迟= 3时钟,计时=关键路径上的一个乘法器延迟。
吞吐量性能比迭代实现提高了3倍。一般来说。如果需要n个迭代循环的算法被“展开”,那么流水线实现的吞吐量性能将提高n倍。由于流水线实现仍然需要3个时钟来传播最终的计算,因此在延迟方面没有损失。同样的,由于关键路径仍然只包含一个乘数,因此没有时间损失。
展开迭代循环可以增加吞吐量。
像这样展开循环的代价是面积的增加。迭代实现需要单个寄存器和乘法器(还有一些图中没有显示的控制逻辑),而流水线的实现需要X和Xpower,以及每个流水线阶段的单独的乘数。区域的优化将在第2章中讨论,展开迭代循环的代价是面积成比例的增加。
1.2低延迟
设计是指通过最小化中间处理延迟,尽可能快地将数据从输入传递到输出。通常,低延迟设计将需要并行性、去掉流水线和逻辑捷径,这些可能会降低吞吐量或设计中的最大时钟速度。
回顾我们的3次方的例子,在迭代实现中没有明显的延迟优化,因为每个连续的乘法操作必须为下一个操作寄存。然而流水线实现,具有减少延迟的清晰路径。注意在每个流水线阶段,每个乘法的乘积必须等到下一个时钟边缘才传播到下一个阶段。通过删除流水线寄存器,我们可以最小化输入到输出的时间:
在上面的例子中,寄存器被从流水线中剥离出来。每个阶段都是前一个阶段的组合表达式,如图1.3所示。
这个设计的性能是:吞吐量=8位/时钟(假设每个时钟有一个新输入)。延迟= 1到2乘法器延迟,0个时钟。计时=关键路径上的两个乘法器。
通过删除流水线寄存器来减少延迟。我们将这种设计的延迟降低到一个时钟周期以下。
损失显然是在计时上,以前的实现可以理论上使系统的时钟周期接近于单个乘法器的延迟,但是在低延迟实现,时钟周期必须是至少两个乘法器延迟(取决于实现)加上关键路径中的任何外部逻辑。
删除流水线寄存器的代价是寄存器之间组合延迟的增加。
1.3计时
计时是指一个设计的时钟速度。设计中任意两个连续元素之间的最大延迟将决定最大时钟速度。时钟速度的概念存在于比本章其他部分讨论的速度/面积权衡更低的抽象级别上,因为时钟速度通常与这些拓扑没有直接关系,尽管这些体系结构中的权衡肯定会对计时产生影响。比如,如果不了解实现的细节,就无法知道是否流水线拓扑会比迭代运行得更快。最大速度,或最大频率,可以根据简单而著名的最大频率方程来定义。
公式1.1最大频率:(1.1)
其中为时钟的最大允许频率;Tclk-q是从时钟到达到数据到达Q的时间;Tlogic是通过触发器之间的逻辑实现的传播延迟;Trouting是指触发器之间的路由延迟;Tsetup是指时钟的下一个上升沿(设置时间)之前必须到达D的最小时间数据;Tskew是发射触发器和捕获触发器之间时钟的传播延迟。
下一节将介绍提高计时性能所需的各种方法和权衡。
1.3.1添加寄存器层
体系结构计时改进的第一个策略是向关键路径添加中间层寄存器。这种技术应该在高度流水线的设计中使用,在这种设计中,额外的时钟周期延迟不会违反设计规范,并且整个功能不会受到寄存器的进一步增加的影响。
例如,假设以下FIR(有限脉冲响应)实现的架构不满足时序要求:
在体系结构上,所有乘法/加法操作都在一个时钟周期内执行,如图1.4所示。换句话说,一个乘法器和一个加法器的关键路径大于最小时钟周期要求。假设延迟需求不是固定在1个时钟上,我们可以通过向乘数添加额外的中间寄存器来进一步流水线化这个设计。第一层很简单:只是添加流水线层之间的乘数和加法器:
在上面的例子中,加法器与乘法器之间通过流水线阶段分开,如图1.5所示。
乘法器是很好的流水线候选项,因为计算可以很容易地分解为阶段。通过将乘法器和加法器分解成单独寄存器阶段,可以实现额外的流水线操作。
添加寄存器层可以通过将关键路径划分为两个延迟较小的路径来改进计时。
这些函数的各种实现将在其他章节中介绍,但是一旦架构被分解成阶段,附加的管道就像上面的例子一样简单。
1.3.2并行结构
架构计时改进的第二种策略是重新组织关键路径,以便并行实现逻辑结构。当当前通过串行逻辑字符串求值的函数可以被并行分解和求值时,就应该使用这种技术。例如,假设前面几节中讨论的标准流水线三次方设计不满足时间要求。为了创建并行结构,我们可以将乘数分解成独立的操作,然后重新组合它们。例如,一个8位二进制乘法器可以用半字节 A和B来表示:
其中A是最显著的半字节, B是最不显著的半字节。因为在我们的3次幂的例子中乘数等于乘数,所以乘法运算可以重新组织如下:
这将我们的问题简化为一系列的4位乘法,然后重新组合这些乘积。这可以通过以下模块实现:
这种设计没有考虑任何溢出问题,但它有助于说明这一点。乘数被分解成可以独立操作的小函数,如图1.6所示。
通过将乘法运算分解成可以并行执行的小运算,可以通过任何子结构将最大延迟减少到最长延迟。
将一个逻辑函数分割成许多可以并行计算的较小的函数可以减少路径延迟到最长的子结构。
1.3.3 平的逻辑结构
架构计时改进的第三个策略是将逻辑结构扁平化。这与前一节中定义的并行结构密切相关,但特别适用于由于优先级编码而被链接的逻辑。通常,合成和布局工具足够智能,可以复制逻辑以减少扇出。但是它们不够聪明,不能分解以串行方式编码的逻辑结构,也没有足够的信息来了解设计的优先级要求。例如,考虑以下控制信号来自一个地址解码,用于写四个寄存器:
在上面的例子中,每个控制信号都用与其他控制信号相关的优先级编码。这种类型的优先级编码实现如图1.7所示
如果控制线是来自另一个模块中的地址解码器的频闪,那么每个频闪都是相互
剩余内容已隐藏,支付完成后下载完整资料
资料编号:[239659],资料为PDF文档或Word文档,PDF文档可免费转换为Word
以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。