原创 嵌入式HLS 案例开发步骤分享——基于Zynq-7010/20工业开发板(3)

2023-1-1 22:37 663 4 4 分类: MCU/ 嵌入式

目 录

4 matrix_demo 案例 27

4.1 HLS 工程说明 27

4.2 编译与仿真 30

4.3 综合 31

4.4 IP 核测试 36

4.4.1 PL 端 IP 核测试 Vivado 工程说明 37

4.4.2 PS 端 IP 核测试裸机工程说明 37

4.4.3 测试说明 39

前 言

本文主要介绍 HLS 案例的使用说明,适用开发环境: Windows 7/10 64bit、Xilinx Vivado

2017.4 、Xilinx Vivado HLS 2017.4 、Xilinx SDK 2017.4。

Xilinx Vivado HLS (High-Level Synthesis,高层次综合) 工具支持将 C 、C++等语言转化

成硬件描述语言,同时支持基于 OpenCL 等框架对 Xilinx 可编程逻辑器件进行开发,可加

速算法开发的进程,缩短产品上市时间。

测试板卡是基于创龙科技Xilinx Zynq-7000系列XC7Z010/XC7Z020高性能低功耗处理器设计的异构多核SoC工业级核心板。

4 matrix_demo 案例

案例功能: 实现 32*32 浮点矩阵乘法运算功能, 同时提供提高运算效率的方法。

4.1 HLS 工程说明

(1) 时钟

HLS 工程配置的时钟为 100MHz。如需修改时钟频率, 请打开 HLS 工程后点击 ,在

弹出的界面中的 Synthesis 栏目进行修改。

图 45

(2)顶层函数

案例有两个可选的顶层函数,分别为 standalone_mmult()和 HLS_accel()。前者为矩阵 乘法运算函数,用于仿真阶段;后者基于前者将数据输入输出接口封装成 AXI4-Stream 接 口, 用于综合阶段。工程默认配置为 standalone_mmult()。

图 46

点击

后,可在弹出的界面中的 Synthesis 栏目查看或设置顶层函数。

图 47

矩阵乘法运算函数如下:

图 48

matrix_demo_test.cpp 中提供了矩阵乘法运算函数 mmult_sw(),程序将 mmult_sw()的

运算结果和顶层函数 standalone_mmult()的运算结果进行对比。如结果一致, 则说明顶层

函数逻辑正确。 mmult_sw()函数不调用逻辑资源, 而 standalone_mmult()函数调用逻辑资

源。

图 49

图 50

4.2 编译与仿真

请参考本文档 HLS 开发流程说明章节, 进行编译。 编译完成后, 进入仿真界面点击

进行全速运行。

图 51

运行完毕后,将在 Console 窗口打印如下提示信息,说明顶层函数逻辑正确。

图 52

4.3 综合

案例提供三个 solution,每个 solution 的算法运行效率不同。由于 solution3 所用资源 较多, xc7z010 无法满足资源要求,因此案例默认使用 solution2 生成 IP 核。

进行综合时,需将顶层函数修改为 HLS_accel() 。修改顶层函数后请点击

,在弹

出的界面中点击“All Solutions”进行综合。

图 53

图 54

综合完成后,可看到三个 solution 的详细信息。

图 55

从上图可看出solution3 的运行效率最高,但消耗资源最多。

(1) solution1 分析

双击选中 solution1,然后点击 Analysis。

图 56

图 57

可看到矩阵乘法运算函数里的三个 for 循环均为顺序运行, 因此耗时最长。

(2) solution2 分析

双击打开 solution2 的 directives.tcl ,可看到下图语句。

图 58

PIPELINE 的作用是允许在函数中并发执行操作, 减少函数运行时间。

图 59

solution2 将 mmult_hw()的 L2 for 循环进行了 PIPELINE 优化。打开solution2 的Analysis, 可看到矩阵乘法运算函数里的 L1/L2 for 循环并行执行,因此耗时较短。

图 60

(3) solution3 分析

双击打开 solution3 的 directives.tcl ,可看到下图语句。

图 61

ARRAY_PARTITION 指令的作用是将大数组划分为多个小数组或单独的寄存器, 以提高 对数据的访问效率。

图 62

solution3 在 solution2 的基础上, 使用了 ARRAY_PARTITION 指令将函数 mmult_hw()的 数组 a 、b 分别分拆为 16 个数组,增加了数据吞吐量, 提高了运算效率。

打开头文件 matrix_demo.h,然后双击选中 solution3 打开工程 Directive,可对编译指

令进行修改或优化。

图 63

4.4 IP 核测试

请参考本文档 HLS 开发流程说明章节,完成 IP 核测试前的准备工作。

HLS 工程生成的 IP 核为 HLS_accel_0。

图 64

4.4.1 PL 端 IP 核测试 Vivado 工程说明

浮点矩阵乘法运算加速器 IP 核通过 AXI DMA IP 核连接到 PS 端 ACP 接口,从而连通

到 PS 端 L2 缓存。 ACP 为 64 位 AXI 从接口,它提供了一个异步缓存相关接入点, 实现了

PS 和 PL 端加速器之间的低延迟路径。

AXI Timer IP 核用于计数,可通过其寄存器来计算浮点矩阵乘法运算加速器 IP 核的运

算时间。

图 65

4.4.2 PS 端 IP 核测试裸机工程说明

PS 端运行 32*32 的浮点矩阵乘法运算,并将 PS 端和 PL 端用时进行比较。 PL 端的浮 点矩阵乘法运算用时从 AXI Timer IP 核中读取。

打开裸机工程,确保 lscript.ld 文件的“Stack Size”为 0x3000,然后进行编译。

图 66

图 67

作者: Tronlong, 来源:面包板社区

链接: https://mbb.eet-china.com/blog/uid-me-3881012.html

版权声明:本文为博主原创,未经本人允许,禁止转载!

文章评论0条评论)

登录后参与讨论
我要评论
0
4
关闭 站长推荐上一条 /2 下一条