基于C的设计方式简化FPGA/协处理器混合平台软硬件协同设计
扫描二维码
随时随地手机看文章
在最近几年中日益流行在高性能嵌入式应用中使用现场可编程门阵列(FPGA)。FPGA已经被证明有能力处理各种不同的任务,从相对简单的控制功能到更加复杂的算法操作。虽然FPGA在某些功能上比设计专用ASIC硬件具有时间和成本上的优势,但在面向软件应用中FPGA比传统处理器和DSP的优势并没有体现出来。这很大程度上是由于过去割裂了硬件和软件开发工具和方法之间的关系。
然而最近FPGA在面向软件设计工具方面的发展,及器件容量的持续增加为软件开发者创造了新的环境。在这种环境下,FPGA可视为软件编译器的一个可能的目标(连同传统和非传统处理器架构)。现在,工具能够帮助软件工程师利用FPGA平台,同时在结合了传统处理器(或处理器核)和FPGA的单一目标平台上,帮助这些开发者利用其所具有的高度算法并行性。
基于FPGA的计算平台,尤其是那些具有嵌入式“软”处理器的平台,有能力实现非常高性能的应用,而没有建立专用定点功能硬件的前期风险。通过使用最新一代的硬件/软件协同设计工具,有可能使用多种面向软件(图形和基于语言)设计方式作为FPGA设计过程的一部分。
使用基于FPGA的参考平台
FPGA中使用嵌入式处理器的优势之一是能够在单个可编程器件上建立硬件/软件开发对象——等效硬件参考平台,这常常被忽视。即使终端产品不包括嵌入式处理器(将替换外部处理器或其他硬件子系统的接口),快速下载和测试新的软件/硬件配置(试验可改变软件/硬件划分方案)的能力也能大大地提高设计生产率。通过使用嵌入式处理器作为测试生成器,单独的硬件部件(或硬件编译的软件过程)也可以快速地验证功能。
这种快速原型平台的典型例子是Altera公司提供的Nios开发包。Cyclone或Stratix FPGA中都包括这个工具包,除了高性能的Nios 32位软核处理器核之外还包括多种硬件和软件外设接口。在设计过程中可以选择这种核,使用Altera SOPC Builder工具配置并下载到相应的FPGA中。板上本身的连接容许直接和各种不同的外部部件连接,从串口(RS232和USB)到Flash存储器和网络接口。
在开发过程中使用这种板并结合Altera工具,容许嵌入式系统设计者用应用原型所需的部件(包括嵌入式处理器)组成目标平台。然后,软件开发者能够关注应用本身,分析和试验不同的硬件/软件划分方案。
权衡硬件和软件资源
在一些高性能嵌入式应用中,从产品构建费用和开发成本考虑最佳的资源使用方案是混合处理器方案。在这种方案中应用非关键性能的部件位于主处理器(它们可能是或不是嵌入式处理器核),而大计算量的部件是一个或多个DSP芯片、其它标准硬件或专用ASIC或FPGA硬件。这种的解决方案通常需要硬件设计方式和工具的知识,但是在性能和成本方面上具有最佳的收益。
对于系统中的每个处理单元(即标准处理器、DSP、FPGA或ASIC),需要不同水平的专用技能。例如,虽然DSP是软件可编程的,在工具上的初期投入小,但他们需要在DSP专门的设计技术方面有一些专门经验,通常需要汇编级的编程技能。在另一方面,FPGA在设计和工具经验上需要相对高的投入,在硬件设计语言作为主要的设计输入方式时尤其如此。
然而FPGA和专用ASIC设计所需的经验和工具投入相比,显然FPGA在开发专用硬件上具有更低的风险。的确,相对于专用ASIC方案的简单性和低风险的设计过程是为任何产品选择FPGA的关键因素是。最近基于软件的FPGA设计工具使这种设计过程具有甚至获得更大的生产效率。这反过来让系统设计者和软件应用开发者在实际的硬件上能够更快地尝试新的算法方式和测试设想,使用迭代方式进行设计。
这种迭代方式重要好处是能够一次改变一个单元(例如将关键的算法移至FPGA)的设计。应用最初是完全用软件进行原型设计,并验证其正确性,然后由FPGA完成特定的功能,这是在每个步骤都要对系统重新进行验证的硬件过程。这种方式被证实能大大地缩短调试时间,降低引入难以调试的系统错误的风险。
你如何在考虑“将应用的哪部分以硬件实现”上做出最明智的选择?一个普遍采用的方式是从用C,Matlab,SystemC或其它一些软件编程语言的软件模型开始。随着应用模型和部件算法的发展,设计者确定并发挥设计中粗略的并行性(或重新设计算法)利用可编程硬件在建立并行结构方面的独有能力。增加并行度通常转化为增加硬件资源,它必须在降低大I/O量的算法性能增益上取舍。使用软件模型验证假设,建立可重复的测试组,这些测试组可以作为模型,进一步提炼为某些可以进行软件和硬件编译的内容。
混合软硬件设计方法
现今如何开发混合软件和硬件应用呢?如果应用是软件驱动的(现今越来越多的设计是这样),软件或系统工程师从编写代码(如上所述)来建立系统原型。另一种是,工程师用更高 级的工具如Simulink(来自Mathworks),基于UML的工具或其它系统设计环境开始设计。在这个过程中,系统设计者或软件工程师将采用更高级的设计抽象以获得最大的生产率,但是可能获得很低的性能结果。因为以这种方式自动选用的处理器类型是受限的,为性能目标转换低级代码的机会相对更少。有经验的嵌入式开发者可能会进一步用汇编语言优化应用的各个部分,或使用专用处理器(即DSP芯片)来提高性能。硬件工程师可以参与优化面向FPGA和ASIC实现的设计中的那部分接口。
初始系统设计和划分完成之后,应用中需要最高性能的各个部分可以手工描述出来,交给硬件工程师。这个工程师为FPGA或ASIC部分编写低层的HDL代码,他们的设计生产率通常非常低(软件工程师1/10或更少)。结果是应用速度增加了,但是代码和最初的软件代码无法对应,设计周期不再一致,系统规格的改变可能很痛苦。
在这种情况下,系统设计者必须作为硬件/软件仲裁者,指定硬件/软件接口,锁定设计反映设计的前期时间。一旦硬件开发认真地展开,可能几乎没有机会再次从整体上把握应用和它的组成算法。
基于C的设计和原型工具加速开发
在上述的方式中,最终的软件/硬件应用是软件和硬件源文件的组合,一些需要软件编译/调试工具流程,其它需要硬件为主的工具流程和专业知识。然而,随着基于C的FPGA设计工具的出现,使得在大部分的设计中采用熟悉的软件设计工具和标准C语言成为可能,尤其在那些本身就是算法的硬件部分。后面的性能转换可能会引入手工的硬件描述语言(HDL)取代自动生成的硬件(正如面向DSP处理器的源代码通常用汇编重新编写),但是因为设计直接从C代码编译成最初的FPGA实现,硬件工程师要参与性能转换的时间会进一步提早至设计阶段,系统作为整体可以用更高生产率的软件设计模式来设计。
如CoDeveloper工具(Impluse Accelerated Technologies提供)允许C语言的应用编译后以FPGA网表形式建立硬件,包括允许描述高度并行和多过程应用描述所必须的C语言扩展。对于包括嵌入式处理器(如Altera的Nios软核处理器)的目标平台,CoDeveloper可以用来生成必要的硬件/软件接口,及生成特定过程的低级硬件描述。
采用这种工具和硬件/软件方式获得成功的关键是软件和硬件处理资源之间合理的划分。好的划分方案不仅要考虑给定算法部件对计算量的需求,而且要考虑数据带宽需求。这是因为硬件/软件接口可能是主要的性能瓶颈。
合理地利用高并行应用的编程模型也很重要。虽然它试图用传统编程方式如远程过程调用(RPC)将特定功能交由FPGA处理,但是研究表明交替的更面向数据流的通信方式更有效率,它更不可能引入阻塞或造成应用死锁。在一些情况下,这意味着重新从整体上考虑应用,寻找新的方式对数据进行搬移和处理。这么做的结果是非常显著的:通过增加应用级的并行性,充分利用可编程逻辑资源,这可能将使一般算法比纯软件实现提升几个数量级。
在这种应用的开发过程中(或重新工程化),设计工具是可视化的,能调试多个并行过程的互连。例如应用监视能够在标准C调试器控制运行时提供应用和组成过程的整体概念。这样的工具有助于量化地给出划分方式的结果,识别可能表示应用瓶颈的高数据吞吐量的区域。当同时使用熟悉软件性能评价方式,这些工具允许特定的代码段可识别为更详细的分析或进行性能调整(图1)。
图1,在应用调试和监视过程中连接硬件和软件过程显示为模块
设计实例:基于FPGA的图像虑波器
为了演示这些工具如何用来把算法过程移至FPGA,我们以图像虑波器为例,其中输入数据流必须非常快速地处理,生成输出数据流。这样的问题可能涉及大量的计算,而且也是带宽密集的:最终的实现方式不能为了增加整体性能而影响数据吞吐量。
图2说明一个简单的图像虑波器如何工作。在所示的示例中(边缘检测虑波器),尤其是3×3窗口的像素数据必须以流方式组合和处理。
图2,图像虑波器过程一次处理输入图像一个像素,在最近的八个像素进行卷积
有许多可能的方法实现这种算法。在本例中,两个流水式硬件处理器用C描述完成这种功能:一个过程生成匹配源图像的匹配行像素(以像素流读取),同时第二个过程接受第一个流(三个代表三个偏移列的流)的结果,将对每个像素窗口卷积,生成一个输出图像,用第二个过程中单一的卷积像素流表示。这个过程和流用Impulse C库(见附文《Impluse C编程模型》)提供的C兼容的流I/O例程来声明和读/写。
因为算法是用标准C(外加Impulse C库)描述的,我们能从软件测试应用(用Microsoft Visual Studio开发)开始,它在桌面仿真环境下完成图像算法。这种测试应用将两种硬件过程和图像卷积功能结合到软件测试平台应用中(它可以编译, 并以基于PC的台式机应用或运行在Nios处理器中的嵌入式应用运行),它从TIFF格式文件中读取数据进行处理。这种测试用标准桌面调试工具和CoDeveloper Application Monitor进行设置和运行。在这种方式下,算法结果可以在进入下一阶段和编译至目标FPGA平台之前进行验证。
编译为硬件
用标准桌面C开发工具仿真它的功能之后,我们准备用Altera Stratix开发原型板,在混合FPGA/处理器目标上实现该应用。Altera Nios开发包包括所有编译和综合硬件和软件应用至FPGA目标所需的硬件和软件(包括自动生成的表示硬件过程的HDL源文件和表示软件过程的C源代码)。Altera提供的软件结合Impulse CoDeveloper,为我们提供了从C语言编译和执行测试应用所需的一切。
我们第一步是为图像滤波器本身生成硬件。为了达到这一目的,我们从CoDeveloper工具中选用Altera Nios Platform Support Package,处理相关的Impulse C源文件。这将产生大约1200行的RTL和相关的硬件/软件接口源文件。
接下来,用A
ltera Quartus工具建立新的项目,生成包括必要外设的Nios处理器核(用Altera的SOPC Builder)。CoDeveloper的输出软件和输出硬件功能将从CoDeveloper输出生成的硬件和软件文件给新创建的Quartus项目。使用Altera的框图工具,我们通过Avalon片内总线将生成的硬件过程和Nios处理器相连。
包括Nios处理器和生成硬件的整个系统用Altera Quartus综合。应用的软件部分(主要由测试生成器和客户功能组成,包括组函数)也导入Quartus项目,用所包含的Nios编译器编译。
最后,用Altera工具生成bit文件,通过提供的并口电缆下载到平台上。在这个平台按预期要求上电和运行。
在这个例子中,显式流水的两个图像滤波器过程和由CoDeveloper C自动为硬件编译器生成的流水在每两个FPGA时钟周期获得最佳的单像素图像处理速率,相当于大约10ms完成整个512×512图像的处理速度。
当然,在FPGA上任何算法的绝对性能是取决于I/O因素及算法本身。在我们的图像滤波器测试方案中,图像数据从Nios上运行的测试生成器通过Avalon片内互连传送到生成的FPGA硬件上,这样可以获得比上述最大像素速率低得多的有效吞吐量。另一个算法版本中,像素数据直接从FPGA硬件接口传送和读取,这样做的结果会最接近最佳的结果。因此考虑带宽的限制是非常重要的——可能的化在硬件上测试,因为带宽是确定应用划分的因素。象CoDeveloper这样的工具可以更容易和更快地进行这方面的评估和实验。
附文:Impluse C编程模型
建立将软件和硬件相结合的应用需要对并行编程技术有所了解,尤其是以差别很大的有效速率操作的独立同步过程。为了帮助建立高度并行的混合硬件/软件应用,Impulse C库包括了设置和管理多个独立过程的功能,它可以通过数据流、信号和可选的共享存储资源相连接。
在典型的Impulse C应用中,编写一个或多个软件过程,作为生成器和客户数据或(可选)和其它直接用FPGA逻辑实现的硬件/软件过程通信和同步的控制器。Impulse C编程模型(概念上和1980年C.A.R.Hoare描述的通信时序处理模型类似)提供了对硬件/软件划分和同步的系统级控制,同时允许用标准C构造编写和自动优化独立过程。
图a,Impulse C编程模型:通信主要通过数据流(映射为生成硬件中的FIFO),其它需要同步的信号,及非流数据的共享和本地存储器(即系数)。
使用Impulse C库功能,C语言可用来描述高度并行的应用,具有最小的软件编程复杂度,同时具有用标准C开发环境下编译和调试的能力。例如,使用Impulse C库功能,一个简单的图像滤波器可以用如下的代码风格描述(实际算法省略):
提供另外的Impulse C功能(和从C应用的主函数间接调用)用数据流和信号建立和连接这些过程,指定存储器和其它外部接口。这个编程模型的结果是底层硬件平台的实际情况(假设是传统处理器和可编程硬件的混合)被抽象,用户(他可能是有经验的C程序员,但几乎没有硬件设计知识)不必学习硬件设计方法,就可以描述和运行混合软件/硬件应用。