Board从入门到精通系列(八)

Board从入门到精通系列(八),第1张

终于到了HLS部分。HLS是High Level Synthesis的缩写,是一种可以将高级程序设计语言C++,C++,SystemC综合为RTL代码的工具。生产力的发展推动了设计模式。在电子技术初级阶段,人们关注的是RLC电路,通过建立微分方程求解电路响应。门级电路是对RLC的初步封装,人们进而采用布尔代数、卡诺图进行电路设计与分析。之后随着集成电路进一步发展,门电路可以集成为寄存器触发器ROM等宏单元,设计工具也变得更为高度模块化。算法级别的电路设计,则一直没有特别好的工具,直到出现了HLS。HLS可以将算法直接映射为RTL电路,实现了高层次综合。这个层面上讲,System Generator也是一种高层次综合工具,因为它将matlab算法描述综合为RTL代码。如果今后机器学习、人工智能获得重大突破,或许会出现将人类自然语言综合为RTL代码的工具,不知我们是否能见证它的面世。HLS的学习资源可以参考。本节给出较为通用的矩阵与向量相乘例子,从全串行到全并行进行了一步步优化实现。矩阵实验室Matlab是比较常用的数学仿真软件。本博主用的是R2013a版本。为了验证矩阵向量相乘正确性,我们先用matlab生成测试矩阵和向量,并利用matlab计算结果。代码如下:[plain] 

 

clear;  

clc;  

close all;  

  

N = 5;  

  

A = randi([1,100],N,N);  

b = randi(100,N,1);  

  

c = A*b;  

  

KKK_SaveToCHeaderFile(A,'A.h');  

  

KKK_SaveToCHeaderFile(b,'b.h');  

KKK_SaveToCHeaderFile(c,'c.h');  

 

这里给出的是A*b = c的简单例子,A为5X5矩阵,b为5X1向量,结果c为5X1向量。其中KKK_SaveToCHeaderFile()是将矩阵、向量保存为C语言数组的子函数,定义如下:[plain] 

 

funcTIon [] = KKK_SaveToCHeaderFile(var,fn)  

fid = fopen(fn,'w');  

var = reshape(var.',1,[]);  

fprintf(fid,'%d, ',var);  

fclose(fid);  

 

给出测试例程中,A如下:[plain] 

 

82  10  16  15  66  

91  28  98  43  4  

13  55  96  92  85  

92  96  49  80  94  

64  97  81  96  68  

 

b如下:[plain] 

 

76  

75  

40  

66  

18  

 

得到的c如下:980015846165552312422939运行matlab脚本之后,生成三个文件:A.h,b.h,c.h,这些是作为HLS程序的输入数据和参考结果。下面我们用HLS工具实现上述矩阵X向量的功能。第一步,运行Vivado HLS。

选择第一项,Create New Project,建立新工程MatrixMulTIply

输入路径和工程名之后,点Next。

添加顶层模块文件。这里我们Top FuncTIons输入MatrixMulTIply,然后New File...,新建一个.c文件,命名为MatrixMultiply.c(后缀不要省略!),然后点Next添加顶层文件测试脚本。这里New一个文件TestMatrixMultiply.c(后缀不要省略!),然后Add前面用Matlab生成的A.h,b.h,c.h,如下图所示:

点Next,选择解决方案配置,如下图所示

其余保持默认,只修改Part Selection部分,改为ZedBoard。改完后,Finish即可进入主界面,如下图所示

可以看出,Vivado HLS界面很像很像Xilinx SDK,不同的是前者负责PL部分开发,后者负责PS软件编写,定位不同决定了二者今后的路必然走向分歧。将MatrixMultiply.c内容改为:[cpp] 

 

typedef int data_type;  

#define N 5  

  

void MatrixMultiply(data_type AA[N*N],data_type bb[N],data_type cc[N])  

{  

    int i,j;  

    for(i = 0;i

    {  

        data_type sum = 0;  

        for(j = 0;j

        {  

            sum += AA[i*N+j]*bb[j];  

        }  

        cc[i] = sum;  

    }  

}  

 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/dianzi/2592155.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-08-08
下一篇 2022-08-08

发表评论

登录后才能评论

评论列表(0条)

保存