高速FPGA器件的顶层设计翻译(F)_第1页
高速FPGA器件的顶层设计翻译(F)_第2页
高速FPGA器件的顶层设计翻译(F)_第3页
高速FPGA器件的顶层设计翻译(F)_第4页
高速FPGA器件的顶层设计翻译(F)_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

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

3、。在这节中,我将用凝胶图像过程作为一个例子来说明在第二节中讨论的硬件的资源和性能的影响。我还会比较两种器件和软件的应用的性能,软件的版本是:Pilchard 和 RC1000第五节是结论,包括评估成就和期望的特性工作网上也有这篇论文。网址:http:/www.doc.ic.ac.uk/mcn99/project/report.pdf第一节:说明自从Handel-C5.a类C硬件语言的出现,一个完全的顶层的FPGA设计方法就被认识到。然而许多开发者当他们要设计高速运行的硬件的时候仍然停留在底层的语言上,比如VHDL这是因为开发者在底层的方法有许多实际电路的控制方法。但底层的设计在FPGA芯片规模

4、逐渐变大的时候可能会达到极限。开发人员将不能用底层的设计来开发包括几十亿个门的高速电路。这个时候顶层的设计就可以达到要求了。这个项目的目的就是介绍一套系统的方法来设计顶层的高速硬件性能。1.1背景和相关工作在这节中,我将介绍一些材料来方便读者了解这篇论文中的一些概念。1.1.1 现场可编程门阵列(FPGAs)1像许多的可变成逻辑器件(PLDs)一样,FPGA是一块可编程的硬件,然而, PLDs的资源消耗和时间延时限制了其大小。而FPGA可以很轻易在一块集成芯片上设计一个有几百万个门的电路。FPGA的可再编程特性允许开发人员用比使用一块VLSI芯片更少的开发时间和更少的开发成本来设计。值得一提的

5、是FPGA以每年两倍容量的发展。因为最新的芯片上有几百万个门,所以FPGA是开发复杂应用的系统理想开发平台。因此我在开发它的应用。Pilchard 2Pilchard是一个基于现场可编程门阵列(FPGA)的可配置的计算平台,它可以插在一台标准的个人电脑的133MHZ同步的动态RAM和双向存储器模块(DIMMS)的插槽中。相比于传统的利用PCI接口的FPGA器件,由于DIMM接口的宽带宽和低延时,Pilchard允许数据在更短的时间传出电脑或者传入电脑。然而由于DIMM接口原本不是设计为I/O接口的,所以需要额外的控制信号来表示数据读写过程的开始和结束。因此,由于Pilchard的发展和运用,顶

6、层的性能设计方法好过底层的结构设计。这就证明了为什么一个用高性能的FPGA的顶层设计的系统方法是很有必要的。RC1000 3 RC1000是一个专为可配置的计算应用的32的PCI卡,它以库的形式全支持的程序包在适合这设备的电路设计,它在连在FPGA或者主CPU的板子还有4个SRAM(每个2M字节),这块板子可以配置成可以运行在4000KHZ到100MHZ的频率中。这个器件在很多方面是不同于Pilchard的,在这份报告中,我将表明发展在这项目内一般介绍,并且可能在应用开发在不同设备上适用。1.1. 4 VHDL 4 VHDL是一门在当今市场上最好的可编程逻辑器件设计语言,VHDL的顶层设计取决

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

8、特性。其中一个是这门语言支持指定每个信号的宽度,这样优化可以用Handel-C编译的额外资源来完成优化。Handel-C编译的目的是为了能直接用xnf或者edif格式通过编程下载到硬件器件中。Handel-C好过VHDL的是它不需要开发人员掌握太多底层硬件知识,而VHDL必须要求掌握。它是一门完全的顶层设计语言!图一显示我采用的转换Handel-C程序到硬件中,尽管每一步都需要很多工具,但用户不需要了解硬件的细节,因为用户只需要点几个按纽就可以转换文件到下一步,就像这样。图1.1 Handel-C的设计流程Handel-C编程硬件比特流EDIF网格文件 编译 布局和布线 下载1.1.6 Han

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

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

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

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

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

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

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

