Vitis HLS 学习笔记--理解串流Stream(1)

目录

1. 介绍

2. 示例

2.1 代码解析

2.2 串流数据类型

2.3 综合报告

3. 总结


1. 介绍

在Vitis HLS中,hls::stream是一个用于在C/C++中进行高级合成的关键数据结构。它类似于C++标准库中的std::stream,但是专门设计用于硬件描述语言(如Verilog或VHDL)中的数据流。hls::stream提供了一种方便的方法来处理数据流,使得在设计硬件加速器时更加灵活和可控。

hls::stream<> 类实现的串流具有如下属性:

  • hls::stream<> 的行为与无限深度的 FIFO 相似。
  • 按顺序对其执行读取和写入。即,从 hls::stream<> 读取数据之后,无法再次对其进行读取
  • 顶层接口上的 hls::stream<> 默认情况下使用 ap_fifo 接口来实现或者作为 AXIS 接口来实现。
  • 串流可定义为局部或全局,并且始终作为内部 FIFO 来实现。全局作用域内定义的串流遵循的规则与任何其它全局变量相同。

常见有两种串流声明方法:

  • hls::stream<Type>:指定串流的数据类型。设计内部的 hls::stream<> 作为 FIFO 来实现,默认深度为 2。STREAM 编译指示或指令可用于更改深度。
  • hls::stream<Type, Depth>:指定串流的数据类型和 FIFO 深度。设置深度以防止停滞。如果设计中的任意任务生产或使用样本的速度大于指定深度,那么 FIFO 可能因无法读取(或写入)而变为空(或满),从而导致停滞。

2. 示例

2.1 代码解析

#include "ap_axi_sdata.h"
#include "ap_int.h"
#include "hls_stream.h"

typedef ap_axiu<64, 0, 0, 0> trans_pkt;

struct data {
    ap_int<64> data_filed;
    ap_int<1>  last;
};


void example(hls::stream<trans_pkt> & inStreamTop,
		     hls::stream<data>      & outTop) {
#pragma HLS INTERFACE axis register_mode = both register port = inStreamTop

	trans_pkt in_val;

	in_val = inStreamTop.read();

	data out_val = {in_val.data, in_val.last};

	outTop.write(out_val);
}

该示例会生成如下IP:

请注意,虽然顶层函数参数 inStreamTop 和 outTop,同为 hls::stream 类型的数据,但是综合成的 IP 却有很大的差别:

  • 指令 #pragma HLS INTERFACE axis 会限定 inStreamTop 以 AXI Stream 接口来实现。
  • 默认的 hls::stream 会以 ap_fifo 接口来实现,outTop。

我么可以看下标准的 fifo 接口:

可以看到,outTop 与 FIFO_WRITE 具有一致的接口信号。

在此例中,我们有个数据打包的操作:

data out_val = {in_val.data, in_val.last};

目的是将 AXI Stream 中的 TLAST 也作为数据的一部分,给到 FIFO 接口中。所以我们 outTop 中的 outTop_din[64:0] 有65位。

2.2 串流数据类型

针对 hls::stream 以 AXI Stream 实现的情况,当串流数据类型 (T) 为简单的整数类型时,有 2 种预定义的 AXI4-Stream 实现类型可用:

  • AXI4-Stream 类的有符号实现
hls::axis<ap_int<WData>, WUser, WId, WDest>

 或者使用简写:

ap_axis<Wdata, WUser, WId, WDest>

  • AXI4-Stream 类的无符号实现
hls::axis<ap_uint<WData>, WUser, WId, WDest>

  或者使用简写:

ap_axiu<WData, WUser, WId, WDest>

2.3 综合报告

================================================================
== HW Interfaces
================================================================
* AXIS
+-------------+---------------+-------+-------+-------+--------+-------+--------+
| Interface   | Register Mode | TDATA | TKEEP | TLAST | TREADY | TSTRB | TVALID |
+-------------+---------------+-------+-------+-------+--------+-------+--------+
| inStreamTop | both          | 64    | 8     | 1     | 1      | 8     | 1      |
+-------------+---------------+-------+-------+-------+--------+-------+--------+

* AP_FIFO
+-----------+------------+
| Interface | Data Width |
+-----------+------------+
| outTop    | 65         |
+-----------+------------+

* TOP LEVEL CONTROL
+-----------+------------+-----------------------------------+
| Interface | Type       | Ports                             |
+-----------+------------+-----------------------------------+
| ap_clk    | clock      | ap_clk                            |
| ap_rst_n  | reset      | ap_rst_n                          |
| ap_ctrl   | ap_ctrl_hs | ap_done ap_idle ap_ready ap_start |
+-----------+------------+-----------------------------------+

