收藏 分享(赏)

高速FPGA器件的顶层设计——毕业论文.doc

上传人:wo7103235 文档编号:6151735 上传时间:2019-03-30 格式:DOC 页数:17 大小:311KB
下载 相关 举报
高速FPGA器件的顶层设计——毕业论文.doc_第1页
第1页 / 共17页
高速FPGA器件的顶层设计——毕业论文.doc_第2页
第2页 / 共17页
高速FPGA器件的顶层设计——毕业论文.doc_第3页
第3页 / 共17页
高速FPGA器件的顶层设计——毕业论文.doc_第4页
第4页 / 共17页
高速FPGA器件的顶层设计——毕业论文.doc_第5页
第5页 / 共17页
点击查看更多>>
资源描述

1、毕业设计论文院 (系) : 专 业: 学生姓名: 学 号: 年 月 日高速 FPGA 器件的顶层设计鸣谢在开始这份报告之前,我想感谢下面这些人,他们帮助我完成了这个项目,没有他们的帮助,我是不可能完成这个项目。我要感谢我的主管韦力拉克教授,他在整个项目进行中给了我很多的建议和鼓励,他还告诉我也面对在项目中遇到的困难。我要感谢杨教授,他让我运用他的硬件运算法则。他还给我说明的例子源文件好让了解他的理论。我还要谢谢他卓越的多媒体的教程。这些多媒体教程包括了很多让我明白图像进程原理的概念。摘要在这个项目中,我发现了一个高质量硬件设计的体系方法,有了这个方法,我成功地在高速硬件上运行了一个经典的凝胶图

2、像算法。在这份报告中,我还会提到一个新器件,这种新硬件可以通过重新排列代码来自动完成高质量的硬件优化。这样它可以运行在最小的时钟周期中。这份报告分为 5 个章节第一节是介绍:主要包括背景和所有相关的工作,还有一些我在这个项目上投资。第二节是优化:在这一节中,我将着重描述用于优化的新器件。我还将论证一些器件可以自动优化的过程。第三节是硬件拓展:在这节中,我将归纳几步改变一个软件,然后下载到硬件中。这些包括许多能改进性能或者保存硬件资源的器件。第四节是范例分析:凝胶图像过程。在这节中,我将用凝胶图像过程作为一个例子来说明在第二节中讨论的硬件的资源和性能的影响。我还会比较两种器件和软件的应用的性能,

3、软件的版本是:Pilchard 和 RC1000第五节是结论,包括评估成就和期望的特性工作第一节:说明自从 Handel-C5.a 类 C 硬件语言的出现,一个完全的顶层的 FPGA 设计方法就被认识到。然而许多开发者当他们要设计高速运行的硬件的时候仍然停留在底层的语言上,比如VHDL 这是因为开发者在底层的方法有许多实际电路的控制方法。但底层的设计在 FPGA 芯片规模逐渐变大的时候可能会达到极限。开发人员将不能用底层的设计来开发包括几十亿个门的高速电路。这个时候顶层的设计就可以达到要求了。这个项目的目的就是介绍一套系统的方法来设计顶层的高速硬件性能。1.1 背景和相关工作在这节中,我将介绍

4、一些材料来方便读者了解这篇论文中的一些概念。1.1.1 现场可编程门阵列(FPGAs)1像许多的可变成逻辑器件(PLDs)一样,FPGA 是一块可编程的硬件,然而, PLDs 的资源消耗和时间延时限制了其大小。而 FPGA 可以很轻易在一块集成芯片上设计一个有几百万个门的电路。FPGA 的可再编程特性允许开发人员用比使用一块 VLSI 芯片更少的开发时间和更少的开发成本来设计。值得一提的是 FPGA 以每年两倍容量的发展。因为最新的芯片上有几百万个门,所以 FPGA 是开发复杂应用的系统理想开发平台。因此我在开发它的应用。Pilchard 2Pilchard 是一个基于现场可编程门阵列(FPG

5、A)的可配置的计算平台,它可以插在一台标准的个人电脑的 133MHZ 同步的动态 RAM 和双向存储器模块(DIMMS)的插槽中。相比于传统的利用 PCI 接口的 FPGA 器件,由于 DIMM 接口的宽带宽和低延时,Pilchard 允许数据在更短的时间传出电脑或者传入电脑。然而由于 DIMM 接口原本不是设计为 I/O 接口的,所以需要额外的控制信号来表示数据读写过程的开始和结束。因此,由于 Pilchard 的发展和运用,顶层的性能设计方法好过底层的结构设计。这就证明了为什么一个用高性能的FPGA 的顶层设计的系统方法是很有必要的。RC1000 3RC1000 是一个专为可配置的计算应用