16、实际的性能优化的最简单的第一步,下面的操作可以使进程自动化。连续扫描程序,尽量把更多的操作联合在一个时钟周期中,直到违背了资料相依的条件,然后在下一时钟周期重复这样的操作。因为我们已经讨论怎样在更尽快的部分内发现数据从属性,这个过程可能被自动做。图2.2是一个简单的例子,我们看到如果没有并行操作,将需要8个时钟周期来完成8个操作,然而如果用并行操作,只需要2个时钟周期就可以完成这些操作。 A=1; 操作1Par B=2; 操作2A=1;操作1 C=3; 操作3B=2;操作2 D=4; 操作4C=3;操作3 A=A+1; 操作5D=4;操作4 B=B+2; 操作6C=C+3; 操作7ParD=D

17、+4; 操作8A=A+1;操作5操作5是依赖与操作1的,B=B+2;操作6但并不依赖操作1,操作2C=C+3;操作7操作3,操作4之间,就像D=D+4;操作8在操作5,操作 6,操作7操作8之间一样。2.1.3 重新排列代码顺序有时候,一个程序可以有高度的并行性,但操作执行的顺序的方法在上面提到的。例如,图2.3中的代码是跟图2.2中的代码功能是一样的,但如果我们用基本的并行操作,将需要4个时钟周期来完成这个操作,而不是2个时钟周期。我们有是可以通过重新排列代码的顺序,这样程序可以运行尽可能少的时钟周期,例如上面代码可以改成图2.2一样的顺序,这样我们又可以用“基本平行”方法。由于这些进程可以

18、被编译器自动进行,编译器将需要有相当多编程的知识和原因,我已研究出一个方法来实现这些进程的自动化。1.首先,选择一部分代码开始, 最好在局部循环中。2.用变量名作为索引和标签来建一个空表,标签的格式是var:n,其中var是一个变量的名称,n是指定的操作顺序的个数。3.连续扫描代码,对每一个变量的任务(任一修正/设定初值), 在下面被列出的规则之后分配标签到操作:第一步:查询表格,找到标注的变量的标签第二步(a)如果没有发现入口,变量就是先前定义,把这个程序入口加入表格,内容(标签)指定为as:形式。 第三步(a1)如果变量是一个常量或者是一个从外部输入的信号量。指定其标签为VARname:1

19、,这里的VARname是定义的变量名。 第三步(a2)如果变量的值取决于其他的变量,从表格中取出这些变量的标签,定义这些变量的标签从我们取得最大的次序加1得到。例如,如果 a=b + e,如果b是d:3,e是e:4,这样a的标签应该是e:5第二步(b)如果有程序入口,变量就是在前面已经定义的,直接取得这些变量的标签。第三步(b)更新在第三步(a1)和第三步(a2)中改变了的变量标签,但是由于一个变化当发现最大的次序标签的时候,我们应该包括比较的它本身的标签。 举例来说, 如果a = b+c 而c和b的标签是和上面的相同的,但是a的标签已存在表格中,值为a:5,这样新的标签将会是a:6.注意在做

20、比较的时候,我们要视常数的次序为0。第四步:用我们刚才指定的标签把这些操作连接起来。4.将所用的操作做了标签后,我们就要调整操作了,把有相同次序的操作放到一起。5.现在,“基本平行”方法将会回到运行最少周期的程序代码上了。相同次序的将会放到一个块中。6.重复从第二步开始的各个步骤,直到整个程序都被转换。这个方法的可行性是把所有的操作放到最近的一个时钟周期执行,这样,经过修改后的代码只用最少的时钟周期就可以执行完成了。很显然这种方法可以很容易实现自动化,通过联合这种方法和前面的“基本平行”的方法,一个令人惊讶的效率很高的并行工作工具被发展! 图2.4显示出这种方法怎样工作的例子图2.3 未优化代

21、码A=1; 周期1Par B=2; 周期2A=1;周期1 C=3; 周期3A=A+1; D=4; 周期4 A=A+1; 周期5Par B=B+2; 周期6B=1;周期2C=C+3; 周期7 B=B+2;D=D+4; 周期8 Par周期3C=3; C=C+3; Par周期4 D=4; D=D+4;图2.4重新排列代码的步骤2.1.4 增加寄存器来储存中间结果仅仅通过重新排列代码有时候是不够的,如果我们发现有许多针对一个变量的操作,而其他的变量只有几步的操作,这样就会出现在前面几个时钟周期有很多的操作,而到了后面的时钟周期却没有了几步操作。这样,我们能平衡每个时钟周期的操作呢?可能解决这个问题的办

