数字IC设计之AHB-Lite总线详解
数字IC设计之AHB-Lite总线详解
导读:本文详细介绍了ARM的AMBA3.0总线协议中的AHB-Lite总线。从其背景、特点、工作模式到具体的信号描述和传输方式,通过大量图表和时序图,帮助读者深入理解这一复杂的总线协议。
AMBA3.0
amba各个家族如图,ahb-lite就是amba3.0家族的,其中的axi3,ahb-lite,apb3都是非常常用的。
学习资料
本次学习参考知乎博主:
官方文档:
这里的protocol的意思就是协议,specification是规范的意思,推荐阅读官方文档,虽然是英文,但是获取的是一手信息,更有助于形成自己的理解。
还有Kimi:
简介
AHB总线全称Advanced High-performance Bus,意为先进高性能总线。推出该总线的目的是补充APB总线在性能上的不足,APB总线适合挂载低速外设,所以AHB总线用来挂载高性能的外设,这样子可以分工合作,节约资源。 AHB总线可以实现多主多从的连接,此时需要设计仲裁机和matrix(矩阵),AHB-Lite一般用于一主多从,此时则不需要仲裁机和matrix,但是也可以用AHB-Lite来实现多主多从,就是设计多个layer,每个layer是一主多从,再把各个layer连起来;
AHB设计模块
上图为一个AHB Bus的设计框图,需要设计多个主机,多个从机,仲裁器,译码器,多路复用器;
AHB-Lite设计模块
需要设计一个主机,多个从机,译码器和多路复用器,这就是整个AHB-Lite的硬件架构;
特点
- 一主多从:简化了整个总线电路架构
- 高带宽操作:所谓高性能就是高带宽和高时钟频率(高速)
- 突发传输:一次指令下传输多笔数据,也对应这着高速
- 单时钟沿触发(后面学习ddr会学习到双沿触发的工作模式);
- 非三态实现:以为会有复杂的mux存在,非三态能避免一些总线传输的冲突吧
- 可配置数据总线高带宽:64至1024bits都是可以的;
- 两级流水线;
工作模式
这张图清晰的介绍了AHB-Lite总线整个系统的工作模式;首先Decoder对Master的地址信号进行译码,通过HSEL-X选择特定的slave来工作,slave接收到了hsel信号,将数据通过HRDATA总线输出,Mux通过decoder传来的select信号决定将对应的hrdata数据route给master,至此完成了本次master与slave的通讯,bus的作用即如此;
模块框图
看看整个总线系统中这四个模块的框图,对于每个信号的具体功能在后面的Singal Description中讲
- Master
主机就是通过地址信号和各个控制信号去发起读写操作; - Slave
从机接收到了主机想要进行通信之后,会向主机回应本次transfer成功还是失败,还可以让主机等待; - Decoder
将地址信号译码assert特定的从机选择信号,并且产生一个控制信号给Mux;但是如果采用多层次设计的话,这个译码功能一般就交由multi-layer实现了; - Multiplexor
将rdata以及从机的响应信号多选一给主机,多层设计是也是交给multi-layer实现;
Operation
文档中叫这个名字,操作,就是在传输中出现的各个情况吧
官方原文,有一些主要的点
传输方式
- 单个:一次传输一笔数据
- 非环绕:具体就是在突发传输的适合你可以设置一个地址边界,非环绕就是在传输到边界时候地址继续递增。比如burst为4,地址那么传输就会直接从地址0、4、8、12增加走;
- 环绕:比如你的地址边界为8,那么传输就会0、4、8,此时到边界了,循环回去,下一笔数据写入地址0,这就是wrap(环绕);
传输阶段
- 地址阶段:一个时钟周期
- 数据阶段:一个或多个周期。这里重要的是多个周期,从机会产生一个HREADY信号,当HREADY为低时,从机就会反压主机,将整个数据阶段拉长,最后通过HRESP信号来向主机表达本次传输成功还是失败(比如超时了就会失败);具体这个多个周期看看时序图:
这就是HREADY为低时从机反压使得主机等待;
这里我想说明一下,以前我学习的对信号的采样要在信号的中间时刻,不要在信号变化时刻,但是图中每次采样都是在信号末尾时刻,这是为何?首先,这个电路都是在HCLK时钟域下进行的,就是同步电路,同步电路的时序主要考虑建立时间和保持时间,建立时间是在时钟边沿到来之前,信号要建立一个稳定值,保持时间是在时钟边沿到来时要有一段时间保持稳定不变,这样才不会被采样到中间那个跳变状态,而A的跳变或者说时建立于保持那个时间段可以看作时A前面那个灰色状态,之后A一直都是稳定的了,肯定就满足建立时间和稳定时间了,所以采样的就是稳定值,在这种reg2reg的同步电路下,只要开始的时序时满足的,后面的时序都是满足的,除非在reg2reg中间插入组合电路;并且从时序图可以看出,信号的变化都是略微滞后于时钟上升沿,这其实就是真实的电路状态,时钟线会有延迟,上升沿到触发器还有一段时间的skew;
多层AHB-Lite
用AHB-Lite总线协议实现多主多从需要设计multi-layer
master1可以访问slave1、2、3,master2可以访问slave1、2、3、4、5,但是一个从机不能同时被多个主机访问,所以对于slave1、2、3需要设计一个arbitration,这个功能也是由multi-layer负责实现;这里补充一个例子来对这个多层设计进行理解:
这是一个简易的SOC,其中DMA是一个较为特殊的外设,因为他即作为CPU的从机,也作为SRAM的主机,这种采用AHB-Lite协议的总线,但是又出现多个主机,就采用多层设计,其中DMA是即有一个slave接口,充当上上图中的AHB-Lite slave4,又具有master接口,充当上上图中的AHB-Lite master1;
SIngal Descriptions
一个通信协议,理解其信号肯定是必不可少的,直接来看官方文档,AHB总线的信号都是以H为前缀
全局信号
时钟和复位信号,时钟是上升沿触发,复位是低电平有效
主机信号
突发传输时AHB总线的一个优点,并且种类很多,位宽为3,一共可以设置8种模式,具体看后面的详解,先知看看信号有哪些;
从机信号
译码器信号
主要是译码总线地址来产生从机的片选信号
复用器信号
这些信号的功能几乎都和APB总线的一样,一些新增的控制信号也是增加了传输的多样性。但是有一个很不一样的点,可以注意到从机信号有一个HRAEADYOUT,复用器有一个HREADY信号,这里出现了两个不同的准备信号,HREADY从文档中是容易理解的,当HREADY拉高,代表这一次传输以及完全结束了,HREADYOUT的描述是拉高时代表总线上的传输完成了,并且可以通过拉低来延长传输。这里从方向上来理解,HREADYOUT是从机发出的,并且可以反压主机,其实这个功能就和APB总线中的PREADY是完全一样的了,就是:告诉主机,写的时候我是否准备好接收数据了,读的时候我是否准备好输出数据了;可以说HREADYOUT拉高时代表传输开始,HREADY拉高是代表整个传输结束,总线回归空闲状态,可以进行下次通讯;
这里找到一个更直观的解释HREADY与HREADYOUT:
HREADYOUT代表着单独的那个从机,HREADY代表所有HREADYOUT的汇总,代表着整个总体;
传输方式
光看信号是空洞的,具体结合该信号在整个通信过程中起到的作用,更能理解其本质;
最基本的传输
看一个通信协议,那时序图是必不可少的
这就是最简单的一次传输;
在地址周期:在HCLK上升沿给出地址信息,并HWRITE拉低(为读);
随即进入数据阶段:在HCLK上升沿在数据总线上更新需要传输的数据,并保持HREADY拉高,在第三个时钟上升沿,master采样到HREADY为高,于是认为此次传输成功;这里可能会想到HREADYOUT信号为什么没来控制数据阶段的等待,我觉得HREADY就是HREADYOUT的结果,先猜一下,后面会详细了解HREADYOUT;
有等待的传输
这是一个比较完整AHB-Lite传输时序图,包含了读写、等待、流水线;中我们可以得到一些信息:
1:传输是两级的pipeline
2:延迟等待带来的副作用,如图:B的数据阶段由于从机没准备好,从正常的1个cycle延迟为3个cycle,于是导致C的地址阶段也被延迟为3个cycle;
传输种类
传输种类就是由信号HTRANS【1:0】决定的,一般这个信号要和突发传输信号HBURST【2:0】互相配合;一共四种传输类型:
HTRANS[1:0] | 类型 | 具体功能 |
---|---|---|
2'b00 | 空闲 | 此时总线不工作,所有控制信号都不起作用 |
2'b01 | 繁忙 | 总线在工作,但是没有数据传输,常用在突发传输时但是没有指定突发长度的时候,在传输最后一个周期的时候用busy这个传输类型,表明这是本次突发传输的最后一笔数据,这个信号几乎不咋用。 |
2'b10 | 非连续 | 每次传输的时候只传输一笔数据,也是一次突发传输的第一笔数据 |
2'b11 | 连续 | 每次传输的时候可以连续传输多个数据,也就是突发传输 |
结合时序图进行分析:
整体来看,在这个过程中一共读了四笔数据;
第一笔数据:T0→T1。就是普通的单笔传输,在T1时刻上升沿,从机检测到了这些控制信号,并在T1→T2周期时将被读取的数据准备好;
T1→T2:此时不传输第二笔数据,于是将HTRANS设置未busy;
第二笔数据:T2→T3,采用连续传输,结合HBURST,是倍增的突发传输方式,地址会自动增加
第三笔数据:T3→T4,继续衔接上一笔的连续传输
第四笔数据:T4→T6,地址自动加一,但是由于控制信号HREADY拉低,使得整个传输过程延迟了一个周期;
T6→T7:从机将最后一笔数据准备好
“锁”传输
由HMASTLOCK控制,就是防止多个主机同时对一个从机进行读写,于是只让其中一个从机发起lock信号,那么此时其他主机的信号都无效,这个用得很少,了解了解得了;
传输的size
这个由HSIZE[2:0]控制,代表着数据总线的位宽,可配置;
记住不要超过总线的位宽了,如果总线是32位宽的,就只能配置000、001、010;
同时hsize信号与hburst信号配合可以配置环绕突发的边界;
hsize信号和地址信号一起被assert,并且hsize信号要一直constant到整个突发传输结束;
突发传输
由信号HBURST[2:0]控制,这是一个非常的重要的功能,只要是告诉的传输,突发传输这个功能几乎是必不可少的;这里再介绍一下一下环绕突发,虽然上面出传输方式那一节已经介绍了,这里再说说hburst是如何与hsize配合的;
比如,我设置的四次连续的突发传输(hburst=3'b010),然后将边界设为16-byte(hsize=3'b010)(就是4x4=16bytes),如果第一个数据的地址是0x34,那么接下来的地址就是0x38,0x3c,如何下一个会环绕回到0x30,因为0x40是边界了,是不允许被碰到的,下一笔数据如果继续递增就是32bit的数据,4byte,地址加4刚好碰到边界,所以就回到0x30;
ok,这个问题我理解了,所谓环绕是围绕着起始地址的,所以我们的环绕中心就是0x34,所以回到0x30,还是有点迷糊,以后懂了再回来补充;
定量的突发最大只能16,要超过16只能用无边界的连续传输,但是要注意一次突发的地址边界最大也不能超过1KB(32位总线就是256个beat),这是协议的规定,一个从机的地址分配是1KB,如果超过了就会访问到另外的从机了;
另外就是协议规定在所有的传输中都需要与地址边界对齐,对齐的边界取决于hsize;比如size是32bit,也就是一个word,那么就采取的字对齐,所以每次地址都必须是4byte进行对齐,地址每次增量为4,一位置addr[1:0]始终为00(每次增4,到头来只是addr[2]加一,低两位始终为0的);
前面讲过在传输过程中,从机通过HREADY发压主机来延长传输时间,同样的主机可以通过在突发传输中插入busy控制信号来延长传输周期;
中止突发
在incr模式中,可以用idle或者nonseq来终止本次突发;
在其他固定长度的突发中,需要用seq信号来终止本次突发;
如果非要提前终止,那么就只能收到从机的error或者是multi-layer发过来的终止信号;
8拍环绕突发
来看个例子吧
这是采用环绕模式读8拍数据;
无论是何种突发模式,第一拍数据都是以nonseq进行传输的,后续才是seq传输;
0x34为起始地址,hsize为word,那么地址边界就在0x40,8拍环绕,那么整个地址环绕为
0x20 0x24 0x28 0x2c 0x30 0x34 0x38 0x3c 0x40(边界)
其他控制信号没啥,都很熟悉了;
有等待的传输
传输过程可以通过从机HREADY来延长传输时间;上图就是有等待的传输;
首先在地址A发起一次单拍的读,这里我有个疑问就是:T1的上升沿那一刻已经检测到HREADY是高,那么接下来就应该把dataA更新出去,为什么拖到T5才provide出去;
然后HREADY拉低,那么把总线放空不打算读了,同时从机也说自己没准备好,把ready拉低,后面到T3主机想传数据了,并且是以INCR4突发,这里需要注意,一旦在HREDAY为低时候改变了传输模式,那么这个htrans必须consist到hready拉高位置,可以看到知道T6Htrans才改变;
有错误的传输
从机会像主机报告一个HRESP信号,其功能等同于APB中的PSLVERR,HRESP只有两个状态:OKAY(LOW),ERROR(HIGH);这里需要注意的就是,报告错误之后还需要一个周期来处理错误,因为当你在T3检测到错误的时候,由于两级流水线,T4的时候已经把地址广播到总线上去了,所以需要再给一个T4的cycle来处理错误,此时讲htrans置为idle,来决定重新发送还是不要这笔数据了;
保护控制信号
HPROT[0],用来告知这次传输时指令还是数据;
HPROT[1],代表是用户访问还是特权访问,比如有些区域的数据是需要很高权限的(例如存操作系统),就不能随便去访问修改,否则会出大问题;
HPROT[2],这个数据能否放在buffer里面,还是必须直接到目的地;
HPROT[3],这个数据能否放在cache里,还是直接到目的地;
大多数ahb设备都不需要protection,直接设置为0001即可;
到此为止,整个AHB-Lite的协议以及各个信号的功能就学完了,后面再学习如何设计一个AHB-Lite system;