AXI-lite协议源码细读

AXI主从机交互模式

AXI和AXI-lite均包含五个不同的通道(允许同时读写、双向通信)。

  1. 读地址通道
  2. 写地址通道
  3. 读数据通道
  4. 写数据通道
  5. 写响应通道

读交易交互图

写交易交互图

源码实现细节

简单概括上面两个图。

读交易过程如上图,主端发送要读的地址,从端把这些地址的数据反馈给主端。

写交易过程见1-2,主端发送要写的地址和数据,完成之后从端发送完成响应。

具体的实现细节,我们以源码进行分析仿真,结合官方提供的一系列文档进行说明。最终达到深入理解AXI-lite的交互过程。

 always @(posedge M_AXI_ACLK)                                             begin                                                                        //Only VALID signals must be deasserted during reset per AXI spec          //Consider inverting then registering active-low reset for higher fmax     if (M_AXI_ARESETN == 0 || init_txn_pulse == 1'b1)                                                   begin                                                                    axi_awvalid <= 1'b0;                                                   end                                                                      //Signal a new address/data command is available by user logic           else                                                                       begin                                                                    if (start_single_write)                                                begin                                                                axi_awvalid <= 1'b1;                                               end                                                                  //Address accepted by interconnect/slave (issue of M_AXI_AWREADY by slave)else if (M_AXI_AWREADY && axi_awvalid)                                 begin                                                                axi_awvalid <= 1'b0;                                               end                                                                  end                                                                      end  //--------------------//Write Data Channel//--------------------//The write data channel is for transfering the actual data.//The data generation is speific to the example design, and //so only the WVALID/WREADY handshake is shown herealways @(posedge M_AXI_ACLK)                                        begin                                                                         if (M_AXI_ARESETN == 0  || init_txn_pulse == 1'b1)                                                    begin                                                                     axi_wvalid <= 1'b0;                                                     end                                                                       //Signal a new address/data command is available by user logic              else if (start_single_write)                                                begin                                                                     axi_wvalid <= 1'b1;                                                     end                                                                       //Data accepted by interconnect/slave (issue of M_AXI_WREADY by slave)      else if (M_AXI_WREADY && axi_wvalid)                                        begin                                                                     axi_wvalid <= 1'b0;                                                      end                                                                       end

注意到主端口的源码中,start_single_write拉高时axi_awvalid和axi_wvalid同时拉高。即写地址和写数据通道有效的信号。

写完之后从端口会反馈响应信号M_AXI_WREADY和M_AXI_AWREADY表示地址写入和数据写入完成。而在从端口源码中也提到了类似的信号S_AXI_WREADY和S_AXI_AWREADY的产生逻辑如下:

 // Implement axi_awready generation// axi_awready is asserted for one S_AXI_ACLK clock cycle when both// S_AXI_AWVALID and S_AXI_WVALID are asserted. axi_awready is// de-asserted when reset is low.always @( posedge S_AXI_ACLK )beginif ( S_AXI_ARESETN == 1'b0 )beginaxi_awready <= 1'b0;aw_en <= 1'b1;end elsebegin    if (~axi_awready && S_AXI_AWVALID && S_AXI_WVALID && aw_en)begin// slave is ready to accept write address when // there is a valid write address and write data// on the write address and data bus. This design // expects no outstanding transactions. axi_awready <= 1'b1;aw_en <= 1'b0;endelse if (S_AXI_BREADY && axi_bvalid)beginaw_en <= 1'b1;axi_awready <= 1'b0;endelse           beginaxi_awready <= 1'b0;endend end // Implement axi_wready generation// axi_wready is asserted for one S_AXI_ACLK clock cycle when both// S_AXI_AWVALID and S_AXI_WVALID are asserted. axi_wready is // de-asserted when reset is low. always @( posedge S_AXI_ACLK )beginif ( S_AXI_ARESETN == 1'b0 )beginaxi_wready <= 1'b0;end elsebegin    if (~axi_wready && S_AXI_WVALID && S_AXI_AWVALID && aw_en )begin// slave is ready to accept write data when // there is a valid write address and write data// on the write address and data bus. This design // expects no outstanding transactions. axi_wready <= 1'b1;endelsebeginaxi_wready <= 1'b0;endend end

我们可以在tb中将主从端口全部都输入相同的源信号,然后给与主端口的信号发送开始脉冲,即可启动整个交互过程。

交互的关键tb代码如下:

initial beginsys_clk_i = 1;sys_rst_n = 0;m_axi_init_axi_txn = 0;#40 sys_rst_n = 1'b1;#20 m_axi_init_axi_txn = 1;#20 m_axi_init_axi_txn = 0;
end.m00_axi_init_axi_txn(m_axi_init_axi_txn),

注意到我们启动时会需要一个脉冲起始位,连接到主端口来进行启动。使用block_board直观显示如图。

可以很明显的看到主设备端口比从设备端口多出的几个接口设计。也能体现最开始图中出现的AXI读写逻辑。

到此我们再根据tb仿真图可以看到更加清晰的读写逻辑,如下图所示:

可以清晰的看到先写后读的数据交互过程,从而对AXI-Lite总线协议有个更加深刻的理解。

参考文件(百度直接搜索即可下载)

  1. ug1037-vivado-axi-reference-guide
  2. IHI0022E_amba_axi_and_ace_protocol_spec

