电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

HLS-矩阵乘法单元设计与SDK测试

26页
  • 卖家[上传人]:Baige****0346
  • 文档编号:266122452
  • 上传时间:2022-03-14
  • 文档格式:DOCX
  • 文档大小:3.06MB
  • / 26 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 1、 HLS矩阵乘法单元设计与SDK测试 目录o 一、引言o 二、程序框架o 三、初步设计o 四、报告分析o 五、优化操作o 六、接口优化o 七、上板测试o 八、补充部分o 九、时间与参考一、引言矩阵乘法,涉及数组优化、循环优化和接口优化等。是一个学习HLS非常好的Lab。HLS新建工程这些就不记录了,在新建时有个需要注意,就是Clock Period的设置,如果设为10,会按照100MHz时钟来进行优化,如果一次运算15ms,就会分配到两个时钟来计算。但HLS工具预估是比较保守的,比如预估一次运算15ms,但实际上板卡后这个运算,就只要7ms。因此可以把周期稍微放大些/减轻约束压力,让HLS在做优化时,能放在一个周期内完成,但如果达不到约定的时钟频率,是可以进行更改的。在新建后的工程右键Project Settings,来进行更改。二、程序框架有Source、Include源代码和Test Beach目录。用于实现矩阵乘法功能的代码,放在Source目录下。用于测试矩阵乘法功能的代码,放在Test Beach目录下。新建文件:matrix_mul.cpp、matrix_mul.h和mai

      2、n.cpp。在matrix_mul.h文件中,使用#ifdef 宏的方式,来避免重复声明某些内容。三、初步设计还未进行优化前的基本功能设计。1、matrix_mul.h文件任意精度定点数:在传统C中,char、int、short、long等的位宽都是固定的,8位、32位、16位和64位。如果电路中要求10位宽的数据,则常规变量无法实现,HLS为了能满足需求,搞了一种ap_int类型的数据变量,内放的是该类型变量的位宽,可以认为ap_int A与char B,是两种类型相同的变量。#ifndef _MATRIX_MUL_#define _MATRIX_MUL_/ HLS提供的任意精度定点数文件#include ap_fixed.h/ A元素对应行,与B元素对应列,进行相乘得到Cvoid matrix_mul(ap_int A44, ap_int B44, ap_int C44);#endif2、matrix_mul.cpp文件#include matrix_mul.hvoid matrix_mul(ap_int A44, ap_int B44, ap_int C44)for(int i=

      3、0;i4;i+)for(int j=0;j4;j+)Cij=0;/ 循环乘四次,并进行相加for(int k=0;k4;k+)Cij=Cij+Aik*Bkj;3、main.cpp文件#include matrix_mul.h#include int main()ap_int A44;ap_int B44;ap_int C44;/ 初始化赋值0、1、2、3、4、5.for(int i=0;i4;i+)for(int j=0;j4;j+)Aij=i*4+j;Bij=Aij;matrix_mul(A, B, C);for(int i=0;i4;i+)for(int j=0;j4;j+)std:coutCi,j=Cijstd:endl;return 0;代码写完,第一步要跑C Simulation,用快捷键Ctrl + B,就可以进行编译了。生成exe文件,就证明没有语法错误。然后,在菜单栏里,有一个Run C Simulation,点后进行C仿真,来看结果是否正确。是纯C语言的仿真。第二步进行综合,点菜单栏的Run C Synthesis。可能会出现下面这个“The function mus

      4、t be specified”错误,原因是可能有很多C函数,但哪个是顶层,需要确定下。在工程中右键Project Settings,选择Synthesis选项卡,将Top Function设置为matrix_mul,就可以跑综合了。四、报告分析综合完,会生成Synthesis的报告文件,下边对该文件的几个关键参数进行分析。1、Performance Estimates,性能估计。1Timing:包含clock,时钟约束。2Latency:在Summary中,包含了Latency与Interval,初步设计中,Latency为169,表示这个矩阵乘法的函数模块,需要耗时169个时钟周期。Interval是这次矩阵乘法与下一次,需要间隔多少周期,由于没有进行流水线的设计,这里需要间隔169个时钟周期,才能进行下一个的矩阵运算,因此Interval等于169。在Detail中,有循环内部的一些细节,可以看到每个循环需要的一些周期数,有些循环可能需要状态跳转,会消耗一部分的时钟周期。后续优化,主要也是照着Latency来进行优化。2、Utilization Estimates,资源利用率估计。

      5、一些资源使用的情况。3、Interface,端口情况。模块的参数就是端口,可以通过参数来生成不同的接口,不设置为缺省,默认是存储器里的数据。还有一些信号,ap开头,为控制信号。五、优化操作初步设计中,完全没有利用到FPGA的并行性,现考虑一些优化操作,来提高性能。1、行列相乘部分行列相乘后相加的代码,我们希望只用一个周期就计算出来。两个方法,1是利用参数循环展开,2是告诉编译器,这部分编译时,需要1个周期来完成,这样也会自动展开。Cij=0;for(int k=0;k4;k+)Cij=Cij+Aik*Bkj;手动循环展开。在功能模块界面,右边有一个Directive,里边有一个for Statement,点开有三个循环,选中最里边那个子循环,右键Insert Directive,打开Vivado HLS Directive Editor这个界面。选择UNROLL,还有Source File和Directive File的选项,Source File是将参数放在C源代码文件中,Directive File是把参数单独放在一个源代码文件中,一般选择Source File就行了。Note:本

      6、来这方式在这里是可以的,但有个Cij=0。如果循环展开的话,这个赋值操作,也会占用一个周期。因此,干脆直接将第二级子循环的Iteration Latency(某个循环消耗的Latency)设置为1,就可以实现上述代码一个周期的目的,如何实现呢?在右边Directive选中第二级循环,右键Insert Directive,打开Vivado HLS Directive Editor后,选择PIPELINE,将里边的II,就是Iteration Latency,设置为1。操作完,会出现#pragma HLS PIPELINE II=1的命令。该操作可强制让每个运算在一个周期内完成,共16个运算,也就是只需要16个周期。2、数组部分PARTITION单、双口存储器的限制,存储器读写冲突,会出现下图那个错误,导致没法一次读取出4个数据,进行行列相乘。如果把数组A的存储器竖着(二维)切成四个,就可以一次读出四个数据。同理,数组B的存储器横着(一维)切成四个,也可以实现一次读出四个数据。不知道这个原因时,可以先进行仿真,来找到问题的关键。使用#pragma HLS ARRAY_PARTITION v

      7、ariable=A complete dim=2来完成切割。3、数组部分RESHAPE将原来深度为16,位宽为8的存储器,变成深度为4,位宽为32的存储器。A数组按二维堆起来,B数组按一维堆起来。使用#pragma HLS ARRAY_RESHAPE variable=A complete dim=2来完成组合。PARTITION一次可以读相同或不同的四个数据地址,但RESHAPE一次读的四个数据,是同一个地址的。通过实验波形,可以更加深入区分这两种操作。all是导出所有信号的波形。至少消耗的时钟周期为16*interval+latency,除此外还有写状态转换的消耗。interval可以被约束为1,那latency呢?latency也可以由#pragma HLS LATENCY min=5 max=5来约束。经过上述操作,综合后可以发现,只用了18个周期便可以完成了,至于为什么不是16个周期,是因为还有一个周期进行启动,并且写操作也有一个周期的延迟。六、接口优化之前使用的都是ap_memory存储器的接口,但模块一般挂接到SoC上,这里将接口改为s_axilite类型,即作为slav

      8、e设备挂载在SoC上。基本命令是:#pragma HLS INTERFACE s_axilite port=A。实际中发现,如果只添加这个命令,interface接口上,还是有ap_start与ap_done模块使能控制信号,这个需要和axi信号加以区分下,在这里,axi只做了数据传输的工作,但模块需要先使能工作才行,就是通过ap_start来完成的。为了让ap_start和ap_done这些信号也受CPU的控制,可以添加#pragma HLS INTERFACE s_axilite port=return。将ap_start与ap_done都变成axi接口综合后的结果。最后,点击report RTL,就能将工程输出为一个IP,在工程中调用。七、上板测试使用的FPGA型号是xc7z020clg400-1。环境简陋,将就着看。1、平台搭建。创建最小系统的Zynq核,并将DDR、UART0配置好,同时引出100MHz的PL时钟,还有一个复位信号。总线互联模块是一接一的,CPU启动工作matrix_mul模块,通过一个AXI口访问,将16个数据从AXI发送到模块,并检测是否done完成。每次改完,记得生成wapper和generate output两步。2、生成并导出bitstream,同时launch SDK。这个没啥复杂的,传统流程。需要留意下,matrix_mul模块的寄存器地址。3、SDK开发新建一个application project的HelloWorld模板,把串口调通之后,开始进行模块的测试,测试的代码如下。为了看懂这个代码,需要去学习几个AXI外设控制的函数。#include #include platform.h#include xil_printf.h#include stdio.h#include xil_io.h#include xparameters.h#include xmatrix_mul_hw.h#include xmatrix_mul.hint main()int data;int state;/ 如果不使

      《HLS-矩阵乘法单元设计与SDK测试》由会员Baige****0346分享,可在线阅读,更多相关《HLS-矩阵乘法单元设计与SDK测试》请在金锄头文库上搜索。

      点击阅读更多内容
    最新标签
    监控施工 信息化课堂中的合作学习结业作业七年级语文 发车时刻表 长途客运 入党志愿书填写模板精品 庆祝建党101周年多体裁诗歌朗诵素材汇编10篇唯一微庆祝 智能家居系统本科论文 心得感悟 雁楠中学 20230513224122 2022 公安主题党日 部编版四年级第三单元综合性学习课件 机关事务中心2022年全面依法治区工作总结及来年工作安排 入党积极分子自我推荐 世界水日ppt 关于构建更高水平的全民健身公共服务体系的意见 空气单元分析 哈里德课件 2022年乡村振兴驻村工作计划 空气教材分析 五年级下册科学教材分析 退役军人事务局季度工作总结 集装箱房合同 2021年财务报表 2022年继续教育公需课 2022年公需课 2022年日历每月一张 名词性从句在写作中的应用 局域网技术与局域网组建 施工网格 薪资体系 运维实施方案 硫酸安全技术 柔韧训练 既有居住建筑节能改造技术规程 建筑工地疫情防控 大型工程技术风险 磷酸二氢钾 2022年小学三年级语文下册教学总结例文 少儿美术-小花 2022年环保倡议书模板六篇 2022年监理辞职报告精选 2022年畅想未来记叙文精品 企业信息化建设与管理课程实验指导书范本 草房子读后感-第1篇 小数乘整数教学PPT课件人教版五年级数学上册 2022年教师个人工作计划范本-工作计划 国学小名士经典诵读电视大赛观后感诵读经典传承美德 医疗质量管理制度 2
    关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
    手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
    ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.