axi时序图_深入 AXI4总线(E3)实战:制作一个 AXI 接口 IP

e6f324c23e03b1e88e7c8b72d04beb65.png
本系列我想深入探寻 AXI4 总线。不过事情总是这样,不能我说想深入就深入。当前我对 AXI总线的理解尚谈不上深入。但我希望通过一系列文章,让读者能和我一起深入探寻 AXI4。

在本系列先前的文章中,我们首先通过协议 specification 了解协议的接口与机制,并通过操作一个 AXI 接口的 RAM IP 进行了一番实战。

从协议机制上来说,协议的制定者权衡协议的使用场景,主从机接口,性能等各方面的需求与限制以及实现的难度制定了这些规则。从笔者个人的经验来说,对于一个协议:

把手册打印出来 -> 翻烂 -> 没人比我更懂这个协议了(误)

翻烂可不是了解一个协议最有效的手段,最重要的还是针对协议的实践。通过操作 AXI 接口的 IP 可以熟悉协议的接口。而通过实现一个协议的接口模块,可以更深入地了解协议。本文将借助 Xilinx 提供的 AXI 接口代码,实现一个 AXI-lite 接口模块,了解协议接口机制的实现。

Vivado 提供的接口代码

在 Vivado 中使用 IP 编辑器创建一个 AXI 接口的 IP,就可以获取到 Xilinx 在创建模板中提供的接口代码,这里简单地纪录下创建过程。

首先在 Tools 中选择 创建打包新 IP 菜单,选择建立一个 AXI4 外设。

d114e58bb745620ba98f9e0ea49b0055.png

在接口界面,添加 AXI 接口。这里的接口可选作为主机或者从机的 AXI-Full,AXI-Lite 或者 AXI-Stream 协议,本文选择 32 位 AXI-Lite 从机作为例子。位宽按照协议规定,可以在 32 位和 64 位之间进行选择。

bbce5ccc4eeabe6e506a3796b846ae8c.png

在创建完 IP 核后.....没错,就是什么都不会发生。如果要编辑 IP 核或者像本文要做的那样查看 IP 的 RTL 代码,那么在 IP catalog 选项中找到刚刚新建的 IP 核,一般在 User Repository 选项下可以找到。右键-在 IP Packager 中编辑。

084806f2cb559d512003cddfa2f8dab1.png

使用 IP Packager 编辑会打开一个新的基于 创建的 IP 核的 Vivado 工程,在这个工程中可以修改 IP 的信息,参数,接口以及 RTL 代码。在 source 中有一个 IP 核的顶层模块以及其下的 AXI-Lite 接口模块,这就是我们要学习的接口实现 demo 了。

4d34e9833ccf865263a3491242d30997.png

AXI-Lite 接口模块信号列表

Xilinx 提供的代码是非常好的学习材料,编码规范并提供了详细的注释。首先可以学习的是参数化的设计,在 IP 核代码中,很多的参数经常需要变化,比如在 GUI 界面中修改数据宽度等等,这就需要完善的参数化设计。

在声明端口之前可以使用#( )声明模块中的参数变量,这里起到两个作用,一是声明了参数a,b,二是赋予它们的默认值。注意一个以上参数的声明方式,不同参数之间用 "," 分隔,这和声明端口的语法是一致的。但每个参数之前的 parameter 是不可以共用的。

module my_module
#(
parameter a = 1,
parameter b = 2
)
(
端口声明
)

在实例化模块时,可以指定传入模块参数的值,如下方实例化 my_module ,模块命名为 m ,在 #( ) 中向模块的参数传入数值,模块中的参数 a,b 得到新的数值 10,20 。如果没有传值操作,那么模块中参数 a,b 使用默认值 1,2。(这里注意实例名 m 的位置)

//实例化 my_module
my_module 
#(
.a(10),
.b(20)
)
m//实例名
(
端口连接
)

在 AXI-Lite 模块中定义了两个参数,数据总线的宽度以及地址总线的宽度。在后续的端口宽度定义中使用了这些参数。关于地址总线宽度为什么这里会是 4 将在后文中具体讨论。