写在最后

不必再相信不该相信的人,努力前行就好。

20210801:AXI-Lite总线逻辑与关键源码分析相关推荐

  1. 【SLAM学习笔记】12-ORB_SLAM3关键源码分析⑩ Optimizer(七)地图融合优化

    2021SC@SDUSC 目录 1.前言 2.代码分析 1.前言 这一部分代码量巨大,查阅了很多资料结合来看的代码,将分为以下部分进行分析 单帧优化 局部地图优化 全局优化 尺度与重力优化 sim3优 ...

  2. 【SLAM学习笔记】6-ORB_SLAM3关键源码分析④ Optimizer(一)单帧优化

    2021SC@SDUSC 目录 1.前言 2.代码分析 1.前言 Optimizer是非常重要的代码文件!! 这一部分代码量巨大,查阅了很多资料结合来看的代码,将分为以下部分进行分析 1. 单帧优化 ...

  3. 【SLAM学习笔记】11-ORB_SLAM3关键源码分析⑨ Optimizer(六)地图回环优化

    2021SC@SDUSC 目录 1.前言 2.代码分析 1.前言 这一部分代码量巨大,查阅了很多资料结合来看的代码,将分为以下部分进行分析 单帧优化 局部地图优化 全局优化 尺度与重力优化 sim3优 ...

  4. 20210803:AXI-Stream协议源码分析初探

    AXI-Stream协议细读 简要说明 交互握手过程简述 源码分析 TestBench测试 写在最后 参考资料 简要说明 不同于AXI和AXI-lite协议,AXI-Stream协议不是基于地址的数据 ...

  5. 【golang源码分析】chan底层原理——附带读写用户队列的环形缓冲区

    1 环形缓冲区 1.1 环形缓冲区结构 环形缓冲区通常有一个读指针和一个写指针.读指针指向环形缓冲区中可读的数据,写指针指向环形缓冲区中可写的缓冲区.通过移动读指针和写指针就可以实现缓冲区的数据读取和 ...

  6. 百万军中取上将首级如探囊取物, 千万行里改关键源码在弹指瞬间。 功能超强的程序编辑器!

    TSEPro11_Setup.exe 百万军中取上将首级如探囊取物, 千万行里改关键源码在弹指瞬间. 功能超强的程序编辑器! 为防内容被恶意篡改,参考 MD5 (TSEPro11_Setup.exe) ...

  7. 【朝花夕拾】Android自定义View篇之(六)Android事件分发机制(中)从源码分析事件分发逻辑及经常遇到的一些“诡异”现象

    前言 转载请注明,转自[https://www.cnblogs.com/andy-songwei/p/11039252.html]谢谢! 在上一篇文章[[朝花夕拾]Android自定义View篇之(五 ...

  8. Android Q 基站刷新接口源码分析 适配双卡手机基站刷新逻辑

    目录 一.获取基站信息的两个关键方法 getAllCellInfo调用流程总结 requestCellInfoUpdate 流程总结 问题 二.双卡手机适配 Android Q requestCell ...

  9. ceph bluestore 源码分析:刷缓存(trim)逻辑

    环境 ceph版本:12.2.1 部署模式:ec 2+1 osd: 3个 且资源池已经有数据 执行命令:ceph daemon osd.0 flush_store_cache 进行刷缓存.即将dump ...

最新文章

  1. html怎么给边框改样式,html里面怎么设置边框?html边框样式设置方法
  2. 网速慢?NO可能是路由器的原因?
  3. 关于LRU缓存简单记录以及代码补全。
  4. win10计算机从桌面消失了,Windows10家庭版程序窗口在桌面上消失了解决方法
  5. 日期控件的使用 c# 114867852
  6. cisco交换机命令大全(10)
  7. qzone.class.php,PHP QQ登录接口应用_PHP教程 - str_repeat
  8. linux下安装nginx和配置
  9. PHP学习之函数中的全局参数
  10. 20191207每日一句
  11. 大学生创新创业企划书
  12. linux vi面板如何复制一行
  13. android studio 显示view树_Android手势分发和嵌套滚动机制
  14. Clickhouse外部储存表引擎(HDFS、MySQL、JDBC、Kafka、File)
  15. 商务礼仪的6大准则(转)
  16. 鸿蒙源码图片,全网最全的鸿蒙源码结构分析(附自制4张架构图)
  17. Go 语言开发工具 LiteIDE X36 发布
  18. unity code-动作系统Animator
  19. Windows Embedded CE 6.0 and R2 下载地址
  20. pandas中的axis=0,axis=1,傻傻分不清楚

热门文章

  1. 高效编排有状态应用——TiDB 的云原生实践与思考
  2. 中国移动:部分 5G 手机可能有网连不上;iOS 13 出现严重漏洞;ReactOS 0.4.12发布 | 极客头条​...
  3. Python 爬取 B 站 5000 条视频,揭秘为何千万人为它流泪!
  4. 为什么说时代在召唤华为!
  5. Kotlin 和 Flutter 对于开发者究竟意味着什么?
  6. “独裁者”Google:开发者别无他选!| 极客头条
  7. Java 这一年:IntelliJ 称霸 IDE,Kotlin 成最大赢家!
  8. 乔帮主,iOS 9 关键源码被泄露了!
  9. 网络编程之bind()的未解之谜
  10. Http Body 的四种格式