目录
一、简介
1.1 AHB
AHB 是为提出高性能可综合设计的要求而产生的新一代 AMBA 总线。AMBA AHB 是位于 APB 之上新一级的总线并且实现了高性能、高系统时钟频率系统的以下特征要求:
- 突发传输;
- 分块处理;
- 单周期总线主机移交;
- 单时钟沿操作;
- 非三态执行;
- 更宽的数据总线架构(64 位或者 128 位)。
1.2 signal list
Name | Source | To | Description |
---|---|---|---|
HCLK 总线时钟 | clock source | each module | 总线时钟,上升沿采样 |
HRESETn 复位 | reset controller 复位控制器 | each module | 总线复位,低电平有效 |
HADDR[31:0] 地址总线 | Master | decoder mux to slave arbiter | 32位系统地址总线 |
HTRANS[1:0] 传输类型 | Master | mux to slave | 当前传输类型NONSEQ(不连续), SEQ, IDLE, BUSY 2’b00 : IDLE 空闲 2’b01 : BUSY 忙 2’b10 : NONSEQ 非连续 2’b11 : SEQ 连续 |
HWRITE 传输方向 | Master | mux to slave | 1为写传输,0为读传输 |
HSIZE[2:0] 传输大小 | Master | mux to slave | 表示传输的大小,典型情况是字节(8 位)、半字(16 位)或者是字(32 位)。协议允许最大的传输大小可以达到 1024 位。3’b000: 8bits ; 3’b001: 16bits ; 3’b010: 32bits ;3’b011: 64bits ; 3’b100: 128bits ; 3’b101: 256bits ;3’b110: 512bits ; 3’b111: 1024bits |
HBURST[2:0] 突发类型 | Master | mux to slave | 表示传输是否组成了突发的一部分。支持四个、八个 或者 16 个burst节拍的突发传输并且突发传输可以是增量或者是回环。( burst类型,支持4、8、16 burst,incrementing/wrapping。) 3’b000: SINGLE (单个传输burst) 3’b001: INCR (未定义长度的incrementing burst) 3’b010: WRAP4 (4拍wrapping burst) 3’b011: INCR4 (4拍incrementing burst) 3’b100: WRAP8 (4拍wrapping burst) 3’b101: INCR8 (4拍incrementing burst 3’b110: WRAP16 (4拍wrapping burst) 3’b111: INCR16 (16拍incrementing burst) |
HPROT[3:0] 保护控制 | Master | mux to slave | 保护控制信号,需要slave带保护功能,一般不用(提供总线访问的附加信息并且主要是打算给那些希望 执行某种保护级别的模块使用的。这个信号指示当前 传输是否为预取指或者数据传输,同时也表示传输是 保护模式访问还是用户模式访问。对带存储器管理单 元的总线主机而言这些信号也用来指示当前传输是高 速缓存的(cache)还是缓冲的(buffer)。) |
HWDATA[31:0] 写数据总线 | Master | mux to slave | 写数据总线,Master到Slave 。建议最小的数据总线宽度为 32 位。然而,在要 求高带宽运行时扩展(数据总线)还是很容易的。 |
HRDATA[31:0] 读数据总线 | Slave | mux to master | 读数据总线,Slave到Master。建议最小的数据总线宽度为 32 位。 |
HREADY 传输完成 | Slave | mux to master arbiter | 高:Slave指出传输结束 低:Slave需延长传输周期 (注意:总线上的从机要求 HREADY 作为输入输出信号。) |
HRESP[1:0] 传输响应 | Slave | mux to master arbiter | Slave发给Master的总线传输状态OKAY, ERROR, RETRY, SPLIT。 |
HSELx 从机选择 | Decoder 译码器 | slave | slave选择信号 |
AHB仲裁信号
Name | Source | To | Description |
---|---|---|---|
HBUSREQx 总线请求 | Master | arbiter | master给仲裁器的请求获得总线使用权的请求信号,系统中每个master都有一个 HBUSREQx 信号,最多 16 个总线主机。 |
HLOCKx 锁定的传输 | Master | arbiter | 如果一个master希望自己在传输期间不希望丢掉总线,则需要向仲裁器发送这个锁定信号。当该信号为高时表示主机请求锁定对总线的访问并且 在该信号为低之前其他主机不应该被允许授予总线。 |
HGRANTx 总线授予 | arbiter | master | 授权信号,当前bus master x的优先级最高。当HREADY和HGRANTx同时为高时,master获取系统总线的访问权利 |
HMASTER [3:0] 主机号 | arbiter | 具有split功能的slave | 仲裁器为每一个master分配的ID,指出哪个主设备正在进行传输,提供进行split的信息 |
HMASTLOCK 锁定顺序 | arbiter | 具有split功能的slave | 表示当前的master正在执行Locked顺序的传输。这个信号和HMASTER有相同的时序 |
HSPLITx[15:0] 分块完成请求 | slave | arbiter | 从设备用这个信号告诉仲裁器哪个主设备运行重新尝试一次split传输,每一位对应一个主设备 |
1.3 Bus interconnection 总线互联
AMBA AHB 总线协议设计使用一个中央多路选择器互联方案。
使用该方案所有总线主机设备输出地址和控制信号来指示它们想执行的传输同时仲裁器决定哪一个主机能够将它的地址和控制信号连通到所有的从机。
当然也需要一个译码器来控制读数据和响应多路信号选择器,多路信号选择器选中来自传输中所包含从机的适当信号。
1.4 Overview of AMBA AHB operation
1.4.1 Basic transfer
AHB 传输包含两个截然不同的部分:
- 地址阶段:一个周期
- 数据阶段:一个或多个周期,由HBURST信号决定需要几个有效周期,可以由HREADY发出请求延长一个周期。
1.4.1.1 NO WAIT
第一个周期的上升沿:master驱动地址和控制信号;
第二个周期的上升沿:slave采样地址和控制信号,并将HREADY拉高;
- 如果是write操作,master会在第二个周期的上升沿传输要写入的数据;
- 如果是read操作,slave会在HREADY信号拉高后将读取的数据写入总线;
第三个周期的上升沿:
- 如果是write操作,master获取HREADY高信号,表明slave已成功接收数据,操作成功;
- 如果是read操作,master获取HREADY高信号,表明此时的读数据有效并且接收下来,操作成功。
需要注意,HREADY信号在数据有效期间必须为高,并且延续到第三个周期的上升沿之后,确保master的正确采样。
1.4.1.2 WITH WAIT
HREADY信号需要在第二、三个周期拉低,slave不能立即处理,即需要等待两个周期。
注:
- 对写操作而言总线主机必须保持数据在整个扩展周期中稳定。
- 对读传输从机没必要提供有效数据直到传输将要结束时,即在HREADY拉高后给出即可。
1.4.1.3 Multiple transfers 多重传输 多个信号传输(两级流水线)
信号传输最多两个,AHB 两级流水线。
第一个周期:master发起一个操作A,并驱动地址和控制信号;
第二个周期:slave收到了来自总线的请求,将HREADY信号拉高;
- 第二个周期上升沿后,master发现有操作B需要执行,并且检查到上一周期的HREADY为高,则发起第二个操作B;
第三个周期:master获取HREADY信号为高,表示操作A已经完成;
第三个周期上升沿后,master发现有操作C需要执行,并且检查到上一周期的HREADY为高,则发起第三个操作C;
第三个周期上升沿后,slave由于繁忙插入了一个等待状态,将HREADY拉低;
第四个周期:master获取HREADY信号为低,知道slave希望等待,于是master保持和上一拍一样的信号;
- 第四个周期,slave处理完了事务,将HREADY信号拉高,表示可以继续处理;
第五个周期:master获取HREADY信号为高,知道slave已经可以处理B操作;
第五个周期上升沿后,B操作完成;
第六个周期上升沿后,C操作完成。
1.5 Interface description
1.5.1 HRESP[1:0]
在传输中从机通过使用响应信号来表示状态
state | description |
---|---|
OKAY | OKAY 响应用来表示传输进展正常并且当 HREADY 变高时表示传 输成功完成。 |
ERROR | ERROR 响应表示发生了一个传输错误并且传输失败。 |
RETRY 和 SPLIT | RETRY 和 SPLIT 两个传输响应都表示传输不能立刻完成,但是总线 主机应该继续尝试传输。 |
1.5.2 HTRANS[1:0] transfer type
HTRANS[1:0] | Type | Description |
---|---|---|
00 | IDLE | 表示没有数据传输的要求。master 被授予总线,但slave没有传输数据。被选中的slave需要通过HRESP[1:0]返回一个OKAY响应 |
01 | BUSY | 主设备占用总线,但是在burst传输过程中还没有准备好进行下一次传输一次burst传输中间主设备可发BUSY这时slave不会从总线上收取数据而是等待,并且通过HRESP[1:0]返回一个OKAY响应。需要注意的是,这个transfer需要给出下一拍的地址和控制信号,尽管slave不会去采样。 |
10 | NONSEQ | 表示一次突发的第一个传输或者一个单一传输。地址和控制信号和前一次传输无关。 总线上的单一传输被视为(数据量为)一个的突发因此传输类型是非连续的。 |
11 | SEQ | burst中剩下的传输是连续传输并且地址是和前一次传输有关的。控制信息和前一次传输一样。地址等于前一次 传输的地址加上传输大小(字节)。在回环突发的情况 下传输地址在地址边界处回环,回环值等于传输大小乘 以传输的次数(4、8 或者 16 其中之一)。(回环指从传输的结束地址边界跳回到传输的起始地址边界) |
T1:传入地址和控制信号,是burst传输的开始,传输类型位NONSEQ。
T2:master不能立刻执行突发的第二次传输,所以主机使用了BUSY传输来延时下一次传输的开始。
T3:slave采集到了master发来的BUSY,master需要等一拍,slave忽略BUSY传输
T4:master发起第二个传输,同一个BURST的第二个传输,传输类型是SEQ。
T5:slave将HEREADY拉低,master需要等待一个周期。
T8:burst的最后一个传输以无等待状态完成。
1.5.3 HSIZE[2:0]
HSIZE[2:0] | Size | Description |
---|---|---|
000 | 8 bits | Byte |
001 | 16 bits | Halfword |
010 | 32 bits | Word |
011 | 64 bits | - |
100 | 128 bits | 4-word line |
101 | 256 bits | 8-word line |
110 | 512 bits | - |
111 | 1024 bits | - |
**HSIZE[2:0]**被用来和 **HBURST[2:0]**信号一起决定回环突发的地址边界。
1.5.4 HBURST[2:0] 突发操作
增量突发(Incrementing bursts):访问连续地址并且突发中的每次传输地址仅是前一次地址的一个增量
回环突发(wrapping bursts):如果传输的起始地址并未和突发(x 拍)中字节总数对齐那么突发 传输地址将在达到边界处回环。
- 例如,一个四拍回环突发的字(4 字节)访问将在 16 字节边界回环。因此,如果传输的起始地址是 0x34,那么它将包含四个到地址
0x34、0x38、0x3C 和 0x30;
HBURST[2:0] | type | Description |
---|---|---|
000 | SINGLE | Single transfer |
001 | INCR | Incrementing burst of unspecified length 未指定长度的增量突发 |
010 | WRAP4 | 4-beat wrapping burst |
011 | INCR4 | 4-beat increment burst |
100 | WRAP8 | 8-beat wrapping burst |
101 | INCR8 | 8-beat increment burst |
110 | WRAP16 | 16-beat wrapping burst |
111 | INCR16 | 16-beat increment burst |
1.5.4.1 Early burst termination 突发提前终止
例子:
- 图 3.7表示了一个四拍回环突发;
- 图 3.8表示了一个四拍增量突发;
- 图 3.9表示了一个八拍回环突发;
- 图 3.10表示了一个八拍增量突发;
- 图 3.11表示了一个未定长度的突发。
图 3.7表示了一个四拍回环突发并且第一次传输伴随一个附加等待状态。
图 3.8表示了(回环突发)和增量突发的唯一不同,既是地址连续 通过了 16 字节边界。
图 3.10中的突发使用半字传输,所以地址每次增加 2 个字节并且突发在递增因此地址 连续增加通过了 16 字节边界。
图 3.11表示未定义长度的增量突发。
1.5.5 HPROT[3:0] 保护控制信号
保护控制信号,HPROT[3:0],提供总线访问的附加信息并且最初打算是给那些希望执行某种保护级别的模块使用的.
HPROT[3] cacheable高速缓存 | HPROT[2] bufferable带缓存的 | HPROT[1] privileged特权模式 | HPROT[0] data数据/opcode操作码 | Description |
---|---|---|---|---|
- | - | - | 0 | Opcode fetch |
- | - | - | 1 | Data access |
- | - | 0 | - | User access |
- | - | 1 | - | Privileged access |
- | 0 | - | - | Not bufferable |
- | 1 | - | - | Bufferable |
0 | - | - | - | Not cacheable |
1 | - | - | - | Cacheable |
并不是所有总线主机都能产生正确的保护信息,因此建议从机在没有严格必要的情况下不要使用 HPROT 信号。
1.5.6 Address decoding 地址译码
对于每个总线上的从机来说使用一个中央地址译码器提供选择信号,HSELx。选择信号 是高位地址信号的组合译码,并且建议使用简单的译码方案以避免复杂译码逻辑和确保高速操作。
1.5.7 Slave transfer responses HRESP[1:0]
只要从机被访问那它必须提供一个表示传输状态的响应。HREADY 信号被用来扩展传 输并且和响应信号 HRESP[1:0]相结合,以提供传输状态。
HSRESP[1] | HRESP[0] | Response | Description |
---|---|---|---|
0 | 0 | OKAY | 当 HREADY 为高表示传输已经成功完成。OKAY 响应也被用来插入任意一个附加周期,当 HREADY 为 低时,优先给出其他三种响应之一。 |
0 | 1 | ERROR | 该响应表示发生了一个错误。错误条件应该发信号给 总线主机以便让主机意识到传输失败。 一个错误条件需要双周期响应。 |
1 | 0 | RETRY | RETRY(重试)信号表示传输并未完成,因此总线 主机应该重试传输。主机应该继续重试传输直到完成 为止。 要求双周期的 RETRY 响应。 |
1 | 1 | SPLIT | 传输并未成功完成。总线主机必须在下一次被授予访 问总线时重试传输。当传输能够完成时从机将请求代 替主机访问总线。 要求双周期的 SPLIT 响应。 |
仅有 OKAY 响应可以在单个周期里给出。ERROR、SPLIT 和 RETRY 响应需要至少两个周期。
1.5.7.1 Two-cycle response
主机从地址 A 发起传输;
这次传输在接收到响应之前主机将地址移动到 A + 4;
从机在地址 A 不能立刻完成传输因此从机发出一个RETRY 响应。该响指示主机在地址 A 的传输无法完成并且在地址 A + 4 的传输被取消而用空闲传输替代。
RETRY:对 RETRY 而言仲裁器将继续使用常规优先级方案因此只有拥有更高优先级的主机 将获准访问总线;
SPLIT:对于 SPLIT 传输而言仲裁器将调整优先级方案以便其他任何主机请求总线即能获 得访问(总线),即使是优先级较低的主机。为了完成一个 SPLIT 传输从机必须通 知仲裁器何时数据可用。
1.5.8 HWDATA[31:0] and HRDATA[31:0]
1.6 Arbitration 仲裁
1.7 AHB Interface diagram
二、Spec
(1)Function descripton
(2)Interface description
Signal Name | Width | Type Direction | Description |
---|---|---|---|
clk | 1 | input | System clk signal, 50Mhz |
rst | 1 | input | System reset signal,negedge |
cmd_i | 16 | input | [15]:读写指示;1:写,0:读[14:8]:地址位[7:0]:数据位 |
cmd_ready | 1 | output | 信号ready |
cmd_valid | 1 | input | 信号valid |
tx | 1 | output | uart发送数据端 |
rx | 1 | input | uart接收数据端 |
read_valid | 1 | output | 读数据valid |
read_data | 8 | output | 读到的数据 |
(3)Block Diagram
(4)Design detil
- List item
(5)Timing
三、Design and Verification
- RTL
在这里插入代码片
- Test bench
在这里插入代码片