dc95a0a28249fc1499db277072fd76bb.png

AXI-Lite 相比完整的 AXI 协议,侧重于配置与状态信号传输,不支持突发传输,并在裁剪了用于内存访问的控制信号后,大幅减少了端口数量,便于集成。端口列表如下,在代码中对每个端口的作用也有注释说明。

bc543f0ba883e2f16443a55e9e055c1f.png
AXI-Lite 接口信号列表

CSR 寄存器

所以系统中集成 AXI-Lite 接口模块的作用一般是什么?

在一个 SoC 系统中,处理器需要配置大量的外设配置寄存器,并从外设的状态寄存器中读取外设的状态,进行初始化完成的判断等操作。AXI-Lite 总线就在 Configure & Status Report 阶段作为主机和外设之间的桥梁。

AXI 接口模块会将来自主机,一般是处理器的 AXI 数据锁存到寄存器中,将数值转为为逻辑电平信号输出给外设模块。将来自外设的电平信号也锁存到寄存器中,在主机发出读取请求时,将状态寄存器的数值以 AXI 读数据的形式发给主机。 AXI 接口模块在系统中起到配置寄存器的配置输入和状态寄存器的状态上报这两方面的作用。

reg [C_S_AXI_DATA_WIDTH-1:0]   slv_reg0;
reg [C_S_AXI_DATA_WIDTH-1:0]   slv_reg1;

自然而然,寄存器就是接口模块中的重要组成部分。在本模块中,设定有 4 个寄存器,每个寄存器位宽 32 位。寄存器的数量和位宽决定了地址总线的宽度。在计算机系统中,地址以字节为单位,4 个寄存器共有 16 个字节,所以地址总线的宽度为:

Waddr = log2(16) = 4 bit

总线操作中片选读写寄存器是以寄存器而不是字节为单位,所以在通过地址判断所要读写的寄存器时,只需要判断地址的高 2 bit,片选出 4 个寄存器。在选择了寄存器之后,也可以借助 WSTRB 字段控制对寄存器中的指定字节进行写操作,这部分会在后文解析协议实现时详细讨论。(WSTRB 信号只是指示从机屏蔽指定字节,实际上这部分数据也是传输的,协议规定传输必须以 32/64 位进行)

配置与状态寄存器可以分为只读,只写,可读可写三类。本文先讨论比较简单的只读,只写情况,即将整个32 bit 宽的寄存器从读/写功能上划分为两类,所有 bit 对于主机而言,全部为只读或者全部为只写。

如何实现只写/只读寄存器,假设寄存器 0 是一个只写寄存器,寄存器 1 是一个只读寄存器:

首先在接口模块上定义输入输出端口,进行寄存器和电平信号的转换。在输出端口上输出内部存储器的内容,或者将外部输入的逻辑电平赋予内部寄存器。

总线接口实现逻辑会在主线产生读写请求时,接口模块会将只写寄存器用总线数据更新或者将只读寄存器的数据更新到总线上,实现寄存器信息的更新。

output [31:0]  reg0_out;
input  [31:0]  reg1_in;
assign  reg0_out  = slv_reg0;
always @(posedge clk)slv_reg1  <= reg1_in;

接口时序实现

AXI-Lite 协议同完整的 AXI 协议一样有 5 个独立的通道,但由于不支持长度超过 1 的突发传输。Lite 协议中地址控制信息通道和数据通道严格满足一对一的关系。比如写地址通道写入地址以及控制信息后,写数据通道只在下一有效时钟沿进行一次数据传输。地址信号传输完成信号作为下一时刻写数据的使能信号。下图表示了地址和数据流向,代码也反映了这一时序关系。

ab6d102917146f6595737c1cdd540004.png
数据流向图

AXI-Lite 协议上并没有特别定义传输的信号时序,时序与 AXI-Full 协议 Burst 长度为 1 的情况相同。

我们首先关注地址通道的逻辑,读写地址通道的逻辑类似,这里以稍复杂些的写地址通道为例。

