我是靠谱客的博主 朴素灯泡,最近开发中收集的这篇文章主要介绍【AHB协议解读 三】传输(Transfers),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

3.1 基本传输

AHBlite传输包含两个阶段:

  1. Address:持续一个HCLK,除非之前的传输未完成而延长
  2. Data:可能需要几个HCLK,通过HREADY信号来控制整个完成周期持续的HCLK个数

HWRITE控制着数据传输的方向:

  1. 若为高电平,则表明是写传输,master在写数据总线上传递数据HWDATA
  2. 若为低电平,则在slave上体现为读传输,slave必须产生一个读数据HRDATA在读数据总线上
3.1.1 无等待传输

下面是读写两种无等待传输波形,可以看出,在这种最简单的情况下,每笔读写传输包含一个地址cycle和一个数据cycle。

  1. master在HCLK上升沿后,将地址和控制信号驱动到bus上
  2. slave在HCLK的下一个上升沿后,对地址和控制信号进行采样
  3. 在slave完成对地址的采样后,它就可以开始驱动合适的HREADY响应,响应将在HCLK的第三个上升沿被master采到
    在这里插入图片描述
    在这里插入图片描述
3.1.2 有等待传输

任何一笔传输的地址阶段都发生在上一笔传输的数据阶段。这种地址和数据的重叠(overlapping)对于总线的流水线性质(pipelined nature)至关重要,并且可以实现高性能的操作,同时仍为slave提供足够的时间来提供对传输的响应。slave可以在任何传输中插入等待状态,以使操作完成获得更多的时间。
在这里插入图片描述
在这里插入图片描述
注意:对于写传输,master在整个扩展周期内保持数据稳定。对于读传输,slave无需提供有效数据,直到传输即将完成。

当以这种方式扩展传输时,它的副作用是延长了下一个传输的地址阶段的时间。
下图显示了到A/B/C三个不相关地址的传输,可以发现:
1.在到地址A和地址C的传输过程中,是没有等待状态的
2.在到地址B的传输过程中的数据阶段有1个等待状态,其影响是地址C的地址阶段被延迟了。
在这里插入图片描述

3.2 传输类型(Transfer types)

传输可以被分为四种类型,它们由信号HTRANS[1:0]来表征。

  1. IDLE(b00):表示不需要数据传输。master在不想执行数据传输时,会使用IDLE类型的传输。一般建议master通过IDLE传输来终止锁定的传输。slave必须始终为IDLE类型传输提供零等待状态的OKAY响应,并且slave必须忽略该传输。
  2. BUSY(b01):BUSY类型传输使得master可以在burst中间插入空闲周期。这种传输表示master正在继续进行突发操作,但下一次传输无法立即进行。当master用BUSY传输 类型时,地址和控制信号必须反映突发中的下一次传输。只有未定义长度的突发可以将BUSY传输作为突发的最后一个cycle,slave必须始终对BUSY传输提供零等待状态的OKAY响应,并且slave必须忽略该传输。
  3. NONSEQ(b10):表示单次传输或突发(burst)的首次传输。地址和控制信号与之前的传输无关。总线上的单次传输可以被视为长度为1的突发,因此传输类型为NONSEQUENTIAL
  4. SEQ(b11):突发中的其余传输是SEQUNENTIAL,并且地址与上一次传输相关。控制信息与前一传输相同,该地址等于前一次传输的地址加上传输数据大小(以字节为单位,通过HSIZE[2:0]表征)。在wrapping类型突发的情况下,传输的地址在地址边界自动跳转。

一张图展现四种不同的传输类型
在这里插入图片描述T0~T1:一个4拍的读请求开始于一笔NONSEQ类型传输
T1~T2:master还没准备好第2笔传输,因此插入1拍的BUSY类型传输来延迟第2拍的开始,slave正常提供第1个传输的读数据
T2~T3:master准备好了第2拍,因此会发出SEQ传输的信号。由于上一笔传输是BUSY传输,所以此时master会忽略slave提供的读数据
T3~T4:master发起第3笔传输,slave正常提供第2拍的读数据
T4~T5:master发起最后一笔传输,可是slave还没准备好接收第3笔传输,因此使用HREADY插入单个等待状态
T5~T6:slave准备好,并为第3笔传输提供读数据
T6~T7:slave准备好,并为最后一笔传输提供读数据

3.3 锁定传输(Locked transfers)

如果master要求锁定访问,则它必须声明HMASTLOCK信号。该信号用于向任何slave指示当前传输序列是不可分割的,因此必须在处理任何其它传输事务之前对其进行处理。通常,Locked传输用于确保信号的完整性,以确保slave在两次传输之间不执行其它操作。
下图以微处理器SWP指令的读取和写入为例。
在这里插入图片描述

3.4 传输大小(Transfer size)

HSIZE[2:0]信号表示的是传输数据量的大小。

下表为传输大小与HSIZE信号之间的编码关系:
在这里插入图片描述
注意:HSIZE设置的传输大小必须小于或等于数据总线的宽度。例如对于32位数据总线,HSIZE只能使用b000,b001或b010

将HSIZE与HBURST结合使用,以确定用于地址跳转的边界值。
HSIZE信号与地址总线具有完全相同的时序,但是HSIZE必须在整个突发传输中保持恒定。

3.5 突发操作(Burst operation)

协议中的突发类型,包含了single、4、8、16beats和undefined length(不定长)这几种,他们都支持incrementing和wrapping:

  1. 递增突发的访问是顺序的,并且突发中每次传输的地址都是前一个地址的增量。
  2. 循环突发跨越地址边界时会自动跳转地址。地址边界的计算方式是突发(Burts)中的拍数(Beats)与传输(Transfer)大小(Size)的乘积,其中,拍数由HBURST控制,传输大小由HSIZE控制。例如,一个4byte大小的4拍循环突发(4-beats wrapping burst of word)以16byte为边界进行边界跳转,若起始地址为0x34,则它的四个transfer地址分别为0x34、0x38、0x3c和0x30

下表是由HBURST[2:0]控制的burst类型。
在这里插入图片描述
注意!master不允许发送跨越1KB地址边界的INCR突发,这是因为slave在设计的时候是以1KB为单位的,如果跨过了1KB就有可能访问到另一个slave。

master在进行单次传输时,可以使用以下方式:

  1. SINGLE burst
  2. 有一个长度为1的burst的不定长burst

Note
突发的大小(Burst Size)表示的是突发的节拍数(传输的个数),而不是传输的字节数。通过将节拍数和每拍中的数据量(HSIZE[2:0])相乘,可以计算出总突发传输的数据量总数。

突发的所有传输必须满足与等于传输大小的地址边界对齐。例如,你必须将一个数据量为word的trasnfer对齐到word地址边界(HADDR[1:0]='b00),将数据量为halfword的transfer对齐到halfword地址边界(HADDR[0]='b0)。IDLE传输的地址也必须对齐,否则在仿真期间monitor可能会报告虚假警告。

3.5.1 BUSY传输后的突发终止(Burst termination after a BUSY transfer)

在突发开始之后,master如果需要更多的时间,则会在继续下一次传输之前使用BUSY类型的传输。
在INCR类型的不定长突发中,master可能会插入BUSY传输然后决定不再发出新的传输请求。在这种情况下,master可以通过发出NONSEQ或IDLE传输来有效地终止不定长突发
协议不允许master使用BUSY来企图结束固定长度突发(INCR4/8/18,WRAP4/8/16),这些定长突发只能以SEQ类型传输结束

3.5.2 突发的提前终止(Early burst termination)

以下两种情况可能会造成突发的终止:
1. slave的错误响应
如果slave响应了一个ERROR,那么master应该取消本次突发中的剩余传输。然而这并不是一个严格的规定,master把本次突发中的剩余传输继续发完也是可以接受的。即使master没有完成突发中的所有传输,在下一次访问到slave的时候也不需要重建这笔突发,例如master只完成了一个8拍突发中的3拍,那么它在下次访问到slave的时候也不必完成剩余的5拍传输。
2. Multi-layer interconnect 终止
虽然master不允许提前终止突发请求,但当突发没有完成时,slave必须被设计为能够正常工作。当多层互连组件被用于多master的系统时,它就可以终止突发以便另一个master可以访问slave。如果这种情况发生,slave必须终止来自之前master的突发,转而响应新的master。

3.5.3 Burst examples

4拍循环突发,WRAP4
边界地址计算:拍数(传输个数)x 传输大小 = 4 x 4(byte) = 16byte,因此以16-byte地址为边界,每逢16-byte(0x10)的地址就需要跳转。
在这里插入图片描述

