AHB总线协议详解

发布时间:2023-05-20

一、AHB总线协议概述

AHB(Advanced High-performance Bus)总线协议是一种用于高性能、低功耗和高带宽内部总线的标准协议。它最初由ARM公司提出,由于其在ARM处理器和其他外围设备中的广泛应用,现已成为业界标准。AHB总线协议主要是为了提高系统的总线带宽,因此它具有高效性和低延迟性,在芯片内部的系统集成中广泛应用。 AHB协议规定了物理和协议的特征,包括总线的位宽、时序和控制信号等等。它针对高效率系统的需求设计,同时还提供了多个可编程的特性,如分块传输、响应优先级控制、寄存器中断等等。

二、AHB总线协议特性

1、总线结构

在AHB总线协议中,主设备(Masters)和从设备(Slaves)之间使用一个总线进行通信。总线上可以有多个主设备和多个从设备,但同一时刻只有一个主设备能够访问总线。从设备响应主设备的传输请求。

// 主设备对总线上一个从设备读取数据的代码示例
HREAD addr[31:0];  // 地址线
HREADYOUT;         // 从设备已经做好了相应准备
// 使能信号
if (HSEL && HTRANS[1:0] == '10' && HREADY)
begin
    // 数据传输
end

2、传输类型

AHB总线协议支持多种传输类型,包括单次传输、多次传输、同步传输和非同步传输等。

// AHB总线协议的传输类型代码示例
parameter HTRANS_IDLE   = 2'b00;  // 空闲
parameter HTRANS_SINGLE = 2'b01;  // 单次传输
parameter HTRANS_INCR   = 2'b10;  // 递增传输
parameter HTRANS_WRAP   = 2'b11;  // 循环传输

3、传输时序

在AHB总线协议中,总线的传输时序是非常重要的。它定义了主设备和从设备之间的交互,包括控制信号和数据传输等。具体的时序如下:

// AHB总线协议的传输时序代码示例
// 控制信号
input HCLK;           // 时钟信号
input HRESETn;        // 复位信号
output HSEL;          // 从设备使能信号
output [1:0] HTRANS;  // 传输类型
output HMASTLOCK;     // 主设备锁
output [31:0] HADDR;  // 地址线
output [2:0] HSIZE;   // 数据块大小
output [1:0] HBURST;  // 传输突发模式
// 数据传输
input [31:0] HRDATA;  // 读数据
output [31:0] HWDATA; // 写数据
output HSPLIT;        // 写数据分裂
// 响应信号
input HREADY;         // 就绪信号
input HRESP;          // 响应信号

三、AHB总线协议操作过程

在使用AHB总线协议进行通信时,通常的操作过程如下:

  1. 主设备发起一次传输请求,从设备在收到这个请求后,准备发送响应信号,同时发送就绪信号,告诉主设备它可以开始传输了。
  2. 主设备准备就绪后,开始传输数据。如果是写操作,主设备将数据写入数据线,并发送写数据使能信号,让从设备知道数据已经到达。
  3. 从设备收到数据,根据情况发送响应信号,以及下一次传输的地址(如果是递增或循环传输)。
// AHB总线协议的操作过程代码示例
// 主设备发起传输请求
HADDR = addr;
HSIZE = size;
HTRANS = trans_type;
HWRITE = write_enable;
HMASTER = master_id;
HPROT = protection; 
HREADY = 1;
// 从设备处理传输请求并准备响应
if (HSEL && HREADY && HTRANS[1:0] != HTRANS_IDLE)
begin
    // 写数据
    if (HWRITE)
    begin
        HWDATA = data;
        HWRITE = 0;
        HSIZE = 'b010;  // 4字节传输
        HREADY = 1;
        // 发送响应信号
        HRESP = OKAY;
    end
    // 读数据
    else
    begin
        HRDATA = read_data;
        HSIZE = 'b010;
        HREADY = 1;
        // 发送响应信号和下一个传输地址
        HRESP = OKAY;
        HADDR = next_addr;
    end
