一、AHB的基本介紹
1. AHB總線有一下特性:
n Burst 傳輸
n Split 事務處理
n 單周期master移交
n 單一時鍾沿操作
n 無三態
n 更寬的數據總線配置(64/128)
2. AHB總線系統的架構
AHB總線的強大之處在於它可以將微控制器(CPU)、高帶寬的片上RAM、高帶寬的外部存儲器接口、DMA總線master、各種擁有AHB接口的控制器等等連接起來構成一個獨立的完整的SOC系統,不僅如此,還可以通過AHB-APB橋來連接APB總線系統。AHB可以成為一個完整獨立的SOC芯片的骨架。
下圖是一個典型的AHB系統總線的結構示意圖

3. AHB總線的組成
下圖清楚的顯示了AHB總線的各個組成部分:

總線中,有多個master和slave,一個仲裁器(arbiter)和一個譯碼器(decoder)組成。
如果再將AHB總線細分,可以分為三組總線:寫數據總線(HWDATA),讀數據總線(HRDATA)和地址控制總線(HADDR)。從上面的結構圖中可以看出,這三組總線相互分離互不干擾。對於每一組總線來說,同時只能由一個master或者slave來獨占,這時需要仲裁器來決定將總線的控制權交與哪個設備,並控制多路選擇器來選擇已經獲得控制權的那個設備來傳輸數據和地址信息。譯碼器根據地址來選擇讓哪個slave的數據通過選擇器。
一般來講,我們稱主動發起操作的設備為master,被動響應master的為slave。
二、AHB總線的信號
AHB總線的信號都是以H開頭,以區別其他的AMBA總線信號
信號名 | 信號源 | 信號功能 |
HCLK Bus clock |
clock source | 總線時鍾信號,都是上升沿有效 |
HRESETn Reset |
reset controller | 系統reset信號,低有效 |
HADDR[31:0] address bus |
master | 32位系統地址總線 |
HTRANS[1:0] transfer type |
master | transfer類型,一共有四種類型:NONSEQUENTIAL, SEQUENTAL, IDLE 或者BUSY |
HSIZE[2:0] transfer size |
master | 每一個transfer傳輸的數據大小。以字節為單位。最高支持1024位 |
HBURST[2:0] burst type |
master | transaction類型,一共有8種 |
HPROT[3:0] protection control |
master | 保護控制信號,一般不用 |
HWDATA[31:0] write data bus |
master | 這是寫數據信號 |
HSELx slave select |
decoder | slave選擇信號 |
HRDATA[31:0] read data bus |
slave | 這是讀數據信號 |
HREADY transfer done |
slave | 當這個信號為高時,表示當前transfer完成。slave也可以通過拉低這個信號來延長一個transfer。注意:slave需要2個HREADY信號,一個作為輸出,一個作為輸入 |
HRESP[1:0] transfer response |
slave | slave給master的響應信號,一共有四種:OKAY,ERROR,RETRY和SPLIT |
下面是仲裁器的信號 | ||
HBUSREQx bus request |
master | 這時master給仲裁器的請求獲得總線使用權的請求信號,最多支持16個master |
HLOCKx locked transfers |
master | 如果一個master希望自己在傳輸期間不希望丟掉總線,則需要向仲裁器發送這個鎖定信號 |
HGRANTx bus grant |
arbiter | 授權信號,會傳送給每一個master。當HREADY和HGRANTx同時為高時,master獲取系統總線的權利 |
HMASTER[3:0] master number |
arbiter | 這個是仲裁器為每一個master分配的ID,用來給多路選擇器提供選擇信號和為SPLIT操作提供控制信號。 |
HMASTLOCK locked sequence |
arbiter | 表示當前的master正在執行Locked操作。這個信號和HMASTER有這相同的時序 |
HSPLITx[15:0] split completion request |
slave(SPLIT-capable) | 這個信號是具有SPLIT操作的slave提供, 作為仲裁器仲裁的一項控制信號 |
三、AHB的傳輸過程
1. AHB的傳輸類型
AHB一共有8種類型的傳輸模式,由HBURST[2:0]來決定
HBURST[2:0] | 類型 | 說明 |
000 | SINGLE | 單一傳輸,一次只有一個地址和控制信號,一組數據 |
001 | INCR | 次數不限的遞增burst傳輸。地址根據每拍數據的大小遞增,可以傳輸任意次數。唯一的限制是地址不能超過1K邊界 |
010 | WRAP4 | 4拍的回環burst傳輸。一共傳4拍,地址會在地址邊界回環。地址邊界根據burst傳輸的次數和每次傳輸的數據大小來計算 |
011 | INCR4 | 4拍的遞增burst傳輸。一共傳4拍,地址根據每一拍的數據大小遞增 |
100 | WRAP8 | 8拍的回環burst傳輸 |
101 | INCR8 | 8拍的遞增burst傳輸 |
110 | WRAP16 | 16拍的回環burst傳輸 |
111 | INCR16 | 16拍的遞增burst傳輸 |
注釋:1. AHB的所有操作,都要求給出的地址是對齊的。
2. 對於同一個burst來說,每次數據的寬度都是一樣的。
下面重點來解釋幾個術語
a). 對齊地址(aligned address)。所謂的對齊地址,其實是對存儲空間的一種划分,在讀取或者存儲數據時,要以這種划分為前提來進行。並且對於不同的情況,對齊地址是不一樣的。下面來說明怎么來確定對齊地址。
對齊地址是由每拍傳輸的數據的寬度來決定的,如下表
傳輸數據的寬度 | 對齊地址(存儲空間的划分) |
1-byte ( 8-bit) | 0x00 0x01 0x02 0x03 .... |
2-byte (16-bit) | 0x00 0x02 0x04 0x06 .... |
4-byte (32-bit) | 0x00 0x04 0x08 0x0c ... |
8-byte (64-bit) | 0x00 0x08 0x10 0x18 ... |
... | ... |
從表中可以看出,對齊地址都是所傳輸數據寬度(以byte為單位)的整數倍 。在AHB總線上,master所給出的地址,必須是對齊地址。
b). 地址邊界(address boundary)。只有對於回環操作才有地址邊界這一說法。地址邊界跟對齊地址和拍數有關。下面舉一個例子來說明邊界怎么算。
AHB只支持3種類型的回環,4拍,8拍,和16拍。其實地址邊界可以使用2張表來進行計算
第一張表就是對齊地址的那張表
第二張表更簡單
拍數 | 地址邊界 |
4拍 | 從0x00開始,每第4個對齊地址為一個邊界 |
8拍 | 從0x00開始,每第8個對齊地址為一個邊界 |
16拍 | 從0x00開始,每第16個對齊地址為一個邊界 |
那么怎么來用這兩張表呢?
舉一個例子,比如是一個WRAP4 的burst,每一拍4-byte數據寬度。那么邊界地址是
這個例子是一個4拍的回環操作,所以每第4個對齊地址為一個邊界,因為每一拍是4-byte的數據寬度,所以它的對齊地址的序列為
0x00 0x04 0x08 0x0c
0x10 0x14 0x18 0x1c
0x20 0x24 0x28 0x2c
0x30 0x34 0x38 0x3c
0x40 0x44 0x48 0c4c
.........................................
根據我上面說的,每第4個對齊地址為一個邊界,所以邊界地址為0x0c 0x1c 0x2c 0x3c 0x4c .....
c). 地址回環。 上面知道了什么是地址邊界,下面來介紹什么是地址回環。
在回環操作中,每當地址超過了地址邊界,地址就會回環到較小的地址上繼續進行。這里的較小地址是回環范圍中的較小的地址。還以b)中的那個例子為例,
0x00 0x04 0x08 0x0c
0x10 0x14 0x18 0x1c
0x20 0x24 0x28 0x2c
0x30 0x34 0x38 0x3c
0x40 0x44 0x48 0c4c
.........................................
上面的每一行都是一個回環的范圍,在一次回環操作中,地址只會在一行里發生變化,不會越行變化,並且每個地址都會用到並且只用到一次。比如,第一拍給出的地址是0x14, 那么接下來3拍的地址依次為 0x18 -> -x1c ->0x10。由於第三拍地址到達了邊界,所以第四拍要返回到此次回環范圍的最小的一個地址上。
通俗的講,地址是這么來按照次序給出的
不管第一個地址怎么給出,地址總是按照這個次序依次發往總線。
d). 遞增(incrementing)- 顧名思義,就是依次增加的意思。拿INCR4來說明地址如何遞增。INCR4 表示一個4拍的burst地址遞增操作。一共4拍,表示會有4個地址,且地址依次的加上一個常數,這個常數的大小是每一拍傳輸的字節數。比如給出的第一個地址是0x40,每一拍傳輸數據的字節數是2bytes,則后面3個地址依次為0x42、0x44和0x46。
2. AHB最基本的傳輸
a) 沒有等待狀態的Signal transfer
Signal transfer是AHB總線最最基本的傳輸類型,下面以時序圖參考來解析它的傳輸過程

