目录
AMBA-APB总线学习
一、AMBA总线简介
AMBA(Advanced Microcontroller Bus Architecture)是由ARM公司提出的一系列总线协议标准,旨在为芯片系统(SoC)中的不同模块提供高效、可靠的互连通信。其核心特点包括:
- 分层架构:包含AHB(高性能总线)、APB(低功耗外设总线)、AXI(可扩展接口)等层次,满足不同带宽和复杂度需求。
- 标准化接口:定义了统一的信号命名规则(如AHB信号以
H
开头,APB以P
开头)和时序规范,简化模块集成。 - 广泛应用:广泛用于处理器、存储器、外设控制器等模块的连接,是现代SoC设计的基础。
二、APB总线详解
APB(Advanced Peripheral Bus)是AMBA协议中专注于低功耗、低速外设连接的子协议,适用于UART、SPI、定时器等简单外设或寄存器配置场景。
1. APB版本演进
APB自1998年推出以来经历了多次升级,主要版本差异如下:
版本 | 新增特性 | 典型应用场景 |
---|---|---|
APB2 | 基础版本,定义PADDR、PWRITE等核心信号 | 早期低速外设 |
APB3 | 增加PREADY (反压信号)、PSLVERR (错误信号) | 需要错误处理的场景 |
APB4 | 新增PPROT (保护信号)、PSTRB (字节选通) | 安全访问、多字节传输 |
APB5 | 增加唤醒指示、用户信号、校验保护等 | 高可靠性系统 |
2. APB核心信号
APB总线信号以P
为前缀,关键信号包括:
• PCLK:全局时钟(上升沿采样)
• PADDR:32位地址总线,支持最大2^32地址空间
• PWRITE:写使能(1为写,0为读)
• PWDATA:32位写数据总线
• PRDATA:32位读数据总线(由从设备驱动)
• PREADY:从设备准备就绪信号(支持反压)
• PSLVERR:传输错误指示(仅在最后一个周期有效)
3. APB状态机
APB状态机包含三个核心状态:
• IDLE:默认状态,无传输进行
• SETUP:发起传输(PSEL=1
、PENABLE=0
),持续1个时钟周期
• ACCESS:完成数据传输(PENABLE=1
),根据PREADY
决定是否连续传输
3. APB传输时序
APB采用两周期传输模型,所有操作均与时钟上升沿同步:
• 写操作-无等待:
- T2(Setup):
PSEL=1
、PENABLE=0
,地址/控制信号有效 - T3(Access):
PENABLE=1
PREADY=1
,数据写入从设备
• 写操作-等待:
- T2(Setup):
PSEL=1
、PENABLE=0
,地址/控制信号有效 - T3(Access):
PENABLE=1
,PADDR
PWRITE
PSEL
PENABLE
PWDATA
等都需要保持,等待PREADY=1
• 读操作-无等待:
- T2(Setup):
PSEL=1
、PWRITE=0
,地址有效 - T3(Access):
PENABLE=1
,从设备输出数据,PREADY=1
后结束
• 读操作-等待:
不再赘述
5. APB设计优势
• 低复杂度:仅4个控制信号,时序简单,适合资源受限场景
• 低功耗:无流水线设计,减少动态功耗
• 易集成:常通过AHB-APB桥与高性能总线互联
三、代码设计
1. master
master代码按照APB状态机设计,只有三个状态,比较简单,状态转移如下(三段状态机)
always@(*)
begin
state_next = S_IDLE;
case(state_now)
S_IDLE : begin
if (req_i )
state_next = S_SETUP;
else
state_next = S_IDLE;
end
S_SETUP : begin
state_next = S_ACCESS;
end
S_ACCESS : begin
if (PREADY && req_i) // have transfer
state_next = S_SETUP;
else if (PREADY && !req_i) // no transfer
state_next = S_IDLE;
else
state_next = S_ACCESS;
end
default:state_next = S_IDLE;
endcase
end
其中req_i是外部读写请求信号。
2. slave
主要参考了第二个连接,不考虑反压的情况,逻辑也比较简单。
写的部分如下,写了4个寄存器(data[0],data[1]…),addr是32bit,高2bit,我用作区分不同的slave地址了,地址解码部分在slave mux
assign wr_sel[0] = (addr[29:2] == 'h0) & write_en ? 1'b1 : 1'b0;
assign wr_sel[1] = (addr[29:2] == 'h1) & write_en ? 1'b1 : 1'b0;
assign wr_sel[2] = (addr[29:2] == 'h2) & write_en ? 1'b1 : 1'b0;
assign wr_sel[3] = (addr[29:2] == 'h3) & write_en ? 1'b1 : 1'b0;
generate
for (i = 0; i < 4; i = i + 1) begin : wr_data_byte
always@(posedge PCLK or negedge PRESETn)
begin
if (!PRESETn)
data[i] <= 32'h0;
else if (wr_sel[i]) begin
if (byte_strobe[0])
data[i][7:0] <= PWDATA[7:0];
else
data[i][7:0] <= data[i][7:0];
if (byte_strobe[1])
data[i][15:8] <= PWDATA[15:8];
else
data[i][15:8] <= data[i][15:8];
if (byte_strobe[2])
data[i][23:16] <= PWDATA[23:16];
else
data[i][23:16] <= data[i][23:16];
if (byte_strobe[3])
data[i][31:24] <= PWDATA[31:24];
else
data[i][31:24] <= data[i][31:24];
end
else
data[i] <= data[i];
end
end
endgenerate
3. slave mux
主要用于一主多从的模式,master到slave的信号通过地址解码,如最高2bit,发送到对应的slave,slave到master的信号也一样。
4. 完整代码以及仿真
链接: 网盘连接 提取码: 1234
四、总结
APB总线凭借其简洁性和低功耗特性,成为SoC中连接低速外设和配置寄存器的理想选择。尽管其带宽和扩展性不及AHB/AXI,但在特定场景下仍不可替代。实际设计中需注意版本兼容性(如APB3/APB4的信号差异)和时序约束。
参考
AMBA APB Protocol Specification
深入理解AMBA总线(二)APB slave设计
以及腾讯元宝的帮助