写在前面
本文是本系列专题的第七篇,参考高亚军老师的视频教程以及课程的ppt,主要介绍了vivado HLS的C++ 基本运算处理。
算术运算符
加减乘除基本操作。当处理定点数时候,要注意数据位宽的处理。原则遵循:大数据不溢出,小数据不损失。这样才能保证我们的数据运算结果的准确性。
算术赋值运算
让书写变得简洁,本质和算术运算差别不大。
示例
在示例中给出了这个操作函数的头文件,C文件还有部分的激励文件。
从函数的功能上,我们可以清楚的看出,仅仅是一个+常数的操作,但是这里要注意的一点就是,关于常数的类型的小tips。
- 当分配常数涉及到运算符时,常数必须首先转换为ap_(u)固定类型,否则,Vivado HLS将文字解释为整数或float或者是double类型,可能无法找到合适的操作,从而产生错误。
自加、逻辑、条件运算
大家都学过,不解释了。
复数乘法示例
实现方法一
资源对比
两者实现的算法不同,消耗资源也不同。
最大公约数示例
下图的左侧我们可以看到,这里的算法实质,主要用到了取余的操作和判断条件。当b满足条件b==0时候,即可得到最大公约数。右边的流程图也很好理解。
代码示例
资源与接口分析
在HLS下,很容易就可以把这个算法给描述出来。
代码示例二(error)
这里用到了是递归操作,HLS工具不支持,所以无法完成算法的实现。
总结
Vivado HLS可以支持C/ c++中的所有基本运算符,在之前文章中提到了部分操作不支持,其余基本可以实现,可以满足算法复现的需求。
全面了解算法对于算法描述非常重要,只有在知道工具支持什么操作,我们才可以在复现算法的时候更加顺利。
Vivado HLS不支持递归函数
Vivado HLS不支持递归函数
Vivado HLS不支持递归函数