APB总线协议详解:从协议原理到Slave与Bridge设计实践

发布时间:2026/9/20 8:50:11

APB总线协议详解:从协议原理到Slave与Bridge设计实践 1. 从一个真实场景说起为什么APB总线值得单独拎出来讲做SoC设计的同行大概率都经历过这样的时刻项目里挂了一堆低速外设——UART、I2C、GPIO、看门狗、定时器它们不需要高带宽但对功耗和面积敏感时序也不能太复杂。这时候如果全都挂到AHB或者AXI上就像用高速公路跑三轮车浪费资源还增加验证复杂度。APBAdvanced Peripheral Bus就是为这类场景量身定做的。APB是AMBA总线家族里结构最简单、功耗最低的一员。它不追求流水线不支持突发传输每次传输至少两个周期看起来“慢”但正是这种简单让它在低速外设互联中几乎无处不在。你打开任何一颗MCU或者SoC的框图APB Bridge下面挂着一串外设这几乎是标配。这篇文章面向的是刚接触AMBA总线协议的IC设计、验证、FPGA工程师以及需要理解总线行为来调试外设的嵌入式底层开发者。我会从协议状态机、信号定义、读写时序、APB Bridge设计、Slave实现要点几个维度展开把APB协议里那些文档上写得含糊、实际项目中却经常踩坑的地方讲透。读完你至少能做到看懂APB时序图、自己写一个符合协议的APB Slave、理解Bridge为什么要那样设计、以及在验证中快速定位APB相关的bug。2. APB协议的核心设计思路与版本演进2.1 为什么APB要设计得这么“简单”APB的设计哲学可以用一句话概括用最少的信号和最简单的时序完成低速外设的寄存器读写。它不关心吞吐量关心的是确定性、低功耗和易于集成。具体体现在几个方面。第一APB没有流水线一次传输从Setup到Access至少两个周期地址和数据在时间上错开Slave不需要在同一周期内同时采样地址和数据降低了时序收敛难度。第二APB没有独立的地址通道和数据通道读写共用一套信号靠PWRITE区分方向信号数量少。第三APB不支持outstanding和out-of-orderMaster发出请求后必须等Slave响应行为可预测。这种设计带来的直接好处是Slave端的状态机极其简单通常只需要几个状态功耗低因为信号翻转少验证起来也容易不需要考虑复杂的乱序场景。代价就是带宽低所以APB只适合挂低速外设不适合做高吞吐数据通路。2.2 APB2、APB3、APB4的区别与选型APB协议经历过几个版本实际项目中常见的是APB3和APB4。理解它们的差异对选型很重要。特性APB2APB3APB4基本读写支持支持支持PREADY无有有PSLVERR无有有PPROT无无有PSTRB无无有典型应用早期外设主流外设安全/字节使能场景APB2没有PREADYSlave必须在固定周期内完成响应这在实际中很难做到因为不同外设的访问延迟不同。APB3引入PREADYSlave可以通过拉低PREADY来插入等待周期这大大提高了灵活性。APB4进一步增加了PPROT保护属性和PSTRB字节选通PPROT用于区分安全/非安全访问PSTRB用于支持字节粒度的写操作。选型建议很直接如果外设访问延迟固定且短APB2够用绝大多数场景用APB3如果涉及安全域隔离或者需要字节写使能选APB4。现在新设计的SoC基本都直接上APB4向下兼容。2.3 APB在AMBA体系中的位置AMBA家族里AXI面向高带宽高频率场景AHB面向中高性能场景APB面向低速外设。一个典型的SoC互联结构是CPU通过AXI访问DDR和高速外设通过AHB访问中速模块再通过APB Bridge把AHB或AXI的传输转换成APB挂低速外设。APB Bridge在这里扮演翻译官的角色。它把上游总线AHB/AXI的传输请求转换成APB的Setup-Access两阶段时序同时处理位宽转换、地址译码、响应回传。理解Bridge的设计就理解了APB协议在实际系统中如何落地。3. APB信号定义与状态机详解3.1 信号清单与每个信号的职责APB的信号数量不多但每个都有明确职责。下面按方向分类说明。系统信号PCLK时钟所有传输同步于此时钟。PRESETn复位低有效。注意是异步复位同步释放还是纯同步复位取决于设计约定但协议要求复位后状态机回到IDLE。MasterBridge输出信号PSEL片选Master在Setup阶段拉高表示选中某个Slave。PENABLE使能Master在Access阶段拉高表示传输进入访问阶段。PADDR地址在Setup阶段有效Access阶段保持。PWRITE方向1表示写0表示读。PWDATA写数据在Access阶段有效。PSTRB字节选通APB4引入每bit对应PWDATA的一个字节。PPROT保护属性APB4引入指示访问的特权级别和安全属性。Slave输出信号PREADY就绪Slave拉高表示传输完成。可以拉低插入等待周期。PRDATA读数据在Access阶段且PREADY为高时有效。PSLVERR错误指示Slave拉高表示传输出错。这里有个容易混淆的点PSEL和PENABLE的时序关系。PSEL在Setup阶段拉高PENABLE在下一个周期拉高两者在Access阶段同时为高。Slave应该在PSEL和PENABLE同时为高时采样地址和控制信号在PREADY为高时完成传输。3.2 状态机IDLE、SETUP、ACCESS三态流转APB的状态机只有三个状态但每个状态的职责和转移条件必须搞清楚。IDLE默认状态PSEL和PENABLE都为低。当Master有传输请求时进入SETUP。SETUPPSEL拉高PENABLE保持低PADDR、PWRITE、PWDATA写有效。这个状态持续一个周期下一个周期无条件进入ACCESS。注意SETUP阶段是固定的一个周期不能插入等待。ACCESSPSEL和PENABLE同时为高。Slave在这个阶段采样控制信号如果PREADY为低保持在这个状态PREADY为高时传输完成。如果是写操作PWDATA在此时被Slave采样如果是读操作PRDATA在此时由Slave驱动。传输完成后如果还有连续传输状态机回到SETUP如果没有回到IDLE。这里有个细节连续传输时SETUP阶段仍然是一个周期但PSEL可以保持高PENABLE在SETUP阶段必须拉低。状态转移可以用下面的表来描述当前状态条件下一状态IDLE有传输请求SETUPSETUP无条件ACCESSACCESSPREADY0ACCESSACCESSPREADY1且有后续传输SETUPACCESSPREADY1且无后续传输IDLE3.3 PREADY与PSLVERR的正确使用姿势PREADY是APB3引入的关键信号它让Slave可以控制传输节奏。但用不好会出问题。PREADY的默认行为如果Slave永远不拉低PREADY那么每次传输固定两个周期SETUP一个ACCESS一个。这适合访问延迟固定的外设比如寄存器读写。需要插入等待周期的场景外设访问需要多个周期比如从慢速存储器读数据、等待PLL锁定、跨时钟域同步。这时候Slave在ACCESS阶段拉低PREADYMaster保持PSEL、PENABLE和所有控制信号不变直到PREADY拉高。注意PREADY拉低期间PADDR、PWRITE、PWDATA、PSTRB、PPROT必须保持不变否则Slave可能采样到错误值。这是验证中经常发现的bug来源。PSLVERR的使用要谨慎。协议规定PSLVERR只在传输的最后一个周期PREADY为高的那个周期有效。Slave在检测到错误时在PREADY拉高的同时拉高PSLVERR。Master收到PSLVERR后如何处理取决于Master的设计——可以产生中断可以记录错误状态也可以忽略。但要注意PSLVERR不是必须的很多简单外设直接把它接地。4. APB读写时序深度解析4.1 无等待写传输时序写传输是最基本的场景。假设Slave不需要插入等待周期时序如下周期1SETUPPSEL1PENABLE0PADDR目标地址PWRITE1PWDATA写数据PSTRB字节选通。周期2ACCESSPSEL1PENABLE1PADDR保持PWRITE保持PWDATA保持PREADY1。Slave在此时采样PWDATA并写入。周期3如果没有后续传输PSEL0PENABLE0回到IDLE。这里的关键点是PWDATA在SETUP阶段就已经有效并且在ACCESS阶段保持。Slave可以在ACCESS阶段采样也可以在SETUP阶段就准备好接收逻辑。但协议推荐在ACCESS阶段且PREADY为高时采样。4.2 带等待周期的读传输时序读传输稍微复杂一点因为PRDATA是由Slave驱动的。假设Slave需要插入两个等待周期周期1SETUPPSEL1PENABLE0PADDR目标地址PWRITE0。周期2ACCESS等待1PSEL1PENABLE1PREADY0。Slave此时还没有准备好数据PRDATA无效。周期3ACCESS等待2PSEL1PENABLE1PREADY0。Slave继续准备数据。周期4ACCESS完成PSEL1PENABLE1PREADY1PRDATA有效数据。Master在此时采样PRDATA。周期5传输结束PSEL0PENABLE0。提示Slave驱动PRDATA的时机可以在PREADY拉高的前一个周期就开始但Master只在PREADY为高的周期采样。为了时序余量很多设计会提前驱动PRDATA。4.3 连续传输与背靠背操作连续传输时APB的状态机在ACCESS完成后回到SETUP而不是IDLE。这意味着PSEL可以保持高但PENABLE必须拉低一个周期。假设连续两次写传输第一次无等待第二次也无等待周期1SETUP1PSEL1PENABLE0PADDRAddr1PWRITE1PWDATAData1。周期2ACCESS1PSEL1PENABLE1PREADY1传输1完成。周期3SETUP2PSEL1PENABLE0PADDRAddr2PWRITE1PWDATAData2。周期4ACCESS2PSEL1PENABLE1PREADY1传输2完成。周期5PSEL0PENABLE0回到IDLE。注意周期3的PENABLE必须为0这是SETUP阶段的定义。如果PENABLE在周期3仍然为1Slave会误认为这是ACCESS阶段的延续导致错误。4.4 PSTRB与PPROT的实际应用PSTRB是APB4引入的字节选通信号位宽等于数据总线位宽除以8。对于32位数据总线PSTRB是4位每bit对应一个字节。PSTRB[i]1表示PWDATA的第i个字节有效。这个信号在什么场景下有用比如一个32位寄存器你只想写低16位不想影响高16位。没有PSTRB时你需要先读出来修改低16位再写回去。有了PSTRB直接写Slave根据PSTRB只更新对应的字节。PPROT是保护属性通常3位指示访问的特权级别用户/特权和安全属性安全/非安全。在TrustZone等安全架构中PPROT用于让Slave判断是否允许访问。如果Slave收到非安全访问但寄存器是安全的可以返回PSLVERR。这两个信号在简单外设中经常被忽略但在安全敏感或者需要精细控制的场景中很重要。设计Slave时即使不用也要把它们纳入端口列表保持接口兼容。5. APB Bridge设计要点与实操5.1 Bridge的核心职责APB Bridge是连接上游总线AHB/AXI和APB的桥梁。它的核心职责包括第一协议转换。把上游的传输请求转换成APB的SETUP-ACCESS时序。上游可能是流水线式的APB是两阶段的Bridge需要做状态机转换。第二地址译码。根据PADDR判断选中哪个Slave生成对应的PSEL。通常每个Slave有独立的PSEL信号。第三位宽转换。上游数据总线可能是64位或128位APB通常是32位。Bridge需要把宽数据传输拆分成多次APB传输。第四响应回传。把APB的PREADY和PSLVERR转换成上游总线能理解的响应信号。5.2 地址译码与PSEL生成地址译码是Bridge设计中最容易出bug的地方。假设系统有4个APB Slave地址映射如下Slave地址范围PSEL信号UART0x4000_0000 - 0x4000_0FFFPSEL0I2C0x4000_1000 - 0x4000_1FFFPSEL1GPIO0x4000_2000 - 0x4000_2FFFPSEL2TIMER0x4000_3000 - 0x4000_3FFFPSEL3译码逻辑取PADDR的高位进行比较。比如地址范围是4KB那么比较PADDR[31:12]。如果PADDR[31:12]等于0x40000选中UART等于0x40001选中I2C以此类推。注意译码逻辑要考虑地址对齐和边界情况。如果PADDR落在未映射区域应该返回PSLVERR而不是让PSEL悬空。很多系统挂死就是因为访问了未映射地址Bridge没有返回错误Master一直等PREADY。5.3 位宽转换与数据拆分当上游数据总线宽于APB数据总线时Bridge需要做数据拆分。比如上游64位APB 32位一次64位写需要拆成两次32位APB写。拆分逻辑根据地址的低位判断。如果地址是8字节对齐第一次写低32位第二次写高32位。PSTRB也要相应拆分。读操作类似两次APB读然后拼接成64位返回给上游。这里要注意顺序先读低32位还是高32位取决于上游总线的要求。通常先读低地址。位宽转换会增加传输延迟因为一次上游传输变成了多次APB传输。在性能敏感的场景要评估这种延迟是否可接受。5.4 一个可综合的Bridge状态机示例下面是一个简化的APB Bridge状态机用Verilog描述。这个例子假设上游是AHB只做协议转换不做位宽转换。module apb_bridge_fsm ( input wire HCLK, input wire HRESETn, input wire htrans_valid, input wire hwrite, input wire [31:0] haddr, input wire [31:0] hwdata, output reg hready, output reg [31:0] hrdata, output reg psel, output reg penable, output reg [31:0] paddr, output reg pwrite, output reg [31:0] pwdata, input wire pready, input wire [31:0] prdata ); localparam IDLE 2b00; localparam SETUP 2b01; localparam ACCESS 2b10; reg [1:0] state, next_state; always (posedge HCLK or negedge HRESETn) begin if (!HRESETn) state IDLE; else state next_state; end always (*) begin next_state state; case (state) IDLE: begin if (htrans_valid) next_state SETUP; end SETUP: begin next_state ACCESS; end ACCESS: begin if (pready) next_state htrans_valid ? SETUP : IDLE; end endcase end always (posedge HCLK or negedge HRESETn) begin if (!HRESETn) begin psel 1b0; penable 1b0; paddr 32b0; pwrite 1b0; pwdata 32b0; hready 1b1; hrdata 32b0; end else begin case (next_state) IDLE: begin psel 1b0; penable 1b0; hready 1b1; end SETUP: begin psel 1b1; penable 1b0; paddr haddr; pwrite hwrite; pwdata hwdata; hready 1b0; end ACCESS: begin psel 1b1; penable 1b1; if (pready) begin hrdata prdata; hready 1b1; end end endcase end end endmodule这个状态机展示了Bridge的核心逻辑IDLE等待请求SETUP建立地址和控制信号ACCESS等待PREADY并回传数据。实际项目中还需要加上地址译码、PSLVERR处理、位宽转换等模块。6. APB Slave实现要点与常见坑6.1 Slave的典型结构一个APB Slave通常包含以下部分接口逻辑采样PSEL、PENABLE、PADDR、PWRITE、PWDATA、PSTRB。地址译码判断访问的是哪个寄存器。寄存器组存储配置和状态。读数据多路选择根据地址选择PRDATA。响应生成生成PREADY和PSLVERR。对于简单的外设比如GPIOSlave可能只有几个寄存器逻辑很简单。对于复杂外设比如DMA控制器寄存器数量多但APB接口部分仍然是这套结构。6.2 写操作的实现细节写操作的关键是在ACCESS阶段且PREADY为高时根据PADDR译码把PWDATA写入对应寄存器。如果有PSTRB还要根据PSTRB逐字节更新。一个常见的错误是在SETUP阶段就写入寄存器。虽然PWDATA在SETUP阶段已经有效但协议推荐在ACCESS阶段写入。原因是如果Slave需要插入等待周期SETUP阶段可能被延长实际上SETUP固定一个周期但ACCESS可能多个周期在SETUP写入可能导致重复写入。另一个细节是PSTRB的处理。如果PSTRB[i]0对应的字节不应该被更新。实现时可以用掩码always (posedge PCLK or negedge PRESETn) begin if (!PRESETn) begin reg0 32b0; end else if (psel penable pready pwrite addr_match) begin reg0[7:0] pstrb[0] ? pwdata[7:0] : reg0[7:0]; reg0[15:8] pstrb[1] ? pwdata[15:8] : reg0[15:8]; reg0[23:16] pstrb[2] ? pwdata[23:16] : reg0[23:16]; reg0[31:24] pstrb[3] ? pwdata[31:24] : reg0[31:24]; end end6.3 读操作的实现细节读操作的关键是在ACCESS阶段且PREADY为高时根据PADDR选择PRDATA。如果Slave需要等待周期可以在ACCESS阶段先拉低PREADY准备好数据后再拉高。一个常见问题是PRDATA的驱动时机。如果Slave在PSEL拉高之前就驱动PRDATA可能会和总线上的其他Slave冲突。正确的做法是只有在PSEL和PENABLE都为高时才驱动PRDATA其他时候保持高阻或默认值。对于需要多个周期才能读出数据的外设比如ADCSlave可以在ACCESS阶段拉低PREADY启动转换转换完成后拉高PREADY并给出数据。但要注意PREADY拉低期间Master会一直等待如果Slave永远不拉高PREADY系统就挂死了。所以要有超时机制或者保证一定能完成。6.4 PREADY的生成策略PREADY的生成策略直接影响传输效率。常见策略有固定延迟Slave总是固定几个周期后拉高PREADY。适合访问延迟固定的外设。实现简单但效率不是最优。基于状态Slave根据内部状态决定何时拉高PREADY。比如等待FIFO非空、等待PLL锁定。灵活但需要仔细设计状态机。组合逻辑PREADY直接由组合逻辑生成比如地址命中就立即拉高。速度快但可能产生毛刺需要寄存。提示PREADY如果是组合逻辑输出要确保在PSEL和PENABLE有效时才有效避免误触发。推荐用寄存器输出虽然多一个周期延迟但时序更干净。6.5 PSLVERR的生成场景PSLVERR不是必须的但在以下场景建议使用访问了未定义的地址偏移。访问了只读寄存器但执行了写操作。安全属性不匹配PPROT指示非安全访问但寄存器是安全的。外设内部错误比如FIFO溢出。生成PSLVERR时要在PREADY拉高的同一个周期拉高PSLVERR。Master收到后可以产生中断或记录错误。注意PSLVERR只对当前传输有效下一个传输要重新评估。7. 常见问题与排查技巧实录7.1 传输挂死PREADY永远不拉高这是APB调试中最常见的问题。现象是Master发出传输后PSEL和PENABLE一直为高PREADY一直为低系统挂死。排查思路首先看Slave的PREADY生成逻辑是不是有条件没满足。比如Slave在等一个外部信号但那个信号一直没来。其次看地址译码是不是PSEL选中的Slave根本不存在或者没使能。如果PSEL选中了一个未初始化的Slave它可能永远不响应。解决方法在Bridge中加入超时机制如果PREADY超过一定周期不拉高强制返回PSLVERR。或者在Slave中确保所有路径都能拉高PREADY。7.2 数据错误采样时机不对现象是读出的数据不对或者写入的数据没生效。常见原因是采样时机错误。对于写操作Slave应该在ACCESS阶段且PREADY为高时采样PWDATA。如果在SETUP阶段采样可能采到旧数据。对于读操作Master应该在ACCESS阶段且PREADY为高时采样PRDATA。如果提前采样可能采到无效数据。排查方法用波形图确认采样时刻。在PREADY为高的那个时钟沿检查PWDATA和PRDATA是否有效。7.3 连续传输时的状态机错误现象是连续传输时第二次传输失败。常见原因是状态机在ACCESS完成后没有正确回到SETUP或者PENABLE没有在SETUP阶段拉低。排查方法检查状态机的转移条件。ACCESS完成后如果有后续传输必须回到SETUP并且PENABLE在SETUP阶段必须为0。如果PENABLE保持为1Slave会认为还是ACCESS阶段导致时序混乱。7.4 地址译码错误现象是访问某个外设时另一个外设被选中。常见原因是地址范围重叠或者译码逻辑错误。排查方法列出所有Slave的地址范围确认没有重叠。检查译码逻辑的比较位数是否正确。比如4KB范围应该比较PADDR[31:12]如果比较了PADDR[31:10]范围就变成了16KB可能重叠。7.5 常见问题速查表问题现象可能原因排查方法解决方法传输挂死PREADY不拉高检查Slave状态机加超时或确保响应数据错误采样时机不对看波形确认采样沿在PREADY高时采样连续传输失败状态机未回SETUP检查状态转移确保PENABLE在SETUP为0选错Slave地址译码错误检查地址范围修正译码逻辑PSLVERR误报错误条件太宽松检查错误生成逻辑收紧错误条件7.6 独家避坑技巧第一个技巧在Bridge中加一个APB传输计数器统计每个Slave的传输次数和等待周期数。调试时一眼就能看出哪个Slave响应慢。第二个技巧Slave的PREADY用寄存器输出不要用组合逻辑。组合逻辑容易产生毛刺而且在跨时钟域时不可靠。第三个技巧验证时写一个APB monitor自动检查协议违规比如PENABLE在SETUP阶段为高、PREADY拉低期间控制信号变化等。这比人工看波形效率高得多。第四个技巧地址译码用casez而不是case方便处理地址掩码。比如casez (paddr[31:12]) 20h40000: psel0 1; ...。第五个技巧如果Slave需要跨时钟域PREADY的同步要用握手信号不要直接打两拍。因为PREADY拉低期间Master会保持请求直接打两拍可能导致PREADY提前释放。8. 验证环境搭建与协议检查要点8.1 一个轻量级APB验证环境APB验证不需要像AXI那样复杂的VIP一个简单的master agent和slave agent就能覆盖大部分场景。Master agent负责发起读写Slave agent负责响应外加一个monitor检查协议。Master agent的核心是一个任务按SETUP-ACCESS时序驱动信号task apb_write(input [31:0] addr, input [31:0] data); (posedge PCLK); psel 1b1; penable 1b0; paddr addr; pwrite 1b1; pwdata data; (posedge PCLK); penable 1b1; wait (pready 1b1); (posedge PCLK); psel 1b0; penable 1b0; endtask读任务类似只是在ACCESS阶段采样PRDATA。8.2 协议检查的关键点Monitor需要检查以下协议规则PSEL拉高后PENABLE必须在下一个周期拉高。PENABLE拉高期间PSEL必须保持高。PREADY拉低期间PADDR、PWRITE、PWDATA、PSTRB、PPROT必须保持不变。PSLVERR只在PREADY为高的周期有效。传输结束后PSEL和PENABLE必须同时拉低或进入下一个SETUP。这些检查可以用断言assertion实现也可以用monitor中的if语句实现。断言更简洁但需要仿真器支持。8.3 覆盖率收集APB验证的覆盖率包括地址覆盖每个Slave的每个寄存器都访问到。传输类型覆盖读、写、读写交替。等待周期覆盖0等待、1等待、多等待。错误覆盖PSLVERR的各种触发条件。PSTRB覆盖所有字节组合。覆盖率收集的目的是确保验证的完备性。APB协议简单但边界情况不少比如PSTRB全0、地址边界、连续传输等。9. 从APB到AHB、AXI的对比与选型思考9.1 三种总线的核心差异特性APBAHBAXI流水线无有有突发传输不支持支持支持乱序不支持不支持支持信号数量少中多带宽低中高典型场景低速外设中速模块高速数据通路APB的优势是简单、低功耗、易集成。AHB在APB的基础上增加了流水线和突发提高了带宽。AXI进一步增加了独立的读写通道和乱序适合高并发场景。9.2 什么时候该用APB判断标准很简单如果外设的访问频率低、数据量小、对延迟不敏感用APB。比如UART的配置寄存器、I2C的速率设置、GPIO的方向控制这些都是典型的APB场景。如果外设需要高带宽比如DMA、以太网MAC、USB控制器那就不能用APB要用AHB或AXI。APB的带宽瓶颈在于每次传输至少两个周期而且不支持突发实际有效带宽很低。9.3 APB Bridge的性能优化虽然APB本身慢但Bridge可以做些优化。比如写缓冲Bridge可以缓冲多个写请求然后连续发给Slave减少SETUP阶段的开销。读预取对于连续读Bridge可以预取下一个地址的数据。位宽匹配如果上游和APB位宽一致省去拆分逻辑减少延迟。但这些优化要谨慎因为APB协议本身不支持乱序优化不能改变传输的顺序语义。10. 实际项目中的APB设计体会我在多个SoC项目中负责过APB子系统的设计和验证踩过的坑不少。最大的体会是APB协议本身很简单但简单的东西往往容易被忽视而忽视的代价就是调试时的大把时间。比如PREADY的时序文档上就一句话“Slave通过PREADY控制传输完成”但实际实现时PREADY的生成逻辑、跨时钟域处理、超时保护每一个都需要仔细考虑。我见过一个项目因为PREADY在复位后没有默认拉高导致系统启动时第一次APB访问就挂死。另一个体会是地址译码的重要性。APB的地址译码通常在Bridge里做但Slave内部也有地址译码。两层译码要一致否则会出现Bridge选中了Slave但Slave内部译码没命中导致PREADY不拉高。这种bug很难查因为从波形上看PSEL已经拉高了但Slave就是不响应。还有PSLVERR的处理。很多设计为了省事直接把PSLVERR接地。这在简单系统中没问题但在复杂系统中未映射地址访问如果不返回错误Master会一直等最终导致系统挂死。建议至少在Bridge层面做未映射地址检测返回PSLVERR。最后分享一个调试小技巧在APB总线上挂一个protocol checker实时打印每次传输的地址、数据、等待周期数。调试时打开log一眼就能看出哪次传输异常。这个checker用Verilog写也就几十行但省下的调试时间是以天计的。APB协议的内容远不止这些比如低功耗设计中的时钟门控、APB在安全架构中的角色、多Master场景下的仲裁等都是可以深入的方向。但把上面这些基础打牢实际项目中遇到的APB问题基本都能覆盖。
延伸阅读

更多相关文章

2026/9/20 8:50:11

Windows代码28真相:驱动签名与硬件ID匹配原理

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/20 8:50:11

Lumina-PMD人形机器人ROS2仿真平台实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/20 8:50:11

Linux驱动自动加载完全指南:modprobe、depmod与MODALIAS机制解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/20 12:15:37

Codex 连上 TaoToken 后,Spring Boot 分页重构能推进到哪一步

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/20 12:15:37

MCP 客户端联调,Cursor 的 Base URL 填 TaoToken

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/20 12:15:37

B站视频下载全攻略:从ID体系到yt-dlp本地解析实操

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/20 0:04:49

GAMP 5 基于风险的计算机化系统验证:软件分类与审计追踪实践

简介:《A Risk-Based Approach to Compliant GxP Computerized Systems》即业内熟知的GAMP 5指南,面向制药企业质量与IT合规人员、验证工程师及计算机化系统管理者,用于解决GxP法规环境下系统合规性难以科学落地的问题。文档以风险管理为主线…

2026/9/20 0:04:49

安全托管MSSP实战:从静态防御到人机协同的攻防运营与应急响应

简介:这份PPT围绕互联网业务安全托管服务展开,面向企业安全负责人、IT运维人员及关注MSSP/MSS选型的读者,重点回应传统安全过度依赖人工、碎片化静态防御难以对抗产业化攻击等痛点。资源共1个pptx文件,包体约30.63MB,以…

2026/9/20 0:04:49

GAMP 5 基于风险的计算机化系统验证:软件分类与审计追踪实践

简介:《A Risk-Based Approach to Compliant GxP Computerized Systems》即业内熟知的GAMP 5指南,面向制药企业质量与IT合规人员、验证工程师及计算机化系统管理者,用于解决GxP法规环境下系统合规性难以科学落地的问题。文档以风险管理为主线…

2026/9/20 0:04:49

安全托管MSSP实战:从静态防御到人机协同的攻防运营与应急响应

简介:这份PPT围绕互联网业务安全托管服务展开,面向企业安全负责人、IT运维人员及关注MSSP/MSS选型的读者,重点回应传统安全过度依赖人工、碎片化静态防御难以对抗产业化攻击等痛点。资源共1个pptx文件,包体约30.63MB,以…

2026/9/20 4:54:47

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/20 5:01:23

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/20 5:09:33

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码