22、法就是增加寄存器来储存中间结果,而且这样可以在很短的时间计算中间变量的值,由于这需要很的理论和逻辑单元,而且这项操作很复杂,所以可以很难实现自动化操作。图2.5是这种方法的一个例子,我们可以看到在修改代码之前需要3个时钟周期在修改程序后只需要2个时钟周期。图2.5 用存储器来储存中间变量2.1.5 流水线操作流水线操作是在一个操作中有多任务的时候一种执行方法,亨利丝和帕得森在他们的书第三节是这样介绍这个流水线操作的具体方法:流水线操作就像是一个装配线,在一个自动装配线上有许多步骤,每个步骤完成一个装备小汽车的操作,尽管在不同的小汽车上,但每个步骤都是并行作业的。理想状况下,我们可以在每个时钟周

23、期后来执行下一个操作,这样,流水线操作就是满负载的,生产量在每个时钟周期将会是一项任务不论它花多少时钟周期来完成这项操作,因此,当一个任务需要100个时钟周期来完成,而且你有足够多的任务来让生产线一满负荷,这样将花大约100倍的时间来完成所有的任务,但速度决定不会达到100,因为:·流水线需要额外的控制逻辑,因此需要增加成本。·流水线需要额外的寄存器来储存中间变量,因此增加延时。此外,开发人员要知道操作不会在很段的时间就完成了,因此流水线操作是一个理想的相同的计算大数据操作。这有当我们用流水线操作的时候必须注意到的几点:·当没有足够硬件资源来处理交错的任务的时候,

24、哈泽德式结构就会发生。例如,我们不能在一个时钟周期来多次来读一个RAM里的数据。解决的方法是在流水线操作中确保有足够多的硬件资源。·因为你用的寄存器储存的中间变量的值在每个周期可能会改变,所以寄存器中数据会丢失,除非你有足够多寄存器来储存中间变量。这样,如果在一个流水线的一个状态在很多状态以后才用到,这样我们就需要增加额外的寄存器来储存和传递中间变量的值,这样任务进入一个新的状态的时候,任务想要读数据的数据就有数据可以读。·当操作需要数据没有准备好,哈泽德式数据就会产生。当进入一个新的流水线操作的时候我们需要很小心设计流水线操作,以防止哈泽德式数据的产生。 图2.6是一个把

25、Handle-C程序转换成流水线操作的例子,运行的结果是数据输入5阶次方。 图2.7显示出上面例子的效果。 图2.6 转换为流水线操作图2.7流水线的效果2.2 空间优化空间优化跟时间优化完全不同,时间优化通常是在同时用更多资源执行更多的操作来获得高速操作,而空间优化关心是这样用最少的资源来完成操作。这在FPGA设计中相当重要,因为我们用的资源越少,我们可以在片子上有更多的操作。我们现在就来讨论一些空间优化的方法。2.2.1 变量的最佳宽度记住在4.1标准宽度中变量的转化方向,事实上,如果我知道一个我们要用的值的上限和下限范围,我们就会发现有些位在大多数情况是用不到的。例如:一个0-1024的

26、变量就不需要用32位,11位的整型就足够了。一个位数少的就只需要小的寄存器来储存了。位数低的比位数高的相同操作需要更少的逻辑门,等式2.1中提到,是的一个组成部分,因此,这种优化不仅节省了很多资源,还减少了,从而减少了。皇家学院的学生阿·塔夫正在研究这个项目8。这个项目主要的目标是通过限定浮点型变量的最佳宽度来自动资源优化。他的方法是仿真足够多的数据,然后通过统计学的原理来找出变量的最佳宽度。2.2.2 组件的再运用如果相同宽度的不同操作数的相同操作在不同的时钟周期中要运行多次,我们就可以建立一个可以应用于不同操作数组件。这种方法不影响电路的延时,但节省了复制组件的门!为了能更多的运