4拍递增突发,INCR4
在这里插入图片描述

8拍循环突发,WRAP8
边界地址计算:传输个数 x 传输大小 = 8 x 4(byte) = 32byte,因此要以32-byte地址为边界,每逢32-byte(0x20)的地址就要向前跳转。因此这里到达0x3C之后,如果不跳转下一个地址是0x40,显然0x40是一个32-byte地址,因此向前跳0x20个地址,到达0x40-0x20=0x20。
在这里插入图片描述

8拍递增突发,INCR8
在这里插入图片描述

不定长突发,INCR
下图展示了两个burst:

  1. 第一个burst是一个2-beat/halfword INCR的写请求burst(0x20),每笔传输的地址步长为0x2
  2. 第二个burst是一个3-beat/word INCR的读请求burst(0x5c),每笔数据的地址步长为0x4
    在这里插入图片描述

3.6 传输等待(Waited transfers)

slave如果需要更多的时间来提供或者采样数据,那么他们会用HREADY来插入等待状态。在传输等待期间,master仅限于对传输类型和地址进行更改

3.6.1 传输等待时更改传输类型(Transfer type changes during wait states)

当slave请求等待状态时,master不能更改传输类型,除非以下几种情况:IDLE传输、定长BURST中的BUSY传输、不定长BURST中的BUSY传输。

1. IDLE传输
在传输等待期间,master可以将传输的状态从IDLE变更到NONSEQ。当传输类型(HTRANS)变更到NONSEQ后,master必须保持传输类型不变,直到HREADY拉高。
下图展示了一个SINGLE突发的传输等待,并且伴随着传输类型从IDLE到NONSEQ的改变。
在这里插入图片描述
T0-T1 master初始化SINGLE突发到地址A
T1-T2 master在地址Y上插入一个IDLE传输,此时slave插入了一个等待状态(HREADY=LOW)
T2-T3 master在地址Z上插入了一个IDLE状态
T3-T4 master将传输类型更改为NONSEQ,并发送一笔初始地址为B的INCR4突发
T4-T5 当HREADY为低时,master必须保证传输类型不变
T5-T6 HREADY拉高,到地址A的SINGLE突发完成,并且开始下一笔INCR4突发
T6-T7 INCR4突发的第一拍完成,发送下一拍传输的地址

2. 定长BURST中的BUSY传输
在定长BURST的传输等待过程中,master可以在HREADY为低时将传输类型从BUSY更改为SEQ。同样,传输类型更改之后需要保持不变,直到HREADY拉高。
Note 因为BUSY传输只能在连续的突发节拍中插入,因此这不适用于SINGLE突发。
在这里插入图片描述
关键cycle解读:
T1-T2 master开始下一个对地址0x28的传输,但因为暂时没“空”发送命令,因此先插入了一笔BUSY传输,同时slave也发起了等待。
T3-T4 master此时有“空”了,因此将BUSY传输更改为SEQ传输,但slave还需要等待。

3. 不定长BURST中的BUSY传输
在不定长突发INCR的传输等待过程中,master也允许在HREADY为低时将BUSY传输更改为其它类型的传输。如果更改为SEQ,那么当前突发将继续,而如果更改为了IDLE或者NONSEQ,那么当前突发结束、进入下一笔突发。
在这里插入图片描述

3.6.2 传输等待时更改地址(Address changes during wait stats)

在slave的等待状态下,master只能改变一次地址,除了以下两种情况:

1. IDLE传输期间
在传输等待期间,master允许改变IDLE传输的地址,当传输类型变为NONSEQ后,master就必须要保证地址不变直到HREADY拉高。
在这里插入图片描述

2. 在一次ERROR响应之后
在传输等待期间,若slave响应了一个ERROR,那么master就可以在HREADY为低的时候改变地址。
在这里插入图片描述
关键cycle:
T3-T4 slave响应ERROR
T4-T5 master将HTRANS切换为IDLE传输,并允许在HREADY为低的时候更改地址;slave完成ERROR响应

最后

以上就是朴素灯泡为你收集整理的【AHB协议解读 三】传输(Transfers)的全部内容,希望文章能够帮你解决【AHB协议解读 三】传输(Transfers)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部