6、的 32 的 PCI 卡,它以库的形式全支持的程序包在适合这设备的电路设计,它在连在 FPGA 或者主 CPU 的板子还有 4 个 SRAM(每个 2M 字节),这块板子可以配置成可以运行在 4000KHZ 到 100MHZ 的频率中。这个器件在很多方面是不同于 Pilchard 的,在这份报告中,我将表明发展在这项目内一般介绍,并且可能在应用开发在不同设备上适用。1.1. 4 VHDL 4VHDL 是一门在当今市场上最好的可编程逻辑器件设计语言,VHDL 的顶层设计取决于他能让设计者很快得将大型电路设计出来然后放到市场上。它可以用库文件保存起来,以便以后的再应用,由于 VHDL 是一门标准语

7、言(IEEE 标准 1076) 。VHDL 能像其他独立器件设计一样提供方便的代码来同步和仿真,VHDL 还很容易将一个可编程逻辑转化为一个 ASIC功能 。这门语言的缺点是还不够高级,开发人员必须掌握组件的硬件特性。因此,我决定用另外一门更高级的硬件语言-i.e.Handel-C。1.1.5 Handel-C 5Handel-C 是一门类似于 C 语言的编程语言,它可以用于将硬件图像通过编程下载到FPGA 或者 ASICs 中,Handel-C 为了支持很少的硬件优化而加入了一些在 C 中没有的额外的特性。其中一个是这门语言支持指定每个信号的宽度,这样优化可以用 Handel-C 编译的额外

8、资源来完成优化。Handel-C 编译的目的是为了能直接用 xnf 或者 edif 格式通过编程下载到硬件器件中。Handel-C 好过 VHDL 的是它不需要开发人员掌握太多底层硬件知识,而VHDL 必须要求掌握。它是一门完全的顶层设计语言!图一显示我采用的转换 Handel-C 程序到硬件中,尽管每一步都需要很多工具,但用户不需要了解硬件的细节,因为用户只需要点几个按纽就可以转换文件到下一步,就像这样。图 1.1 Handel-C 的设计流程编译 布局和布线 下载1.1.6 Handel-C 语言的扩展 7一个 PH.D 的学生李东尤发明了一门支持硬件和软件的语言,他的方法是把 C 和Ha

9、ndel-C 绑在一起,在这门语言中,用户可以指定哪个部分用于软件,哪个部分用于硬件。在这个项目中,他还开发了很多友好的用语 FPGA 器件和主机的通信接口,然而支持这门语言的器件还相当有限,这就是我为什么不选择这门语言的原因。1.2 主要成就我已开发出一种简单而有效的优化方法,这种方法可以重新排列代码,这样可以运行在最小时钟周期。我已开发出针对高速器件设计出一个体系的顶层硬件设计流程我实现在硬件运行复杂的 2D 凝胶图像过程第二章 优化在这章中,我将论述很多的方法来优化顶层代码,优化是我们开发和运用的主要部分,Handel-C 编程 EDIF 网格文件 硬件比特流类似于由于有限的 CPU 资

10、源而运行的 PC 软件。这一章的主要目标放在怎样自动优化这些进程,我们还将讨论一些相等进程,以便衡量优化后速度到底提高了多少2.1 性能优化这是在开发潜能类似于程序在相同时钟周期运行在不相矛盾的操作来获得速度上的增加,在通常的运用中,十几或者几百个操作在电脑上并行运行,然而电脑因为硬件资源的有限是不能并行操作的。但是设计特殊的能并行操作的硬件是有可能的。重要是速度能达到。这就是为什么 FPGA 的应用有时候比相应运行在低时钟的 FPGA 的软件(当然我们也需要考虑到物价指数,但是 PC 机的 CPU 仍然可以快速独立地运行) 。这有我们可以运用的技术。2.1.1 平衡每条路径的延迟平衡每条路径

11、的延迟是很重要,因为硬件的时钟最快也就是最长延时的那条路径。因此因为如果有某一条路径上延时十分严重,当其他的路径能够以非常高的速度运行的时候那么我们就浪费资源。通过平衡延时能确保并行优化是最理想的。一条路径的延时定义为:= + (2.1)delayTlogicruting这里的 是一条路径的总延时;delay是逻辑延时;logic是线路上的延时rutinT因此,为了减少延时就是减少 和 的其中一个或者两个都减少,这里有两步delayTrouting主要步骤化复杂的操作为简单的操作用一些预定义的组件和布线约束化复杂的操作首先,最简单的步骤是把复杂的步骤分成学多简单的操作,这个步骤有效得减少了每一

12、步的逻辑操作,因此减少了等式 2.1 中 。在软件编程中,复杂操作通常比相同结构logicT的简单操作运行要快甚至更快,这是因为编译器会为我们优化结构操作。而硬件中,一个复杂的操作就意味着要用很长的时间来完成,而简单操作就不需要很长的时间。图 2.1 表明了把一个复杂的操作分成许多简单的操作。在这个例子中,我们可以看出有时候额外的寄存器我们可以看出为了使操作足够简单,通过额外的寄存器把中间计算结果存起来是很有必要的。图 2.1:复杂操作的分解复杂操作a+= b+ c*d简单操作int temp;temp=c*d; temp+=b; a+=tem p;预定义布置和布线组件如果第一种方法不能满足用

13、户要求或者时序上的限制不能满足,我们可以用 FPGA 芯片开发者提供的延时分析,来找出延时最长的一条线路。例如,我们可以用 Xinlinx ISE Foundation 4 的延时分析来分析 Xinlinx 公司的 FPGA 芯片,在找到最长的线路后,我们就知道哪个操作运行太慢了。这个时候,我们就应该试试这两种方法来提高运行速度。第一种方法是自己尝试写一个限制文件明确地布局和布线,这样相比于一些不是很好的自动布局和布线的工具可以提高工作效率。然后我们可以在布局和布线之前把这些限制文件包括到进程中。然而这种方法需要开发人员有相当多 FPGA 芯片知识,这包括关于芯片支持的一些能减少延时的原始组件

14、和布局布线之间的关系等方面的知识。第二种方法相比来说简单一些,就是用一些预定义好的元器件来布局和布线,这些都是芯片开发人员做好的,简单来说就是芯片开发人员已做好了,你只是调用就行了。就 Xinlinx 来说,他有一个叫做代码生成器的编程软件,他就像上面说的一样可以直接调用的。Handel-C 菜单中指定了怎样把这些组件包括到 Handel-C 编程菜单中,然而用户需特别注意这些组件的输入和输出的时序。由于 Handel-C 语言的局限性,输入信号要晚一个周期进入组件,这一步会减少等式 2.1中 ,因为逻辑块的较佳的布局和信号的布线会使延时明显得减少。routingT进程自动的可能性以上,我们讨

15、论了两种方法来达到这一步,这一步是很难实现自动,因为很难定义哪个操作是复杂的哪个不是,这取决于我们用到的器件和芯片还有程序的功能。我们需要一个严格时序限制的器件。一个 16 位的乘法器相比于其他不能运行在高速的器件来说可以认为是一个复杂的器件。当一个操作不能运行在高速环境上,再去把这个操作再去分成一些可以运行在高速的分操作简直是浪费。然而我们可以再借用李的观点来把这些操作实现自动化。当编译源文件的时候,我们可以包含我们要用的器件信息和时序限制,器件库包含有每个逻辑单元的延时时间。它还包括 FPGA 开发工具怎样对信号布线的信息。这样编译器可以估计每路的 , , ,然后和限制的时序延时比较,如果

16、不能达到,编译logicTrutingdelayT器会用上面提到的第二种方法来平衡每路的延时,直到符合限制条件。2.1.2 基本的并行操作这是实际的性能优化的最简单的第一步,下面的操作可以使进程自动化。连续扫描程序,尽量把更多的操作联合在一个时钟周期中,直到违背了资料相依的条件,然后在下一时钟周期重复这样的操作。因为我们已经讨论怎样在更尽快的部分内发现数据从属性,这个过程可能被自动做。图 2.2 是一个简单的例子,我们看到如果没有并行操作,将需要 8个时钟周期来完成 8 个操作,然而如果用并行操作,只需要 2 个时钟周期就可以完成这些操作。A=1; 操作 1 ParB=2; 操作 2 A=1;

17、 操作 1C=3; 操作 3 B=2; 操作 2D=4; 操作 4 C=3; 操作 3A=A+1; 操作 5 D=4; 操作 4B=B+2; 操作 6 C=C+3; 操作 7 ParD=D+4; 操作 8 A=A+1; 操作 5操作 5 是依赖与操作 1 的, B=B+2; 操作 6但并不依赖操作 1,操作 2 C=C+3; 操作 7操作 3,操作 4 之间,就像 D=D+4; 操作 8在操作 5,操作 6,操作 7 操作 8 之间一样。2.1.3 重新排列代码顺序有时候,一个程序可以有高度的并行性,但操作执行的顺序的方法在上面提到的。例如,图 2.3 中的代码是跟图 2.2 中的代码功能是一

18、样的,但如果我们用基本的并行操作,将需要 4 个时钟周期来完成这个操作,而不是 2 个时钟周期。我们有是可以通过重新排列代码的顺序,这样程序可以运行尽可能少的时钟周期,例如上面代码可以改成图 2.2 一样的顺序,这样我们又可以用“基本平行”方法。由于这些进程可以被编译器自动进行,编译器将需要有相当多编程的知识和原因,我已研究出一个方法来实现这些进程的自动化。1.首先,选择一部分代码开始, 最好在局部循环中。2.用变量名作为索引和标签来建一个空表,标签的格式是 var:n,其中 var 是一个变量的名称,n 是指定的操作顺序的个数。3.连续扫描代码,对每一个变量的任务(任一修正/设定初值), 在

19、下面被列出的规则之后分配标签到操作:第一步:查询表格,找到标注的变量的标签第二步(a)如果没有发现入口,变量就是先前定义,把这个程序入口加入表格,内容(标签)指定为 as:形式。第三步(a1)如果变量是一个常量或者是一个从外部输入的信号量。指定其标签为VARname:1,这里的 VARname 是定义的变量名。第三步(a2)如果变量的值取决于其他的变量,从表格中取出这些变量的标签,定义这些变量的标签从我们取得最大的次序加 1 得到。例如,如果 a=b + e,如果 b 是d:3,e 是 e:4,这样 a 的标签应该是 e:5第二步(b)如果有程序入口,变量就是在前面已经定义的,直接取得这些变量

20、的标签。第三步(b)更新在第三步(a1)和第三步(a2)中改变了的变量标签,但是由于一个变化当发现最大的次序标签的时候,我们应该包括比较的它本身的标签。 举例来说, 如果a = b+c 而c和b的标签是和上面的相同的,但是a的标签已存在表格中,值为a:5,这样新的标签将会是a:6.注意在做比较的时候,我们要视常数的次序为0。第四步:用我们刚才指定的标签把这些操作连接起来。4.将所用的操作做了标签后,我们就要调整操作了,把有相同次序的操作放到一起。5.现在, “基本平行”方法将会回到运行最少周期的程序代码上了。相同次序的将会放到一个块中。6.重复从第二步开始的各个步骤,直到整个程序都被转换。这个

21、方法的可行性是把所有的操作放到最近的一个时钟周期执行,这样,经过修改后的代码只用最少的时钟周期就可以执行完成了。很显然这种方法可以很容易实现自动化,通过联合这种方法和前面的“基本平行”的方法,一个令人惊讶的效率很高的并行工作工具被发展!图2.4显示出这种方法怎样工作的例子图2.3 未优化代码A=1; 周期 1 ParB=2; 周期 2 A=1; 周期 1C=3; 周期 3 A=A+1;D=4; 周期 4 A=A+1; 周期 5 ParB=B+2; 周期 6 B=1; 周期 2C=C+3; 周期 7 B=B+2;D=D+4; 周期 8 Par 周期 3C=3;C=C+3;Par 周期 4D=4;

22、D=D+4;图 2.4 重新排列代码的步骤2.1.4 增加寄存器来储存中间结果仅仅通过重新排列代码有时候是不够的,如果我们发现有许多针对一个变量的操作,而其他的变量只有几步的操作,这样就会出现在前面几个时钟周期有很多的操作,而到了后面的时钟周期却没有了几步操作。这样,我们能平衡每个时钟周期的操作呢?可能解决这个问题的办法就是增加寄存器来储存中间结果,而且这样可以在很短的时间计算中间变量的值,由于这需要很的理论和逻辑单元,而且这项操作很复杂,所以可以很难实现自动化操作。图 2.5 是这种方法的一个例子,我们可以看到在修改代码之前需要 3 个时钟周期在修改程序后只需要 2 个时钟周期。图 2.5

23、用存储器来储存中间变量2.1.5 流水线操作流水线操作是在一个操作中有多任务的时候一种执行方法,亨利丝和帕得森在他们的书第三节是这样介绍这个流水线操作的具体方法:流水线操作就像是一个装配线,在一个自动装配线上有许多步骤,每个步骤完成一个装备小汽车的操作,尽管在不同的小汽车上,但每个步骤都是并行作业的。理想状况下,我们可以在每个时钟周期后来执行下一个操作,这样,流水线操作就是满负载的,生产量在每个时钟周期将会是一项任务不论它花多少时钟周期来完成这项操作,因此,当一个任务需要 100 个时钟周期来完成,而且你有足够多的任务来让生产线一满负荷,这样将花大约 100 倍的时间来完成所有的任务,但速度决

24、定不会达到 100,因为:流水线需要额外的控制逻辑,因此需要增加成本。流水线需要额外的寄存器来储存中间变量,因此增加延时。此外,开发人员要知道操作不会在很段的时间就完成了,因此流水线操作是一个理想的相同的计算大数据操作。这有当我们用流水线操作的时候必须注意到的几点:当没有足够硬件资源来处理交错的任务的时候,哈泽德式结构就会发生。例如,我们不能在一个时钟周期来多次来读一个 RAM 里的数据。解决的方法是在流水线操作中确保有足够多的硬件资源。因为你用的寄存器储存的中间变量的值在每个周期可能会改变,所以寄存器中数据会丢失,除非你有足够多寄存器来储存中间变量。这样,如果在一个流水线的一个状态在很多状态

25、以后才用到,这样我们就需要增加额外的寄存器来储存和传递中间变量的值,这样任务进入一个新的状态的时候,任务想要读数据的数据就有数据可以读。当操作需要数据没有准备好,哈泽德式数据就会产生。当进入一个新的流水线操作的时候我们需要很小心设计流水线操作,以防止哈泽德式数据的产生。图2.6是一个把Handle-C程序转换成流水线操作的例子,运行的结果是数据输入5阶次方。图2.7显示出上面例子的效果。图2.6 转换为流水线操作图 2.7 流水线的效果2.2 空间优化空间优化跟时间优化完全不同,时间优化通常是在同时用更多资源执行更多的操作来获得高速操作,而空间优化关心是这样用最少的资源来完成操作。这在 FPG

26、A 设计中相当重要,因为我们用的资源越少,我们可以在片子上有更多的操作。我们现在就来讨论一些空间优化的方法。2.2.1 变量的最佳宽度记住在 4.1 标准宽度中变量的转化方向,事实上,如果我知道一个我们要用的值的上限和下限范围,我们就会发现有些位在大多数情况是用不到的。例如:一个 0-1024 的变量就不需要用 32 位,11 位的整型就足够了。一个位数少的就只需要小的寄存器来储存了。位数低的比位数高的相同操作需要更少的逻辑门,等式 2.1 中提到, 是 的一个logicTdelay组成部分,因此,这种优化不仅节省了很多资源,还减少了 ,从而减少了 。logicl皇家学院的学生阿塔夫正在研究这

27、个项目8。这个项目主要的目标是通过限定浮点型变量的最佳宽度来自动资源优化。他的方法是仿真足够多的数据,然后通过统计学的原理来找出变量的最佳宽度。2.2.2 组件的再运用如果相同宽度的不同操作数的相同操作在不同的时钟周期中要运行多次,我们就可以建立一个可以应用于不同操作数组件。这种方法不影响电路的延时,但节省了复制组件的门!为了能更多的运用这些组件,我们甚至可以放弃限制条件,这样短操作数的操作可以运用这写共享组件。这是因为长操作很短操作是一样的。可能有疑问是,由于用了并需要多很多逻辑单元会增加电路的延时。是的,原则上,我们可以用足够的逻辑单元就会操作变快,然而 FPGA 器件并不支持不同操作不同

28、时钟,时钟的频率时最长那条路径来决定,因此,共享组件对程序的影响不会很大。在 Handel-C 中,共享表达式可以很容易定义共享组件,图 2.8 是这样的一个简单例子,想要了解更详细的信息,参考 Handel-C 的用户指南和 DK1 设计步骤是很有用的。图 2.8 Handel-C 中的共享表达式2.3 评估如果我们不知道估计结果,这样就无法知道优化是否达到效果,因此,在这节中,我们将讨论有关估计的相关手法。我将给出一些等式,这样,开发人员就可以对操作做出判断。是否值得在硬件中编程?如果结果达不到预期结果,器件再高级点是否可以值得这样做,或者可以想到能达到更高速度的其他方法。这些都是我们这节

29、要回答的问题。2.3.1 等式= + + (2.2)excTonfigcmprocT现在我们将介绍一些其他的等式来帮助我们估计结果。假设硬件在执行的过程中不需要经常配置,这样 0 因此,等式变为:configT= + (2.3)excTomprocrutingT可以通过下面等式得:pro=n*t (2.4)rc这里的 n 时钟的个数,n 是时钟的延时T 可以通过下面等式确定:t=1/c (2.5)这里 c 是时钟频率因此=n/c (2.6)procn 可以在电路编译后的仿真中得到,c 可以从延时报告中得到。同理我们可以得到 comT=w/b (2.7)comT这里的 w 是每项操作主机和 FP

30、GA 芯片需要交换的字节数,b 是器件和 PC 机通信的接口的带宽。把 连在一起得:procm=w/b+n/c (2.8)excT从这个等式中,我们可以看到优化并不是只是减少时钟的个数和提高时钟的频率,我们还要考虑到通信的数据量,有时候,高速并不因为你能很快传递数据,而是因为很好传递数据的方法。例如:如果我们能很轻松处理数据以便数据在 n 操作只能被读一次,然后每个操作中 w 等于 o+i/n,这里 o 是输出到主机的数据量,而 i 是从主机输出的数据量。2.3 等式的推理我们知道软件的 ,所以我们就可以知道期间是否可以达到我们想要的速度。如果excT不知道,我们将试着去推出来。1. 首先,w

31、/b 是比 大一点吗?如果是,不管硬件运行多快,对整体的速度的提高exc一点用处都没有,因为大部分的时间都用来传递数据,除非你利用一个高带宽的通信接口,这样就不值得在硬件上执行这个程序了。2. 假设 c 不变,w/b 相对与 相当的小。例如:时钟的频率是不变的,计算 n 需要excT达到这个速度,这样我们就应该考虑更多的并行处理方法来达到这个周期数3. 如果你觉得不好处理 n,那么就假设 n 是定值,这样计算 c 是否可以提高速度,然后考虑当前的方法是否可以运行在这样的速度上,如果你用更高级的芯片是否可以提高速度。或者你是否期望你能运行的速度的芯片进入市场。4. 是否你的方法有局限性,例如:如