27、用这些组件,我们甚至可以放弃限制条件,这样短操作数的操作可以运用这写共享组件。这是因为长操作很短操作是一样的。可能有疑问是,由于用了并需要多很多逻辑单元会增加电路的延时。是的,原则上,我们可以用足够的逻辑单元就会操作变快,然而FPGA器件并不支持不同操作不同时钟,时钟的频率时最长那条路径来决定,因此,共享组件对程序的影响不会很大。在Handel-C中,共享表达式可以很容易定义共享组件,图2.8是这样的一个简单例子,想要了解更详细的信息,参考Handel-C的用户指南和DK1设计步骤是很有用的。图2.8 Handel-C中的共享表达式2.3 评估 如果我们不知道估计结果,这样就无法知道优化是否达

28、到效果,因此,在这节中,我们将讨论有关估计的相关手法。我将给出一些等式,这样,开发人员就可以对操作做出判断。是否值得在硬件中编程?如果结果达不到预期结果,器件再高级点是否可以值得这样做,或者可以想到能达到更高速度的其他方法。这些都是我们这节要回答的问题。2.3.1 等式 =+ + (2.2) 现在我们将介绍一些其他的等式来帮助我们估计结果。 假设硬件在执行的过程中不需要经常配置,这样0因此,等式变为: = + (2.3)可以通过下面等式得: =n*t (2.4)这里的n时钟的个数,n是时钟的延时T可以通过下面等式确定: t=1/c (2.5)这里c是时钟频率 因此 =n/c (2.6)n可以在

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

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

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

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

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

34、,如果不符合,回来第三步第五步:估计实际结果,写结论3.2 编程分析在这一节中,我们将讨论硬件顶层设计的第一步。程序分析是最五个步骤中最重要的一步,以为如果在硬件上选择了错误的部分,那么对程序的影响将不会很明显或者可以忽略。3.2.1 程序分析的四个指导原则 我研究出程序分析的四个指导原则,开发人员并不需要必须征寻,但可以给开发人员知道程序的哪个部分可以转换。原则1:选择重复执行的部分原因很明显,如果我们选择在硬件中很少运行的部分,尽管这个部分可以高速运行,但对实际程序的运行并不起很大的作用,因为它在硬件中很少执行。我们最好选择在有限的硬件中执行程序的内循环。然而,因为技术的提高,今天,随着F

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

36、,而且还包括了FPGA芯片配置时间(),传递初始数据和从FPGA芯片中读数据的时间(),如果我们不需要实时重新配置FPGA芯片,在我们第一次配置器件的时候, 就是零,然而每次执行程序的时候,就不会是零,总共的时间取决于主机和器件交换的数据量很交换的频率。如果有大量的数据要传送,当Tcomm占Texec的大部分的时候,高速运行可能就达不到。然而在某些情况下是有办法来解决这个问题的。例如,如果在顺序执行的时候,大部分的数据是一样的,我们在第一次操作后就把这些数据留在FPGA芯片中,这样顺序执行的Tcomm包括在传递不同数据的时间中。原则4:如果可以,尽量避免浮点型的计算 众所周知,PC机

37、比FPGA芯片能更好得计算浮点型数据,由于专用的CPU和很好并行硬件设计,所以推荐有CPU来处理浮点型数据,尽管FPGA有支持浮点型数据计算的库,但它不能像运行整形数据计算那样快,然而,现在有很多商业界,学术界都在研究这个操作,所以我可以预见这个原则过不了多久就用不上了。尽管这样,我还是要推荐避免浮点型数据操作,如果开发人员碰到浮点型的计算,应该试着考虑可否用整形数据计算来代替浮点型的计算。所有的硬件开发操作中,这些操作是最难实现自动完成的。因为这涉及到考虑程序到底是做什么的,因此很难找到一个实现自动的规则,然而,可以从现在的编译器借鉴一些方法来使这一步简单点,例如:亨利丝和帕得森研究的编译器

38、的方法,从而发现数据依赖而且很有可能可以除去这中依赖性。3.3直接转换在这节中,我们将看到开发过程的第二步。就是把软件编程直接转化成硬件语言,这一步不涉及任何优化,把优化留在后面是因为我们必须确保硬件编程能和软件编程有同样的结果,这样可以方便调试,如果我们把优化放在前面,这样如果有错误有发生时,我们就很难调试程序,因为我们不知道问题出在哪一步。这个部分是很直接,因为Handel-C是一门顶层设计语言。仅仅需要加一些代码来让主机和FPGA器件之间通信,这部分代码要符合等式3.1中通信用时(),它的工作之一是从主机取出和装入进程需要的数据,另一个工作是把FPGA器件处理后的数据传回主机。上面提到,

