前面的几篇文章介绍了AHB-lite协议。主要内容其实就是文档的介绍加上我自己的一些理解,希望对大家有帮助。今天这篇文章将带来AHB设计需要注意的一些事项,然后带来一个AHB的实战项目AHB2APB转接桥的设计前沿。
1、AHB设计要点和规则
1.1、HREADYOUT和HREADYIN
很多人包括我自己在第一次接触AHB的时候,会被它的两个HREADY信号搞混,分别是HREADYOUT和HREADY(IN)信号。
其中HREADYOUT信号是由Slave发出,送给MUX选择器,用来表示Slave是否已经准备进行真正的数据传输(data phase阶段),例如写操作时,Slave是否可以将数据存下来。本质上是Slave对Master的反压信号。
而HREADYIN,由MUX输出返回到所有的Slave,通知各个Slave,是否还有别的SLAVE有未完成的传输。每个Slave在采样地址和控制信号的时候,都要看这个HREADYIN信号是否为1,如果为0的话则代表别的Slave还有未完成的传输,因此不能采样地址和控制信号。
首先我们思考一个问题,HREADYOUT默认的复位值应该是多少?
- 假设都为0,那么HREADY信号自然也为0。这样返回给所有的Slave的HREADYIN信号就为0,则Slave会认为还存在别的transaction还没有结束。则会一直等待,那么整个系统就会不工作了!这也是很多人设计AHB-Slave的时候会犯的错误。
然后我们再思考一下,如果没有HREADYIN信号会怎么样?
- 假设此时有两个Slave,Slave1和Slave2。没有HREADYIN,则对Slave自身而言。没有人去反压它自己,也就意味着只要HSEL选中它的情况下,它都可以接收控制信号。
假设在T0->T1这个时间段,S1接收了一笔控制信号(ADDR PHASE)。按理来说T1->T2它应该要返回数据或者将写数据存下来(DATA PHASE),但如果S1不能接收,在T1->T2这个时间段S1的HREADYOUT为0同时T1->T2又进入了新的addr phase,假设此时Master选中的是S2,控制信号什么的都发生了变化。那么请问Master在T2->T3这个阶段应该怎么做?
如果Master是看S1,那么S1的HREADYOUT为0,则MASTER会维持住当前的控制信号。但是T2->T3的时候,实际上选中的是S2,那么S2就会接收两笔控制信号。并且还是一模一样的控制信号,如果都是NONSEQ信号,地址还一样,则直接不符合协议报错。
如果Master是看S2,此时S2的HREADYOUT为1,那么Master会变化控制信号和写数据。那么T2->T3的时候写数据变了,则等到S1的hreadyout拉高的时候,它拿不到正确的数据(此时还是针对S1的DATA PHASE)。
其实核心的逻辑在于,如果没有HREADYIN信号,那么HSEL选中的情况下,Slave就可以接收控制信息和数据信息。这个时候Master无论选择哪个Slave的HREADY,都有可能导致其它的Slave接收到错误的信息。还有一点导致这个原因就是AHB具有pipeline传输,当前的CYCLE有可能既是上一个Slave的data pahse也是下一个Slave的addr phase。
因此如果只靠Slave反压master,选择哪个Slave反压Master就成了问题,这样一来,不管选择哪个Slave都会出问题。
1.2、Memory Mapping
AHB slave最小是按照1KB对齐的,也就是译码的结果,只会看1KB以上的地址。
如果没有做好1KB对齐,这时候HSEL信号会同时选中Slave1和Default Slave。这时候自然就不符合预期了。所以应该按照协议的规则,做好1KB对齐。
Default Slave是用来干嘛的?我们做Memory Map的时候,自然不可能所有的地址都覆盖掉。我们需要考虑有一个Default Slave,这样访问缺省地址的时候,会有一个符合你需求的Response。如果没有相关逻辑的话,就会有问题,总线会卡住。
2、AHB2APB同步桥设计前言
我们再看一下这个典型的基于AMBA的SoC子系统,左右两边分别是AHB和APB子系统。两边子系统的时钟频率通常不一样。所以我们才需要两个子系统,那如何建立二者之间的通信。这个时候就需要AHB2APB转接桥实现协议的转换,实际上在SoC设计当中,转接桥是非常常见的。转接桥的设计很大程度上决定了系统的工作能力,做好转接桥的设计需要对转接桥两端的协议都有充分的理解,此外当时钟频率不一样的时候,还会涉及跨时钟域的知识。接下来的文章将通过一系列文章给大家讲解AHB2APB转接桥的设计和相关的跨时钟域的知识。
欢迎和我一起学习AMBA总线,完整的专栏在这里: