精华内容
下载资源
问答
  • AXI总线

    2018-10-16 10:21:42
    axi总线是arm公司开发的一套soc总线标准,用于片上系统设计时各个模块之间的互联操作,被广大的ic设计厂商所使用。AXI是高级扩展接口,在AMBA3.0中提出,AMBA4.0将其修改升级为AXI4.0。AMBA4.0 包括AXI4.0、AXI4.0-...

    AXI 总线概述

    1.简介:
    axi总线是arm公司开发的一套soc总线标准,用于片上系统设计时各个模块之间的互联操作,被广大的ic设计厂商所使用。AXI是高级扩展接口,在AMBA3.0中提出,AMBA4.0将其修改升级为AXI4.0。AMBA4.0 包括AXI4.0、AXI4.0-lite、ACE4.0、AXI4.0-stream
    AXI4.0-lite是AXI的简化版本,ACE4.0 是AXI缓存一致性扩展接口,AXI4.0-stream是ARM公司和Xilinx公司一起提出,主要用在FPGA进行以数据为主导的大量数据的传输应用。

    1.1 关于AXI协议

    AMBA AXI协议支持支持高性能、高频率系统设计。

    适合高带宽低延时设计
    无需复杂的桥就能实现高频操作
    能满足大部分器件的接口要求
    适合高初始延时的存储控制器
    提供互联架构的灵活性与独立性
    向下兼容已有的AHB和APB接口
    关键特点:

    分离的地址/控制、数据相位
    使用字节线来支持非对齐的数据传输
    使用基于burst的传输,只需传输首地址
    分离的读、写数据通道,能提供低功耗DMA
    支持多种寻址方式
    支持乱序传输
    允许容易的添加寄存器级来进行时序收敛

    总线的两端可以分为master和slave,他们直接一般通过interconnect连接,如果是一对一的话,interconnect可以没有。
    是的V是在这里插入图片描述
    1.2 AXI架构

    AXI协议是基于burst的传输,并且定义了以下5个独立的传输通道:读地址通道、读数据通道、写地址通道、写数据通道、写响应通道。

    地址通道携带控制消息用于描述被传输的数据属性,数据传输使用写通道来实现“主”到“从”的传输,“从”使用写响应通道来完成一次写传输;读通道用来实现数据从“从”到“主”的传输。

    读架构

    写架构

    AXI是基于VALID/READY的握手机制数据传输协议,传输源端使用VALID表明地址/控制信号、数据是有效的,目的端使用READY表明自己能够接受信息。

    读/写地址通道:读、写传输每个都有自己的地址通道,对应的地址通道承载着对应传输的地址控制信息。

    读数据通道:读数据通道承载着读数据和读响应信号包括数据总线(8/16/32/64/128/256/512/1024bit)和指示读传输完成的读响应信号。

    写数据通道:写数据通道的数据信息被认为是缓冲(buffered)了的,“主”无需等待“从”对上次写传输的确认即可发起一次新的写传输。写通道包括数据总线(8/16…1024bit)和字节线(用于指示8bit 数据信号的有效性)。

    写响应通道:“从”使用写响应通道对写传输进行响应。所有的写传输需要写响应通道的完成信号。

    接口与互联

    AXI协议提供单一的接口定义,能用在下述三种接口之间:master/interconnect、slave/interconnect、master/slave。

    可以使用以下几种典型的系统拓扑架构:

    共享地址与数据总线
    共享地址总线,多数据总线
    multilayer多层,多地址总线,多数据总线
    在大多数系统中,地址通道的带宽要求没有数据通道高,因此可以使用共享地址总线,多数据总线结构来对系统性能和互联复杂度进行平衡。

    寄存器片(Register Slices):

    每个AXI通道使用单一方向传输信息,并且各个通道直接没有任何固定关系。因此可以可以在任何通道任何点插入寄存器片,当然这会导致额外的周期延迟。

    使用寄存器片可以实现周期延迟(cycles of latency)和最大操作频率的折中;使用寄存器片可以分割低速外设的长路径。
    2.信号描述

    表 2-1 全局信号

    在这里插入图片描述
    表 2-2 写地址通道信号

    在这里插入图片描述
    表 2-3 写数据通道信号
    在这里插入图片描述
    表 2-4 写响应通道信号
    在这里插入图片描述
    表 2-5 读地址通道信号
    这里写图片描述
    在这里插入图片描述
    表 2-6 读数据通道信号
    这里写图片描述

    表 2-7 低功耗接口信号
    在这里插入图片描述

    3.信号接口要求

    3.1时钟复位

    时钟

    每个AXI组件使用一个时钟信号ACLK,所有输入信号在ACLK上升沿采样,所有输出信号必须在ACLK上升沿后发生。

    复位

    AXI使用一个低电平有效的复位信号ARESETn,复位信号可以异步断言,但必须和时钟上升沿同步去断言。

    复位期间对接口有如下要求:①主机接口必须驱动ARVALID,AWVALID,WVALID为低电平;②从机接口必须驱动RVALID,BVALID为低电平;③所有其他信号可以被驱动到任意值。

    在复位后,主机可以在时钟上升沿驱动ARVALID,AWVALID,WVALID为高电平。

    3.2基本读写传输

    握手过程

    5个传输通道均使用VALID/READY信号对传输过程的地址、数据、控制信号进行握手。使用双向握手机制,传输仅仅发生在VALID、READY同时有效的时候。下图是几种握手机制:

    图 3-1 VALID before READY 握手
    这里写图片描述

    图 3-2 READY before VALID 握手
    这里写图片描述

    图 3-3 VALID with READY 握手
    这里写图片描述

    通道信号要求

    通道握手信号:每个通道有自己的xVALID/xREADY握手信号对。

    写地址通道:当主机驱动有效的地址和控制信号时,主机可以断言AWVALID,一旦断言,需要保持AWVALID的断言状态,直到时钟上升沿采样到从机的AWREADY。AWREADY默认值可高可低,推荐为高(如果为低,一次传输至少需要两个周期,一个用来断言AWVALID,一个用来断言AWREADY);当AWREADY为高时,从机必须能够接受提供给它的有效地址。

    写数据通道:在写突发传输过程中,主机只能在它提供有效的写数据时断言WVALID,一旦断言,需要保持断言状态,知道时钟上升沿采样到从机的WREADY。WREADY默认值可以为高,这要求从机总能够在单个周期内接受写数据。主机在驱动最后一次写突发传输是需要断言WLAST信号。

    写响应通道:从机只能它在驱动有效的写响应时断言BVALID,一旦断言需要保持,直到时钟上升沿采样到主机的BREADY信号。当主机总能在一个周期内接受写响应信号时,可以将BREADY的默认值设为高。

    读地址通道:当主机驱动有效的地址和控制信号时,主机可以断言ARVALID,一旦断言,需要保持ARVALID的断言状态,直到时钟上升沿采样到从机的ARREADY。ARREADY默认值可高可低,推荐为高(如果为低,一次传输至少需要两个周期,一个用来断言ARVALID,一个用来断言ARREADY);当ARREADY为高时,从机必须能够接受提供给它的有效地址。

    读数据通道:只有当从机驱动有效的读数据时从机才可以断言RVALID,一旦断言需要保持直到时钟上升沿采样到主机的BREADY。BREADY默认值可以为高,此时需要主机任何时候一旦开始读传输就能立马接受读数据。当最后一次突发读传输时,从机需要断言RLAST。

    通道间关系

    AXI协议要求通道间满足如下关系:

    写响应必须跟随最后一次burst的的写传输
    读数据必须跟随数据对应的地址
    通道握手信号需要确认一些依耐关系
    通道握手信号的依耐关系

    为防止死锁,通道握手信号需要遵循一定的依耐关系。①VALID信号不能依耐READY信号。②AXI接口可以等到检测到VALID才断言对应的READY,也可以检测到VALID之前就断言READY。下面有几个图表明依耐关系,单箭头指向的信号能在箭头起点信号之前或之后断言;双箭头指向的信号必须在箭头起点信号断言之后断言。

    图 3-4 读传输握手依耐关系
    这里写图片描述

    图 3-5 写传输握手依耐关系
    这里写图片描述

    图 3-6 从机写响应握手依耐关系
    这里写图片描述

    3.3传输结构

    地址结构

    AXI协议是基于burst的,主机只给出突发传输的第一个字节的地址,从机必须计算突发传输后续的地址。突发传输不能跨4KB边界(防止突发跨越两个从机的边界,也限制了从机所需支持的地址自增数)。

    1)突发长度

    ARLEN[7:0]决定读传输的突发长度,AWLEN[7:0]决定写传输的突发长度。AXI3只支持116次的突发传输(Burst_length=AxLEN[3:0]+1),AXI4扩展突发长度支持INCR突发类型为1256次传输,对于其他的传输类型依然保持1~16次突发传输(Burst_Length=AxLEN[7:0]+1)。

    burst传输具有如下规则:

    wraping burst ,burst长度必须是2,4,8,16
    burst不能跨4KB边界
    不支持提前终止burst传输
    所有的组件都不能提前终止一次突发传输。然而,主机可以通过解断言所有的写的strobes来使非所有的写字节来减少写传输的数量。读burst中,主机可以忽略后续的读数据来减少读个数。也就是说,不管怎样,都必须完成所有的burst传输。

    注:对于FIFO,忽略后续读数据可能导致数据丢失,必须保证突发传输长度和要求的数据传输大小匹配。

    突发大小

    ARSIZE[2:0],读突发传输;AWSIZE[2:0],写突发传输。

    AxSIZE[2:0] bytes in transfer

    ‘b000      1

    ‘b001      2

    ‘b010      4

    ‘b011      8

    ‘b100      16

    ‘b101      32

    ‘b110      64

    ‘b111      128

    突发类型

    FIXED:突发传输过程中地址固定,用于FIFO访问

    INCR:增量突发,传输过程中,地址递增。增加量取决AxSIZE的值。

    WRAP:回环突发,和增量突发类似,但会在特定高地址的边界处回到低地址处。回环突发的长度只能是2,4,8,16次传输,传输首地址和每次传输的大小对齐。最低的地址整个传输的数据大小对齐。回环边界等于(AxSIZE*AxLEN)。

    AxBURST[1:0]    burst type

    ‘b00          FIXED

    ‘b01          INCR

    ‘b10          WRAP

    ‘b11          Reserved

    Start_Address=AxADDR

    Number_Bytes=2^AxSIZE

    Burst_Length=AxLEN+1

    Aligned_Addr=(INT(Start_Address/Number_Bytes))xNumber_Bytes。//INT表示向下取整。

    对于INCR突发和WRAP突发但没有到达回环边界,地址由下述方程决定:

    Address_N=Aligned_Address+(N-1)xNumber_Bytes

    WRAP突发,突发边界:

    Wrap_Boundary=(INT(Start_Address/(Number_Bytes x Burst_Length)))x(Number_Bytes x Burst_Length)

    数据读写结构

    WSTRB[n:0]对应于对应的写字节,WSTRB[n]对应WDATA[8n+7:8n]。WVALID为低时,WSTRB可以为任意值,WVALID为高时,WSTRB为高的字节线必须指示有效的数据。

    窄传输

    当主机产生比它数据总线要窄的传输时,由地址和控制信号决定哪个字节被传输:

    INCR和WRAP,不同的字节线决定每次burst传输的数据,FIXED,每次传输使用相同的字节线。

    下图给出了5次突发传输,起始地址为0,每次传输为8bit,数据总线为32bit,突发类型为INCR。

    图 3-7 窄传输示例1
    这里写图片描述

    下图给出3次突发,起始地址为4,每次传输32bit,数据总线为64bit。

    图 3-8 窄传输示例2
    这里写图片描述

    非对齐传输

    AXI支持非对齐传输。在大于一个字节的传输中,第一个自己的传输可能是非对齐的。如32-bit数据包起始地址在0x1002,非32bit对齐。

    主机可以①使用低位地址线来表示非对齐的起始地址;②提供对齐的起始地址,使用字节线来表示非对齐的起始地址。

    图 3-9 对齐非对齐传输示例1-32bit总线
    这里写图片描述

    图 3-10 对齐非对齐传输示例2-64bit总线
    这里写图片描述

    图 3-11 对齐的回环传输示例
    这里写图片描述

    读写响应结构

    读传输的响应信息是附加在读数据通道上的,写传输的响应在写响应通道。

    RRESP[1:0],读传输

    BRESP[1:0],写传输

    OKAY(‘b00):正常访问成功

    EXOKAY(‘b01):Exclusive 访问成功

    SLVERR(‘b10):从机错误。表明访问已经成功到了从机,但从机希望返回一个错误的情况给主机。

    DECERR(‘b11):译码错误。一般由互联组件给出,表明没有对应的从机地址。

    新的改变

    我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:

    1. 全新的界面设计 ,将会带来全新的写作体验;
    2. 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
    3. 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
    4. 全新的 KaTeX数学公式 语法;
    5. 增加了支持甘特图的mermaid语法1 功能;
    6. 增加了 多屏幕编辑 Markdown文章功能;
    7. 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
    8. 增加了 检查列表 功能。

    功能快捷键

    撤销:Ctrl/Command + Z
    重做:Ctrl/Command + Y
    加粗:Ctrl/Command + B
    斜体:Ctrl/Command + I
    标题:Ctrl/Command + Shift + H
    无序列表:Ctrl/Command + Shift + U
    有序列表:Ctrl/Command + Shift + O
    检查列表:Ctrl/Command + Shift + C
    插入代码:Ctrl/Command + Shift + K
    插入链接:Ctrl/Command + Shift + L
    插入图片:Ctrl/Command + Shift + G

    合理的创建标题,有助于目录的生成

    直接输入1次#,并按下space后,将生成1级标题。
    输入2次#,并按下space后,将生成2级标题。
    以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。

    如何改变文本的样式

    强调文本 强调文本

    加粗文本 加粗文本

    标记文本

    删除文本

    引用文本

    H2O is是液体。

    210 运算结果是 1024.

    插入链接与图片

    链接: link.

    图片: Alt

    带尺寸的图片: Alt

    当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

    如何插入一段漂亮的代码片

    博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

    // An highlighted block
    var foo = 'bar';
    

    生成一个适合你的列表

    • 项目
      • 项目
        • 项目
    1. 项目1
    2. 项目2
    3. 项目3
    • 计划任务
    • 完成任务

    创建一个表格

    一个简单的表格是这么创建的:

    项目 Value
    电脑 $1600
    手机 $12
    导管 $1

    设定内容居中、居左、居右

    使用:---------:居中
    使用:----------居左
    使用----------:居右

    第一列 第二列 第三列
    第一列文本居中 第二列文本居右 第三列文本居左

    SmartyPants

    SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:

    TYPE ASCII HTML
    Single backticks 'Isn't this fun?' ‘Isn’t this fun?’
    Quotes "Isn't this fun?" “Isn’t this fun?”
    Dashes -- is en-dash, --- is em-dash – is en-dash, — is em-dash

    创建一个自定义列表

    Markdown
    Text-to-HTML conversion tool
    Authors
    John
    Luke

    如何创建一个注脚

    一个具有注脚的文本。2

    注释也是必不可少的

    Markdown将文本转换为 HTML

    KaTeX数学公式

    您可以使用渲染LaTeX数学表达式 KaTeX:

    Gamma公式展示 Γ(n)=(n1)!nN\Gamma(n) = (n-1)!\quad\forall n\in\mathbb N 是通过欧拉积分

    Γ(z)=0tz1etdt . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,.

    你可以找到更多关于的信息 LaTeX 数学表达式here.

    新的甘特图功能,丰富你的文章

    Mon 06Mon 13Mon 20已完成 进行中 计划一 计划二 现有任务Adding GANTT diagram functionality to mermaid
    • 关于 甘特图 语法,参考 这儿,

    UML 图表

    可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图::

    张三李四王五你好!李四, 最近怎么样?你最近怎么样,王五?我很好,谢谢!我很好,谢谢!李四想了很长时间,文字太长了不适合放在一行.打量着王五...很好... 王五, 你怎么样?张三李四王五

    这将产生一个流程图。:

    链接
    长方形
    圆角长方形
    菱形
    • 关于 Mermaid 语法,参考 这儿,

    FLowchart流程图

    我们依旧会支持flowchart的流程图:

    Created with Raphaël 2.2.0开始我的操作确认?结束yesno
    • 关于 Flowchart流程图 语法,参考 这儿.

    导出与导入

    导出

    如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

    导入

    如果你想加载一篇你写过的.md文件或者.html文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
    继续你的创作。


    1. mermaid语法说明 ↩︎

    2. 注脚的解释 ↩︎

    展开全文
  • AXI总线系列博客专属源码和验证工程,博客地址如下: https://blog.csdn.net/qq_33486907/article/details/88289714
  • xilinx zynq axi总线资料

    2018-11-26 09:20:19
    xilinx zynq axi总线资料,包括axi总线的官方手册,axi总线的使用说明
  • AXI总线说明

    2016-01-17 14:58:41
    AXI总线协议中各个分类说明的都比较详细,建议可以参考此文档来设计FPGA中的AXI总线
  • AXI总线——工作原理

    2021-01-07 13:10:00
    AXI总线 一.AXI总线通道 (1)读地址通道,包含ARVALID, ARADDR, ARREADY信号;主机->从机 (2)写地址通道,包含AWVALID,AWADDR, AWREADY信号;主机->从机 (3)读数据通道,包含RVALID, RDATA, RREADY, RRESP信号...
  • 实现了axi-lite总线的uart,并实现了axi总线的dma,详尽的仿真文件,pynq zynq可直接下板
  • AXI总线 详细整理

    千次阅读 多人点赞 2020-12-22 20:20:55
    AXI总线 详细整理AXI总线概述时钟与复位AXI的5个通道写入数据的流程读取数据的流程握手依赖关系突发传输机制读/写响应结构Outstanding、Out-of-Order、InterleavingAXI4、AXI4-Lite、AXI4-StreamAXI4仿真实例AXI4-...

    AXI总线概述

    AXI(Advanced eXtensible Interface)总线是AMBA总线架构中,最新并且性能最好的一个总线标准。AXI的设计目标是可以在高时钟频率下运行,并在延滞时间长的状况下仍可达成高数据吞吐率。AXI总线将读/写请求与读/写结果相互分离、将数据写入和数据读出的信号相分离,可以同时进行写入和读出动作,从而最大限度地提高总线的数据吞吐率。

    由若干master设备和slave设备通过一些形式的interconnect组成的典型的系统如下图所示,AXI总线即可作为其中的Interface,实现数据通信。
    在这里插入图片描述

    amba_axi_protocol_spec的下载地址:
    https://static.docs.arm.com/ihi0022/g/IHI0022G_amba_axi_protocol_spec.pdf?_ga=2.83582867.447931395.1591251023-1939436544.1591251023

    时钟与复位

    Clock
    每个AXI interface都有一个时钟信号ACLK,所有的输入信号在ACLK的上升沿采样,所有的输出信号在ACLK的上升沿之后发生变化。
    在master和slave interface上,输入与输出信号之间必须没有组合逻辑路径。

    Reset
    AXI协议使用低电平有效的复位信号ARESETn。复位信号可以被异步置位,但是复位的释放必须与ACLK的上升沿是同步的。
    During reset,需要遵循下面的interface requirement:
    (1)A master interface must drive ARVALID, AWVALID, and WVALID LOW.
    (2)A slave interface must drive RVALID and BVALID LOW.
    (3)All other signals can be driven to any value.

    在复位之后,master被允许驱动ARVALID, AWVALID, or WVALID 为高电平的最早的时刻是ARESETn为高电平之后的一个ACLK的上升沿,如下图所示。
    在这里插入图片描述

    AXI的5个通道

    AXI总线的master和slave的端口分为5个双向流量控制的通道,如下图所示。所谓双向流量控制是指发送端用valid表示数据是有效的,接收端用ready表示可以接受数据;只有在vaild和ready同时为1时,数据才成功被传送。vaild/ready机制可以使发送接收双方都有能力控制传输速率。

    AXI规定:
    (1)A source is not permitted to wait until READY is asserted before asserting VALID .
    (2)When VALID is asserted, it must remain asserted until the handshake occurs.
    在这里插入图片描述
    在这里插入图片描述

    写入数据的流程

    (1)master通过写地址通道发出写入请求;
    (2)master通过写数据通道发送写入的数据;
    (3)slave在完成写入动作后(写数据通道last),通过写响应通道发回确认信息。
    在这里插入图片描述

    读取数据的流程

    (1)master通过读地址通道发出读取请求;
    (2)slave通过读数据通道将读取的数据传给master。
    在这里插入图片描述

    握手依赖关系

    在下面的依赖关系图中:单箭头信号表示其指向的信号可以在箭头起始信号置起之前或之后置起;双箭头信号表示其指向的信号必须在箭头起始信号置起之后置起。

    (1)读传输事务依赖关系
    下图表示,RVALID必须等到ARVALIDARREADY握手后才可以置位。
    在这里插入图片描述

    (2)AXI3写传输事务依赖关系
    slave必须等待master的WLAST信号置位,才能将BVALID置位。
    在这里插入图片描述

    (3)AXI4和AXI5写传输事务依赖关系
    slave必须等待master的WLAST信号置位,才能将BVALID置位。
    在这里插入图片描述

    突发传输机制

    无论是读写操作,AXI 总线支持,或者说基于突发传输(Burst Transaction)。

    突发传输的流程:
    a.主机在读/写地址通道写入起始地址(AxADDR)以及突发传输的长度(AxLEN)、宽度(AxSIZE)、类型(AxBURST)等信息;
    b.从机将在起始地址开始,依次接收主机传输的写数据,或者读取连续地址上的数据,作为读数据传输给主机。

    注意:单次 burst 传输中的数据,其地址不能跨越 4KB 边界。
    (地址数值的1代表1个字节,如32bit数据线,AxSIZE没有限制,则每次burst地址增加4)

    (1)突发传输长度
    突发传输长度(burst length),指一次突发传输中包含的数据传输(transfer)数量,在协议中使用AxLEN信号控制(AWLENARLEN)。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    突发传输长度在不同的模式下有一些限制,包括:
    a.对于WRAP模式,突发传输长度仅能为2,4,8,16
    b.在一次突发传输中,地址不能跨越4KB地址边界
    c.一次突发传输不能在完成所有数据传输前提前结束
    (协议中多次强调,通信双方都不能在传输事务的所有 Transfer 完成前提前结束,哪怕发生错误,也要走完整个传输事务的流程。但是主机也有办法减少传输的数据。在写传输事务中,发送方可以通过置低所有的写有效位(WSTRB),使写数据无效。在读传输事务中,主机可以直接丢弃读取到的数据。)

    (2)突发传输宽度
    突发传输宽度(burst size),指传输中的数据位宽,具体地,是每周期传输数据的字节数量,在协议中使用AxSIZE信号控制(AWSIZEARSIZE)。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    突发传输数据宽度不能超过数据总线本身的位宽。而当数据总线位宽大于突发传输宽度时,将根据协议的相关规定,将数据在部分数据线上传输(A3.4.3章节Narrow transfers)。
    在这里插入图片描述
    在这里插入图片描述

    (3)突发传输类型
    突发传输类型(burst type),类型共有 3 种,分别为 FIXEDINCR 以及 WRAP。使用 2 位二进制表示,在协议中使用 AxBURST信号控制(AWBURSTARBURST)。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    FIXED 类型: burst 中所有数据都使用起始地址。该模式适合对某个固定地址进行多次数据更新,比如读写一个FIFO时,读写地址就是固定的。

    INCR 类型最为常用:后续数据的地址在初始地址的基础上进行递增,递增幅度与传输宽度相同。适合对于RAM、DDR等通过地址映射(mapped memory)的存储介质进行读写操作。

    WRAP 类型:比较特殊,首先根据起始地址得到绕回边界地址(wrap boundary)与最高地址。当前地址小于最高地址时,WRAP 与 INCR 类型完全相同,地址递增。但到递增后的地址到达最高地址后,地址直接回到绕回边界地址,再进行递增,就这样循环往复。最高地址由绕回边界地址计算得到:wrap boundary + (N_bytes x burst_len)。根据协议手册上表示,WRAP 适合对 cache 的访问。

    读/写响应结构

    AXI协议提供读/写事务的响应信号:对于读操作,响应信号在读地址通道RRESP[1:0];对于写操作,响应信号在写响应通道BRESP[1:0]
    在这里插入图片描述

    OKAY 常规访问成功
    EXOKAY 独占访问成功
    SLVERR 从机错误
    DECERR 解码错误

    注意:在写传输事务中,单个写回复针对的是整个 burst,而不是 burst 中单个 transfer。但是在读传输事务中,从机可以为突发传输中每一个读传输数据产生不同的读回复信号。

    Outstanding、Out-of-Order、Interleaving

    在这里插入图片描述

    Outstanding:master 不必等待命令执行结束就可以发送下一命令
    Out-of-Order:对于相同ID的指令,必须要顺序完成;对于不同ID的指令,可以乱序完成。
    Interleaving:乱序传输时不同ID之间的数据可以内插,但是要保证每个ID的数据顺序。

    注意:AXI4的WID信号被去掉了,因此AXI4的写数据通道不能实现Out-of-Order和Interleaving)
    在这里插入图片描述

    Outstanding是指正在进行中的,未完成的,形象表达就是说“在路上”。相比于正常情况下的主机和从机的读写操作,如果outstanding能力N>1,写操作:主机可以连续发出N组写地址和写数据,这期间如果没有写响应返回,则等待,如果有写响应返回,则返回了几个就可以接着发几组。也就是说在路上的写响应最多是N。对于读操作是同样的道理。

    当一个master向一个或多个slave发出数据块读/写请求时,AXI总线要求在同一个数据块内,每一个数据的读/写的完成必须按照顺序。但数据块之间,或读取与写入之间,AXI总线并不要求完成读/写的顺序与发出读/写请求的顺序保持一致,也就是允许读/写事务的乱序(Out-of-Order)。AXI总线的每个通道上的每一个读/写请求、数据结果,以及写入回应都包括一个4bit的读/写事务识别序号ID[3:0]。根据识别序号,主控模块可以辨别接收到的读取数据或是写入回应与发出的读/写请求之间的对应关系。不同ID的数据可以内插(Interleaving),通过ID号可以对数据进行识别。

    AXI4、AXI4-Lite、AXI4-Stream

    在这里插入图片描述

    AXI4仿真实例

    由于Vivado软件中包含很多AXI协议的IP核,因此在Vivado中进行仿真。

    在Vivado2019.1中,调用AXI BRAM Controller (4.1) IP核。
    设置Memory Depth 为262144。
    BRAM Instance 选择Internal。
    在这里插入图片描述

    tb_axi_bram.v

    `timescale 1ns / 1ps
    
    // Company:
    // Engineer:
    //
    // Create Date: 2020/12/22
    // Author Name: Sniper
    // Module Name: tb_axi_bram
    // Project Name:
    // Target Devices:
    // Tool Versions:
    // Description:
    //
    // Dependencies:
    //
    // Revision:
    // Revision 0.01 - File Created
    // Additional Comments:
    //
    
    
    module tb_axi_bram;
    
    // parameter
    parameter ADDR_WIDTH = 20;
    parameter DATA_WIDTH = 32;
    
    
    // global
    reg aclk;
    reg aresetn;
    
    // write address channel
    wire [0:0] m_axi_awid;
    wire [ADDR_WIDTH-1:0] m_axi_awaddr;
    wire [7:0] m_axi_awlen;    // Burst Length: 0-255
    wire [2:0] m_axi_awsize;   // Burst Size: Fixed 3'b011
    wire [1:0] m_axi_awburst;  // Burst Type: Fixed 2'b01(Incremental Burst)
    wire m_axi_awlock;         // Lock: Fixed 1'b0
    wire [3:0] m_axi_awcache;  // Cache: Fiex 4'b0011
    wire [2:0] m_axi_awprot;   // Protect: Fixed 3'b000
    wire [3:0] m_axi_awqos;    // QoS: Fixed 4'b0000
    wire [0:0] m_axi_awuser;   // User: Fixed 32'd0
    wire m_axi_awvalid;
    wire m_axi_awready;
    
    // write data channel
    wire [DATA_WIDTH-1:0] m_axi_wdata;
    wire [DATA_WIDTH/8-1:0] m_axi_wstrb;
    wire m_axi_wlast;
    wire [0:0] m_axi_wuser;
    wire m_axi_wvalid;
    wire m_axi_wready;
    
    // write response channel
    wire [0:0] m_axi_bid;
    wire [1:0] m_axi_bresp;
    wire [0:0] m_axi_buser;
    wire m_axi_bvalid;
    wire m_axi_bready;
    
    // read address channel
    wire [0:0] m_axi_arid;
    wire [ADDR_WIDTH-1:0] m_axi_araddr;
    wire [7:0] m_axi_arlen;
    wire [2:0] m_axi_arsize;
    wire [1:0] m_axi_arburst;
    wire m_axi_arlock;
    wire [3:0] m_axi_arcache;
    wire [2:0] m_axi_arprot;
    wire [3:0] m_axi_arqos;
    wire [0:0] m_axi_aruser;
    wire m_axi_arvalid;
    wire m_axi_arready;
    
    // read data channel 
    wire [0:0] m_axi_rid;
    wire [DATA_WIDTH-1:0] m_axi_rdata;
    wire [1:0] m_axi_rresp;
    wire m_axi_rlast;
    wire [0:0] m_axi_ruser;
    wire m_axi_rvalid;
    wire m_axi_rready;
    
    // User-interface
    reg master_rst;
    reg wr_start;
    reg [ADDR_WIDTH-1:0] wr_addrs;
    reg [7:0] wr_len;
    reg [DATA_WIDTH-1:0] wr_data;
    wire wr_handshake;
    wire wr_busy;
    wire wr_done;
    
    reg rd_start;
    reg [ADDR_WIDTH-1:0] rd_addrs;
    reg [7:0] rd_len;
    wire [DATA_WIDTH-1:0] rd_data;
    wire rd_handshake;
    wire rd_busy;
    wire rd_done;
    
    
    
    initial
    begin
        aresetn = 0;
        aclk = 0;
        master_rst = 0;
        wr_start = 0;
        wr_addrs[ADDR_WIDTH-1:0] = 0;
        wr_len[7:0] = 0;
        wr_data[DATA_WIDTH-1:0] = 0;
    
    	#100;
        @(posedge aclk);
        aresetn <= 1;
        
        
        @(posedge aclk);
        wr_addrs <= 0;
        wr_len[7:0] <= 15;
        @(posedge aclk);
        if(!wr_busy)
            wr_start <= 1;
        @(posedge aclk);
        wr_start <= 0;
        
        repeat(30) @(posedge aclk);
        wr_addrs <= 1024;
        wr_len[7:0] <= 255;
        @(posedge aclk);
        if(!wr_busy)
            wr_start <= 1;
        @(posedge aclk);
            wr_start <= 0;
    end
    
    
    initial
    begin
        rd_start = 0;
        rd_addrs[ADDR_WIDTH-1:0] = 0;
        rd_len[7:0] = 0;
    
        repeat(500) @(posedge aclk);
        @(posedge aclk);
        rd_addrs <= 1024;
        rd_len[7:0] <= 255;
        @(posedge aclk);
        if(!rd_busy)
            rd_start <= 1;
        @(posedge aclk);
            rd_start <= 0;
    
        repeat(300) @(posedge aclk);
        @(posedge aclk);
        rd_addrs <= 0;
        rd_len[7:0] <= 15;
        @(posedge aclk);
        if(!rd_busy)
            rd_start <= 1;
        @(posedge aclk);
            rd_start <= 0;
    end
    //clock
    always #5 aclk = ~aclk;
    
    always @(posedge aclk)
        if(wr_handshake)
            wr_data = wr_data + 1;
    
    
    // AXI WRITE  //
    
    localparam W_IDLE   = 3'd0;
    localparam WA_WAIT  = 3'd1;//write address
    localparam WA_START = 3'd2;
    localparam WD_WAIT  = 3'd3;//write data
    localparam WD_PROC  = 3'd4;
    localparam WR_WAIT  = 3'd5;//write response
    localparam WR_DONE  = 3'd6;
    
    reg [2:0] wr_state;
    reg [ADDR_WIDTH-1:0] reg_wr_addrs;
    reg [7:0] reg_wr_len;
    reg reg_awvalid;
    reg reg_wvalid;
    reg reg_w_last;
    
    // Write State
    always @(posedge aclk or negedge aresetn)
    begin
        if(!aresetn)
        begin
            wr_state <= W_IDLE;
            reg_wr_addrs <= 0;
            reg_wr_len <= 0;
            reg_awvalid <= 0;
            reg_wvalid <= 0;
            reg_w_last <= 0;
        end
        else
        begin
            if(master_rst)
            begin
                wr_state <= W_IDLE;
            end
            else
            begin
                case(wr_state)
                W_IDLE:
                begin
                    if(wr_start)
                    begin
                        wr_state <= WA_WAIT;
                        reg_wr_addrs <= wr_addrs;
                        reg_wr_len <= wr_len;
                    end
                    reg_awvalid <= 0;
                    reg_wvalid <= 0;
                    reg_w_last <= 0;
                end
                WA_WAIT:
                begin
                    wr_state <= WA_START;
                end
                WA_START:
                begin
                    wr_state <= WD_WAIT;
                    reg_awvalid <= 1;
                end
                WD_WAIT:
                begin
                    if(m_axi_awvalid & m_axi_awready)
                    begin
                        wr_state <= WD_PROC;
                        reg_awvalid <= 0;
                        reg_wvalid <= 1;
                    end
                end
                WD_PROC:
                begin
                    if(m_axi_wvalid & m_axi_wready)
                    begin
                        if(reg_wr_len == 0)
                        begin
                            wr_state <= WR_WAIT;
                            reg_wvalid <= 0;
                        end
                        else
                            reg_wr_len <= reg_wr_len - 1;
    
                        if(reg_wr_len == 1)
                            reg_w_last <= 1;
                        else
                            reg_w_last <= 0;
                    end
                end
                WR_WAIT:
                begin
                    if(m_axi_bvalid & m_axi_bready)
                    begin
                        //reg_wr_status[1:0] <= m_axi_bresp[1:0];
                        //if(reg_w_last)
                        //begin
                            wr_state <= WR_DONE;
                        //end
                        //else
                        //begin
                            //wr_state <= WA_WAIT;
                            //reg_wr_addrs <= reg_wr_addrs + 32'd2048;
                        //end
                    end
                end
                WR_DONE:
                begin
                    wr_state <= W_IDLE;
                end
    
                default:
                begin
                    wr_state <= W_IDLE;
                end
                endcase
            end//if(master_rst)
        end//if(!aresetn)
    end
    
    
    assign m_axi_awid         = 1'b0;
    assign m_axi_awaddr[ADDR_WIDTH-1:0] = reg_wr_addrs[ADDR_WIDTH-1:0];
    assign m_axi_awlen[7:0]   = reg_wr_len[7:0];
    assign m_axi_awsize[2:0]  = $clog2(DATA_WIDTH/8);//3'b010;
    assign m_axi_awburst[1:0] = 2'b01;
    assign m_axi_awlock       = 1'b0;
    assign m_axi_awcache[3:0] = 4'b0011;
    assign m_axi_awprot[2:0]  = 3'b000;
    assign m_axi_awqos[3:0]   = 4'b0000;
    assign m_axi_awuser[0]    = 1'b0;
    assign m_axi_awvalid      = reg_awvalid;
    assign m_axi_wdata[DATA_WIDTH-1:0]  = wr_data[DATA_WIDTH-1:0];
    assign m_axi_wstrb[DATA_WIDTH/8-1:0]   = {(DATA_WIDTH/8){1'b1}};
    assign m_axi_wlast        = reg_w_last;
    assign m_axi_wuser        = 0;
    assign m_axi_wvalid       = reg_wvalid;
    assign m_axi_bready       = m_axi_bvalid;
    assign wr_handshake       = m_axi_wvalid & m_axi_wready;
    assign wr_busy            = (wr_state == W_IDLE)? 1'b0 : 1'b1;
    assign wr_done            = (wr_state == WR_DONE);
    
    
    
    
    
    
    // AXI READ   //
    
    localparam R_IDLE   = 3'd0;
    localparam RA_WAIT  = 3'd1;
    localparam RA_START = 3'd2;
    localparam RD_WAIT  = 3'd3;
    localparam RD_PROC  = 3'd4;
    localparam RD_DONE  = 3'd5;
    
    reg [2:0] rd_state;
    reg [ADDR_WIDTH-1:0] reg_rd_addrs;
    reg [7:0] reg_rd_len;
    reg reg_arvalid;
    reg reg_r_last;
    
    // Read State
    always @(posedge aclk or negedge aresetn)
    begin
        if(!aresetn)
        begin
            rd_state <= R_IDLE;
            reg_rd_addrs <= 0;
            reg_rd_len <= 0;
            reg_arvalid <= 0;
        end
        else
        begin
            case(rd_state)
            R_IDLE:
            begin
                if(rd_start)
                begin
                    rd_state <= RA_WAIT;
                    reg_rd_addrs <= rd_addrs;
                    reg_rd_len <= rd_len;
                end
                reg_arvalid <= 0;
            end
            RA_WAIT:
            begin
                rd_state <= RA_START;
            end
            RA_START:
            begin
                rd_state <= RD_WAIT;
                reg_arvalid <= 1;
            end
            RD_WAIT:
            begin
                if(m_axi_arvalid & m_axi_arready)
                begin
                    rd_state <= RD_PROC;
                    reg_arvalid <= 0;
                end
            end
            RD_PROC:
            begin
                if(m_axi_rvalid & m_axi_rready)
                begin
                    if(m_axi_rlast & reg_r_last)
                        rd_state <= RD_DONE;
                    else
                        reg_rd_len <= reg_rd_len - 1;
    
                    if(reg_rd_len == 1)
                        reg_r_last <= 1;
                    else
                        reg_r_last <= 0;
                end
            end
            RD_DONE:
            begin
                rd_state <= R_IDLE;
            end
            endcase
        end//if(!aresetn)
    end
    
    // Master Read Address
    assign m_axi_arid         = 1'b0;
    assign m_axi_araddr[ADDR_WIDTH-1:0] = reg_rd_addrs;
    assign m_axi_arlen[7:0]   = reg_rd_len[7:0];
    assign m_axi_arsize[2:0]  = $clog2(DATA_WIDTH/8);//3'b010;
    assign m_axi_arburst[1:0] = 2'b01;
    assign m_axi_arlock       = 1'b0;
    assign m_axi_arcache[3:0] = 4'b0011;
    assign m_axi_arprot[2:0]  = 3'b000;
    assign m_axi_arqos[3:0]   = 4'b0000;
    assign m_axi_aruser[0]    = 1'b0;
    assign m_axi_arvalid      = reg_arvalid;
    assign m_axi_rready       = m_axi_rvalid;
    assign rd_handshake       = m_axi_rvalid & m_axi_rready;
    assign rd_busy            = (rd_state == R_IDLE)? 1'b0 : 1'b1;
    assign rd_done            = (rd_state == RD_DONE);
    
    
    
    
    
    
    //DUT
    axi_bram_ctrl_0 U_axi_bram_ctrl_0
    (
        //global signal
        .s_axi_aclk(aclk),
        .s_axi_aresetn(aresetn),
        
        //write address channel
        .s_axi_awaddr(m_axi_awaddr),//[19:0]
        .s_axi_awburst(m_axi_awburst),//[1:0]
        .s_axi_awcache(m_axi_awcache),//[3:0]
        .s_axi_awlen(m_axi_awlen),//[7:0]
        .s_axi_awlock(m_axi_awlock),
        .s_axi_awprot(m_axi_awprot),//[2:0]
        .s_axi_awready(m_axi_awready),
        .s_axi_awsize(m_axi_awsize),//[2:0]
        .s_axi_awvalid(m_axi_awvalid),
        
        //write data channel
        .s_axi_wdata(m_axi_wdata),//[31:0]
        .s_axi_wlast(m_axi_wlast),
        .s_axi_wready(m_axi_wready),
        .s_axi_wstrb(m_axi_wstrb),//[3:0]
        .s_axi_wvalid(m_axi_wvalid),
        
        //write response channel
        .s_axi_bready(m_axi_bready),
        .s_axi_bresp(m_axi_bresp),//[1:0]
        .s_axi_bvalid(m_axi_bvalid),
        
        //read address channel
        .s_axi_araddr(m_axi_araddr),//[19:0]
        .s_axi_arburst(m_axi_arburst),//[1:0]
        .s_axi_arcache(m_axi_arcache),//[3:0]
        .s_axi_arlen(m_axi_arlen),//[7:0]
        .s_axi_arlock(m_axi_arlock),
        .s_axi_arprot(m_axi_arprot),//[2:0]
        .s_axi_arready(m_axi_arready),
        .s_axi_arsize(m_axi_arsize),//[2:0]
        .s_axi_arvalid(m_axi_arvalid),
        
        //read data channel
        .s_axi_rdata(m_axi_rdata),//[31:0]
        .s_axi_rlast(m_axi_rlast),
        .s_axi_rready(m_axi_rready),
        .s_axi_rvalid(m_axi_rvalid)
    );
    
    /*
    initial
    begin
        $dumpfile("tb_axi_bram.vcd");
        $dumpvars(0,tb_axi_bram);
    end
    
    initial #1000 $finish;
    */
    
    endmodule
    

    仿真结果:
    (1)burst写入数据
    仿真波形与“写数据的流程”是一致的。
    在这里插入图片描述
    在这里插入图片描述

    (2)burst读取数据
    仿真波形与“读数据的流程”是一致的。
    在这里插入图片描述
    在这里插入图片描述

    AXI4-Lite仿真实例

    在这里插入图片描述

    在Vivado2019.1中,调用AXI Uartlite (2.0) IP核。配置如下。
    在这里插入图片描述

    写数据时序如下所示:(可以看出AWREADYWREADY是同时反馈的,表示地址和数据是同时写入;BVALID在下一个时钟返回)
    在这里插入图片描述

    AXI4-Stream仿真实例

    AXI4-Stream协议比较简单就不做实例仿真了,只要validready同时为1,就一直写入数据,直到valid & ready & last

    展开全文
  • AXI总线协议 学习

    2019-07-23 16:00:55
  • AMBA-AXI总线详解.docx

    2020-12-26 14:47:45
    AXI总线详解
  • AXI总线介绍

    2021-05-31 15:11:21
    AXI总线介绍 参考文档: UG761-AXI Reference Guide(v14.3) AXI入门 深入AXI总线(一) 深入AXI总线(二) AXI是什么? axi是一种总线协议,他是ARM AMBA(Advanced Microcontroller Bus Architecture)中最重要的...

    AXI总线介绍

    参考文档:

    AXI是什么?

    axi是一种总线协议,他是ARM AMBA(Advanced Microcontroller Bus Architecture)中最重要的一部分,是一种面向高性能、高带宽、低延迟的片内总线。它的地址/控制和数据相位是分离的,支持不对齐的数据传输,同时在突发传输中,只需要首地址,同时分离的读写数据通道、并支持Outstanding传输访问和乱序访问,并更加容易进行时序收敛。目前Xilinx的7系列FPGA中使用的均是AMBA4.0中的AXI协议。

    AMBA 4.0协议

    AXI4总线有三种类型:

    1. AXI4用于高性能内存映射(Memory-Mapped)型的通信上。
    2. AXI4-Lite用于简单低吞吐量的内存映射型通信上(比如简单的寄存器读写)。
    3. AXI4-Stream用于高速的数据流传输,无需地址管理。

    从以上介绍和实践开发来看,AXI4主要用于大块的数据读写,如DDR、BRAM的数据搬移;AXI4-Lite主要用于外设模块的配置,状态寄存器的读写等;而AXI4-Stream主要用于高速数据的传输,如高速AD数据、视频数据等的传输。

    AXI工作原理

    总体架构

    AXI协议是一个点对点的传输协议。总线两端发起读写事务的一端称为主设备(Master),响应事务的一端是从设备(Slave)。点对点传输意味着本条总线只能用于两个设备间通信,和SPI等接口不一样,不存在片选从设备这样的机制。那你肯定会问,那如果主设备想访问多个从设备该怎么办?或者某个从设备需要被多个主设备访问该怎么办?这就需要AXI总线中一个重要的设备:中央互联(Interconnect)。一般来说,系统中的电路结构如下图所示:

    preview

    传输通道

    AXI4 总线的一大特征是它有 5 个独立的传输通道,这些通道都只支持单向传输。单向传输的通道意味着两端的终端节点是有身份差距的,好比水只能从上游流到下流。在 AXI 总线传输中,通道两端分为 Master 主机与 Slave 从机,主机总是发起读写请求的一方。常见的主机有CPU、DMA,而存储介质控制器(比如 DDR 控制器)则是典型的从机。主机可能通过从机读取或者写入存储介质。而显然从机不可能主动向 CPU 写入数据。

    通道的读/写定义都是根据主机来定义的,这五种通道是:

    1. 读地址通道 (ARC) read address channel
    2. 读数据通道 (RC) read data channel
    3. 写地址通道 (AWC) write address channel
    4. 写数据通道(WC) write data channel
    5. 写回复通道 (RC) write response channel

    读写传输操作

    AXI4的一次读写传输操作中支持最多256个data transfers,而在AXI4-lite中每次读写传输操作只支持一个data transfer。

    read transaction:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w3lhdmmb-1622445062334)(/home/xsx/.config/Typora/typora-user-images/image-20210323170317141.png)]

    write transaction:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rQp9xxZT-1622445062336)(/home/xsx/.config/Typora/typora-user-images/image-20210323170440628.png)]

    由上图可以看出,AXI4的数据和地址通道是独立的,所以它支持全双工的数据传输。在硬件层面,AXI4允许每组master-slave使用不同的时钟。

    Valid/Ready握手机制

    在上面讲到AXI4总线一共有5种独立的传输通道,这些传输通道使用同一种VALID/READY握手机制来进行通信。

    在握手机制中,通信双方分别扮演发送方(Source)和接收方(Destination),两者的操作(技能)并不相同。

    发送方置高 VALID 信号表示发送方已经将数据,地址或者控制信息已经就绪,并保持于消息总线上。

    接收方置高 READY 信号表示接收方已经做好接收的准备。

    preview

    其中ACLK为时钟信号

    当双方的 VALID/READY 信号同时为高,在时钟 ACLK 上升沿,完成一次数据传输。所有数据传输完毕后,双方同时置低自己的信号。

    所谓的双向流控机制,指的是发送方通过置起 VALID 信号控制发送的时机与速度,接收方也可以通过 READY 信号的置起与否控制接收速度。

    发送方拥有传输的主动权,但接收方在不具备接收能力时,也能够置低信号停止传输,反压发送方。

    VALID信号先到达

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sr7AnNb0-1622445062339)(/home/xsx/.config/Typora/typora-user-images/image-20210329145044800.png)]

    我发送方的VALID先置高,表示我已经准备好发送数据了,并且我已经 将数据放在消息总线上了,这时可能接收方还没准备好,它在T2

    的时候才忙完,然后我置高READY信号,表示我现在可以接收数据了。这样以来,两者皆大欢喜,在时钟下一个的上升沿完成数据的传输,

    然后同时置低双方的信号。

    READY信号先到达

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T6YataSk-1622445062340)(/home/xsx/.config/Typora/typora-user-images/image-20210329145058649.png)]

    现在情况反过来了,接收方现在很闲,而发送方很忙。这时,接收方的READY置高,表明其已做好接收数据的准备,而发送方在T2时刻才

    忙完,将其VALID信号置高发送数据,在时钟下一个的上升沿完成数据的传输,然后同时置低双方的信号,一次传输完成。

    VALID和READY同时到达

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kEVgFqG3-1622445062341)(/home/xsx/.config/Typora/typora-user-images/image-20210329145108911.png)]

    这种情况最简单,两者同时置高,完成数据的传输。

    注意,Valid信号一旦置高,它只有等待完成至少一次传输才能置低。

    突发传输机制(Burst)

    在 AXI 总线中的突发传输是指,在地址总线上进行一次地址传输后,进行多次数据传输(transfer),第一次地址传输中的地址作为起始地址,根据突发传输类型的不同,后续数据的存储地址在起始地址的基础上递增(INCR 模式);或者首先递增,到达上限地址后回到起始地址,继续递增(WRAP 模式);又或者后续数据都将不断写入起始地址,刷新起始地址上的数据。(FIXED 模式)

    AXI4突发传输控制信息在地址通道上,随着第一次地址传输时写入,控制信息包括:

    img

    其中,ARLEN表示突发传输的长度,其实也就是支持多少个transfer。

    ARSIZE表示每个transfer中的最大数据宽度。突发传输数据宽度不能超过数据线本身的宽度。当数据线本身宽度大于突发传输宽度时,将根据协议的相关规定制定数据在部分数据线上传输。

    ARBURST表示传输的类型,包括INCR,WRAP,FIXED。

    FIXED 类型适合对某个固定地址进行数据更新,比如向一个 almost full 的 fifo 更新数据。

    INCR 类型最为常用,后续的数据的存储地址在初始地址的基础上,以突发传输宽度进行递增,适合对于 RAM 等 mapped memory 存储介质进行读写操作。

    WRAP 模式比较特殊,除了初始地址外,还有最高地址的界限。在最大地址以下,WRAP 与 INCR 类型完全相同,地址递增,但达到最高地址后,地址直接回到起始地址,再进行递增,就这样循环往复。数据手册上表示,WRAP 适合对 cache 的访问。

    举个例子:

    突发式写:

    img

    突发式读:

    img

    展开全文
  • AXI总线协议中文版

    2019-03-29 22:09:44
    Xilinx的AXI总线协议,给英文不好的同学准备的,介绍的很详细。
  • AXI总线详细解析

    2018-05-30 21:06:50
    详细介绍AXI总线的时序以及握手过程,每个环节都面面俱到。
  • AXI总线监控性能分析介绍及案例
  • AXI总线详解完结篇

    千次阅读 2020-11-29 00:09:35
    经过几个月的整理和发文,AXI总线详解系列正式迎来最终篇,内容基本涵盖了上一篇文章的全部内容。 所有文章的链接如下: 1、 AXI总线详解 2、AXI总线详解-总线和接口以及协议 3、AXI协议中的通道结构 4、AXI总线详解...
  • AXI是由ARM公司提供的一种总线协议,Xilinx从6系列的FPGA开始对AXI总线提供支持,现如今已经发展到AXI4这个版本。在Xilinx的ZYNQ系列中,AXI是经常用的一种接口。AXI有3个概念需要分清楚,总线、接口、协议。总线是...
  • AXI总线简介

    2019-09-06 22:23:02
    AXI总线简介 ...
  • zynq AXI总线

    千次阅读 2018-04-23 19:47:21
    zynq AXI是很重要的内容,本篇仅是简单的介绍。大量参考了其他书籍。AXI (Advanced eXtensible Interface) 本是由ARM公司提出的一...1.AXI总线ZYNQ有三种AXI总线:(1)AXI4:(For high-performance memory-mappe...
  • AXI 总线详解

    千次阅读 2020-09-04 10:48:08
    本文我们详解AXI,在ZYNQ中有支持三种AXI总线,拥有三种AXI接口,当然用的都是AXI协议。其中三种AXI总线分别为: AXI4:(For high-performance memory-mapped requirements.)主要面向高性能地址映射通信的需求,...
  • 一、AXI总线简介 AXI是AMBA中一个新的高性能协议。AXI技术丰富了现有的AMBA标准内容,满足超高性能和复杂的片上系统(Soc)设计的需求。AXI特点:单向通道体系结构。信息流只以单方向传输,简化时钟域间的桥接,...
  • AXI总线中文详解1.doc

    2021-05-07 09:07:25
    AXI总线中文详解1.doc
  • AXI总线协议文档汇总

    2016-12-08 21:26:24
    包括ARM AXI总线的多份协议,花了很长时间收集,打包上传,方便需要的朋友。求好评
  • AXI总线协议详解

    2013-12-08 20:56:33
    此文档对AXI总线协议进行了系统的详解,有急需的同学可以下载看看!
  • AXI总线学习汇总

    2021-03-26 11:30:05
    AXI总线学习汇总 0.绪论 AXI是高级扩展接口,在AMBA3.0中提出,AMBA4.0将其修改升级为AXI4.0。AMBA4.0 包括AXI4.0、AXI4.0-lite、ACE4.0、AXI4.0-stream AXI4.0-lite是AXI的简化版本,ACE4.0 是AXI缓存一致性...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,581
精华内容 1,432
关键字:

axi总线