20210801:AXI-Lite总线逻辑与关键源码分析
AXI-lite协议源码细读
AXI主从机交互模式
AXI和AXI-lite均包含五个不同的通道(允许同时读写、双向通信)。
- 读地址通道
- 写地址通道
- 读数据通道
- 写数据通道
- 写响应通道
读交易交互图
写交易交互图
源码实现细节
简单概括上面两个图。
读交易过程如上图,主端发送要读的地址,从端把这些地址的数据反馈给主端。
写交易过程见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总线协议有个更加深刻的理解。
参考文件(百度直接搜索即可下载)
- ug1037-vivado-axi-reference-guide
- IHI0022E_amba_axi_and_ace_protocol_spec
写在最后
不必再相信不该相信的人,努力前行就好。
20210801:AXI-Lite总线逻辑与关键源码分析相关推荐
- 【SLAM学习笔记】12-ORB_SLAM3关键源码分析⑩ Optimizer(七)地图融合优化
2021SC@SDUSC 目录 1.前言 2.代码分析 1.前言 这一部分代码量巨大,查阅了很多资料结合来看的代码,将分为以下部分进行分析 单帧优化 局部地图优化 全局优化 尺度与重力优化 sim3优 ...
- 【SLAM学习笔记】6-ORB_SLAM3关键源码分析④ Optimizer(一)单帧优化
2021SC@SDUSC 目录 1.前言 2.代码分析 1.前言 Optimizer是非常重要的代码文件!! 这一部分代码量巨大,查阅了很多资料结合来看的代码,将分为以下部分进行分析 1. 单帧优化 ...
- 【SLAM学习笔记】11-ORB_SLAM3关键源码分析⑨ Optimizer(六)地图回环优化
2021SC@SDUSC 目录 1.前言 2.代码分析 1.前言 这一部分代码量巨大,查阅了很多资料结合来看的代码,将分为以下部分进行分析 单帧优化 局部地图优化 全局优化 尺度与重力优化 sim3优 ...
- 20210803:AXI-Stream协议源码分析初探
AXI-Stream协议细读 简要说明 交互握手过程简述 源码分析 TestBench测试 写在最后 参考资料 简要说明 不同于AXI和AXI-lite协议,AXI-Stream协议不是基于地址的数据 ...
- 【golang源码分析】chan底层原理——附带读写用户队列的环形缓冲区
1 环形缓冲区 1.1 环形缓冲区结构 环形缓冲区通常有一个读指针和一个写指针.读指针指向环形缓冲区中可读的数据,写指针指向环形缓冲区中可写的缓冲区.通过移动读指针和写指针就可以实现缓冲区的数据读取和 ...
- 百万军中取上将首级如探囊取物, 千万行里改关键源码在弹指瞬间。 功能超强的程序编辑器!
TSEPro11_Setup.exe 百万军中取上将首级如探囊取物, 千万行里改关键源码在弹指瞬间. 功能超强的程序编辑器! 为防内容被恶意篡改,参考 MD5 (TSEPro11_Setup.exe) ...
- 【朝花夕拾】Android自定义View篇之(六)Android事件分发机制(中)从源码分析事件分发逻辑及经常遇到的一些“诡异”现象
前言 转载请注明,转自[https://www.cnblogs.com/andy-songwei/p/11039252.html]谢谢! 在上一篇文章[[朝花夕拾]Android自定义View篇之(五 ...
- Android Q 基站刷新接口源码分析 适配双卡手机基站刷新逻辑
目录 一.获取基站信息的两个关键方法 getAllCellInfo调用流程总结 requestCellInfoUpdate 流程总结 问题 二.双卡手机适配 Android Q requestCell ...
- ceph bluestore 源码分析:刷缓存(trim)逻辑
环境 ceph版本:12.2.1 部署模式:ec 2+1 osd: 3个 且资源池已经有数据 执行命令:ceph daemon osd.0 flush_store_cache 进行刷缓存.即将dump ...
最新文章
- html怎么给边框改样式,html里面怎么设置边框?html边框样式设置方法
- 网速慢?NO可能是路由器的原因?
- 关于LRU缓存简单记录以及代码补全。
- win10计算机从桌面消失了,Windows10家庭版程序窗口在桌面上消失了解决方法
- 日期控件的使用 c# 114867852
- cisco交换机命令大全(10)
- qzone.class.php,PHP QQ登录接口应用_PHP教程 - str_repeat
- linux下安装nginx和配置
- PHP学习之函数中的全局参数
- 20191207每日一句
- 大学生创新创业企划书
- linux vi面板如何复制一行
- android studio 显示view树_Android手势分发和嵌套滚动机制
- Clickhouse外部储存表引擎(HDFS、MySQL、JDBC、Kafka、File)
- 商务礼仪的6大准则(转)
- 鸿蒙源码图片,全网最全的鸿蒙源码结构分析(附自制4张架构图)
- Go 语言开发工具 LiteIDE X36 发布
- unity code-动作系统Animator
- Windows Embedded CE 6.0 and R2 下载地址
- pandas中的axis=0,axis=1,傻傻分不清楚
热门文章
- 高效编排有状态应用——TiDB 的云原生实践与思考
- 中国移动:部分 5G 手机可能有网连不上;iOS 13 出现严重漏洞;ReactOS 0.4.12发布 | 极客头条​...
- Python 爬取 B 站 5000 条视频,揭秘为何千万人为它流泪!
- 为什么说时代在召唤华为!
- Kotlin 和 Flutter 对于开发者究竟意味着什么?
- “独裁者”Google:开发者别无他选!| 极客头条
- Java 这一年:IntelliJ 称霸 IDE,Kotlin 成最大赢家!
- 乔帮主,iOS 9 关键源码被泄露了!
- 网络编程之bind()的未解之谜
- Http Body 的四种格式