电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本
换一换
首页 金锄头文库 > 资源分类 > DOCX文档下载
分享到微信 分享到微博 分享到QQ空间

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

  • 资源ID:266122452       资源大小:3.06MB        全文页数:26页
  • 资源格式: DOCX        下载积分:15金贝
快捷下载 游客一键下载
账号登录下载
微信登录下载
三方登录下载: 微信开放平台登录   支付宝登录   QQ登录  
二维码
微信扫一扫登录
下载资源需要15金贝
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
如填写123,账号就是123,密码也是123。
支付方式: 支付宝    微信支付   
验证码:   换一换

 
账号:
密码:
验证码:   换一换
  忘记密码?
    
1、金锄头文库是“C2C”交易模式,即卖家上传的文档直接由买家下载,本站只是中间服务平台,本站所有文档下载所得的收益全部归上传人(卖家)所有,作为网络服务商,若您的权利被侵害请及时联系右侧客服;
2、如你看到网页展示的文档有jinchutou.com水印,是因预览和防盗链等技术需要对部份页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有jinchutou.com水印标识,下载后原文更清晰;
3、所有的PPT和DOC文档都被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;下载前须认真查看,确认无误后再购买;
4、文档大部份都是可以预览的,金锄头文库作为内容存储提供商,无法对各卖家所售文档的真实性、完整性、准确性以及专业性等问题提供审核和保证,请慎重购买;
5、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据;
6、如果您还有什么不清楚的或需要我们协助,可以点击右侧栏的客服。
下载须知 | 常见问题汇总

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

    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和main.cpp。在matrix_mul.h文件中,使用#ifdef 宏的方式,来避免重复声明某些内容。三、初步设计还未进行优化前的基本功能设计。1、matrix_mul.h文件任意精度定点数:在传统C中,char、int、short、long等的位宽都是固定的,8位、32位、16位和64位。如果电路中要求10位宽的数据,则常规变量无法实现,HLS为了能满足需求,搞了一种ap_int<>类型的数据变量,<>内放的是该类型变量的位宽,可以认为ap_int<8> A与char B,是两种类型相同的变量。#ifndef _MATRIX_MUL_#define _MATRIX_MUL_/ HLS提供的任意精度定点数文件#include "ap_fixed.h"/ A元素对应行,与B元素对应列,进行相乘得到Cvoid matrix_mul(ap_int<8> A44, ap_int<8> B44, ap_int<16> C44);#endif2、matrix_mul.cpp文件#include "matrix_mul.h"void matrix_mul(ap_int<8> A44, ap_int<8> B44, ap_int<16> C44)for(int i=0;i<4;i+)for(int j=0;j<4;j+)Cij=0;/ 循环乘四次,并进行相加for(int k=0;k<4;k+)Cij=Cij+Aik*Bkj;3、main.cpp文件#include "matrix_mul.h"#include <iostream>int main()ap_int<8> A44;ap_int<8> B44;ap_int<16> C44;/ 初始化赋值0、1、2、3、4、5.for(int i=0;i<4;i+)for(int j=0;j<4;j+)Aij=i*4+j;Bij=Aij;matrix_mul(A, B, C);for(int i=0;i<4;i+)for(int j=0;j<4;j+)std:cout<<"C"<<i<<","<<j<<"="<<Cij<<std:endl;return 0;代码写完,第一步要跑C Simulation,用快捷键Ctrl + B,就可以进行编译了。生成exe文件,就证明没有语法错误。然后,在菜单栏里,有一个Run C Simulation,点后进行C仿真,来看结果是否正确。是纯C语言的仿真。第二步进行综合,点菜单栏的Run C Synthesis。可能会出现下面这个“The function must be specified”错误,原因是可能有很多C函数,但哪个是顶层,需要确定下。在工程中右键Project Settings,选择Synthesis选项卡,将Top Function设置为matrix_mul,就可以跑综合了。四、报告分析综合完,会生成Synthesis的报告文件,下边对该文件的几个关键参数进行分析。1、Performance Estimates,性能估计。1°Timing:包含clock,时钟约束。2°Latency:在Summary中,包含了Latency与Interval,初步设计中,Latency为169,表示这个矩阵乘法的函数模块,需要耗时169个时钟周期。Interval是这次矩阵乘法与下一次,需要间隔多少周期,由于没有进行流水线的设计,这里需要间隔169个时钟周期,才能进行下一个的矩阵运算,因此Interval等于169。在Detail中,有循环内部的一些细节,可以看到每个循环需要的一些周期数,有些循环可能需要状态跳转,会消耗一部分的时钟周期。后续优化,主要也是照着Latency来进行优化。2、Utilization Estimates,资源利用率估计。一些资源使用的情况。3、Interface,端口情况。模块的参数就是端口,可以通过参数来生成不同的接口,不设置为缺省,默认是存储器里的数据。还有一些信号,ap开头,为控制信号。五、优化操作初步设计中,完全没有利用到FPGA的并行性,现考虑一些优化操作,来提高性能。1、行列相乘部分行列相乘后相加的代码,我们希望只用一个周期就计算出来。两个方法,1是利用参数循环展开,2是告诉编译器,这部分编译时,需要1个周期来完成,这样也会自动展开。Cij=0;for(int k=0;k<4;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:本来这方式在这里是可以的,但有个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 variable=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类型,即作为slave设备挂载在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 <stdio.h>#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.h"int main()int data;int state;/ 如果不使

注意事项

本文(HLS-矩阵乘法单元设计与SDK测试)为本站会员(Baige****0346)主动上传,金锄头文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即阅读金锄头文库的“版权提示”【网址:https://www.jinchutou.com/h-59.html】,按提示上传提交保证函及证明材料,经审查核实后我们立即给予删除!

温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.