本文對AHB協議作了簡單整理,整理自兩篇文章:
1. 簡介
AHB總線規范是AMBA總線規范的一部分,AMBA總線規范是ARM公司提出的總線規范,被大多數SoC設計采用,它規定了AHB (Advanced High-performance Bus)、ASB (Advanced System Bus)、APB (Advanced Peripheral Bus)。AHB用於高性能、高時鍾頻率的系統結構,典型的應用如ARM核與系統內部的高速RAM、NAND FLASH、DMA、Bridge的連接。APB用於連接外部設備,對性能要求不高,而考慮低功耗問題。ASB是AHB的一種替代方案。
1.1 AHB總線的架構
AHB總線的強大之處在於它可以將微控制器(CPU)、高帶寬的片上RAM、高帶寬的外部存儲器接口、DMA總線master、各種擁有AHB接口的控制器等等連接起來構成一個獨立的完整的SOC系統,不僅如此,還可以通過AHB-APB橋來連接APB總線系統。AHB可以成為一個完整獨立的SOC芯片的骨架。
下圖是一個典型的AHB系統總線的結構示意圖
1.2 AHB基本特性
- Burst傳輸
- Split事務處理
- 單周期master移交
- 單一時鍾沿操作
- 無三態
- 更寬的數據總線配置(64/128)
- 流水線操作
- 可支持多個總線主設備(最多16個)
2. AHB總線的組成

- 主設備Master
某一時刻只允許一個主設備使用總線
- 從設備Slave
通過地址映射來選擇使用哪一個從設備
- 仲裁器arbiter
- 譯碼器decoder
- 總線可以分為三組
讀數據總線(HRDATA)
地址控制總線(HADDR)
3. 信號描述
Name | Source | To | Description |
HCLK | clock source | 各module | 總線時鍾,上升沿采樣 |
HRESETn | reset controller | 各module | 總線復位,低電平有效 |
HADDR[31:0] | Master | decoder mux to slave arbiter |
32位系統地址總線 |
HTRANS[1:0] | Master | mux to slave | 當前傳輸類型NONSEQ, SEQ, IDLE, BUSY |
HWRITE | Master | mux to slave | 1為寫,0為讀 |
HSIZE[2:0] | Master | mux to slave | 每一個transfer傳輸的數據大小,以字節為單位,最高支持1024位 |
HBURST[2:0] | Master | mux to slave | burst類型,支持4、8、16 burst,incrementing/wrapping |
HPROT[3:0] | Master | mux to slave | 保護控制信號,需要slave帶保護功能,一般不用 |
HWDATA[31:0] | Master | mux to slave | 寫數據總線,Master到Slave |
HRDATA[31:0] | Slave | mux to master | 讀數據總線,Slave到Master |
HREADY | Slave | mux to master arbiter |
高:Slave指出傳輸結束 低:Slave需延長傳輸周期 |
HRESP[1:0] | Slave | mux to master arbiter |
Slave發給Master的總線傳輸狀態OKAY, ERROR, RETRY, SPLIT |
HSELx | Decoder | slave | slave選擇信號 |
AHB仲裁信號
Name | Source | To | Description |
HBUSREQx | Master | arbiter | master給仲裁器的請求獲得總線使用權的請求信號,最多支持16個master |
HLOCKx | Master | arbiter | 如果一個master希望自己在傳輸期間不希望丟掉總線,則需要向仲裁器發送這個鎖定信號 |
HGRANTx | arbiter | master | 授權信號,當前bus master x的優先級最高。當HREADY和HGRANTx同時為高時,master獲取系統總線的權利 |
HMASTER [3:0] | arbiter | 具有split功能的slave | 仲裁器為每一個master分配的ID,指出哪個主設備正在進行傳輸,提供進行split的信息 |
HMASTLOCK | arbiter | 具有split功能的slave | 表示當前的master正在執行Locked操作。這個信號和HMASTER有這相同的時序 |
HSPLITx[15:0] | slave | arbiter | 從設備用這個信號告訴仲裁器哪個主設備運行重新嘗試一次split傳輸,每一位對應一個主設備 |
4. 總線操作
有需要占用總線的Master向arbiter發出請求,arbiter授權給指定的master。任一時間周期只有一個master可以接入總線,對其指定的slave進行讀寫操作。獲得授權的總線開始AHB傳輸,首先發出地址和控制信號,提供地址信息、傳輸方向、帶寬和burst類型。總線統一規划slave的地址,譯碼器根據地址和控制信號確定哪個slave與master進行數據通信。數據傳輸通過數據總線完成。為避免出現三態總線,AHB將讀寫總線分開,寫數據總線用於從master到slave的數據傳輸,讀數據總線用於從slave到master的數據傳輸。每筆傳輸包括一個地址和控制周期,一個或多個數據周期。地址和控制周期不能被擴展,因此slave必須在一個周期內采樣地址信號。數據周期可以通過HREADY信號擴展,但HREADY為低時給傳輸加入一個等待狀態以使slave獲得額外的時間來提供或采樣數據,另外slave通過響應信號HRESP反映傳輸狀態。
一般情況下master完成完整的burst傳輸,arbiter才會授權給其他的master接入總線,然而為避免過大的判決延遲,arbiter也可能打斷burst傳輸。在這種情況下master必須再次接入總線以進行中斷的burst剩余部分的傳輸。
5. 基本傳輸
一筆傳輸由如下兩部分組成:地址階段:一個周期
數據階段:一個或多個周期,由HBURST信號決定需要幾個有效周期,可以由HREADY發出請求延長一個周期。
5.1 沒有等待狀態的single transfer

