Vitis高层次综合学习——FPGA

高层次综合

什么是高层次综合?就是使用高级语言(如C/C++)来编写FPGA算法程序。
在高层次综合上并不需要制定微架构决策,如创建状态机、数据路径、寄存器流水线等。这些细节可以留给 HLS 工具,通过提供输入约束(如时钟速度、性能编译指示、目标器件等)即可生成经过最优化的 RTL。
其主要优势为:
1、提高FPGA算法部署的效率
(1)使用C语言来开发和确认FPGA算法;
(2)使用C语言来仿真RTL设计。
2、算法易于移植。

Vivado 和 HLS

Vitis HLS 工具会将 C 或 C++ 函数综合到 RTL 代码中,以便在 Versal 自适应 SoC、Zynq MPSoC 或 AMD FPGA 器件的可编程逻辑 (PL) 区域内实现。Vitis HLS 与 Vivado Design Suite 紧密集成用于综合与布局布线,并与 Vitis 核开发套件紧密集成用于异构系统级别设计和应用加速。
HLS能够降顺序执行的C语言程序转为并行执行。
如下面的例子:

#include <vector>
#include <iostream>
#include <ap_int.h>
#include "hls_vector.h"
#define totalNumWords 512
unsigned char data_t;
int main(int, char**) {
// initialize input vector arrays on CPUfor (int i = 0; i < totalNumWords; i++) {in[i] = i;
}
compute(data_t in[totalNumWords], data_t Out[totalNumWords]);check_results();	
}
void compute (data_t in[totalNumWords ], data_t Out[totalNumWords ]) {data_t tmp1[totalNumWords], tmp2[totalNumWords];A: for (int i = 0; i < totalNumWords ; ++i) {tmp1[i] = in[i] * 3;tmp2[i] = in[i] * 3;}B: for (int i = 0; i < totalNumWords ; ++i) {tmp1[i] = tmp1[i] + 25;}C: for (int i = 0; i < totalNumWords ; ++i) {tmp2[i] = tmp2[i] * 2;}D: for (int i = 0; i < totalNumWords ; ++i) {out[i] = tmp1[i] + tmp2[i] * 2;}
}

上面的C语言代码在CPU中按顺序执行,当然也可以在FPGA中顺序执行,但是这样就没有发挥FPGA的优势。compute() 函数需重构,以实现基于 FPGA 的加速。
加速有以下方向:
1、compute 函数可先启动,随后再将所有数据传递给它;
2、多个 compute 函数能以重叠方式运行,例如,“for”循环能够在上一次迭代完成前启动下一次迭代;
3、“for”循环内的各项操作都能在多个码字上并发运行,无需逐字执行。

compute() 函数循环 A 将输入值乘以 3,并创建两条独立路径,分别是 B 和 C。循环 B 和 C 执行操作并将数据馈送给 D。这是一种现实状况的简单表示法,您需在其中逐一执行多项任务,这些任务彼此相连形成如下所示网络。
在这里插入图片描述