32、果你读同时存储器中一个地址,可能你的方法能以 10 倍的速度运行。5. 最后,你的程序是否可以在硬件的其他可以开发的并行执行的位置执行。2.4 小结在这章中,我讨论了很多优化操作,我介绍了通过重新排列代码来使你的的程序能并行执行在最段的周期中,在后面,我介绍了优化操作中很重要的一个计算等式,在等式中,我们了解到操作的执行速度不仅跟 FPGA 芯片运行速度和你能减少多少个时钟周期,还跟怎样减少 FPGA 芯片跟主机通信的资源有关。第三章:系统的顶层硬件设计在这章中,我将介绍这样把软件编程转换到硬件的一般的 5 个步骤,我将在后面的几个小节中具体介绍这 5 个步骤。3.1 设计步骤Handel-C

33、 中,开发人员把软件编程转换为硬件电路的一般步骤如图 3.1 所示。如下所示:1. 第一步是编程分析,编程分析通常是确定程序中哪块要转换为硬件。这步是很重要的,因为这步决定了操作的最后结果,基本方法是找出一个程序哪一个部分重复执行,因此这个部分的速度将很明显影响整个电路的速度。2. 第二步是直接转换,这一步是直接把软件编程不优化直接转化到硬件电路中,这样是为了确保硬件执行结果能跟软件一样。3. 第三步是平衡延时,这是为了平衡硬件每个部分的延时,这一步很重要,因为硬件的时钟延时会是每个通路的最长的那个延时,因此,如果某一个通路的延时比其他的都要长,这就意味着我们浪费很多资源,因为其他的通路不能运

34、行在更高的速度。4. 第四步是优化,一次运用一种优化算法是很重要的。应用优化算法后,我们就要看程序是否达到要求,如果没有达到,就回到第三不,如果达到了,就继续下面的第五步。5. 最后一步是估算,就是估计程序的硬件电路的实际结果,然后对下面的问题做一个结论。硬件是否提高了程序的运行速度?如果没有,在哪一块能,我们可以用其他的方法来执行这个程序吗?等。我们可以看到最后 3 个步骤事实是我们前面讨论的优化,剩下的我们将在这章中讨论。图 3.1 硬件开发步骤3.2 编程分析在这一节中,我们将讨论硬件顶层设计的第一步。程序分析是最五个步骤中最重要的第一步:程序分析。确定程序哪个部分需要转换第二步:把软件

35、不优化直接转化为硬件第四步:优化,每次应用一个优化算法,检查是否符合条件要求,如果不符合,回来第三步第三步:平衡每路的延时第五步:估计实际结果,写结论一步,以为如果在硬件上选择了错误的部分,那么对程序的影响将不会很明显或者可以忽略。3.2.1 程序分析的四个指导原则我研究出程序分析的四个指导原则,开发人员并不需要必须征寻,但可以给开发人员知道程序的哪个部分可以转换。原则 1:选择重复执行的部分原因很明显,如果我们选择在硬件中很少运行的部分,尽管这个部分可以高速运行,但对实际程序的运行并不起很大的作用,因为它在硬件中很少执行。我们最好选择在有限的硬件中执行程序的内循环。然而,因为技术的提高,今天

36、,随着 FPGA 芯片的越来越大,集成的百万个门和实时的在线配置,把整个程序都写到硬件中都是有可能的。原则 2:选择数据依赖性小的模块在硬件执行的那部分程序是不能太依赖数据,FPGA 芯片一般是比 PC 机的 CPU 要慢一点,这就为什么需要外加逻辑电路来配置 FPGA 器件。因此程序的并行操作才可以到达高速。太依赖数据将会减少并行的操作,因为这块的数据取决于其他块的数据将会影响程序的并行操作。原则 3:选择通信少的模块硬件执行时间是= + + (3.1) excTonfigcomprocT这里的 表示总的执行时间exc表示重新配置的时间onfig表示主机和 FPGA 芯片传递数据的时间cmT

37、表示实际的数据执行时间pro从等式3.1可以看到,完成所有硬件操作的时间不但取决于数据执行时间,而且还包括了FPGA芯片配置时间( ) ,传递初始数据和从FPGA芯片中读数据的时间( ) ,configT comT如果我们不需要实时重新配置FPGA芯片,在我们第一次配置器件的时候, 就是零,nfig然而每次执行程序的时候, 就不会是零,总共的时间取决于主机和器件交换的数据量com很交换的频率。如果有大量的数据要传送,当Tcomm占Texec的大部分的时候,高速运行可能就达不到。然而在某些情况下是有办法来解决这个问题的。例如,如果在顺序执行的时候,大部分的数据是一样的,我们在第一次操作后就把这些

