您的位置:

AHB总线协议详解

一、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处理器和外围设备的通信。在实际使用过程中,需要根据不同的系统架构和应用场景进行合理的设计和优化,以提高总线效率和系统稳定性。