end

四、AHB总线协议的分块传输

为了支持大块的数据传输,AHB协议提供了分块传输的特性。当传输数据量较大时,可以将数据分成若干数据块,从而提高传输效率。 在分块传输模式下,源地址和目的地址在第一次传输时只需指定一次,后续传输指令只需要改变不同的传输块的地址偏移。由于地址的计算是由总线控制器自动完成的,因此在一次传输中,不需要CPU参与。

// AHB总线协议的分块传输代码示例
// 源地址和目的地址
parameter SOURCE_ADDR = 'h10000000;
parameter DEST_ADDR   = 'h20000000;
// 数据块大小
parameter BLOCK_SIZE  = 1024;
// 发送
for (i = 0; i < DATA_LENGTH / BLOCK_SIZE; i++)
begin
    transfer_type = i == 0 ? HTRANS_SINGLE : HTRANS_INCR;
    transfer_addr = i * BLOCK_SIZE;
    transfer_data = data[i * BLOCK_SIZE : (i+1) * BLOCK_SIZE - 1];
    // 传输数据块
    ahb_transfer(SOURCE_ADDR + transfer_addr, DEST_ADDR + transfer_addr, BLOCK_SIZE, transfer_data, transfer_type);
end

五、AHB总线协议的优先级

为了解决多个主设备同时请求总线的冲突问题,AHB协议提供了优先级控制的特性。 在AHB总线协议中,如果有多个主设备请求总线,那么总线控制器会根据主设备ID和处理器当前状态来确定哪个主设备获得访问优先级。一旦优先级确定,总线控制器就会为该主设备分配总线,并阻塞其他设备的请求。

// AHB总线协议的优先级控制代码示例
// 查找获得访问权限的主设备
for (i = 0; i < NUM_MASTERS; i++)
begin
    ahb_master_t master = top.masters[i];
    if (master.requesting && !master.granted && (ahb_priority[i] > max_priority || requesting_master == -1))
    begin
        max_priority = ahb_priority[i];
        requesting_master = i;
    end
end
// 分配总线
if (requesting_master != -1)
begin
    ahb_master_t master = top.masters[requesting_master];
    // 禁止其他请求
    for (i = 0; i < NUM_MASTERS; i++)
        top.masters[i].busy = i != requesting_master;
    // 给予访问权限
    master.granted = 1;
    master.busy = 1;
    ahb_priority[requesting_master] = 0;
end

六、AHB总线协议的寄存器中断

AHB协议可以通过触发中断来响应设备的请求。中断可以由设备内部产生,也可以由总线控制器生成,以便所连接的处理器可以及时处理。 在AHB总线协议中,中断被认为是一种控制交换。主设备会发送一个中断请求给从设备,从设备会在响应信号中反馈中断信号,使主设备可以正确地处理中断请求。

// AHB总线协议的寄存器中断代码示例
// 发送中断请求
HADDR = 'h40000000;
HTRANS = HTRANS_IDLE;
HSIZE = HSIZE_WORD;
HWRITE = 1;
HWDATA = (1 << 4) | (1 << 2) | irq_idx;
HMASTER = MASTER_ID_CPU;
ahb_transfer(HADDR, HWDATA, HSIZE, HTRANS, HMASTER, HWRITE);
// 从设备响应中断请求
if (HSEL && HWRITE && HREADY)
begin
    interrupt[irq_idx] = 1'b1;
    // 响应信号中的中断请求
    HRESP = OKAY;
    HREADY = 1;
end

总结

通过以上的分析,我们了解了AHB总线协议在内部通信中的作用和特点。AHB总线协议具有高效性、低延迟性、分块传输、优先级控制、寄存器中断等多种特性,适用于各种类型的ARM处理器和外围设备的通信。在实际使用过程中,需要根据不同的系统架构和应用场景进行合理的设计和优化,以提高总线效率和系统稳定性。