38、数据留在FPGA芯片中,这样顺序执行的Tcomm包括在传递不同数据的时间中。原则4:如果可以,尽量避免浮点型的计算众所周知,PC机比FPGA芯片能更好得计算浮点型数据,由于专用的CPU和很好并行硬件设计,所以推荐有CPU来处理浮点型数据,尽管FPGA有支持浮点型数据计算的库,但它不能像运行整形数据计算那样快,然而,现在有很多商业界,学术界都在研究这个操作,所以我可以预见这个原则过不了多久就用不上了。尽管这样,我还是要推荐避免浮点型数据操作,如果开发人员碰到浮点型的计算,应该试着考虑可否用整形数据计算来代替浮点型的计算。所有的硬件开发操作中,这些操作是最难实现自动完成的。因为这涉及到考虑程序到底

39、是做什么的,因此很难找到一个实现自动的规则,然而,可以从现在的编译器借鉴一些方法来使这一步简单点,例如:亨利丝和帕得森研究的编译器的方法,从而发现数据依赖而且很有可能可以除去这中依赖性。3.3 直接转换在这节中,我们将看到开发过程的第二步。就是把软件编程直接转化成硬件语言,这一步不涉及任何优化,把优化留在后面是因为我们必须确保硬件编程能和软件编程有同样的结果,这样可以方便调试,如果我们把优化放在前面,这样如果有错误有发生时,我们就很难调试程序,因为我们不知道问题出在哪一步。这个部分是很直接,因为 Handel-C 是一门顶层设计语言。仅仅需要加一些代码来让主机和 FPGA 器件之间通信,这部分

40、代码要符合等式 3.1 中通信用时( ) ,它的工作之comT一是从主机取出和装入进程需要的数据,另一个工作是把 FPGA 器件处理后的数据传回主机。上面提到,这一步很重要。找到一个能每项操作传送最少数据方法是很重要的,一种可行的方法是把尽量多可以再用的数据用 FPGA 的 RAM 储存起来。另外一种方法是把数据分割成若干部分以便 FPGA 芯片能储存起来,反复利用这些数据,直到它被清除出器件。通信的编码很难实现自动完成,因为不同的芯片和主机通信的方式不同。然而,去年,一个卓越的工学士李东尤提出可以解决这个问题的方案。他开发出一种新的语言,这种语言把软件编程和硬件语言统一在一起。有了这个软件,

41、用户可以定义哪些部分由硬件完成,哪些部分由软件完成。指定器件后,他的编译器通过器件库自动生成通信代码,因此,如果要编译器支持一个新的器件,用户可以很简单把它写进库里。这种方法可以使一般的开发人员不必花太多的时间在写器件的通信代码。3.4 小结在这个章节中,我们讨论了高速 FPGA 芯片的顶层设计的一般步骤,在第二部分,我还提到了怎样解决通信中的最少数据量的问题。第四章:例程分析:2-D 凝胶图像处理在这章里,我们将讨论在第二章提到的现实生活中的应用。我们将以 2-D 凝胶图像的处理作为例子来说明第二章中提到的开发步骤。我们还将比较流水线操作和 RC1000 操作的性能,遗憾的是,由于一些困难,

42、我还没研究出 2-D 凝胶图像的处理的流水线操作,这在后面的章节将会细细讨论。4.1 2-D 凝胶图像处理2-D凝胶图像处理是一个用研究的技术,它的目的是在不同时间将两张图像来匹配凝胶模型,然而,因为不同大小的图像很难对准,所以很难正确和有效的匹配模型,最近S.Vesser博士,M.J.Dunn博士和 G. Z.Yang博士的一片论文中提到一个新奇的技术,这种技术是基于图像强度分配比选择图像特性佳的原则。方法是使用凝胶图像处理一个多解析度表示法而且开发事实最佳的匹配的近似值能被从低解析度图像有效率地吸取。在这一步,最重要是找出程序执行次数最多的内循环,否则对程序的影响不会很明显,所以我们必须掌