ef685c91734c107c02d6bdf54776fcbd.png

上述代码块通过控制 awready 信号完成了一次地址通道传输。逻辑检测 awvalid,wvalid信号的电平,当主机在写地址以及写数据通道上就绪时,从机置高 awready 信号,完成一次地址传输。与上 ~awready 是因为传输只需要在一次时钟上升沿 valid,ready 信号同时置高即可,在下一个周期,从机需要负责将 awready 信号置低,主机一般也会将 awvalid 信号置低,不过这和从机就不相干了。

在置高 awready 信号的条件中与上了 aw_en 变量,这是为了使从机有控制地址通道传输的能力。在整个写传输周期中,即地址-数据-写回复信号传输持续期间,如果主机又发起了一次新的写传输请求,置高 awvalid,wvalid信号,那么此时 aw_en 信号为低,从机将不会响应直至从机完成写回复,结束本次传输后,才回去响应下一次传输。

39e5641cf8cf7b0fe1f797f5fde8175c.png
AXI 写通道从机的守则

根据上述协议中守则,从机可以等待 AWVALID 或者 WVALID,也可以等两者都就绪后,再置起 AWREADY,那么本实现中等待的就是两者都置起。也就是说虽然数据在地址后一周期传输,但是在地址传输时,数据已经就绪。

在从机置起 awready 信号完成地址通道传输的同时,从机也会从写地址上锁存当前的写地址。锁存的写地址会用于其后一个周期时刻来判断待写入的寄存器。

cd19527b1e81e834e3a15cb0aa2ad840.png

有趣的是锁存地址的过程块可以合并到上述产生 awready 的过程块中去,两者的使能条件相同。但从 Verilog 的哲学来说,合则节省代码行数,分则使逻辑功能划分更清楚。反正代码已经很多行了,如果分开写能够更好体验逻辑功能,那就分开写吧。

接下来是写数据通道的时序产生,同写地址通道类似,从机的写数据通道中的 wready 信号也根据主机的 wvalid 信号产生。当 wvalid 为高,则置高 wready 一个周期。因为本实现中写地址通道和写数据通道是严格一对一的关系,所以 wready 的信号的产生和 awready 信号在同一个周期中进行,判断 wvalid 与 awvalid 同时为高 。如果实现的是支持突发传输的 AXI-Full 协议,那么写数据将和写地址就失去了这种一一对应的关系。(一次地址传输对应多次数据传输)

b5a11644d6f9a63fe7b92cabe293cec6.png

本实现中最为重量级的一个部分是写数据的接收。首先判断读取写数据的使能条件。如前文所说:写地址传输的后一个时刻为写数据传输,写地址的完成的信号即作为写数据的使能信号。

662fdcbc6e52f278f2b6904d9d2a9fb0.png

当写使能有效后,逻辑首先根据写地址判断主机所要操作的寄存器。这里对写地址进行切片:

axi_awaddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB]

5f9acab5c7aa0930bce15ba91e31f565.png

ADDR_LSB 与寄存器地址宽度相关:32 位时为 2 ,64 位时为 3 。选择寄存器时不需要考虑地址的 [ADDR_LSB-1 : 0] 部分。

寄存器宽度为 32 位时,每个寄存器 4 个字节,选择寄存器时,不需要判断地址低两位,因为这是单个寄存器内部的字节地址。

OPT_MEM_ADDR_BITS 与寄存器的数量有关,2^(OPT_MEM_ADDR_BITS+1) = 寄存器数量。So:

地址线的位宽 = ADDR_LSB+OPT_MEM_ADDR_BITS + 1

以 4 个 32 位寄存器为例,地址线的宽度 = log2(4*4) = 4 ,即 2 + 1 + 1、

#注:在根据地址选择寄存器时,当然也可以对整个地址宽度进行判断,但这样会造成资源的浪费。

在完成寄存器的选择后,将总线上已经就绪的写数据写入寄存器。如果不使用 STRB 信号对某些字节进行屏蔽,那么这样就完事了: slv_reg0 <= S_AXI_WDATA;