第二個周期的上升沿,slave采樣地址和控制信號,並將HREADY拉高;
如果是寫操作,master會在第二個周期的上升沿傳輸要寫入的數據;
如果是讀操作,slave會在HREADY信號拉高后將讀取的數據寫入總線;
第三個周期的上升沿,
如果是寫操作,master獲取HREADY高信號,表明slave已成功接收數據,操作成功;
如果是讀操作,master獲取HREADY高信號,表明此時的讀數據有效並且接收下來,操作成功。
需要注意,HREADY信號在數據有效期間必須為高,並且延續到第三個周期的上升沿之后,確保master的正確采樣。
5.2 slave插入等待狀態的single transfer

如果是寫操作,master需要在等待期間保持寫數據不變,直到本次傳輸完成;
如果是讀操作,slave不需要一開始就給出數據,僅當HREADY拉高后才給出有效數據。
5.3 多個single transfer的pipeline操作

第一個周期,master發起一個操作A,並驅動地址和控制信號;
第二個周期,slave收到了來自總線的請求,將HREADY信號拉高;
第二個周期上升沿后,master發現有操作B需要執行,並且檢查到上一周期的HREADY為高,則發起第二個操作B;
第三個周期,master獲取HREADY信號為高,表示操作A已經完成;
第三個周期上升沿后,master發現有操作C需要執行,並且檢查到上一周期的HREADY為高,則發起第三個操作C;
第三個周期上升沿后,slave由於繁忙插入了一個等待狀態,將HREADY拉低;
第四個周期,master獲取HREADY信號為低,知道slave希望等待,於是master保持和上一拍一樣的信號;
第四個周期,slave處理完了事務,將HREADY信號拉高,表示可以繼續處理;
第五個周期,master獲取HREADY信號為高,知道slave已經可以處理B操作;
第五個周期上升沿后,B操作完成;
第六個周期上升沿后,C操作完成。
需要注意幾點:
HREADY在一定程度上表示了slave的pipeline能力,在AHB中是2個pipe,也就是總線上最多存在2個未處理完的transfer。只有當總線上未完成的transfer少於2個時,master才能發起操作。
5.4 遞增burst

T2,由於master不能在第二個周期里處理第二拍,所以master使用BUSY transfer來為自己延長一個周期的時間。注意,雖然是延長了一個周期,但是master需要給出第二個transfer的地址和控制信號;
T3,slave采集到了master發來的BUSY,知道master需要等待一拍,所以slave會忽略這個BUSY transfer;
T3,master發起了第二個transfer,因為是同一個burst的第二個transfer,所以transfer的類型是SEQ;
T5,slave將HREADY信號拉低,告訴master需要等待一個周期;
T8時刻完成最后一個transfer。
需要注意的 雖然slave會忽略掉BUSY transfer,但是master也需要給出下一拍的地址和控制信號。
5.5 wrapping 4-beat burst

5.6 遞增4拍burst

