一、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 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處理器和外圍設備的通信。在實際使用過程中,需要根據不同的系統架構和應用場景進行合理的設計和優化,以提高總線效率和系統穩定性。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/239062.html