【AMBA-APB总线学习】

AMBA-APB总线学习

一、AMBA总线简介

AMBA(Advanced Microcontroller Bus Architecture)是由ARM公司提出的一系列总线协议标准,旨在为芯片系统(SoC)中的不同模块提供高效、可靠的互连通信。其核心特点包括:

  1. 分层架构:包含AHB(高性能总线)、APB(低功耗外设总线)、AXI(可扩展接口)等层次,满足不同带宽和复杂度需求。
  2. 标准化接口:定义了统一的信号命名规则(如AHB信号以H开头,APB以P开头)和时序规范,简化模块集成。
  3. 广泛应用:广泛用于处理器、存储器、外设控制器等模块的连接,是现代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=1PENABLE=0),持续1个时钟周期
ACCESS:完成数据传输(PENABLE=1),根据PREADY决定是否连续传输

状态转移图

3. APB传输时序

APB采用两周期传输模型,所有操作均与时钟上升沿同步:
写操作-无等待

  1. T2(Setup)PSEL=1PENABLE=0,地址/控制信号有效
  2. T3(Access)PENABLE=1 PREADY=1,数据写入从设备
    写操作-无等待

写操作-等待

  1. T2(Setup)PSEL=1PENABLE=0,地址/控制信号有效
  2. T3(Access)PENABLE=1PADDR PWRITE PSEL PENABLE PWDATA 等都需要保持,等待PREADY=1
    在这里插入图片描述

读操作-无等待

  1. T2(Setup)PSEL=1PWRITE=0,地址有效
  2. 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设计
以及腾讯元宝的帮助

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一匹狼呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值