AMBA-AHB的地址译码
前言
地址译码器用于为总线上的每个 slave 提供选择信号 HSELx 。选择信号是通过组合逻辑
对地址码译码产生的,规范建议避免复杂的译码逻辑以保证高速操作。
只在当前的数据传输完成后(HREADY 为高), slave 才会采样地址和控制信号以及
HSELx 。在一定条件下可能出现这样的情况:产生 HSELx 信号而 HREADY 为低,在完成
当前传输后 slave 会改变。
每个 slave 最小的地址空间为 1kB ,所有的 master 的 burst 传输的上限也是 1kB ,如此
设计保证了不会出现地址越界问题。当一个设计不会用到所有的地址空间时,可能出现访问
到一个不存在的地址的情况,这就需要增加一个附加的默认 slave 来为上面的情况提供一个
响应。当 SEQ 或 NONSEQ 传输访问到一个不存在的地址,默认 slave 应该提供 ERROR 响
应;当 IDLE 或 BUSY 传输访问到一个不存在的地址,默认 slave 会提供 OKAY 响应。地址
译码器会带有实现默认 slave 的功能。下图显示典型的地址译码系统和选择信号。

AHB协议地址译码机制详解
1. 地址译码器设计与HSELx生成
地址译码器是AHB总线的核心组件之一,负责根据主设备(Master)发送的地址信号生成从设备(Slave)选择信号 HSELx。其设计遵循以下原则:
-
译码逻辑简化
- 使用高位地址(如
HADDR[31:10]
)进行组合逻辑译码,避免复杂计算以保证高速操作。 - 示例:若从机地址范围为0x0000_0000~0x0000_03FF(1KB),则通过比较地址高22位(
HADDR[31:10]
)确定HSELx。 - 代码实现中通常采用
casez
语句匹配地址范围,确保译码器响应速度。 - 假设系统中有 3个从设备(Slave),地址分配如下: Slave1:地址范围
0x4000_0000 ~ 0x4000_0FFF
(4KB,用于外设寄存器。 Slave2:地址范围0x8000_0000 ~ 0x8000_FFFF
(64KB,用于SRAM)。 Default Slave:处理未映射地址的访问,返回错误响应。
- 使用高位地址(如
module ahb_decoder (input wire HCLK, // 总线时钟input wire HRESETn, // 复位信号(低有效)input wire [31:0] HADDR, // 地址总线input wire HREADY, // 传输完成信号output reg HSEL1, // Slave1选择信号output reg HSEL2, // Slave2选择信号output reg HSEL_DEFAULT // 默认Slave选择信号
);// 地址译码逻辑(组合逻辑)
always @(*) beginif (!HRESETn) beginHSEL1 = 1'b0;HSEL2 = 1'b0;HSEL_DEFAULT = 1'b0;end else if (HREADY) begin// 使用高位地址译码,HADDR[9:0]为从设备内部偏移地址casez (HADDR[31:10])// Slave1: 0x4000_0000 ~ 0x4000_0FFF (4KB)22'b0100_0000_0000_0000_0000_?? : begin // HADDR[31:10] = 20'h40000HSEL1 = 1'b1;HSEL2 = 1'b0;HSEL_DEFAULT = 1'b0;end// Slave2: 0x8000_0000 ~ 0x8000_FFFF (64KB)22'b1000_0000_0000_0000_????_?? : begin // HADDR[31:16] = 16'h8000HSEL1 = 1'b0;HSEL2 = 1'b1;HSEL_DEFAULT = 1'b0;end// 默认Slave处理未映射地址default : beginHSEL1 = 1'b0;HSEL2 = 1'b0;HSEL_DEFAULT = 1'b1;endendcaseend else begin// HREADY为低时保持当前选择信号HSEL1 = HSEL1;HSEL2 = HSEL2;HSEL_DEFAULT = HSEL_DEFAULT;end
endendmodule
-
时序控制与HREADY信号
- HREADY为高时采样:Slave仅在
HREADY=1
(当前传输完成)时采样地址、控制信号及HSELx。 - HREADY为低时稳定:若译码过程中
HREADY=0
(传输未完成),HSELx保持原状态,避免信号跳变导致总线冲突。
- HREADY为高时采样:Slave仅在
2. 1KB地址边界与突发传输限制
-
最小地址空间分配
- 每个Slave的最小地址空间为1KB,起始地址需对齐至1KB边界(如0x0000_0000、0x0000_0400)。
-
1KB地址边界的定义:在AHB协议中,每个从设备的最小地址空间为1KB(即1024字节),这是从设备地址空间的最小粒度。
-
地址边界被划分为多个1KB的区域,例如:
0x0000_0000
到0x0000_03FF
、0x0000_0400
到0x0000_07FF
等。 -
为什么需要1KB地址边界限制?由于AHB协议规定每个从设备的地址空间最小为1KB,如果突发传输跨越了这个边界,可能会错误地访问其他从设备的地址空间,从而导致系统错误甚至致命错误。
-
提高性能和兼容性:限制突发传输不能超过1KB边界,可以避免长时间的突发传输跨越多个从设备,从而降低性能损耗并确保协议的兼容性。
-
突发传输的处理方式!如果突发传输试图跨越1KB边界,则必须将其拆分为两个或多个传输。
-
比如,当传输地址落在1KB边界附近时,需要重新发起新的传输以确保数据正确到达目标地址。例如,如果传输地址为
0x3F00
,而目标地址为0x4000
,则需要将传输拆分为两次传输:第一次传输到0x3F00
,第二次传输到0x4000
。
-
突发传输约束
- 所有Master的突发传输(如INCR、WRAP)不得跨越1KB边界。
- 示例:若INCR4突发起始地址为0x0000_03FC(接近1KB边界),需拆分为两个INCR2突发以避免越界。
3. 默认Slave的响应机制
-
功能定义
- 默认Slave用于处理访问未分配地址空间的请求(如地址映射未填满时)。
- 响应规则:
- SEQ/NONSEQ传输:返回
ERROR
响应,表示无效访问。 - IDLE/BUSY传输:返回零等待周期的
OKAY
响应,避免总线阻塞。
- SEQ/NONSEQ传输:返回
-
实现方式
- 默认Slave通常集成于地址译码器中,作为“兜底”逻辑。
- 示例代码中通过
default
分支处理未匹配地址,返回默认响应。
4. 典型地址译码系统架构
-
模块组成
- 译码器:生成HSELx信号,选择目标Slave。
- 读数据复用器:将选中Slave的读数据回传至Master。
- 默认Slave:处理非法地址访问。
-
时序示意图(图八解析)
- 地址阶段:Master驱动地址后,译码器生成HSELx(基于高位地址)。
- 数据阶段:Slave在
HREADY=1
时采样HSELx并响应数据。 - 异常处理:非法访问触发默认Slave的
ERROR
或OKAY
响应。
关键设计要点总结
设计要素 | 实现规则 | 引用来源 |
---|---|---|
HSELx生成逻辑 | 高位地址译码,避免复杂逻辑 | |
HREADY信号作用 | 控制HSELx采样时机,确保传输完成前信号稳定 | |
1KB地址边界限制 | 防止突发越界,Slave地址空间对齐 | |
默认Slave响应规则 | SEQ/NONSEQ→ERROR;IDLE/BUSY→OKAY | |
译码器代码实现 | 使用casez 语句匹配地址范围,HADDR[9:0] 不参与译码 |
通过以上机制,AHB协议实现了高效、可靠的总线地址管理,同时通过默认Slave和边界约束保障了系统稳定性。