FPGA AXI-Stream协议详解与仿真实践

AXI-Stream协议详解与仿真实践

1 摘要

AXI-Stream总线是一种高效、简单的数据传输协议,主要用于高吞吐量的数据流传输场景。相比于传统的AXI总线,AXI-Stream总线更加简单和轻量级,它通过无需地址的方式,将数据从一个模块传输到另一个模块,适用于需要高速数据传输的应用场景。是AXI协议中最简单的一种。本文主要介绍在FPGA中使用AXI-Stream协议进行数据流传输过程及FPGA仿真实践试验。

2 AXI-Stream适用场景

AXIS与AXI-FULL的主要区别:
•取消了Address Write/Address Read通道;
•取消了反馈响应信号Bresp和Rresp;
•半双工,仅能读或者写;
•不允许乱序;
•无最大突发传输长度;
•包含TID信号指示源,TDEST指示目的地;
•包括一个用于插入和溢出空字节的TKEEP信号;

适合使用AXIS协议设计高速数据传输处理的场合:
(1)视频摄像头数据流传输
(2)高速AD数据采集传输
(3)AXI-DMA数据传输

3 信号定义

3.1 接口信号及握手

信号信号描述
ACLK时钟源全局时钟,所有信号在时钟源上升沿采样
ARESTN复位源全局复位,低电平有效
TVALID表示主设备数据有效,当TVALID和TREADY同时有效时完成数据传输
TREADY表示从设备准备可以,主设备可以发送数据,当TVALID和TREADY同时有效完成数据收发
TDATA[(8n-1):0]AXI-Stream数据
TSTRB[(n-1):0]TSTRB[n-1:0]对应的bit位为1代表对应的字节有效,否则无效,但是会占用这个数据位。
TKEEP[(n-1):0]KEEP[n-1:0]对应的bit位为1代表对应的字节有效,否则为空,可以丢掉。
TLAST表示最后一个数据。
TID[(i-1):0]数据流的标识符,用来表明不同的数据流。
TDEST[(d-1):0]据流提供路由信息。
TUSER[(n-1):0]用于数据的同步,代表stream数据的开始。

使用 axi-stream协议,我们最关注的信号主要是:TVALID、TREADY、TLAST、TDATA。其中TDATA是数据物理总线。TVALID、TREADY表示了传输开始,TLAST标识了一次循环的最后一个数据,传输结束标志。

在这里插入图片描述
时序如下

在这里插入图片描述

3.2 Stream数据流

部分术语
(1)Transfer:基于TVALID和TREADY握手协议的传输,一次握手成功就是一次Transfer,代表一次最小粒度的数据传输发生;
(2)Packet:一组通过axi-stream传输的数据,所谓的Packet可能包含一个Transfer也有可能是多个Transfers。
(3)Frame:最大的Byte组合,包含整数个Packe。
(4) Data Stream:可以包含独立的字节传输,或者在Packet中组合在一起的一系列字节传输。

AXI-Stream数据流相关的信号。
• TDATA:为一次transfer传输的数据,一般强制要求为8的整数倍,以和其他信号相对应。
• TSTRB:其每一个bit和DATA的每一个字节相对应,用来表示DATA的数据是否有效。
• TSTRB:标识符,指示TDATA中的每个字节,是数据字节还是位置字节。
• TKEEP:标识符,指示TDATA中的每个字节,是否需要作为数据流的一部分被处理。
字节流
字节流是数据字节和空字节的传输,字节流传输可以传输任意数量的数据字节,这取决于数据宽度。
• Data byte:代表这个字节的数据是需要传输且有效的;
• Position byte:代表这个字节的数据是需要传输的,实际上是无效的,只不过需要用来占位置,大家就理解成补0那种操作即可;
• Null byte:完全没用,可以丢弃;
传输过程中需要通过TKEEP和TSTRB是要组合在一起使用,告知下游如何处理DATA数据,数据中各种其共有三种含义:
在这里插入图片描述
这里简单讨论占位字节的具体应用场景:
• 数据标识:比如在视频处理当中,可以使用Position Byte当做一帧的开头;
•错误检测:每过多少比特插入一个Position Byte用于检测错误。如果不符合规律说明丢数之类的问题;
• 数据分组:如一次传4个Byte的数据,但是有一组或者两组数据是无效的,这样就可以用Position Byte。让数据的Group是规律的,同时Slave也可以感知到某个数据是无效的。

4 仿真实践

4.1 AXI-STREAM MASTER

仿真设计Master主动发送固定32大小的数据,同时Slave接收数据形成回环测试,通过s_axis_tdata与m_axis_tdata数据进行对比,验证AXI-STREAM时序及数据发送接收是否正确。
AXI_stream_M00_AXIS 核心代码