eebdefbd446baa579a208b94ed6ee8fd.png

STRB 信号的作用是屏蔽一些字节的写入,比如某个寄存器只有 8 bit,或者 16 bit,但寄存器的写入必须以 32 bit 为单位。完整写入 32 bit 势必会影响临近的其他寄存器,此时可以使用 STRB 信号,指定要写入的字节位置为 1,屏蔽字节位置写 0 。

代码中使用 for 循环,以字节为单位,判断 STRB 信号为 1,则进行写入,否则保持原寄存器值不变。

完成一次写操作的最后一步,是由从机在写回复通道上对此次传输进行评价...啊不 响应。

4569e40904a20d1bc87a0359fa2f95cd.png

在完成传输,即写数据/地址通道完成握手后的下一周期,从机置起 bvalid 信号,并在 bresp 信号上给出 'OK' 信号。在响应通道完成握手后,置低 bvalid 完成响应操作。

这里我们的从机要么不给,要就回复 'OK',那么就不会有错误的情况发生么?

我的理解是在这个模块中,和主机在芯片内部通信,就隔几个寄存器,几个 um 的距离,一般不会出现传输错误的情况。再者说,出现了错误,我们从机也不知道啊。(无辜.jpg)

笔者个人唯二遇到 AXI 回复错误的情况分别发生在 interconnect 和 DataMover IP 上。一是在 DataMover 上向 IP 写了错误的 CMD,IP 回复 Internal error;二是 interconnect 和从机的连接有问题,interconnect 无法转发请求,回复 decode error;这些错误回复在开发阶段对 Debug 是很有帮助的,但生产环境中,主机一般不会对这些错误回复进行处理。

主机可能是这样一种佛系思想:

小错误不影响功能,错了也就错了,不管
Fatal 错误,啊,我 dump 了,所以也不管

好了,后续的文章可能会对 response 做进一步分析。

读通道逻辑和写通道类似,本文就不再做进一步展开,读者可以自行阅读代码。这里有一个建议,即使笔者在完成了这篇文章的写作后,再通过仿真也解决了一些疑惑。所以这里建议读者还是要亲自仿真一下,获得第一手感性认识。

在设计中集成接口模块

在开发完成了一个寄存器总线接口模块后(假装都是我们自己写的),我们有两种方式将其集成到顶层设计中。

  1. 以 IP 的形式,打开我们先前提到的 IP Packager,在 IP 的工程中集成用户其余的模块。完成集成仿真验证后就完成了整个功能 IP 的开发。这种方式适合将成熟的代码与接口进行集成。这种方式,修改代码后需要更新 IP,会有些繁琐。
  2. 另一种适合在开发的过程中集成接口的方式是复制 IP 生成的接口模块代码到自己的工程中,例化为一个模块使用。这样比较适合开发中的,经常需要修改的顶层设计。

结语

本文我们通过学习 Xilinx 在 IP 接口中提供的 AXI-Lite 接口实现的模板,有 AXI 的实现有了更深入的了解,其实从 AXI-Lite 的角度来说,很简单哈,这一部分也是 AXI 协议的基础部分。在后续的文章中,我们将对 AXI 协议的实现做更深入的了解。

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

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

相关文章

动点四边形周长最短_初中几何--线段之和最小值 Part 1:通过点关于直线对称点得到两定点之间直线段长度最短。...

下面介绍下求线段和最小值常见题型1&#xff0c;通过点关于直线对称点得到两定点之间直线段长度最短。以下题为例&#xff0c;已知矩形ABCD&#xff0c;AB8&#xff0c; AD6.E&#xff0c;F分别为AB&#xff0c;AD的中点。G&#xff0c;H分别为BC&#xff0c;AB上动点。求四边形…

番茄钟怎么调_学习神器-番茄钟

番茄钟番茄工作法是简单易行的时间管理方法。使用番茄工作法&#xff0c;选择一个待完成的任务&#xff0c;将番茄时间设为25分钟&#xff0c;专注工作&#xff0c;中途不允许做任何与该任务无关的事。直到番茄时钟响起&#xff0c;然后进行短暂休息一下&#xff08;5分钟就行&…