這個圖中只給出了一部分的信號,但可以清楚的說明signal transfer的傳輸過程
1. 在第一個周期的上升沿過后,master將地址和控制信號打入總線。
2. 在第二個周期的上升沿處,slave將總線上的地址和控制信號接收下來,並且將HREADY信號拉高。
3. 在接下來的第二個周期里,分兩種情況:
A). 如果是寫操作,master會在第二個周期的上升沿過后將要寫的數據打入總線。
B). 如果是讀操作,slave會在HREADY信號拉高過后將讀取的數據打入總線
4. 在第三個周期的上升沿處,分兩種情況:
A). 如果是寫操作,master獲取HREADY高信號,表明slave已經成功接收數據,操作成功。
B). 如果是讀操作,master獲取HREADY高信號,表面此時的讀數據有效並且接收下來,操作成功。
這里要注意一點,HREADY信號在數據有效期間必須為高,並且延續到第三個周期的上升沿之后,確保master的正確采集。
b). slave插入等待狀態的single transfer
上面的情況是slave可以及時處理master請求的情況。但也可能存在這種情況:slave太慢不能立即處理。這時需要讓master稍微等一等。這時需要slave來插入一些等待的狀態。

如上圖,HREADY信號在第二第三個周期拉低,意在告訴master說slave不能立即處理,需要master等待2個周期。在這里需要注意2點:
1. 如果是寫操作,master需要在等待期間保持寫數據不變,直到本次傳輸完成。
2. 如果是讀操作,slave不需要一開始就給出數據(如果一開始可以給出的話,就不需要等待了),僅當HREADY拉高之后才給出有效數據。
c). 多個single transfer的piplline操作
前面2個都是只發單獨的一個transfer,那么多個transfer連續發送會怎么樣呢:

1. 第一個周期的上升沿之后,master發起一個操作A,並將地址和控制信號打入總線。
2. 在第二個周期的上升沿處,slave收到了來自總線的請求,master獲取HREADY信號為高。
3. 在第二個周期的上升沿過后,slave由於空閑將HREADY信號拉高,表示可以處理數據。
4. 在第二個周期的上升沿過后,發現有操作B需要執行,並且檢查到上一周期的HREADY為高,則發起第二個操作B。
5. 在第三個周期的上升沿處,master獲取HREADY信號為高,表示操作A已經完成。
6. 在第三個周期的上升沿之后,master發現有操作C需要執行,並且檢查到上一周期的HREADY為高,則發起第三個操作C。
7. 在第三個周期的上升沿之后,slave由於繁忙而插入了一個等待狀態,將HREADY拉低。
8. 在第四個周期的上升沿處,master獲取HREADY的信號為低,知道了slave希望他這一拍等待一下,此時,master在第四個周期內需要保持和上一拍一樣的信號。
9. 在第三個周期期間,slave處理完了事務,所以在第四個周期的上升沿之后,slave將HREADY信號拉高,表示已經可以繼續處理數據。
10. 在第五個周期的上升沿處,master獲取HREADY信號為高,知道了slave已經可以處理B操作。
11.在第五個周期的上升沿之后,B操作完成。
12.在第六個周期的上升沿之后,C操作完成。
對於上面的過程需要注意幾點:
1. HREADY在一定程度上表示了slave的pipeline能力,在AHB中,是2個pipe。也就是總線上最多存在2個未處理完的transfer。
2. 只有當總線上未完成的transfer少於2個時,master才能發起操作。
T1時刻之后,master將第一拍地址和控制信號打入總線,因為是一個新的burst的開始,所以transfer的類型是NONSEQ的。 T2上升沿,slave采集到master發出的控制信號。
控制信號包括(haddr,htans,hburst)。 slave就是基於這一控制信號,考慮是否在下個周期(T2時刻后的周期,把自己的data放上供給master讀取)
NONSEQ是single模式和burst模式第一拍的必要條件。
這里的hburst發出為INCR模式,即為次數不限的遞增burst傳輸。地址根據每拍數據的大小遞增,可以傳輸任意次數。唯一的限制是地址不能超過1K邊界.
由於master不能在第二個周期里處理第二拍,T2時刻后,所以master使用BUSY transfer來為自己延長一個周期的時間。注意,雖然是延長了一個周期,但是master需要給出第二個transfer的地址和控制信號。在T3時刻Slave的控制信號htrans busy被slave抓到。
在T3的上升沿,實際上第一個tranfer(讀或者寫)完成。
這里實際上完成了一次握手,master說我下個周期會很busy,發不出來數據,slave你就不要采了
對於無效的周期,實際上和busy一同發出的busy信號也沒什么意義了(反正下個周期也不會在完成tranfer了)。
slave在T3時刻采集到了master發來的BUSY transfer,知道master需要等待一拍,所以,slave會忽略這個BUSY transfer。
也就是說,T4時候,總線上 的數據信號是無效的。T4這個時刻只是為了獲取下一周期的控制信號
雖然master在busy的周期數據是無效的,但是控制還必須有效,這樣的話實際上控制信號只是在准備通知slave下一周期,我是否還是無效的,如果有效,我的地址是啥。
在等待了一個周期之后,T5時刻完成第二個transfer。一切正常
在第五個周期里,slave很忙,將HREADY信號拉低,告訴master需要等待一個周期。然后再T6時刻,master 感受到slave的不ready,就會保持字的狀態。
。。。。。。。
列表內容最后在T8時刻完成最后個transfer。
需要注意的 雖然slave會忽略掉BUSY transfer,但是master也需要給出下一拍的地址可控制信號。
這里沒反應出來的是hresp信號,這一信號包含ok,error,retry, split,正常情況下,都會是ok狀態