其中 AXIS 和 AP_FIFO 的报告均符合预期。

================================================================
== SW I/O Information
================================================================
* Top Function Arguments
+-------------+-----------+---------------------------------------------+
| Argument    | Direction | Datatype                                    |
+-------------+-----------+---------------------------------------------+
| inStreamTop | in        | stream<hls::axis<ap_uint<64>, 0, 0, 0>, 0>& |
| outTop      | out       | stream<data, 0>&                            |
+-------------+-----------+---------------------------------------------+

软件IO依然提供了丰富的信息。

虽然示例代码中使用了简写“ ap_axiu<64, 0, 0, 0>”,报告仍然还原了全称。

3. 总结

在Vitis HLS中,hls::stream是一个关键的数据结构,用于处理数据流。它类似于C++标准库中的std::stream,但专门设计用于硬件描述语言。hls::stream具有类似无限深度的FIFO的行为,支持顺序读写操作,并可灵活定义数据类型和FIFO深度。通过示例代码和综合报告,我们了解到hls::stream在硬件设计中的重要作用,以及如何根据需求配置不同的接口实现。这使得在设计硬件加速器时更加灵活、可控。

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

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

相关文章

六级段落匹配

一个段落最多匹配2个句子 一个段落对应&#xff1a;0-2 适当放题 找到三个对应点就可以选 每看三个句子划关键词之后再自己回忆一遍关键词&#xff0c;看了36 37 38 就复述一遍关键词看了39 40 41就又从36开始复述关键词&#xff08;334&#xff09;看到最后一句话就又从头…

Linux实操之常用指令详解

文章目录 vi 和 vimvi 和 vim 基本使用 开机、重启和用户登录注销关机&重启命令用户登录和注销 用户管理基本介绍基本语法细节说明修改密码删除用户查询用户信息指令切换用户查看当前用户/登录用户用户组 实用指令指定运行级别帮助指令文件目录类时间和日期类搜索查找类压缩…

Python | Leetcode Python题解之第74题搜索二维矩阵

题目&#xff1a; 题解&#xff1a; class Solution:def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:row,col len(matrix),len(matrix[0])row_l,row_r 0,row-1while row_l < row_r:m (row_lrow_r)//2if target < matrix[m][0]:row_r m-1…

ICode国际青少年编程竞赛- Python-1级训练场-变量练习

ICode国际青少年编程竞赛- Python-1级训练场-变量练习 1、 a 8 for i in range(8):Dev.step(a)Dev.turnRight()a - 12、 a 3 for i in range(4):Dev.step(a)Dev.turnRight()a a 1 Dev.step(5)3、 a 4 for i in range(4):Dev.step(2)Dev.step(-5)Dev.step(3)Spaceship.…

JVM学习笔记【基础篇:垃圾回收】

自动垃圾回收 C/C的内存管理 ⚫ 在C/C这类没有自动垃圾回收机制的语言中&#xff0c;一个对象如果不再使用&#xff0c;需要手动释放&#xff0c;否则就会出现 内存泄漏。我们称这种释放对象的过程为垃圾回收&#xff0c;而需要程序员编写代码进行回收的方式为手动回收。 ⚫ …

ue引擎游戏开发笔记(34)——建立射击映射,并添加特效

1.需求分析&#xff1a; 准备处理射击系统&#xff0c;首先角色需要能射击&#xff0c;有反馈&#xff0c;先建立角色与控制器之间的映射&#xff0c;并添加简单特效&#xff0c;证明映射已经建立。 2.操作实现&#xff1a; 1.首先常规建立映射流程&#xff0c;具体可参考笔记…

线性表--数据结构设计与操作

单链表 1.单链表的定义&#xff1a; typedef struct LNode{Elemtype data;struct Lnode *next; }LNode ,*LinkList;//单链表的数据结构&#xff08;手写&#xff09; #include<iostream> #include<vector> #include<algorithm>typedef int TypeElem; //单链表…

如何解决3D模型变黑或贴图不显示的问题---模大狮模型网

在进行3D建模和视觉渲染时&#xff0c;经常会遇到模型表面变黑或贴图不显示的问题&#xff0c;这可能严重影响最终视觉效果的质量。这些问题通常与材质设置、光照配置或文件路径错误有关。本文将探讨几种常见原因及其解决方法&#xff0c;帮助3D艺术家和开发者更有效地处理这些…

☺☺☺☺☺☺☺栈的应用习题:有效的括号☺☺☺☺☺☺☺

目录 一解题思路&#xff1a; 二对解答代码分析&#xff1a; 三解答代码展示&#xff1a; 即浅学栈的创建后&#xff0c;可以简单利用其性质&#xff08;先进后出&#xff0c;后进先出&#xff09;来完成对一些题目的解答 如&#xff1a; 一解题思路&#xff1a; 这里我们可…

[法规规划|数据概念]金融行业数据资产和安全管理系列文件解析

“ 金融行业在自身数据治理和资产化建设方面一直走在前列。” 一直以来&#xff0c;金融行业由于其自身需要&#xff0c;都是国内开展信息化建设最早&#xff0c;信息化程度最高的行业。 同时&#xff0c;金融行业的数据治理、数据资产化以及过程中的管理要求和安全要求与其他…

Hive Partitioned Tables 分区表

Hive Partitioned Tables 分区表 1.分区表概念 Hive分区表&#xff08;Partitioned Tables&#xff09;是一种用于管理大量数据的机制&#xff0c;它可以将数据分散到不同的目录或分区中&#xff0c;以提高查询性能、优化数据存储和管理。 这种表结构可以根据某个列的值进行分…

【Ansible】ansible-playbook剧本

playbook 是ansible的脚本 playbook的组成 1&#xff09;Tasks&#xff1a;任务&#xff1b;通过tasks 调用ansible 的模板将多个操作组织在一个playbook中运行 2&#xff09;Variables&#xff1a;变量 3&#xff09;Templates&#xff1a;模板 4&#xff09;Handles&#xf…

基于C++从0到1手写Linux高性能网络编程框架(超清)

基于C从0到1手写Linux高性能网络编程框架(超清) TIME_WAIT状态存在原因有两点&#xff1a; 其一是可靠的中止tcp连接&#xff1b; 其二是保证让延迟的tcp报文有足够的时间被识别&#xff1b; 客户端在关闭连接阶段需要处理收到重复的结束报文&#xff0c;然后回复最后的ACK…

网络网络层之(4)IPv4协议

网络网络层之(1)IPv4协议 Author: Once Day Date: 2024年4月4日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文档可参考专栏&#xff1a;通信网络技术_Once-Day的…

IDEA远程连接docker服务,windows版docker desktop

1.windows上安装docker desktop docker desktop下载地址&#xff1a;Docker Desktop: The #1 Containerization Tool for Developers | Docker 有的windows系统不支持安装docker desktop 安装完之后我们可以直接打开&#xff0c;可以选择不登录使用 我们用IDEA连接到docker …

什么是 AI Agent ?

&#xff08;注&#xff1a;本文为小报童精选文章。已订阅小报童或加入知识星球「玉树芝兰」用户请勿重复付费&#xff09; 讲解的同时&#xff0c;也给你推荐一些实用的学习资源。 AI agent &#xff08;智能体 / 代理&#xff09;这个词儿最近非常流行&#xff0c;似乎「大语…

使用Three.js开发一个3D案例Demo

使用Three.js开发一个3D案例 最近在找工作&#xff0c;发现好多招聘要求都需要会Three.js&#xff0c;以前接触比较多的是2D开发&#xff0c;也就是平面开发&#xff0c;用到的做多的技术就是d3.js&#xff0c;现在3D开发已经成为了大势所趋&#xff0c;所以就学习下Three.js。…

sql优化思路

sql的优化经验 这里解释一下SQL语句的优化的原理 1.指明字段名称&#xff0c;可以尽量使用覆盖索引&#xff0c;避免回表查询&#xff0c;因此可以提高效率 2.字面意思&#xff0c;无需过多赘述。索引就是为了提高查询效率的。 3.图中两条sql直接可以使用union all 或者 uni…

上市公司财务困境模型​MertonDD、OScore、RLPM、ZScore四种模型​(1992-2022年)

01、数据介绍 上市公司财务困境模型是用于预测和评估上市公司是否可能陷入财务困境的一种模型。这个模型通常基于一系列的财务比率和其他相关变量&#xff0c;通过统计分析方法来构建。​ 数据名称&#xff1a;上市公司财务困境模型MertonDD、OScore、RLPM、ZScore五种模型 …

PHPStudy Apache或者MySQL启动以后自动停止

问题 phpstudy小皮面板中的Apache或MySQL启动以后自动停止 正在启动——已启动——已停止 总结&#xff1a;最主要的原因&#xff1a;端口冲突 端口冲突了&#xff0c;已经有其他程序占用了80、3306端口。 也就是说你的电脑上已经有了一个Apache、MySQL并且正在运行。 解决方案…
最新文章