`timescale 1 ns / 1 psmodule AXI_stream_v1_M00_AXIS #(// Users to add parameters here// User parameters ends// Do not modify the parameters beyond this line// Width of S_AXIS address bus. The slave accepts the read and write addresses of width C_M_AXIS_TDATA_WIDTH.parameter integer C_M_AXIS_TDATA_WIDTH	= 32,// Start count is the number of clock cycles the master will wait before initiating/issuing any transaction.parameter integer C_M_START_COUNT	= 32)(// Users to add ports here// User ports ends// Do not modify the ports beyond this line// Global portsinput wire  M_AXIS_ACLK,// input wire  M_AXIS_ARESETN,// Master Stream Ports. TVALID indicates that the master is driving a valid transfer, A transfer takes place when both TVALID and TREADY are asserted. output wire  M_AXIS_TVALID,// TDATA is the primary payload that is used to provide the data that is passing across the interface from the master.output wire [C_M_AXIS_TDATA_WIDTH-1 : 0] M_AXIS_TDATA,// TSTRB is the byte qualifier that indicates whether the content of the associated byte of TDATA is processed as a data byte or a position byte.output wire [(C_M_AXIS_TDATA_WIDTH/8)-1 : 0] M_AXIS_TSTRB,// TLAST indicates the boundary of a packet.output wire  M_AXIS_TLAST,// TREADY indicates that the slave can accept a transfer in the current cycle.input wire  M_AXIS_TREADY);// Total number of output data                                                 localparam NUMBER_OF_OUTPUT_WORDS = 32;                                               // function called clogb2 that returns an integer which has the                      // value of the ceiling of the log base 2.                                           function integer clogb2 (input integer bit_depth);                                   begin                                                                              for(clogb2=0; bit_depth>0; clogb2=clogb2+1)                                      bit_depth = bit_depth >> 1;                                                    end                                                                                endfunction                                                                          // WAIT_COUNT_BITS is the width of the wait counter.                                 localparam integer WAIT_COUNT_BITS = clogb2(C_M_START_COUNT-1)

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

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

相关文章

浙大 DeepSeek 线上课学习笔记

目录 DeepSeek:回望AI三大主义与加强通识教育 从达特茅斯启航的人工智能三大主义 人工智能三剑客之一:符号主义人工智能的逻辑推理 人工智能三剑客之二:连接主义人工智能的数据驱动 人工智能三剑客之三:行为主义人工智能的百…

【Python机器学习】1.2. 线性回归理论:一元线性回归、最小化平方误差和公式(SSE)、梯度下降法

喜欢的话别忘了点赞、收藏加关注哦(关注即可查看全文),对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 1.2.1. 什么是回归分析(Regressive Analysis)? 一些例子 举一些例子吧: 下图是…

golang介绍,特点,项目结构,基本变量类型与声明介绍(数组,切片,映射),控制流语句介绍(条件,循环,switch case)

目录 golang 介绍 面向并发 面向组合 特点 项目结构 图示 入口文件 main.go 基本变量类型与声明 介绍 声明变量 常量 字符串(string) 字符串格式化 空接口类型 数组 切片 创建对象 追加元素 复制切片 map(映射) 创建对象 使用 多重赋值 控制流语句…

《白帽子讲 Web 安全》之移动 Web 安全

目录 摘要 一、WebView 简介 二、WebView 对外暴露 WebView 对外暴露的接口风险 三、通用型 XSS - Universal XSS 介绍 四、WebView 跨域访问 五、与本地代码交互 js 5.1接口暴露风险: 5.2漏洞利用: 5.3JavaScript 与 Native 代码通信 六、Chr…

算法日常刷题笔记(3)

为保持刷题的习惯 计划一天刷3-5题 然后一周总计汇总一下 这是第三篇笔记 笔记时间为2月24日到3月2日 第一天 设计有序流 设计有序流https://leetcode.cn/problems/design-an-ordered-stream/ 有 n 个 (id, value) 对,其中 id 是 1 到 n 之间的一个整数&#xff…

mysql5.7离线安装及问题解决

这次主要是讲解mysql5.7离线安装教程和一主一从数据库配置 1、去官网下载自己对应的mysql https://downloads.mysql.com/archives/community/2、查看需要安装mysql服务器的linux的类型 uname -a第二步看一下系统有没有安装mysql rpm -qa|grep -i mysql3、上传安装包 用远程…

JAVA实战开源项目:安康旅游网站(Vue+SpringBoot) 附源码

本文项目编号 T 098 ,文末自助获取源码 \color{red}{T098,文末自助获取源码} T098,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

三数之和_算法

1.题目描述 首先我们分析下这道题目:假设给我们一个数组,让数组某三个不同下标的数相加最终得0,那么我就返回这三个数.但是如果返回的多个数组中的元素相同,那么我们还要删掉其中一个保留一个. 注意:这道题的重点是三个数的下标不能相等并且返回的数组中的元素也不能相等,通过…

关于Deepseek本地部署硬件环境检查教程

要在电脑上本地部署DeepSeek,需要关注以下硬件和软件配置: 硬件配置 CPU:至少4核CPU,推荐Intel i5/i7或AMD Ryzen 5/7系列处理器。内存:至少8GB DDR4内存,推荐16GB DDR4内存,对于大型模型建议…

一周一个Unity小游戏2D反弹球游戏 - 移动的弹板(鼠标版)

前言 本文将实现控制弹板移动,通过Unity的New Input System,可以支持鼠标移动弹板跟随移动,触控点击跟随移动,并且当弹板移动到边界时,弹板不会移动超过边界之外。 创建移动相关的InputAction 项目模版创建的时候默认会有一个InputAction类型的文件,名字为InputSystem_Ac…

250302-绿联NAS通过Docker配置SearXNG及适配Open-WebUI的yaml配置

A. 配置Docker中的代理 绿联NAS简单解决docker无法获取镜像-不用软路由 - 哔哩哔哩 B. 下载官网对应的镜像 群晖NAS用docker搭建SearXNG元搜索引擎_哔哩哔哩_bilibili C. 修改默认省略的参数,只配置Base_URL,删除其它默认的空缺项 searxng-docker/REA…

C++-第十九章:异常

目录 第一节:异常有哪些 第二节:异常相关关键字 2-1.抛出异常 2-2.捕获异常 2-3.异常的捕获规则 2-3-1.异常被最近的catch捕获 2-3-2.catch捕获的是异常的拷贝 2-3-3.异常为子类时,可以用父类引用接收 2-4.捕获任意异常 第三节&#xff1…

Redis详解(实战 + 面试)

目录 Redis 是单线程的!为什么 Redis-Key(操作redis的key命令) String 扩展字符串操作命令 数字增长命令 字符串范围range命令 设置过期时间命令 批量设置值 string设置对象,但最好使用hash来存储对象 组合命令getset,先get然后在set Hash hash命令: h…

‘ts-node‘ 不是内部或外部命令,也不是可运行的程序

新建一个test.ts文件 let message: string = Hello World; console.log(message);如果没有任何配置的前提下,会报错’ts-node’ 不是内部或外部命令,也不是可运行的程序。 此时需要安装一下ts-node。 npm install

(十 五)趣学设计模式 之 命令模式!

目录 一、 啥是命令模式?二、 为什么要用命令模式?三、 策略模式的实现方式四、 命令模式的优缺点五、 命令模式的应用场景六、 总结 🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支…

基于单片机的智能扫地机器人

1 电路设计 1.1 电源电路 本电源采用两块LM7805作为稳压电源,一块为控制电路和传感器电路供电,另一块单独为电机供电。分开供电这样做的好处,有利于减小干扰,提高系统稳定性。 LM7805是常用的三端稳压器件,顾名思义0…

【Redis学习】Redis Docker安装,自定义config文件(包括RDB\AOF setup)以及与Spring Boot项目集成

【本文内容】 第1章:通过Docker安装Redis,并自定义config文件以及mount data目录。第2章:介绍Redis持久化到磁盘,有4种方式:RDB / AOF / NONE / RDB AOF。第3章:使用Server自带的redis-cli工具连接。第4章…

【3天快速入门WPF】13-MVVM进阶

目录 1. 窗体设置2. 字体图标3. 控件模板4. 页面逻辑4.1. 不使用MVVM4.2. MVVM模式实现本篇我们开发一个基于MVVM的登录页面,用来回顾下之前学习的内容 登录页面如下: 窗体取消了默认的标题栏,调整为带阴影的圆角窗体,左侧放一张登录背景图,右边自绘了一个关闭按钮,文本框…

PHP实现登录和注册(附源码)

前言 本博客主要讲述利用php环境实现一个简单的前后端结合的用户登录和注册功能。phpstudy是PHP调试环境的集成包,该程序包集成了 ApachePHPMySQLphpMyAdmin 等多个工具,是很好用的调试环境的程序集成包。 目录 前言 1. 准备工作 1.1 工具 1.2 php…

Redis数据结构-List列表

1.List列表 列表类型适用于存储多个有序的字符串(这里的有序指的是强调数据排列顺序的重要,不是升序降序的意思),列表中的每个字符串称为元素(element),一个列表最多可以存储2^32-1个元素。在R…