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 CPU
	for (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 dataflow
	load(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=32
	out.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=32
	vecOf16Words 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=32
	out.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=32
	out.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=32
	out.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=32
	out[i] = in.read();
	}
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

tauri-vue:快速开发跨平台软件的架子,支持自定义头部UI拖拽移动和窗口阴影效果

Tauri Vue Typescript 一个使用 taurivuets 开发跨平台软件的模板&#xff0c;支持窗口头部自定义 UI 和拖拽和窗口阴影&#xff0c;不用再自己做适配了&#xff0c;拿来即用&#xff0c;非常 nice。而且已经封装好了 tauri 的 http 请求工具&#xff0c;省去很多弯路。开源…

(二)结构型模式:8、代理模式(Proxy Pattern)(C++示例)

目录 1、代理模式&#xff08;Proxy Pattern&#xff09;含义 2、代理模式的UML图学习 3、代理模式的应用场景 4、代理模式的优缺点 5、C实现代理模式的实例 1、代理模式&#xff08;Proxy Pattern&#xff09;含义 代理模式&#xff08;Proxy&#xff09;&#xff0c;为…

大数据-玩转数据-Flink 自定义Sink(Mysql)

一、说明 如果Flink没有提供给我们可以直接使用的连接器&#xff0c;那我们如果想将数据存储到我们自己的存储设备中&#xff0c;mysql 的安装使用请参考 mysql-玩转数据-centos7下mysql的安装 创建表 CREATE TABLE sensor (id int(10) ) ENGINEInnoDB DEFAULT CHARSETutf8二…

Wi-Fi 安全在学校中的重要性

Wi-Fi 是教育机构的基础设施&#xff0c;从在线家庭作业门户到虚拟教师会议&#xff0c;应有尽有。大多数 K-12 管理员对自己的 Wi-Fi 网络的安全性充满信心&#xff0c;并认为他们现有的网络安全措施已经足够。 不幸的是&#xff0c;这种信心往往是错误的。Wi-Fi 安全虽然经常…

Layui列表表头去掉复选框改为选择

效果&#xff1a; 代码&#xff1a; // 表头复选框去掉改为选择 $(".layui-table th[data-field"0"] .layui-table-cell").html("<span>选择</span>");

keil构建STM32工程并使用proteus仿真led点灯实验

STM32单片机与51单片机有很大区别&#xff0c;不仅结构上有很大差异&#xff0c;STM32更复杂一些&#xff0c;在操作上来说&#xff0c;STM32也要复杂很多&#xff0c;51单片机上手写代码&#xff0c;可以很直接操作引脚&#xff0c;但是STM32单片机在操作引脚之前需要作很多初…

数据结构——栈(C语言)

需求&#xff1a;无 栈的概念&#xff1a; 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端为栈底。栈中的数据元素遵守后进先出&#xff08;LIFO&#xff09;原则。压栈&…

分类预测 | MATLAB实现MTBO-CNN多输入分类预测

分类预测 | MATLAB实现MTBO-CNN多输入分类预测 目录 分类预测 | MATLAB实现MTBO-CNN多输入分类预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.MATLAB实现MTBO-CNN多输入分类预测 2.代码说明&#xff1a;基于登山队优化算法&#xff08;MTBO&#xff09;、卷积神经…

ABAP: SQL 多值查询

基础查数据 问题举例&#xff1a;例如查物料类型为ZFRT、ZROH和ZRSA的物料编码。 1、直接查询&#xff0c;三种不同类型的物料类型是或的关系。 SELECT DISTINCT ma~matnr ma~mtartFROM mara AS maINNER JOIN mbewh AS mbON ma~matnr mb~matnrINTO CORRESPONDING FIELDS OF…

EmbedPress Pro 在WordPress网站中嵌入任何内容

EmbedPress Pro可让您通过高级自定义、自定义品牌、延迟加载和更多惊人功能嵌入源。为古腾堡块和Elementor编辑器提供支持的一体化 WordPress 嵌入解决方案。使用 EmbedPress 在古腾堡创建交互式内容。使用 EmbedPress 的古腾堡块立即将任何内容嵌入到您的网站。 网址: EmbedP…

最强自动化测试框架Playwright(29)-文件选择对象

FileChooser对象通过page.on("filechoose")事件监听。 如下代码实现点击百度搜图按钮&#xff0c;上传文件进行搜索。 from playwright.sync_api import Playwright, sync_playwright, expectdef run(playwright: Playwright) -> None:browser playwright.chro…

linux 学习————LNMP之分布式部署

目录 一、概述 二、LNMP环境部署 三、配置nginx 四、 配置php使nginx能够解析.php 五、配置mysql 六、配置discuz进行登录论坛访问测试 一、概述 LNMP代表 Linux、Nginx、MySQL、PHP&#xff0c;是一种常用的服务器架构。它由以下组件组成&#xff1a; Linux&#xff1a;作…

docker的数据管理

目录 一.如何管理docker容器中的数据 二.数据卷 2.1数据卷原理 2.2数据卷作用 2.3数据卷案例 三.数据卷容器 3.1数据卷容器的作用 3.2端口映射 一.如何管理docker容器中的数据 管理Docker 容器中数据主要有两种方式:数据卷(Data Volumes)和数据卷容器( DataVolumes Contain…

查看 Linux 内核版本的几种方法

uname -a uname -srm uname -r 分拆&#xff1a;Linux 5.13.0-19-generic x86 64 5-内核版本 13-主修订版本 0-19 -次要修订版本 过查看 /proc/version 文件确认 /proc 目录包含虚拟文件&#xff0c;其中包含有关系统内存&#xff0c;CPU内核&#xff0c;已安装文件系统等的信…

详解零售行业供应链管理核心KPI指标(四)

现在零售行业的供应链管理越来越复杂了&#xff0c;复杂的原因是因为市场的变化、商业模式、销售模式的变化。 比如在以往传统的线上电商平台、线下渠道&#xff0c;现在线上电商还增加直播带货&#xff0c;线下渠道又增加了O2O模式。从一线城市的供应链还是做到供应链下沉到二…

开源数据库Mysql_DBA运维实战 (修改root密码)

MySQL——修改root密码的4种方法 本文以windows为例为大家详细介绍下MySQL修改root密码的4种方法&#xff0c;大家可以可以根据的自己的情况自由选择&#xff0c;希望对大家有所帮助 方法1&#xff1a; 用SET PASSWORD命令 首先登录MySQL。 格式&#xff1a;mysql> set pass…

Linux命令200例:ps用于查看当前系统中运行的进程信息(常用)

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌。CSDN专家博主&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &…

Linux安装Nginx

Linux安装Nginx 下载Nginx上传文件至服务器编译启动 下载Nginx 官网下载地址&#xff1a;https://nginx.org/en/download.html 或者关注wx公众号&#xff1a;一颗星宇宙&#xff0c;发送&#xff1a;Linux服务部署获取下载地址 上传文件至服务器 使用rz命令进行选择文件上传…

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

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

爬虫逆向实战(十五)--阿某某营登录

一、数据接口分析 主页地址&#xff1a;阿某某营 1、抓包 通过抓包可以发现登录接口是Users/Login 2、判断是否有加密参数 请求参数是否加密&#xff1f; 通过查看“载荷”模块可以发现有一个s加密参数 请求头是否加密&#xff1f; 无响应是否加密&#xff1f; 无cookie是…