作者: BIGMAC,文章来源: 图灵研究院微信公众号
注:本文由作者授权转发,如需转载请联系作者本人
1. 前言
Vitis HLS(原VivadoHLS)是一个高级综合工具。用户可以通过该工具直接将C、 C++编写的函数翻译成HDL硬件描述语言,最终再映射成FPGA内部的LUT、DSP资源以及RAM资源等。
用户通过Vitis HLS,使用C/C++代码来开发RTL IP核,可以缩短整个FPGA项目的开发和验证时间。
2. 使用高级综合工具来开发FPGA的优势
3. Vitis HLS工作流程
Vitis HLS的工作流程如下图所示:
Vitis HLS工作主要分为两个阶段,第一个阶段为调度和控制逻辑的提取;第二个阶段为捆绑映射。
4.调度(Scheduling)和捆绑(Binding)的例子
下面这段为Vitis HLS的示例代码:
图片居中使用:
根据这段代码,Vitis HLS的Scheduling和Binding方式如下图所示:
由图中可以看到,Scheduling阶段,该运算流程被分为2个时钟周期完成,第一个时钟周期完成乘加操作,第二个时钟周期完成第二次加法操作。
Binding阶段直接将第一个时钟周期的乘加操作映射为DSP资源来处理;第二个时钟周期的操作映射给另一个加法器资源来处理。
5.控制逻辑提取(Control Logic Extraction)的例子
下面这段为Vitis HLS的示例代码:
根据这段代码,Vitis HLS的ControlLogic Extraction方式如下图所示:
此代码示例执行与前一个示例相同的操作。 但是该操作处在for循环中,并且该函数有两个参数是数组形式。
从图中可以看到,Control Logic Extraction阶段根据该代码创建了状态机(FSM)来顺序完成这段代码的操作。char类型的变量被映射成8bit的数据总线,数组in或out一般默认被映射为block RAM。
该状态机总共包含4个阶段,状态机开始于C0,C0状态计算b+c的值。由于该计算流程只需要请求计算一次b+c的值,因此C0状态只执行一次。
C1状态到C3状态会重复执行3次,其中C1状态产生地址、读取数组in的值并存储到x中,同时C1状态会控制一个累加器来判断自己需要迭代重复几次C1~C3的流程。在C2状态,block RAM会返回in数组对应的值给x变量。在C3状态,完成乘加操作。
---------------------------------
参考文献:
[1]《Vitis High-Level Synthesis User Guide》. UG1399. Xilinx
[2]“跟Xilinx SAE学HLS系列视频讲座-高亚军 ”https://www.bilibili.com/video/av41246874