我们说回AHB总线。
作者:Trustintruth
来源: https://aijishu.com/a/1060000000119684
我们讲的总线传输就是主机通过总线与从机的联络,其具体的操作是:
在每一次传输开始之前,总线主机向仲裁器断言一个申请信号,仲裁器会回复主机核实可以使用总线。主线得到授权之后通过驱动地址和控制信号来发起一次 AMBA AHB 传输。这些信号提供关于地址、方向和传输宽度的信息,以及表示传输类型是否为一次突发传输的部分。
地址不长期有效所以所有从机必须在这个时段(传输地址时)采样地址。然而,通过HREADY 信号可以延长数据。当该信号为低时导致在传输中插入等待状态同时允许从机有额外的时间提供或者采样数据。
在传输中从机通过使用响应信号来表示状态,
HRESP[1: 0]:OKAY OKAY 响应用来表示传输进展正常并且当 HREADY 变高时表示传输成功完成。
ERROR ERROR 响应表示发生了一个传输错误并且传输失败。
RETRY 和 SPLIT RETRY 和 SPLIT 两个传输响应都表示传输不能立刻完成,但是总线主机应该继续尝试传输。
在常规操作中主机被允许在仲裁器授予另一个主机访问总线之前完成一个特定突发的所有传输。然而,为了避免过多的仲裁延时可能允许仲裁器打断一个突发并且这种情况下主机必须(申请)重新仲裁总线以完成剩下的突发传输。
拿一次传输(single transfer)举例
(下面的control信号并不是一个具体的信号,二十以下信号的总体,省略表示
HWRITE - 这个信号是读写控制信号,也即transfer的方向控制信号。 高电平表示写操作,低电平表示读操作。
HSIZE - 这个信号是指明单次传输的数据宽度。
表示传输的大小,三位表示0…7,分别对应8bits(byte), 16bits(halfword),32bits(word),
64bits, 128bits,256bits, 512bits,1024bits
HPROT[3:0] - 为transfer提供额外的访问保护和控制权限信号。一般不用,在此不做介绍。
HTRANS[1:0] - 进行一次传输时的传输类型,这个信号由主机根据自己要进行的传输类型生成的控制信号。一共4种类型
00 IDEL主设备占用总线,但没进行传输,两次突发传输中间主设备可发IDLE,此时就算从机被使能,也不会从总线上获取任何的数据信号。如果此时从机被选中,那么每一个IDLE周期从机都要通过HRESP[1:0]返回一个OKAY响应
01 BUSY 主设备占用总线,但是在突发传输过程中还没有准备好进行下一次传输,一次突发传输中间主设备可发BUSY。这时从机不会从总线上收取数据而是等待,并且通过HRESP[1:0]返回一个OKAY响应。需要注意的是,这个传输需要给出下一拍的地址和控制信号,尽管从机不会去采样。
10 NONSEQ 表明一次单个数据的传输或者一次突发传输的第一个数据。地址和控制信号与上一次传输无关
11 SEQ 突发传输中剩下的传输是连续传输并且地址是和前一次传输有关的。控制信息和前一次传输一样。地址等于前一次传输的地址加上传输大小(字节)。在回环突发的情况下传输地址在地址边界处回环,回环值等于传输大小乘以传输的次数(4、 8 或者 16 其中之一)。)
开始传输的第一个周期的上升沿,无论是读操作还是写操作,我们的主机将地址信息和控制信息发送到总线上;
第二个周期的上升沿,从机采样地址和控制信号,并将HREADY拉高;如果是写操作,主机会在第二个周期的上升沿过后传输要写入的数据;如果是读操作,从机会在HREADY信号拉高后将读取的数据写入总线;
第三个周期的上升沿,如果是写操作,主机获取HREADY高信号,表明从机已成功接收数据,操作成功;如果是读操作,主机获取HREADY高信号,表明此时的读数据有效并且接收下来,操作成功。HREADY信号在数据有效期间必须为高,并且延续到第三个周期的上升沿之后,确保主机的正确采样。时序图如下
但是如果从机在传输是不能立即处理的时候我们的时序是怎样的呢?从机不能及时处理时,从机会插入一些等待的状态,即将HREADY信号拉低。再将HREADY信号拉低的期间,对于写操作,写数据一直不变知道传输完成;对于读操作,从机不一定要在一开始给数据,只是保证在HREADY拉高之后在给出有效数据。
如果是流水线,直接摘自大牛博文
扩展数据周期的一个负效应是必需延长相应的下一笔传输的地址周期。A和C为零等待传输,B加入了一个等待周期,因此相应的C地址周期要进行扩展。
第一个周期,主机发起一个操作A,并驱动地址和控制信号;
第二个周期,从机收到了来自总线的请求,将HREADY信号拉高;
第二个周期上升沿后,主机发现有操作B需要执行,并且检查到上一周期的HREADY为高,则发起第二个操作B;
第三个周期,主机获取HREADY信号为高,表示操作A已经完成;
第三个周期上升沿后,主机发现有操作C需要执行,并且检查到上一周期的HREADY为高,则发起第三个操作C;
第三个周期上升沿后,从机由于繁忙插入了一个等待状态,将HREADY拉低;
第四个周期,主机获取HREADY信号为低,知道从机希望等待,于是主机保持和上一拍一样的信号;
第四个周期,从机处理完了事务,将HREADY信号拉高,表示可以继续处理;
第五个周期,主机获取HREADY信号为高,知道从机已经可以处理B操作;
第五个周期上升沿后,B操作完成;
第六个周期上升沿后,C操作完成。
需要注意几点:
HREADY在一定程度上表示了从机的pipeline能力,在AHB中是2个pipe,也就是总线上最多存在2个未处理完的transfer。只有当总线上未完成的transfer少于2个时,主机才能发起操作。
本文暂时先不说突发操作,挖个坑之后填齐。
获取更多代码与资料,欢迎关注我啊!
推荐阅读
关注此系列,请关注专栏Arm AMBA协议集