43、握这种方法工作的算法。下面是用于编程的简短算法。第一步:设定层为第 0 层;第二步:设定解析度为 5 来模糊图像 I1,I2 ;第三步:严格优化转换参数 t 为 ;rigdT第四步:如果 l 小于 5,继续下面第五步,否则结束;第五步:细化 t第六步:如果没有完成所有的t矩阵ai,j;ai+1,j;ai,j+1;ai+1,就执行第七步,否则执行第八步;第七步:将控制点ci,j;ci+1,j;ci,j+1;ci+1,j+1最佳化是由使用 BFGS 取f(c)=corr(l1, tc(I2)的最大值得到,然后回到第六步;第八步:增加设计层次l第九步:设定解析度为5+l来模糊图像I1,I2,然后回到

44、第四步;基本上,运算法则的主意是把两个输入图像 (I1,I2) 分为特定数目的区块(栅极)。当图像2(I2) 的栅极形状被控制点(ci,j; ci+1,j; ci,j+1; ci+1,j+1)决定的时候, 图像1(I1) 的栅极在外形上总是尖锐的.一个目标图像(tc(I2) 是通过转换对I1的对应I2中尖锐的栅极图素,这样是为了符合I1中的矩形像素。阻止控制点的操作和相似性就可以在 I1 和Tc(I2)之间被计算。相似性是在 2个图像之间的图素的关联。然后派生出将会用来调整控制点,以使在I2和Tc(I2)之间的相似性将会增加。重复执行程序,直到相似性的达到满意。上面的整个程序在图像的不同解析度

45、将会被执行。从低的解析度到高解析度的操作。 栅极的数目是程序工作的解析度决定。源自较低的解析度的控制点将会决定较高的解析度的程序开始控制点。很显然计算的哪一步是用时最多, 就是第7步的“控制点的优化”。因此我选择这一个部份作为我们硬件操作的出发点。4.2.2原则4:尽量避免浮点型数据的计算因此我们选择执行时间最长的那个部分。现在应该看看这部分是否适合在硬件执行,实现是适当的。 因为控制点的优化算法是用包括许多浮点型数据计算的算出的,所以在第一眼看去,程序是不符合这个规则的。 在现阶段,我们应该做第一件事物是看是否可以用整型数据计算来代替浮点计算。一个有用的方法是依大小决定浮点型数据的数值,以便

46、特定量整型数据的最低重要整型数据位表现在十位后面的数值。 但是正常地,浮点型数据能比相同的宽度整型数据适应数值范围大。 这就意味着,当把它传递到整数的时候,我们要丢掉浮点型数据的某些有效数据位。丢掉这些有效数据位对这程序运行的影响不是很大。遗憾的是,我认识到这不是程序的主体,事实上,一些运算过程的中间结果有很大的数据,特别是程序运行在很多像素参加处理的时候。这就意味着丢掉一些有效数据位对程序的最后影响是很明显的,但是,当我们更深入了解程序的时候,我们就会发现优化其实是可以分成两个部分的。相似性和导出的转换和计算BFGS优化仅仅第二个部分才会涉及到浮点型数据的计算,第一部分可以在整型数据上执行,

47、现在,我们就要问个问题:第一个部分也是程序执行最频繁的那个部分吗?在回答这个问题之前,让我们来看看下面这个等式:c=w*i*CPI (4.1)这里的w是程序中数据单元的个数i是每个数据单元指令的平均值CPI是每个指令执行的平均周期c是程序执行总共时钟周期现在我可以告诉答案是第一个部分就是程序执行最频繁的那个部分,尽管两个部分执行的时间是一样的,第一部分的确是计算量最大的,原因是两者图像的大部分像素都参与到第一部分的计算,而第二部分只须计算控制点的工作,控制点要比图像的像素点要少得多。因此第一部分的等式4.1中的w要比第二部分的等式4.1中w要大很多,但两个部分中的i和CPI接近相等的。i之所以

48、相等是因为每个数据的计算量差不相等的,CPI相等是因为CPU的流水线是满的,应为这两部分的操作需要相当多的计算操作。因此,通过等式4.1,我们可以知道,第一部分的c要比第二部分的c要大很多。因为CPU的时钟是固定的,所以我们可以计算出第一部分是程序计算量最大的部分。4.2.3 原则2:选择数据依赖少的部分选择的这部分的代码是符合这个标准吗?答案是符合。因为对于每个目标像素,它的数值完全地在来自Image2的4个像素,而且不影响其他目标像素。这就意味着在流水线操作可以同时操作所有的目标像素,这样就对数据的依赖性很小,相似性和导出计算也对数据的依赖性很小,这样是因为他们是从对数据依赖性很小的目标像

49、素计算得到的。4.2.4原则3:选择消耗通信资源少的部分由等式2.1知, 是 的一个部分。因此, 不能很大也很重要。在前面的章comTexc comT节中提到, =w/b,这里b是要通信的数据被通信接口的带宽分成字节数。要通信的数c据量w=I1+I2+cp+Tc(I2)+d+s这里I1,I2是源图像,cp是控制点数组, (I2)是被转换的图像,d是一个能确定中cT间结果的数组,s是一个能决定相似性的中间结果的数组,在最高的解析层次,每个像素的大小是512位*512位,有17*17的控制点,每个控制点也4位的x,y,每个控制点有6个8位的d数据。每个8位数据有5个s数据,因此总共要传递的数据有80256个字节,在Pilchard系统中,的64位100M的DIMM接口的带宽是8*100MHZ=800MB/s,因此,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 学术论文 > 毕业论文

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报