获取某一条_想获取流量?这几种工具是必须要有的,能帮你获客快人一步!

2020年&#xff0c;最难的莫过于实体店了&#xff0c;而没有受到影响的&#xff0c;也就是那些互联网企业&#xff0c;一切企业甚至业绩比以前还好&#xff0c;不得不承认&#xff0c;互联网确实有它的独特之处。也因此&#xff0c;很多实体商家也在慢慢向互联网转变。为什么要…

排除jar_Gradle排除依赖关系

Gradle排除依赖关系在IDE中发现了C3P0的依赖&#xff0c;但是在build.gradle并没有手动导入&#xff0c;所以说某个jar包依赖了&#xff0c;在STS中没有像Maven可以直接查看依赖的窗口可以在命令行下查看整个项目的依赖关系gradle dependencies![[外链图片转存失败(img-v7CgoEk…

格式怎么转换_爱奇艺下载的视频怎么转换成常见的mp4格式?

虽说现如今在线观看视频已经很流畅了&#xff0c;只要网速在线&#xff0c;基本上不会出现画面卡顿的情况&#xff0c;但是仍然有不少小伙伴会将视频从各大平台中下载下来收看&#xff0c;这样&#xff0c;即便是没有联网&#xff0c;也不会影响视频播出。不知道大家在从爱奇艺…

分屏 取消_记录Android7.0以上手机开启分屏后活动的生命周期变化

真正的大师&#xff0c;总是怀着一颗学徒的心。大家好&#xff0c;我是小黑&#xff0c;一个还没秃头的程序员~~~如今&#xff0c;很多Android手机已经支持多屏任务了&#xff0c;也就是说你可以边追剧边回好友消息了&#xff0c;所以&#xff0c;今天的内容是记录Android7.0出…

ios 主题切换 思路_iOS 使用 NSObject 的分类实现快速切换主题

PYThemeAn easy way to change theme through NSObjects category for iOS.通过 NSObject 的分类实现使用简单的主题更换。Features轻量级低耦合自动管理内存支持动态更换主题颜色支持动态更换主题图片支持 CocoaPodsRequirementsiOS 7.0 or laterXcode 7.0 or laterArchitectu…

mysql 嵌套函数_MySQL 聚合函数嵌套使用

MySQL 中聚合函数不可用直接嵌套使用&#xff0c;比如&#xff1a; MAX(AVG(sal))、MAX(COUNT(*))...解决思路&#xff1a;可以使用嵌套子查询&#xff0c;先分组取出被嵌套的聚合函数结果&#xff0c;再使用外聚合函数嵌套。(应该有更合适方式&#xff0c;待补充)示例&#xf…

mysql权限分立_MySQL设置3权分立

网站后台中权限模块非常普遍&#xff0c;所以掌握3权分立十分必要3权分立表有 用户表&#xff0c;角色表&#xff0c;权限表&#xff0c;对应关系如下用户有着“读者”&#xff0c;“作者”和“管理员”角色&#xff0c;角色有不同权限&#xff0c;如发布文章&#xff0c;审核…

python跑一亿次循环_python爬虫爬取微博评论

原标题&#xff1a;python爬虫爬取微博评论python爬虫是程序员们一定会掌握的知识&#xff0c;练习python爬虫时&#xff0c;很多人会选择爬取微博练手。python爬虫微博根据微博存在于不同媒介上&#xff0c;所爬取的难度有差异&#xff0c;无论是python新入手的小白&#xff0…

Nature:原来记忆是这样形成的!科学家发现记忆形成新机制

来源&#xff1a;神经科技概要&#xff1a;神经元之间通过突触传递信息&#xff0c;大约50年前科学家们发现了突触的可塑性&#xff0c;科学界也一直认为突触是记忆和学习过程中的一个重要的功能组成部分。来自法国的研究人员最近发现了突触储存信息和控制信息储存过程的一个新…