#include "diamond.h"
#define NUM_WORDS 16
extern "C" {
void diamond(vecOf16Words* vecIn, vecOf16Words* vecOut, int size)
{hls::stream<vecOf16Words> c0, c1, c2, c3, c4, c5;assert(size % 16 == 0);#pragma HLS dataflowload(vecIn, c0, size);compute_A(c0, c1, c2, size);compute_B(c1, c3, size);compute_C(c2, c4, size);compute_D(c3, c4,c5, size);store(c5, vecOut, size);
}}
void load(vecOf16Words *in, hls::stream<vecOf16Words >& out, int size)
{Loop0:for (int i = 0; i < size; i++){#pragma HLS PERFORMANCE target_ti=32#pragma HLS LOOP_TRIPCOUNT max=32out.write(in[i]);
}
}
void compute_A(hls::stream<vecOf16Words >& in, hls::stream<vecOf16Words >&
out1, hls::stream<vecOf16Words >& out2, int size)
{Loop0:for (int i = 0; i < size; i++){#pragma HLS PERFORMANCE target_ti=32#pragma HLS LOOP_TRIPCOUNT max=32vecOf16Words t = in.read();out1.write(t * 3);out2.write(t * 3);}
}
void compute_B(hls::stream<vecOf16Words >& in, hls::stream<vecOf16Words >&
out, int size)
{Loop0:for (int i = 0; i < size; i++){#pragma HLS PERFORMANCE target_ti=32#pragma HLS LOOP_TRIPCOUNT max=32out.write(in.read() + 25);}
}
void compute_C(hls::stream<vecOf16Words >& in, hls::stream<vecOf16Words >&
out, int size)
{Loop0:for (data_t i = 0; i < size; i++){#pragma HLS PERFORMANCE target_ti=32#pragma HLS LOOP_TRIPCOUNT max=32out.write(in.read() * 2);}
}
void compute_D(hls::stream<vecOf16Words >& in1, hls::stream<vecOf16Words >&
in2, hls::stream<vecOf16Words >& out, int size)
{Loop0:for (data_t i = 0; i < size; i++){#pragma HLS PERFORMANCE target_ti=32#pragma HLS LOOP_TRIPCOUNT max=32out.write(in1.read() + in2.read());}
}
void store(hls::stream<vecOf16Words >& in, vecOf16Words *out, int size)
{Loop0:for (int i = 0; i < size; i++){#pragma HLS PERFORMANCE target_ti=32#pragma HLS LOOP_TRIPCOUNT max=32out[i] = in.read();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/70464.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iTOP-RK3568开发板ubuntu环境下安装Eclipse

eclipse 是使用 Java 语言开发的&#xff0c;一个 Java 应用程序&#xff0c;这意味着 eclipse 只能运行在 Java虚拟机上。倘若没有安装 JDK&#xff08;Java Development Kit&#xff09;&#xff0c;即使在 ubuntu 上安装了 eclipse&#xff0c;也不能运行&#xff0c;所以要…

设计模式之享元模式(Flyweight)的C++代码实现

1、享元模式提出 面向对象很好地解决了抽象问题&#xff0c;但是创建对象会带来一定的内存开销。绝大部分情况下&#xff0c;创建对象带来的内存开销是可以忽略不计的&#xff1b;在有些情况下是需要谨慎处理的&#xff0c;如类A的sizeof是50个字节&#xff0c;则创建50*1024*…

IT运维:使用数据分析平台监控深信服防火墙

概述 深信服防火墙自身监控可以满足绝大部分需求&#xff0c;比如哪个应用占了最大带宽&#xff0c;哪个用户访问了哪些网站&#xff1f;这里我们为什么使用鸿鹄呢&#xff1f;因为我们要的是数据的处理和分析&#xff0c;比如某个用户在某个事件都做了哪些行为&#xff0c;这个…

提示丢失vcomp140.dll怎么办?如何快速修复vcomp140.dll丢失问题

最近我遇到了一个程序启动失败的问题&#xff0c;错误提示显示缺少了vcomp140.dll文件。经过一番研究和尝试&#xff0c;我终于成功修复了这个问题。在这里&#xff0c;我将分享一下我的修复方法。 目录 vcomp140.dll是什么&#xff1f; 如何快速修复呢&#xff1f; vcomp140…

DR模式 LVS负载均衡群集

数据包流向分析&#xff1a; &#xff08;1&#xff09;客户端发送请求到 Director Server&#xff08;负载均衡器&#xff09;&#xff0c;请求的数据报文&#xff08;源 IP 是 CIP,目标 IP 是 VIP&#xff09;到达内核空间。 &#xff08;2&#xff09;Director Server 和 Re…

K8S用户管理体系介绍

1 K8S账户体系介绍 在k8s中&#xff0c;有两类用户&#xff0c;service account和user&#xff0c;我们可以通过创建role或clusterrole&#xff0c;再将账户和role或clusterrole进行绑定来给账号赋予权限&#xff0c;实现权限控制&#xff0c;两类账户的作用如下。 server acc…

06-加密算法

加密算法 一、前言知识1、加密解密2、MD5&#xff08;最常见&#xff09;3、SHA4、进制5、时间戳6、URL编码7、base64编码8、unescape编码9、AES加密10、DES&#xff08;类似于base64&#xff09; 二、常见加密形式算法解析三、演示案例1、某 CTF 比赛题目解析2、某 CMS 密码加…

企业电子招投标采购系统源码之电子招投标的组成 tbms

​ 功能模块&#xff1a; 待办消息&#xff0c;招标公告&#xff0c;中标公告&#xff0c;信息发布 描述&#xff1a; 全过程数字化采购管理&#xff0c;打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力&#xff0c;为…

拉丁方设计资料的方差分析(SPSS版+SAS版)

拉丁方设计&#xff08;Latin square design&#xff09;&#xff1a;实验研究中涉及一个处理因素和两个控制因素&#xff0c;每个因素的类别数或水平数相等&#xff0c;此时可采用拉丁方设计&#xff0c;将两个控制因素分别安排在拉丁方设计的行和列上。该设计类型仍为单因素方…

【jenkins】jenkins流水线构建打包jar,生成docker镜像,重启docker服务的过程,在jenkins上一键完成,实现提交代码自动构建的功能

【jenkins】jenkins流水线构建打包jar&#xff0c;生成docker镜像&#xff0c;重启docker服务的过程&#xff0c;在jenkins上一键完成&#xff0c;实现提交代码自动构建&#xff0c;服务重启&#xff0c;服务发布的功能。一键实现。非常的舒服。 1. 启动脚本 shell脚本 这是 s…

TOMCAT的多实例部署和动静分离

tomcat的多实例 动静分离 排错小工具&#xff1a; telnet工具&#xff1a;yum -y install telnet telnet工具用于测试端口是否正常 telnet 20.0.0.101 80Tomcat多实例部署&#xff1a; 一台服务器上有多个tomcat的服务 1.安装好 jdk 2.安装 tomcat cd /opt tar zxvf apache-…

re学习(33)攻防世界-secret-galaxy-300(动态调试)

下载压缩包&#xff1a; 下载链接&#xff1a;https://adworld.xctf.org.cn/challenges/list 参考文章&#xff1a;攻防世界逆向高手题之secret-galaxy-300_沐一 林的博客-CSDN博客 发现这只是三个同一类型文件的三个不同版本而已&#xff0c;一个windows32位exe&#xff0…