3、总线协议分析:AHB协议关键信号与时序分析

AHB总线,说白了就是ARM架构下SoC内部的高速公路。我做了这么多年海思芯片调试,跟AHB打交道最多。今天咱们就聊聊AHB协议里那几个最关键的信号——HADDR、HWDATA、HRDATA、HTRANS,以及它们之间的时序关系。

3.1 HADDR:地址总线的那些坑

HADDR是32位地址总线,这个大家应该都熟。但我在项目中遇到过一个问题——很多人以为HADDR就是直接对应物理地址,其实不然。

AHB协议规定,HADDR必须按字对齐。什么意思?就是低两位永远是0。你想想看,如果HADDR[1:0]不是0,那总线传输就会出问题。我当年调试一个DMA控制器,死活读不到正确数据,最后发现是地址没对齐。

关键点:HADDR[1:0] = 2'b00,这是AHB协议的铁律。

另外,HADDR在流水线中是有延迟的。地址阶段和数据阶段差一个时钟周期。这个特性在做时序分析时特别重要。

3.2 HWDATA与HRDATA:读写数据通道

HWDATA是写数据总线,HRDATA是读数据总线。两者都是32位宽。嗯,这里要注意——写数据和读数据是分开的,所以AHB是典型的全双工总线。

我个人的习惯是,在调试时先看HWDATA是否在正确的时钟沿出现。如果HWDATA在地址阶段就出现了,那肯定是时序错了。正确的做法是:

  • 地址阶段:HADDR有效
  • 数据阶段:HWDATA有效(写操作)或HRDATA有效(读操作)

曾经有一次,我发现HRDATA总是比预期晚一个周期。查了半天,原来是slave端的ready信号没处理好。这个坑我踩过,你们要注意。

调试技巧:用逻辑分析仪抓HWDATA和HRDATA时,一定要同时抓HCLK。没有时钟参考,你根本分不清哪个周期是地址,哪个周期是数据。

3.3 HTRANS:传输类型决定一切

HTRANS是2位信号,表示传输类型。这个信号很多人不重视,但它其实是AHB协议的核心。

HTRANS[1:0] 传输类型 说明
00 IDLE 空闲传输,不传输数据
01 BUSY 忙传输,master暂时无法继续
10 NONSEQ 非连续传输,新的一笔传输开始
11 SEQ 连续传输,用于burst操作

为什么说HTRANS重要?因为它决定了总线仲裁和slave的响应策略。举个例子,如果master发了一个BUSY传输,slave必须保持当前状态,不能释放总线。

我记得有一次调试一个USB控制器,它总是发BUSY信号,导致整个总线效率极低。后来发现是FIFO深度设计不合理,master频繁进入BUSY状态。改完FIFO深度,问题就解决了。

3.4 时序分析:流水线是怎么跑的

AHB的流水线分为两个阶段:地址阶段(Address Phase)和数据阶段(Data Phase)。

地址阶段发生在HCLK的上升沿,master把HADDR和HTRANS放到总线上。数据阶段发生在下一个HCLK上升沿,master或slave把数据放到HWDATA或HRDATA上。

你想想看,这种流水线设计有什么好处?说白了就是提高吞吐量。地址和数据可以并行处理,一个时钟周期内可以同时进行一笔传输的地址阶段和上一笔传输的数据阶段。

注意事项:流水线虽然提高了效率,但也带来了控制复杂度。特别是当slave需要插入等待状态时(HREADY拉低),整个流水线都会暂停。我见过不少工程师在这里栽跟头。

3.5 实战:一个典型的AHB写传输

咱们来看一个实际的例子。假设master要写一个字到地址0x1000_0000,数据是0xA5A5_A5A5。

时钟周期1(地址阶段):
  HADDR = 0x1000_0000
  HTRANS = NONSEQ(10)
  HWRITE = 1(写操作)
  HSIZE = 010(32位传输)
  HBURST = 000(单次传输)

时钟周期2(数据阶段):
  HWDATA = 0xA5A5_A5A5
  HREADY = 1(slave准备好)
  HRESP = OKAY(传输成功)

这个例子看起来简单,但实际调试时你会发现很多细节。比如HREADY信号,如果slave在时钟周期2拉低了HREADY,那数据阶段就要延长一个周期。我曾经遇到一个slave,它的HREADY逻辑有bug,导致总线死锁,整个系统都卡住了。

3.6 避坑指南

最后,我总结几个AHB调试中常见的坑:

  • 地址对齐问题:HADDR低两位必须为0,否则slave会返回ERROR响应
  • HTRANS状态机:NONSEQ后面必须跟SEQ(如果是burst),不能直接跟IDLE
  • HREADY时序:slave必须在数据阶段开始时决定是否插入等待状态,不能中途改变
  • HRDATA采样:读数据必须在HREADY为高时采样,否则数据无效

我曾经因为没注意HREADY的时序,在FPGA验证时浪费了整整两天。从那以后,我每次调试AHB总线,第一件事就是抓HCLK、HADDR、HWDATA、HRDATA、HTRANS和HREADY这六个信号。你想想看,只要这六个信号对了,AHB传输基本就不会出问题。

好了,AHB协议的关键信号和时序分析就讲到这里。下一章咱们聊聊APB总线,那个比AHB简单多了,但坑也不少。