6.控制信號
HTRANS[1:0] | 傳輸類型 | Description |
00 | IDLE | 主設備占用總線,但沒進行傳輸 兩次burst傳輸中間主設備可發IDLE 此時就算slave被使能,也不會從總線上獲取任何的數據信號。如果此時salve被選中,那么每一個IDLE周期slave都要通過HRESP[1:0]返回一個OKAY響應 |
01 | BUSY | 主設備占用總線,但是在burst傳輸過程中還沒有准備好進行下一次傳輸 一次burst傳輸中間主設備可發BUSY 這時slave不會從總線上收取數據而是等待,並且通過HRESP[1:0]返回一個OKAY響應。需要注意的是,這個transfer需要給出下一拍的地址和控制信號,盡管slave不會去采樣。 |
10 | NONSEQ | 表明一次單個數據的傳輸或者一次burst傳輸的第一個數據 地址和控制信號與上一次傳輸無關 |
11 | SEQ | burst傳輸接下來的數據 地址和上一次傳輸的地址是相關的,這時總線上的控制信號應當與之前的保持一致,地址視情況遞增或者回環。 |
HSIZE[2:0] | Size | Description |
000 | 8 bits | Byte |
001 | 16 bits | Halfword |
010 | 32 bits | Word |
011 | 64 bits | - |
100 | 128 bits | 4-word line |
101 | 256 bits | 8-word line |
110 | 512 bits | - |
111 | 1024 bits | - |
- Burst傳輸類型
burst不能超過1K地址邊界。
HBURST[2:0] | 類型 | Description |
000 | SINGLE | Single transfer |
001 | INCR | Incrementing burst of unspecified length |
010 | WRAP4 | 4-beat wrapping burst |
011 | INCR4 | 4-beat increment burst |
100 | WRAP8 | 8-beat wrapping burst |
101 | INCR8 | 8-beat increment burst |
110 | WRAP16 | 16-beat wrapping burst |
111 | INCR16 | 16-beat increment burst |
- 響應信號
master發起一筆傳輸后,slave可以決定這筆傳輸的進程,而master不能取消已經發出的傳輸。slave通過HREADY信號反映傳輸是否完成,通過HRESP[1:0]反映傳輸的狀態。
slave可以如下方式完成一筆傳輸:
-
- 立即完成一筆傳輸;
- 延遲一個或幾個周期完成傳輸;
- 傳輸失敗返回error;
- 延遲傳輸,釋放總線。
- 傳輸完成HREADY
為高時傳輸完成,為低時傳輸需要延遲。
傳輸響應HRESP[1:0]
00: OKAY
01: ERROR
10: RETRY
傳輸未完成,請求主設備重新開始一個傳輸,arbiter會繼續使用通常的優先級
11: SPLIT
傳輸未完成,請求主設備分離一次傳輸,arbiter會調整優先級方案以便其他請求總線的主設備可以訪問總線
- 地址譯碼
地址譯碼器用於為總線上每個slave提供選擇信號HSELx,選擇信號是通過組合邏輯對地址碼譯碼產生的。只有當前的數據傳輸完成后(HREADY為高),slave才會采樣地址和控制信號以及HSELx。在一定條件下可能會出現這樣的情況:產生HSELx信號而HREADY為低,在當前傳輸后slave會改變。
每個slave最小的地址空間為1KB,所有的master的burst傳輸上限也是1KB,如此設計保證了不會出現地址越界問題。當一個設計不會用到所有的地址空間時,可能出現訪問到一個不存在的地址的情況,這就需要增加一個附加的默認slave來為上面的情況提供一個響應。當SEQ或NONSEQ傳輸訪問到一個不存在的地址,默認slave應該提供ERROR響應;當IDLE或BUSY傳輸訪問到一個不存在的地址,默認slave會響應OKAY。地址譯碼器會帶有實現默認slave的功能。
- 仲裁
仲裁機制保證了任意時刻只有一個master可以接入總線。arbiter決定哪個發出接入請求的master可以接入總線,這通過優先級算法實現。AHB規范並沒有給出優先級算法,設計者需要根據具體的系統要求定義。一般情況下arbiter不會中斷一個burst傳輸,將總線接入權讓給其他master。當然未定義長度的burst傳輸是可以打斷的,這要看優先級算法是如何規定的。如果一筆burst被打斷,master再度獲得接入權限時,會傳遞剩余的部分。如一筆長度為INCR8的傳輸在傳遞3 beat后被打斷,master再次獲得接入授權后,會繼續傳輸剩余的5 beat,剩余部分可以由一個SINGLE和一個INCR4組成,或者一個INCR。
HBUSREQx:master向arbiter發出接入請求的信號。
HLOCKx:指示是否要進行不可中斷的傳輸,這一信號與HBUSREQx同時由master向arbiter發出。
HGRANTx:arbiter產生指示master獲得授權,當HGRANTx信號為高同時HREADY為高時,master可以向總線傳輸地址信號。
HMASTER[3:0]:arbiter產生指示哪個master獲得授權,這一信號用於地址控制多路來選擇哪個master接入總線。
HMASTERLOCK:arbiter產生指示當前傳輸是否為鎖定序列傳輸。
HSPLIT:供支持SPLIT傳輸使用。
七、模塊接口
AHB-Master接口
AHB_Slave接口
Decoder接口
Arbiter接口