AHB协议已经有较多人学习总结了,在学习过程中参考的网址如下所示:
总线协议 -- AMBA总线(一) - love小酒窝 - 博客园 (cnblogs.com)
AHB总线_bleauchat的博客-CSDN博客_ahb总线
AHB—SRAMC项目(结构图,核心代码、Testbench架构)_Mr.翟的博客-CSDN博客_sramc
AHB总线_bleauchat的博客-CSDN博客_ahb总线
AMBA AHB总线 - BH5HSV - 博客园 (cnblogs.com)
AMBA总线协议AHB、APB - feipeng8848 - 博客园 (cnblogs.com)
总之对AHB协议的学习是为了弄明白AHB的工作机制,可以写简单的AHB BUS总线模块,或者可以在该总线上挂不同的master和slave,为master和slave写正确的wrapper文件(因为复杂的bus总线IP通过购买性价比较高)。
在AHB的对master的端口信号中hburst有single、incr、incr4、wrap4、incr8、wrap8、incr16、wrap16几种类型,其中single类型为一次传输一个单独的beat,single类型不是burst类型;其他均表示传输连续的beat,为burst类型。
进行一次burst传输则需要进行一次占用总线的申请,进行一次single传输也需要进行一次总线占用的申请。
每一次single传输的地址与上一次的传输的地址没有关系(即前后两次传输是独立的);burst传输的非首次传输的地址均是在上一次地址的基础上加上地址增量后的地址,比如burst传输的起始地址为0x34,地址增量为0x4,则下一次传输的地址是0x38,在下一次传输的地址是0x3c。
burst传输的地址不能超过1KB的地址边界,需要跨越1KB边界时则需将burst进行拆分后再传输。incr类型为增量burst传输,wrap类型为回环burst传输,incr和wrap后的数字为每个burst需要传输的拍数,无数字的incr表示没有限制一次传输的拍数。当传输类型为wrap时,存在回环边界,而传输类型为incr时不存在回环边界,直接在上一个地址的基础上直接加上地址增量。
在AHB协议中,burst传输中每一个beat都对应相应的地址信号,即每传输一beat均需要传输一个地址。因此master在进行burst传输时每一个beat对应的地址都要传输,不能省去传输起始和终止地址间的地址。burst传输对于master来说能减少对总线使用权限的申请次数;对于部分slave来说可以提前知道主机的访问计划早做准备,从而提高slave的效率。参考的网址:AHB burst功能理解 - charlie_zhang的日志 - EETOP 创芯网论坛 (原名:电子顶级开发网) -
地址增量=hsize/8bit。举例:hsize=8bit,则地址增量为0x1;hsize=16bit,则地址增量为0x2;hsize=32bit,则地址增量为0x4。
每beat传输的数据位宽与hsize和总线的实际数据位宽有关。hsize对应的每beat位宽如下
[2:0]hsize | 3'b000 | 3'b001 | 3'b010 | 3'b011 | 3'b100 | 3'b101 | 3'b110 | 3'b111 |
位宽/beat | 8bit | 16bit | 32bit | 64bit | 128bit | 256bit | 512bit | 1024bit |
32bit的总线位宽(即hrdata/hwdata为32bit)允许一次beat传输的最大位宽为32bit,即一次beat传输可以是8bit,可以是16bit,也可以是32bit。在最大位宽限制条件下一次beat传输的位宽取决于hsize的值。
注:8bit=1byte,16bit=1halfworld,32bit=1world。
1KB中的B是指byte,在AHB传输中是以1byte为计数单位/传输单位的。因此1KB的地址边界即把地址分成了不同的区间,如0x0000_0000到0x0000_03ff,0x0000_0400到0x0000_07ff,0x0000_0800到0x0000_0bff,以此类推。一旦burst传输要跨越1KB的边界时,则需要将burst拆分后再传输。
burst的传输若要跨越边界时,需根据实际情况进行拆分,比如hsize=world,hburst=INCR8,当传输第4个beat时的地址为0x3fc,若继续传输则跨界1KB,因此需要讲INCR8拆分为INCR4+INCR4两个burst传输。
1KB边界的使用原因:大部分slave的地址空间是以1KB为单位的。不超过1KB边界是为了避免在burst传输时传给错误的slave,从而避免造成致命错误。
注:此处的1KB边界不限制slave的地址空间的划分,即slave的地址空间可以为1KB,也可以为2KB,也可以为3KB,根据实际需求选择,但slave的地址空间应为1KB的整数倍。
当hsize=4byte,hburst=wrap8时,如果传输的起始地址不是4x8=32=0x20的倍数时,就会产生折回的边界地址,比如0x24,0x28,0x2c,0x30,0x34,0x38,0x3c,x020,即在地址碰到下一个边界时减去0x20就是折回后的地址。
当系统中使用到cache时会用到WRAP,具体的使用方法需要查看cache的操作。(这一点还不甚明白,后续继续补充),参考的网址:axi/ahb的wrap类型的应用场景 - FPGA/ASIC/IC前端设计 - EETOP 创芯网论坛 (原名:电子顶级开发网) -
这点后续再补充吧~
个人所学所见所想是有所限制的,这里如有错误或不准确的地方,望各大虾指出补充,先谢过~
如有侵权,及时告知并作相应处理~