腾讯 AI Lab副主任俞栋:过去两年基于深度学习的声学模型进展

来源&#xff1a;腾讯AI Lab概要&#xff1a;过去几年里&#xff0c;自动语音识别&#xff08;ASR&#xff09;已经取得了重大的进步 。这些进步让 ASR 系统越过了许多真实场景应用所需的门槛&#xff0c;催生出了 Google Now、微软小娜和亚马逊 Alexa 等服务。1. 引言过去几年…

王劲首度解析景驰:我们是跑得最快的无人驾驶公司

来源&#xff1a;AI世代概要&#xff1a;9月14日&#xff0c;在景驰科技天使轮投资方之一华创资本组织的分享会上&#xff0c;王劲以景驰科技创始人兼首席执行官的身份&#xff0c;发表了主题为“无人驾驶的大国冲刺”的演讲。创业近半年后&#xff0c;王劲带着景驰最新的发展成…

mysql 5.7安装完密码是多少_关于mysql5.7.18的安装并修改初始密码的图文教程

这篇文章主要为大家详细介绍了Mysql5.7安装并修改初始密码的方法&#xff0c;具有一定的参考价值&#xff0c;感兴趣的小伙伴们可以参考一下Centos 安装MySQL可以参考之前写的一篇文章Centos7.3 安装Mysql5.7并修改初始密码windows安装mysql5.7有两种方式1、下载.msi安装文件直…

化解谷歌AI霸权的另一种思路?开发平台的生态围剿

来源&#xff1a; 脑极体概要&#xff1a;无论是学界还是巨头&#xff0c;都只能给出规则和参考&#xff0c;以及一小部分示例性应用&#xff0c;而最终让人工智能落地产生价值的&#xff0c;只能是成千上万脑中闪过鬼点子的开发者。相较移动互联网&#xff0c;AI将是一个更激进…

波士顿咨询联手MIT发布万字人工智能报告,详解企业如何跨越“AI应用鸿沟”

来源&#xff1a;机器人圈概要&#xff1a;AI可以帮助人们预测就业市场接下来的变动&#xff0c;发现&#xff08;并满足&#xff09;新的培训劳动力的需求&#xff0c;以此缓冲它自身及其他因素造成的影响。人们对人工智能&#xff08;AI&#xff09;抱有极高的期待&#xff0…

工信部:2017工业物联网白皮书

来源&#xff1a;199IT互联网数据中心概要&#xff1a;目前&#xff0c;物联网进入与传统产业深度融合发展的崭新阶段&#xff0c;工业制造领域的转型升级成为工业物联网发展的重要驱动力&#xff0c;世界各国纷纷发布相关的战略举措&#xff0c;抢占新一轮发展战略机遇。目前&…

从共享单车看城市云反射弧的工作运行机制

作者&#xff1b;刘锋&#xff0c;黄子铜概要&#xff1a;智能时代&#xff0c;我们的城市从架构上也越来越类脑化&#xff0c;从运转上变得越来越智慧&#xff0c;共享单车基于物联网技术&#xff0c;很便捷地解决了最后一公里的需求&#xff0c;是城市云脑中云反射弧在交通领…

AI 热潮之下,初创企业能否躲过科技巨头的碾压?

来源&#xff1a;AIis概要&#xff1a;人工智能&#xff08;AI&#xff09;是当下的流行语&#xff0c;AI 相关的初创企业纷纷涌现&#xff0c;大型科技巨头也频频采取相关动作&#xff0c;走在 AI 的前沿。全世界的科技巨头们要小心了。人工智能&#xff08;AI&#xff09;是当…

mysql先删后增并发时出现死锁_MySQL死锁案例分析一(先delete,再insert,导致死锁)...

一、死锁案例MySQL版本&#xff1a;Percona MySQL Server 5.7.19隔离级别&#xff1a;可重复读(RR)业务逻辑&#xff1a;并发下按某个索引字段先delete记录&#xff0c;再insert记录比如&#xff1a;begin;delete from tb where order_id xxx;insert into tb(order_id) values…