热度 6| ||
这个协议其实很简单,很容易入门,但是想透彻理解,并不容易。
都会提出一个问题:他们有什么区别?为何需要这两个协议?适用场景是什么?
每当问到这个问题,很多人都能够回答一二,例如
- AHB是高性能,允许address phase + data phase pipe方式进行,一定程度上支持类似AXI的outstanding能力,APB则不能
- APB一般用于低速外设,AHB用于高速外设
然后我会说,嗯第一个回答的很好,同样频率,slave response zero delay情况下,AHB确实比APB数据transaction带宽高,那你知道burst吗?你是如何理解AHB拥有的burst功能的呢?;第二个回答也没错,那能回答下,低速外设和高速外设特征上有什么不同,低速高速的标准是什么,为何APB用于低速外设,而AHB用于高速呢?
- burst就是突发传输,也可以认为是打包传输,以INCR4为例,向4个连续地址单元(每个单元大小由Hsize控制),这四个transaction认为不能中断,彼此一定是back-to-back(先不考虑early termination的事情),对应对连续地址的访问场景,可以是memory,也可以是地址连续的配置寄存器。对于一般的单master场景,例如某SoC集成单核cpu,且该cpu只有一个AHB master口(用此口取指令,访问memory,访问外设),而且系统中无DMA,该AHB master挂了诸如flash,sram,IO device等slave,在这种情况下。cpu发出的ahb transaction有两种选择,一个是用的back-to-back single mode,另外是用INCR4,但其实这两种选择效率是相同的,INC4体现不出任何优势,那优势到底如何体现呢?
通过刚才的例子,认识到单AHB master系统中,是无法体现burst优势的,然后我们再系统中增加一个master,例如通用DMA控制器,并假设这个DMA只有一个master口(当然还有一个slave配置口,这里不讨论),最多支持4 channel,channel的具体细节可以由软件配置,不做细节探讨,但它最明显的特征是系统中出现了两个AHB master,假设两个master某个时刻都要去访问同一个资源,例如sram。
CPU可能是在执行程序读取sram中某个变量,DMA可能正在IO与sram之间搬移数据,这时就需要仲裁了,如果arbiter看不到任何single/INCR4的信息,两个master过来的请求地位是等同的,它就会有各种稀奇古怪的仲裁策略。但实际上我们并不希望他们地位等同,加入DMA的初衷是减轻 cpu的负担,让它可以几乎不被打扰专注做自己事情,例如4个channel分别是:USB OTG正在发射数据,需要DMA从sram中顺序取内容填充到USB transimit regs中;CAN/SPI/I2C等都在收数据,他们内部都有fifo,当fifo almost full时,希望DMA赶紧把这些数据搬移到sram中,防止fifo溢出(uart)或者IO transaction pending(例如I2C)。系统设计的目标是DMA访问memory时,一旦开始就不要被打断,快速的完成,虽然这样会导致CPU执行稍微慢了一些,这样就能够使得device fifo内容能够快速填充或读取,fifo 不上溢也不下溢,IO device保证running状态,不会被中止或出现数据丢失现象。当然如果系统中存在latency,仲裁切换时有损耗,burst更体现了高效率;
- 低速高速并没有明确的界限,都是相对的,例如有些系统中,AHB仅仅有几十Mhz的速度,而有些系统中APB却有高达几百Mhz的速度。它们之间的区别主要在协议的不同,AHB协议复杂性要高一些,implementation时 cost要大一些(假设是protocol compliant),但这些feature对于一般低速外设其实并不需要,例如I2C/SPI/SDIO OTG/USB之类配置通道,不会出现INCR/WRAP之类burst场景,而且配置通道一般都是初始化时简单配置下,running时数据带宽很低,例如I2C 峰值400Kbps,算下来也就max bandwidth 50KB/s,用APB完成能够handle这种场景,对应的cost/area都比较低,而且可以进一步降低APB 频率,performance又能够接受,APB当然是较好的选择了。注意中间插入一个AHB2APB 异步桥。
细节:注意AHB 与APB decoder的cost差别,AHB address phase与data phase是pipe进行的,老地址马上就被新地址pipe掉了,因此需要寄存器暂存才能执行对slave的访问,这时AHB cost大的一个角度。
-----------------------------------------------------------------------------------------------------
写在最后,关于理解什么是协议,例如拿到一个IP,若要想在不同厂家的不同SoC系统中复用,必须说自己是standard protocol compliant,当然协议会有各种optional的feature。除此之外,如果你修改了IP,然后集成在自己的特定SoC系统中,可以正常work,而且工作的还不错,但是却不能成为protocol compliant,拿出去后就不能随便在其他SoC系统中复用,这就是协议的含义 - 即要以大家约定的方式工作,虽然修改了协议在某个特殊系统中仍然能工作,但是不具备可移植性。