1、基本传输
一次传输包括2个阶段
-
地址阶段:持续一个HCLK周期,除非被上次传输扩展。
-
数据阶段:可能需要多个HCLK周期,用HREADY信号来控制完成传输所需的周期数。
HWIRTE控制数据传输方向:
-
高电平时表示写传输,主机发布数据在写数据总线HWDATA[31:0]
-
低电平时表示读传输,从机产生数据在读数据总线HRDATA[31:0]
最简单传输是没有等待状态的,因此传输只包含一个地址周期和一个数据周期。
在一次没有等待状态的传输中,
1、主机驱动地址和控制信号到总线上在HCLK的上升沿后
2、从机在下一个HCLK上升沿采样地址和控制信息
3、在从机采样到地址和控制信息后驱动HREADYOUT响应,该响应被主机在第三个上升沿采样。
地址阶段可出现在上一次传输的数据阶段,这种数据和地址的交叠是总线具有流水性质的基础。
从机可以往传输中插入等待状态来使传输完成获得额外的时间。每个从机都有HREADYOUT信号,它在数据阶段被从机驱动。
对于写操作,在被扩展的周期内主机应该保持所驱动的数据稳定。而对于读操作,从机只需要在传输的完成阶段提供有效数据即可。
当一次传输被用这种方式扩展时,将对下一次传输的地址阶段产生同样扩展的副作用。
2、传输类型
传输可被分类成4种类型,被HTRANS[1:0]控制。
HTRANS[1:0] | 类型 | 描述 |
---|---|---|
0b00 | IDLE | 表明没有数据传输。当主机不想传输数据时使用该类型。建议主机用IDLE传输来结束一次LOCKED传输。从机必须用一个无等待状态的OKAY来响应IDLE传输。 |
0b01 | BUSY | BUSY传输类型使主机能在BURST传输中插入IDLE周期,这种传输类型表明主机想继续这次BURST传输但下一次传输不能立刻发生。当主机使用BUSY类型时,地址和控制信号必须体现出下一次传输。只有未定义长度的BURST能用BUSY传输作为突发传输的最后一个周期。从机必须用一个无等待状态的OKAY来响应BUSY。 |
0b10 | NONSEQ | 表明一次单次传输或者一次BURST传输的第一次传输。地址和控制信号和前一次传输无关。总线上的单次传输被当成长度为1的BURST传输因此类型是NONSEQ |
0b11 | SEQ | BURST传输的剩余传输均是SEQ的并且地址和上次传输是相关的。控制信号和上次传输完全一致。地址等于上次传输的地址加上传输大小(被HSIZE[2:0]信号定义) |
T0-T1 主机用一个NONSEQ型的传输开启读操作。
T1-T2 主机插入一个BUSY状态延迟第二拍数据的开启。从机提供第一拍的读数据。
T2-T3 主机已为第二拍传输准备好,标志SEQ信号,此时忽略读数据总线上的数据。
T3-T4 主机开始第三拍操作,从机将第二拍的读数据放在读总线上。
T4-T5 主机进行最后一拍读操作,但从机拉低HREADY来插入等待状态。
T5-T6 从机拉高HREADY,同时将读数据放于读总线上。
T6-T7从机将最后一拍的读数据放于数据总线上。
3、上锁传输(Locked Tranfers)
如果主机需要上锁存取,它必须拉高HMASTLOCK信号,该信号对所有从机表明当前传输序列是不可分割的,因此本次传输在处理其他传输前必须处理完成。
一般上锁传输用于保持信号标志的完整性,确保从机在微处理器的SWP指令的读写阶段不会进行其他操作。
在一次上锁传输后,建议主机插入一次IDLE传输。
大多数从机没有实现HMASTLOCK的需求因为它们只需能够执行它们收到的命令。但能被超过1个主机存取的,如多口Memory控制器(MPMC)必须实现HMASTLOCK接口信号。
允许主机在一次上锁传输序列的开始、中间、结尾为IDLE传输拉高HMASTLOCK,但不建议这么做,因为这种行为会影响系统的仲裁。
仍然允许但不建议主机为一串IDLE传输拉高HMASTLOCK然后在没有非IDLE传输时拉低HMASTLOCK。也会影响系统的仲裁。
要求所有上锁传输序列都是对相同的从机地址域操作的。
4、传输大小
HSIZE[2:0]表明一次数据传输的大小
HSIZE设置的传输大小必须小于等于数据总线宽度。
用HSIZE和HBURST来决定回环bursts的地址边界。
HSIZE和地址总线对齐,但在一次BURST传输期间,HSIZE必须保持不变。
5、Burst操作
该协议定义了4,8,16拍、未定义长度的burst和单次传输。支持递增和回环bursts。
增量bursts存取连续的位置,每次传输的地址是前一次传输地址的增量。
回环bursts在地址超越地址边界时回环,地址边界是burst拍数和传输大小的乘积。bursts拍数由HBURST控制,传输大小由HSIZE控制。如一个4拍的,4字节的回环bursts传输在4*4=16字节的边界回环。因此,如果bursts起始地址为0X34,则它由四个传输地址0x34,0x38,0x3c,0x30组成。
HBURST[2:0]控制了burst类型
主机不能开始一次跨越1KB地址边界的增量burst。
如果主机想进行一次单次传输可以使用
(1)single bursts传输:HBURST[2:0]=3’b000
(2) 未定义长度的burst传输但长度为1,HBURST[2:0]=3’b001
burst传输必须和地址边界(由传输大小决定)对齐,比如4字节数据的传输,地址低2位必须为0(因为00放第1字节,01放第2字节,。。11放第4字节),IDLE传输期间地址也必须对齐。
- 在一次BUSY传输后结束BURST传输
在一次burst传输开始后,主机如果在下一次传输前需要更多时钟周期,可以使用BUSY。
在一次未定义长度的burst中(INCR),主机可以插入BUSY传输然后决定是否继续需要传输数据。主机可以在BUSY后开始一次NONSEQ或者IDLE操作来高效地结束本次burst。但协议不允许主机使用BUSY来结束定义长度的burst传输。这些定义长度的burst传输必须使用SEQ来结束。同样不允许主机在一次SINGLE burst传输后立马插入BUSY传输,SINGLE burst传输必须紧接IDLE传输或者NONSEQ传输。(single burst可以理解为拍数为1的定长传输,定长传输均不可以使用BUSY结束) - Burst传输的提前结束
(1)从机error响应
如果从机提供一个ERROR响应,那主机可以取消本次burst的剩余传输。但这不是严格的要求。主机仍然可以继续传输完本次burst。
若主机取消了本次burst的剩余传输,它必须在ERROR的2个时钟周期内改变HTRANS为IDLE。
若主机未完成burst传输,当再次操作该从机时,不需要重建那次burst。
(2)多层互连停止
主机不允许提前结束一次burst传输,从机必须设计成若burst未停止就要正确工作。
在一个多主机系统中,多层互连组件可通过使另一个主机存取从机来结束一次burst。从机必须结束来自原先主机的burst才能响应新的主机。
例子:
从机插入了一个等待状态。注意wrap burst的地址。
INCR4的读操作,地址在16字节边界不会回环,而是继续递增。
前半段是半字增量burst,地址每次加2,后半段是字增量burst,地址每次加4。
6、等待传输
从机如果需要更多周期来采样数据,可使用HREADYOUT来插入等待状态。在等待周期内,主机对传输类型和地址的改变均有限制。主要包括:
(1)等待周期传输类型的变化
在一次等待传输中,主机被允许改变传输类型由IDLE到NONSEQ。改变为NONSEQ后HTRANS必须保持,直到HREADY被拉高。
SINGLE burst必须紧接IDLE或者NONSEQ,这里就是IDLE的例子,被HREADY隔断了地址阶段和数据阶段。
在一次定长burst传输的等待传输中,主机被允许改变传输类型从BUSY到SEQ,改变为SEQ后HTRANS必须保持,直到HREADY被拉高。改变为NONSEQ后必须保持,直到HREADY被拉高。
在一次未定义长度的burst的等待传输中,主机可以改变传输类型从BUSY到任意类型。当HREADY是低电平时,如果BUSY转到SEQ则继续本次burst,若BUSY转到IDLE或NONSEQ则结束本次burst。
(2)等待周期的地址变化
在等待周期内,主机被允许为IDLE传输改变地址,当HTRANS由IDLE变为NONSEQ时,地址必须保持不变直到HREADY被拉高。
在一次等待传输中,如果从机响应ERROR,主机被允许在HREADY为低电平期间修改地址。
7、保护控制
8、Memory类型
9、安全传输