基本信息
- 原书名:Practical FPGA Programming in C
- 原出版社: Prentice Hall PTR

编辑推荐
阐明了C语言在FPGA发展中的意义及如何应用到当前进程。详述了如何通过C语言来有效支持软/硬件协同设计,并在混合软/硬件平台上直接实现FPGA件应用。
阐述了适用于高度并行FPGA平台的新的、基于C语言的程序模型和技术。
展望了FPGA计算技术的未来。
介绍了丰富的C代码在实际应用中的范例。
内容简介
作译者
目录
译者序
序言
前言
致谢
第1章 一种计算平台——FPGA
1.1 FPGA简介
1.2 基于FPGA的可编程硬件平台
1.3 提高性能而降低成本
1.4 工具的作用
1.5 将FPGA作为嵌入式软件平台
1.6 编程抽象的重要性
1.7 C语言何时适用于FPGA设计?
1.8 如何使用本书?
第2章 可编程平台的发展
2.1 可编程逻辑的起源
2.2 可重编程性、硬件描述语言和FPGA的发展
2.3 可编程片上系统
2.4 FPGA并行计算
2.5 本章小结
译者序
本书介绍了一个由C语言扩充的Impulse C语言,用来设计一个FPGA上的硬件系统,包括实现一个处理器。Impulse C语言只是在C语言的基础上添加了一些类和库,对于熟悉C语言的设计者来说,很容易掌握。本书除了对该语言本身和设计方法进行了阐述之外,还用了几个有代表性的例子作了具体示范,书后还附有若干个实例的Impulse C语言描述清单。这使得本书既有丰富的理论内容,又有很强的实用性。最重要的是,读者可以通过本书了解一个更高层次的新的设计理念,掌握如何在更高抽象层次进行建模和设计的概念和方法。..
当前我国在高科技领域快速发展,人们的创新意识有了显著提高。我们相信,本书的翻译出版必将对我国电子设计自动化领域发挥应有的作用。
本书由下列人员分工翻译:赵康、戴晖、杨晓庆、赵燕妮、朱利民、周晟、隋文涛、张剑。邓澍军、杨晓庆对部分章节进行修订,边计年负责全书并进行统稿、定稿。由于水平和时间所限,错误和不当之处在所难免,由衷希望读者予以批评指正。...
译者
2006年7月
前言
我们编写该书的目的是为了给软件开发方法和原理与基于FPGA的数字设计方法和原理之间架桥。我们认为应该为两种截然不同的读者去编写本书:软件应用开发者和数字硬件设计者。
对于软件工程师,我们的目标是将FPGA作为软件可编程的计算资源。我们希望让他们明白,只要利用合适的方法,这些器件与其他那些非传统的计算平台(比如DSP),是没什么本质区别的。我们将会通过实例来说明,一个软件设计人员并不需要很深的硬件设计知识与功底,就可以以实用的方式使用软件设计方法与软件设计语言来设计一个基于FPGA的高性能计算的应用。
而对于硬件设计者我们的目标是类似的,但有一条告诫:我们并不是希望取代硬件设计的所有方法,更不是暗示该书所提供的方法与工具代表了硬件设计工程师的失业。毕竟,如果你是一个使用VHDL或Verilog来设计复杂电子系统的FPGA设计人员,这本书的名字《实用C语言FPGA编程》听起来更像是一对矛盾。如何利用一个软件编程语言C成为描述数字电路硬件的一种实用的方法呢?事实上有的时候那些硬件描述语言(HDL)提供的清楚而又精确的描述对达到设计目的是很必要的。但是你将会看到,这些对硬件精确的控制并不总是必须的。如果首先用C语言编写软件,然后对其中的一部分用汇编语言重新编码,硬件设计人员同样可以从这些工具中受益,他们可以将高层与低层的描述按照需要混合起来,以尽快满足设计目标。即使整个硬件设计最终需要利用低层的硬件描述语言来重新编码,高层设计语言也允许硬件工程师可以更快地探索设计空间并创建工作原型。
因此对于这些有经验的硬件设计工程师而言,我们首先声明我们和你们是站在同一阵线的。我们并不相信C或C++(被全世界众多编程人员应用)实用到可以代替VHDL、Verilog或其他HDL的地步。此外,我们坚信对于通用ASIC和FPGA设计,C或C++都不会扮演一个领导者,甚至不是一个重要者的角色,至少对于今天的设计来说是这样。然而,在硬件设计流程中,会有基于C语言的设计的一席之地的。难道还不相信吗?稍后我们将会解释。
面向基于FPGA的硬件设计的C语言
首先我们可以稍微考虑一下在硬件设计中C所具有的功能,或C所缺乏的功能。为什么标准C语言不适于替代现存的硬件设计语言呢?因为任何一个好的编程语言都会提供一件很重要的东西:对它要描述的对象的一个合理的抽象。VHDL与Verilog(或者更确切地说是这些语言的可综合子集)成功地得到应用是因为它们提供了对某一类硬件的一个合理且有效的抽象:具有复位和时钟逻辑的电平触发与边沿触发的寄存器,任意的逻辑门,以及用高度并行方式来安排的钟控逻辑器件。所有现今的FPGA都适合该模式,同样我们也可以在当今大部分大型ASIC设计中发现这种模式,不管它有多么复杂。
标准C语言没有提供这种抽象级别(我们称作寄存器传输级,即RTL),因此基于C的硬件语言可以以语法修饰,额外的功能或关键字,编译提示,等等的形式添加类RTL的结构,以得到某种有意义的方式来表达并行和描述像时钟与复位信号这些低端硬件结构。但是这样我们相当于生成了另一个新的硬件描述语言。在另一方面,如果缺少此类的RTL级的这些结构,面向FPGA和其他非传统的目标的C编译器开发者将会面对一个几乎不太可能的问题:如何更有效地将这些为一类处理目标(传统的微处理器)而编写的算法和应用映射到与之完全不同的处理目标(任意的逻辑门和附带有比较高层的逻辑构件的寄存器)上面去?没有人可以从一个纯的软件应用开始完成这种映射且能达到合理的效率,虽然我们一直在试图去改进它。
那么,我们为什么要在FPGA设计中使用C语言?那是由于它具备以下几个优势,包括软硬件协同设计的潜质,C编写的测试平台的生成,以及(如果改进的C支持它的话)用标准C的环境编译和调试FPGA应用的能力。如果一个中间层次的硬件抽象方法被采纳的话——该方法不需要编程人员理解所有的硬件设计目标的细节,而是被编程模型指引到一条更合适的编码途径上去——那么,以系统性能和大小来衡量,你就可以打破软件设计生产率与硬件设计结果之间的这种平衡。
令人信服的软件加速平台
这一块专属于软件设计者。站在应用的角度来看,使用FPGA作为硬件加速器以达到一个比较高效的计算是大势所趋。具有类似性能要求的具体应用包括很多,有通信、图像处理、流媒体以及其他通用的信号处理。大部分这种应用是在嵌入式软件领域中,而其他则应用在科学、生物、金融以及其他更大规模的计算的领域中。
当要求提升速度时,通常这些应用以软件模型开始,常常以C语言的形式来出现,之后由人工用VHDL或Verilog重新编写,并在硬件中实现。这种用人工由软件向硬件转化的过程不仅很长而且乏味至极;因而,人们十分需要一种更快的方式来达到实现硬件的目的。此外,人们也强烈期望避免由于软件算法更新而导致的硬件重设计。因此,实现由软件向硬件转换的自动化——至少是为了产生硬件原型——受到了人们的高度重视。这种对于那些没有太多硬件设计技术和经验的设计团队和开发人员,或者对于那些硬件设计时使用传统的方法会造成成本太高的情况下,自动化还可以带来硬件上的加速。由C到硬件的编译技术使得为一类新的应用和开发者提供硬件加速成为可能。
在硬件方面,近年来在基于FPGA的可编程平台上所取得的进步使得FPGA用做应用加速器变得更加实用。事实上,带有嵌入式处理器核的FPGA现在已经变成了整个嵌入式系统的划算的替代品。感谢那些FPGA供应商以及第三方知识产权(IP)的供应商长期的努力,在FPGA上建立整个的系统这个梦想最终成为了现实。这些新的基于FPGA的平台的共同点就是它们都包含了一个或多个通用处理器核以及大量的可编程逻辑器件。正像大家所关注的那样,他们配备了大量的免费使用的经过预测试的元件,以及不断增多的可被授权的第三方的开放源代码的元件,这些都可以在几个小时之内就装配在芯片上,从而组建成各种各样的可能的软硬件处理平台。
从工具的观点来看,最令人感兴趣的是这些新的工具和设备以及相应的新计算平台足够灵活,可以支持那些来自软件开发领域的方法和工具的使用,包括传统的软件调试器。利用诸如C和C++的语言并协同软硬件编译器,可以使将软件直接在一个软硬件混合平台上实现变得更加实用。
一些怀疑在FPGA设计中使用软件设计语言和方法的FPGA设计师可能会忽略这一点。对于传统的通用的硬件设计,C语言是不可能完全代替像VHDL和Verilog这些硬件描述语言的。但是,C将会在这种软硬件混合应用中扮演一个十分重要的角色,这种现象在当今正逐渐浮现,其中什么是软件什么是硬件这条线正逐渐变得模糊,而对快速构建原型和快速进行实验并运行的能力的要求变得越来越急迫。..
另外,由于嵌入式FPGA处理器的流行,C语言早已被成千上万的软件工程师应用于FPGA。问题是数量如此巨大的软件工程师仅仅能够在FPGA内为嵌入式微处理器编程。该书的目标就是使C语言的编程可以应用于整个FPGA,而不仅仅是它里面的嵌入式微处理器。
实验的能力
基于FPGA的硬件设计利用C语言编程,可以使你具有进行实验的能力——包括使用不同的算法方法,不同的软硬件划分,不同的目标平台。利用相同的设计输入语言,你就具有使用不同的硬件和软件目标预测自己手中的应用及其内部算法的能力。
举例来说,本书告诉读者如何建立一个测试实例,在该测试实例中,同样的C语言算法,只经过很细小的修改,就可以在一个桌面计算环境中(在诸如Visual Studio,gbd或Eclipse之类的软件中的C调试器控制下)运行,以进行功能仿真,或是在嵌入式处理器的系统内部执行,或是直接在FPGA上编译以用做专用硬件。利用这个方法,许多根本毫不相同的计算方式就可以进行试验,而可选择的软硬件划分的策略也可以进行评估。正如大家所看到的,这种快速产生软硬件原型并实验的能力是由于对FPGA运用基于软件的方法和工具的最主要的优势。
该书是如何组织的对于软件和硬件的开发者,我们介绍了关于FPGA器件的很重要的背景信息,它们的历史,可用工具的类型,以及一部分可用的基于FPGA的计算平台。
序言
在以前我工作的地方,负责软件设计的人员与负责硬件设计的人员相处得很不错,但有时他们似乎很不协调。比如,硬件工程师们会挽起自己的袖子,不分昼夜地大干几个月,而软件设计人员则懒洋洋地坐在一边休息,或是去玩乒乓球,或是去做其他软件程序人员做的事情,一直等到硬件已经被设计出来或变得稳定以后软件设计工作可以继续开始,才正式投入工作。从这一点上来看,硬件设计队伍的人员往往没有时间计划自己的假期,照顾自己的家庭,甚至忘了自己的生活。这样对大家是都没有益处的,因为当他们发现设计的某些不足或者提出新的要求后,要求软件设计队伍立即跟上来,尽快得到新的设计。
在这种情形下曾与我共事过的那支软件设计队伍与硬件设计队伍都没有争斗过,真的很令人难以想象。这正印证了我自己的那句话,就像生活一样,在软硬件协同设计中,“明确的分界线造就友善的邻居”。
为什么硬件设计人员会对本书感兴趣?
我们由硬件设计这部分开始详细阐述。电子设计自动化(EDA)指的是设计电子元件和系统的软件工具。在早期的数字逻辑设计中,我们利用门级的原理图描述电路。
这种方法在20世纪80年代中后期逐渐被放弃,而成熟的硬件描述语言(HDL)的引入为我们提供了更有效的方法。它可以允许我们在更高的抽象级别——寄存器传输级(RTL)描述设计的具体功能。此外,硬件描述语言可以使得选择不同设计方案的过程更加快速,表示与仿真更加方便。而且,逻辑综合技术能够使其真正地转换为生产力,编译这些高层的描述,生成与之等价的门级网表。
另一个考虑则是设计的物理实现方法。在以前,我们只能利用大量的现有的并不理想的器件以及比较简单的可编程逻辑器件,或者是按自己的特殊要求自己设计器件。在1984年,一种新的器件登上舞台,即现场可编程门阵列(FPGA)。这些器件的第一批产品比较简单,仅仅包括几千个等价门,但是它却改变了一切。今天的产品以包含了上百万个等价门,同时有大量嵌入式的像RAM块这样的功能单元以及乘法器而自豪。
当前我们再一次踏入了设计生产力需要变革的时代。虽然像Verilog和VHDL这样的语言可以准确地描述一个设计的功能要求,但是面对今天这种数百万级门的系统还是一筹莫展。事实上,用硬件描述语言来描述和验证这样的一个设计是很耗时的。
但是另外一个更加重要的问题是,利用传统硬件描述语言来描述一个设计要求我们在实现级(微体系结构级)做出许多判断与决策。此外,这还会导致对可选的设计与体系结构的探索变得复杂与耗时。例如,如果你已经有了一个用硬件描述语言描述的设计,然后有人说“我们试试将流水级数增加一倍会出现什么效果”,你可能会取消你这个周末的安排了。
解决方法是,再一次转移到一个更高的抽象级别,对硬件设计工程师而言最自然的一个级别则是标准的ANSI C语言。这本书可以教你如何使用扩展了少量C兼容的库函数的标准的ANSI C语言去描述一个设计。在你掌握了描述以及验证方法(不同的设计方法和体系结构的探索)之后,该书还为你介绍了可以自动把无时序的C语言描述转换为与之对应的可综合的等价的硬件描述语言的工具。..
这种方式所导致的结局是:与仅仅使用HDL相比,它允许硬件设计工程师可以更快地实现一个产品原型。有人可能会问:“那么软件设计者呢?”……
软件设计人员是否也感兴趣?
实际上,该书最初的读者对象应该是软件设计人员,因为它提出的方法允许以软件设计为主的工程师可以在使用一个软件设计方法时,注意利用在专门硬件实现中存在的大量并行性。
也许并不令人奇怪,很多为数字信号处理器(DSP)和嵌入式应用编写C代码的软件设计工程人员对以FPGA形式存在的“生疏的硬件”由害怕变为彻底的厌恶。但是不要害怕,勇士们!因为“除了它自己再也没什么可怕的”,我亲爱的父亲曾经这样说过。
例如,在需要完成一个DSP的应用时,大部分DSP代码首先看到使用C语言的好处。令人非常讨厌的是,一旦算法在这一抽象级通过验证,就需要用汇编语言重写或者调整大量代码,以达到设计性能的需求。当然,这种手工的转换造成了人力浪费,也造成了时间耗费。
而更大的问题则是,由于最终DSP代码需要在一个通用的微处理器或专用的DSP器件上运行,而这两者的实现天生就很慢,因为它们是建立在传统的冯·诺伊曼体系结构上,这种结构要求它们取指令→取一组数据→取另一组数据→执行操作→存储结果→……→重复以上工作。
现在,我们来看一个典型的类似DSP的函数:y=(a*b)+(c*d)+(e*f)+(g*h);
如果你通过一个DSP芯片去运行,则需要很多操作及时钟周期才可以运行完。现在我们考虑使用一种等价的FPGA中的硬件实现,在该实现中所有的乘法并行执行而不需要去取指和对指令进行译码,这会带来几个数量级的加速。
因而,该书的一个目的是使读者学会如何应用C语言去对FPGA进行“编程”,直接在硬件上实现自己的算法。
这些技术并不仅仅局限于对DSP的应用上,它们同样适用于一般的嵌入式应用开发者。该书中所提到的概念会使你能够对作为“另一个可编程核心”的FPGA有一个全面的或部分的认识。所不同的是,以前你需要在一个嵌入式的(软或硬)微处理核上来运行自己的代码,而现在可以考虑是否将代码中合适的部分直接在硬件上运行来达到性能的显著飞跃。