jjzjj

AXI总线个人理解笔记-------------(一)接口信号解析

会飞的梦想家 2024-06-11 原文

        第一次写这么较为复杂的接口介绍,第一是希望将自己学的东西整理一下、加强记忆,第二是希望对入门的同学有所帮助,第三希望有这方面经验的大佬看到有不对的地方能够给予指正。    

        AXI总线是计算机内部的一种高速总线,主要用于主机(master)和从机(slave)低延迟、高速的数据传输,是由ARM公司设计的为了代替AHB、APB总线而存在的总线标准。AXI可以细分为AXI4、AXI_lite、AXI_stream。

        三种总线标准的特点应用为:

        AXI4(AXI_full):拥有5个数据通道(注意是通道,每个通道里面都有一系列的信号线),可以进行多次带有地址和数据的突发(burst)传输,满足高性能的存储器映射,常应用于DDR的数据读写。

        AXI_lite:也拥有5个数据通道,但是不能进行多次的突发传输,或者说只能进行一次突发传输,可以用于简单的低吞吐率的存储映射,例如内存的配置。

        AXI_stream:算是AXI4的简化版,传输高数数据流,没有地址线,能够无次数限制的突发传输,可以应用于FIFO、PCIE、AD/DA的数据传输。

注释:突发(burst)对于新手来说可能理解有点困难,我的理解就是传输一次数据就是一次突发,不管你的数据线或者地址线的线宽/位数是多少。后面会涉及到burst size和burst length会具体讲到。还有在AXI的传输中,数据都是以字节(8bit)的方式进行理解,就是说数据的位宽都是字节的倍数。

        本文主要针对AXI4总线进行讲解,因为它的标准里面接口线是最多的、最全的,通过AXI4的学习后去学习其他两个标准就会变得相对的简单。

接口信号解析

   这里我们联系实际先看看在vivado的ip当中AXI4的接口有哪些,直接上图:注意这里的截图是从机接口的截图。

        好家伙第一次看到的同学肯定头大有木有?反正我就是。不要方,我们先把这些信号分通道,前面我们提到了AXI4的接口分为5个通道,接下来我们详细讲。这5个通道在图中从上往下分解,分别为AW,W,B,AR,R,也是写地址通道、写数据通道、写响应通道、读地址通道、读数据通道。

        读到这儿可能有的同学就疑惑了,为什么有写响应通道没有读响应通道呢?

        其实是有的,只是在官方的设计中把读响应通道和读数据通道(W)合并了,也就是上图中的s_axi_rresp[1:0],为什么写操作不合并呢,简单说一下,对于主机来说,写是输出通道,而响应是需要从机产生响应,所以对主机来说是输入通道,一个输入一个输出显然不能合并,而读是输入通道,自然就可以合并了,同时减少了接线数量。

        至于为什么不放在读地址通道(AW)而是放在读数据通道(W),大家可以想一想(我的理解是一方面为了不破坏读地址通道的完整性,另一方面是读数据本身就少了一根字节选通信号(strb[*]))。

全局时钟和复位(AXI_aclk/AXI_aresetn)

        对了这里必须补充一下除开上面图中的5个通道的接口,还有两个接口AXI_aclkAXI_aresetn,很好理解:

        前者是AXI4的全局时钟,无论地址还是数据都要靠这个时钟来驱动,且都是在时钟的上升沿有效;

        后者是全局复位信号,低电平有效,在有效期间像valid和ready这类握手信号都必须保持低电平,即拉低为0。且在赛灵思的官方设计当中要求的复位的方式为:在时钟上升沿检测到复位信号有效时才进行复位,简单来说就是异步复位,同步释放的方式。

接下来我们详细介绍5个通道每个组成信号:

        注释:下面的所有input和output都是站在主机的角度,跟上图中的从机接口图是相反的。

(1)写地址通道/AW

awaddr[n:0]:output,写地址信号,在每次突发传输中只发送首地址即可。

awprot[2:0]:output,写安全信号,每一位都代表两种类型,标识着访问方式是否正常安全。

awvalid:output,写有效信号,由数据发送方输出给数据接收方,代表当前地址有效。

awready:input,写准备信号,数据接收方输出给数据发送方,代表接收方准备好接收地址了。

注释:在主机当中来说,当写的时候valid就是主到从是output,ready就是从到主是input;当读的时候主机就是接收方valid就是从到主input,ready就是主到从output。上面的截图是从机(slave)AXI接口,大家不要看错了,从机反过来就行了,只要记住valid是数据发送方产生,ready是接收方产生,后面就不做解释了。

(2)写数据通道/W

wdata[n:0]:output,写数据通道,位宽可以根据需求设置,但是都是8的倍数,也就是一个字节。

wstrb[((n+1)/8)-1:0]:output,字节选通信号,每一位代表wdata中的一个字节,当为1的时候,代表wdata对应字节有效,比如wstrb[N]=1,则代表wdata[(N+1)*8-1:N*8]这个字节有效。

wvalid:output,写有效信号,由数据发送方产生输出给数据接收方,代表当前数据有效。

wready:input,写准备信号,数据接收方产生输出给数据发送方,代表接收方准备好接收数据了。

(3)写响应信号/B

bresp[1:0]:input,写数据响应信号,由数据接收方产生,代表数据的接收是否正常,有4种状态。后面系列会补充。

bvalid:input,响应有效信号,由数据接收方产生输出给数据发送方,代表当前响应有效。

bready:output,响应准备信号,数据发送方产生输出给数据接收方,代表发送方准备好接收响应

(4)读地址通道/AR

araddr[n:0]:output,读地址信号,在每次突发传输中只发送首地址即可。

arprot[2:0]:output,读安全信号,每一位都代表两种类型,标识着访问方式是否正常安全。

arvalid:output,读有效信号,由数据发送方输出给数据接收方,代表当前地址有效。

arready:input,读准备信号,数据接收方输出给数据发送方,代表接收方准备好接收地址了。

(5)读数据通道/R

rdata[n:0]:input,读数据通道,位宽可以根据需求设置,但是都是8的倍数,也就是一个字节。

rresp[1:0]:input,读数据响应信号,由数据接收方产生,代表数据的接收是否正常。

rvalid:input,读有效信号,由数据发送方产生输出给数据接收方,代表当前数据有效。

rready:output,读准备信号,数据接收方产生输出给数据发送方,代表接收方准备好接收数据了。

-----------------------------------------------------分界线-------------------------------------------------------------------

        好了,贪多嚼不烂,今天这一文在这儿就结束了,比较枯燥大部分都是文字输出,没有办法,AXI理论的东西必须啃下来,大家共勉加油!

有关AXI总线个人理解笔记-------------(一)接口信号解析的更多相关文章

  1. Ruby 解析字符串 - 2

    我有一个字符串input="maybe(thisis|thatwas)some((nice|ugly)(day|night)|(strange(weather|time)))"Ruby中解析该字符串的最佳方法是什么?我的意思是脚本应该能够像这样构建句子:maybethisissomeuglynightmaybethatwassomenicenightmaybethiswassomestrangetime等等,你明白了......我应该一个字符一个字符地读取字符串并构建一个带有堆栈的状态机来存储括号值以供以后计算,还是有更好的方法?也许为此目的准备了一个开箱即用的库?

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby - 用逗号、双引号和编码解析 csv - 2

    我正在使用ruby​​1.9解析以下带有MacRoman字符的csv文件#encoding:ISO-8859-1#csv_parse.csvName,main-dialogue"Marceu","Giveittohimóhe,hiswife."我做了以下解析。require'csv'input_string=File.read("../csv_parse.rb").force_encoding("ISO-8859-1").encode("UTF-8")#=>"Name,main-dialogue\r\n\"Marceu\",\"Giveittohim\x97he,hiswife.\"\

  4. ruby-on-rails - 我更新了 ruby​​ gems,现在到处都收到解析树错误和弃用警告! - 2

    简而言之错误:NOTE:Gem::SourceIndex#add_specisdeprecated,useSpecification.add_spec.Itwillberemovedonorafter2011-11-01.Gem::SourceIndex#add_speccalledfrom/opt/local/lib/ruby/site_ruby/1.8/rubygems/source_index.rb:91./opt/local/lib/ruby/gems/1.8/gems/rails-2.3.8/lib/rails/gem_dependency.rb:275:in`==':und

  5. postman接口测试工具-基础使用教程 - 2

    1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,

  6. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  7. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

  8. TimeSformer:抛弃CNN的Transformer视频理解框架 - 2

    Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图

  9. ruby - 用 YAML.load 解析 json 安全吗? - 2

    我正在使用ruby2.1.0我有一个json文件。例如:test.json{"item":[{"apple":1},{"banana":2}]}用YAML.load加载这个文件安全吗?YAML.load(File.read('test.json'))我正在尝试加载一个json或yaml格式的文件。 最佳答案 YAML可以加载JSONYAML.load('{"something":"test","other":4}')=>{"something"=>"test","other"=>4}JSON将无法加载YAML。JSON.load("

  10. ruby - 易于初学者理解的 Ruby 库 - 2

    关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。关闭3年前。Improvethisquestion我正处于学习Ruby的阶段,我想查看一些小型库的源代码以了解它们是如何构建的。我不知道什么是小型图书馆,但希望SO能推荐一些易于理解的图书馆来学习。因此,如果有人知道一两个非常小的库,这是新手Rubyists学习的好例子,请推荐!我想使用Manveru'sInnatelib,因为它试图保持在2000LOC以下,但我还不熟悉其中经常使用的Ruby速记。也许大约100-5

随机推荐