39、这一步很重要。找到一个能每项操作传送最少数据方法是很重要的,一种可行的方法是把尽量多可以再用的数据用FPGA的RAM储存起来。另外一种方法是把数据分割成若干部分以便FPGA芯片能储存起来,反复利用这些数据,直到它被清除出器件。通信的编码很难实现自动完成,因为不同的芯片和主机通信的方式不同。然而,去年,一个卓越的工学士李东尤提出可以解决这个问题的方案。他开发出一种新的语言,这种语言把软件编程和硬件语言统一在一起。有了这个软件,用户可以定义哪些部分由硬件完成,哪些部分由软件完成。指定器件后,他的编译器通过器件库自动生成通信代码,因此,如果要编译器支持一个新的器件,用户可以很简单把它写进库里。这种方

40、法可以使一般的开发人员不必花太多的时间在写器件的通信代码。3.4 小结在这个章节中,我们讨论了高速FPGA芯片的顶层设计的一般步骤,在第二部分,我还提到了怎样解决通信中的最少数据量的问题。第四章:例程分析:2-D凝胶图像处理在这章里,我们将讨论在第二章提到的现实生活中的应用。我们将以2-D凝胶图像的处理作为例子来说明第二章中提到的开发步骤。我们还将比较流水线操作和RC1000操作的性能,遗憾的是,由于一些困难,我还没研究出2-D凝胶图像的处理的流水线操作,这在后面的章节将会细细讨论。4.1 2-D凝胶图像处理2-D凝胶图像处理是一个用研究的技术,它的目的是在不同时间将两张图像来匹配凝胶模型,然

41、而,因为不同大小的图像很难对准,所以很难正确和有效的匹配模型,最近S.Vesser博士,M.J.Dunn博士和 G. Z.Yang博士的一片论文中提到一个新奇的技术,这种技术是基于图像强度分配比选择图像特性佳的原则。方法是使用凝胶图像处理一个多解析度表示法而且开发事实最佳的匹配的近似值能被从低解析度图像有效率地吸取。在这一步,最重要是找出程序执行次数最多的内循环,否则对程序的影响不会很明显,所以我们必须掌握这种方法工作的算法。下面是用于编程的简短算法。第一步:设定层为第0层;第二步:设定解析度为5来模糊图像I1,I2;第三步:严格优化转换参数t为;第四步:如果l小于5,继续下面第五步,否则结束

42、;第五步:细化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,然后回到第四步;基本上,运算法则的主意是把两个输入图像 (I1,I2) 分为特定数目的区块(栅极)。当图像2(I2) 的栅极形状被控制点(ci,j; ci+1,j; ci,j+1; ci+1,j+1)决定的时候, 图像1(I1) 的栅极

43、在外形上总是尖锐的.一个目标图像(tc(I2) 是通过转换对I1的对应I2中尖锐的栅极图素,这样是为了符合I1中的矩形像素。阻止控制点的操作和相似性就可以在 I1 和Tc(I2)之间被计算。相似性是在 2个图像之间的图素的关联。然后派生出将会用来调整控制点,以使在I2和Tc(I2)之间的相似性将会增加。重复执行程序,直到相似性的达到满意。上面的整个程序在图像的不同解析度将会被执行。从低的解析度到高解析度的操作。 栅极的数目是程序工作的解析度决定。源自较低的解析度的控制点将会决定较高的解析度的程序开始控制点。很显然计算的哪一步是用时最多, 就是第7步的“控制点的优化”。因此我选择这一个部份作为我们硬件操作的出发点。4.2.2原则4:尽量避免浮点型数据的计算因此我们选择执行时间最长的那个部分。现在应该看看这部分是否适合在硬件执行,实现是适当的。 因为控制点的优化算法是用包括许多浮点型数据计算的算出的,所以在第一眼看去,程序是不符合这个规则的。 在现

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论