当前位置:首页 > EDA > 电子设计自动化
[导读] 在编写软件时,您有没有遇到过无论怎么努力编码,软件都不能按您期望的速度运行?我遇到过。您有没有想过,“有没有什么简单而且成本不高的方法可将一些代码输入多个定制处理器或定制硬件?”毕竟,您的应用

 在编写软件时,您有没有遇到过无论怎么努力编码,软件都不能按您期望的速度运行?我遇到过。您有没有想过,“有没有什么简单而且成本不高的方法可将一些代码输入多个定制处理器或定制硬件?”毕竟,您的应用只是众多应用中的一个,而且创建定制硬件需要花费时间和成本。是不是这样?

最近听说了赛灵思的高层次综合工具Vivado®HLS后,我开始重新思考这一问题。高层次综合工具与Zynq®-7000 All Programmable SoC的结合为设计开辟了新的可能性,其中Zynq®-7000 All Programmable SoC结合了带有FPGA架构的双核ARM®CortexTM-A9处理器。这类工具可以用C语言,C++语言或SystemC源代码创建高度优化的RTL。近年来,出现很多这项技术的提供商,且其采用率也不断提高。

如果我只用Vivado HLS便能完成要求更高的计算,那么将那些慢速代码迁移到硬件中会有多难?毕竟我经常用C++语言编写代码,而Vivado HLS将C/C++语言作为输入语言。ARM处理器内核意味着我可以在常规环境下运行多数软件。事实上赛灵思还提供了一款软件开发工具(SDK)以及PetaLinux来帮您实现这一目的。

架构问题

从软件角度思考这一转变,我开始更加担心软件接口问题。毕竟,HLS创建的硬件专注于处理硬件接口。我需要一些易于访问的工具(如协处理器或硬件加速器)来加快软件运行速度。而且,我不想编写新的编译器。为了方便与软件的其它部分交换数据,这个接口应该类似于简单的存储单元,我们可以在其中输入信息并稍后读取结果。

然后我有了新的发现。Vivado HLS支持以相对较小的努力轻松创建AXI从接口。这让我开始思考,创建加速器也许没有那么难。于是,我编码了一个简单的实例来探索这种可能性。探索的结果让我惊喜不已。

下面看看我用了什么方法,并思考这种方法所得出的结果。

在我的实例中,我选择了对一系列简单的矩阵运算(如加法和乘法)进行建模。我不想将它限制在固定的大小,因此,我必须同时提供输入阵列及各阵列的尺寸大小。理想的接口会将所有数值作为函数的自变量,例如图1中的代码。

硬件接口需要用一种简单的方法将函数自变量映射到存储单元。图2是支持这一映射的存储器配置。寄存器中保存了有关矩阵的排列方式以及所需运算的信息。指令寄存器将指示执行何种运算。这样我便可以将一些简单的运算融合到一个硬件中。可以用状态寄存器来查看是否正在进行运算或是已经成功完成运算。此外,器件最好还能提供中断支持。

回到硬件设计,我了解到Vivado HLS为阵列自变量留出空间以指定小容量内存。这样,图3所示函数便说明了这种函数性。

假设能够综合AXI从接口,怎样将它用在软件上?我将正常编码环境假设为Linux。还好赛灵思提供PetaLinux,而且PetaLinux提供一种叫做用户I/O器件的机制。UIO可以用简单的方法将新硬件映射到用户内存空间,并具备中断等待能力。这意味着您可以省去编写器件驱动程序所耗费的的时间和流程。图4显示了这个系统。

这种方式当然也有缺陷。例如,无法在DMA中使用UIO器件,因此您必须在器件内存中构建矩阵,并在构建完成后手动复制出来。如果需要,将来可以通过定制器件驱动程序解决这个问题。

用Vivado HLS综合硬件

现在回到综合AXI从接口的话题。它的综合难度有多大?我发现这些编码限制非常合理。除内存的动态分配以外,大多数C ++语言都可以使用。

毕竟硬件在运行过程中不能生产其本身。这限制了标准模板库(STL)功能的使用,因为这里大量使用了动态分配。只要数据保持静态,多数功能都可以使用。起初这项任务似乎非常繁重,但我发现这并不是什么大事。另外,Vivado HLS允许C++类、模板、函数和运算符重载。我的矩阵运算可轻易归入定制矩阵分类。

增加I/O来创建AXI从接口非常简单。只需增加一些能够指示包含哪些端口以及使用哪些协议的编译指示即可。

只要我不按下所有旋钮,运行这款综合工具非常简单。图5展示了其中各个步骤,在此我不再详细解释。需要就目标技术和时钟速度对Vivado HLS进行一些引导。之后涉及的程序会密切关注违反政策的报告并研究分析报告以确保Vivado HLS按我所期望的方式运行。工具用户必须对硬件方面有所了解,但有一些技术课程可以解决这个问题。还存在综合前后运行仿真以检验预期行为的问题。

Vivado IP Integrator让AXI从接口连接到Zynq SoC硬件变得轻而易举,并打消了对信号连接错误的顾虑。赛灵思甚至拥有我所使用的ZedBoard开发系统的系统概述,并用IP Integrator导出数据用于软件开发套件。

清除瓶颈

我对结果非常满意,我希望能用这款芯片与工具集的组合做更多事情。我并没有探索所有的可能性。例如,Vivado HLS还支持AXI主接口。AXI会允许加速器从外部存储器复制矩阵(尽管这样也可能存在安全问题)。不过我强烈建议所有面临代码瓶颈的人都能考虑这个工具集。这里提供足够的培训课程、资源和材料以实现快速匀变,其中包括Doulos提供的课程、资源和材料。如需了解更多信息,敬请访问:www.doulos.com。

图1 – 调用加速器示例

地址 寄存器名称 目录 位元

内容

0 Matrix0_ptr RW 32

Matrix 0数据地址

4 Matrix0_shape RW 32 Matrix 0行 Matrix 0列
8 Matrix1_ptr RW 32

Matrix 1数据地址

12 Matrix1_shape RW 32 Matrix 1行 Matrix 1列
16 Matrix2-ptr RW 32

Matrix 2数据地址

20 Matrix2_shape RW 32 Matrix 2行 Matrix 2列
24 Matrix3_ptr RW 32

Matrix 3数据地址

28 Matrix3_shape RW 32 Matrix 3行 Matrix 3列
32 -reserved- - 32

 

36 -reserved- - 32

 

40 Command RW 32 0 enum
44 Status RW 32 0 enum

8192 × 32存储器

图2 – 寄存器汇总表

图3 – 加速器函数API

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