# AMBA
###### tags: `Digital IC Design`
[點我回主頁](https://hackmd.io/@derek8955/BkK2Nb5Jo/https%3A%2F%2Fhackmd.io%2Fc%2FBkK2Nb5Jo%2Fedit%3Fedit)
Outline
---
- AMBA Introduction
- AHB 2.0
- APB 2.0
- AXI 3.0 ~AXI 5.0
- AHB other version
- APB other version
AMBA Introduction
---
AMBA(Advanced Microcontroller Bus Architecture)是由ARM開發的SoC Bus protocol,用於實現不同模塊之間的高校通訊。本文僅介紹AHB, APB.
AHB(Advanced High-Performance Bus) 高速 BUS, ARM當初訂定的目的為讓它能夠用來當作SOC 的 on-chip system bus,它的特性包括:
- 支持多個Master-Slave 設備,至多16個master(同個時間點上,只允許一個主設備使用Bus)
- 支持 burst 傳輸
- bandwidth 8~128bits
- Split transcation(後面會提到)
APB 低速 BUS,
- 接口簡單,主要應用於peripherial外設
- APB上的設備都是Slave,僅APB Bridge為master
- 沒有 pipeline設計,傳輸過程永遠需要2個cycle以上
||
|:---:|
|典型AMBA系統|
AHB由以下四種組成
- AHB master(CPU、DMA...等): 發起1次讀/寫操作; 當前時刻只允許一個主設備使用 BUS
- AHB slave(Memory、Bridge...等): 響應一次讀寫操作; 通過address mapping選擇要使用哪個slave
- AHB arbiter: 允許某一個 master 設備控制 BUS
- AHB decoder: address deocoder,決定選擇接收哪個 slave 設備
APB由以下兩種組成
- AHB2APB Bridge
- APB Slave
> AXI 3.0 可以看這篇[文章](https://www.cnblogs.com/xianyuIC/p/17372573.html)
> AXI lite 可以看這篇[文章](https://www.cnblogs.com/xianyuIC/p/11609358.html)
> AXI 5.0 可以看這篇[文章](https://www.cnblogs.com/xianyuIC/p/17937602)
AHB 2.0 操作流程
---
Step 1: 有需要占用BUS的master向arbiter發出請求,arbiter授權給指定的master
Step 2: master開始傳輸,發送地址和控制訊號。選中的 slave 響應
Step 3: decoder根據地址與控制訊號確定哪個slave與master進行數據通訊,直到HREADY拉高,表示數據傳輸完畢
||
|:---:|
|AHB 操作方塊圖|
|HADDR: Write Address. HWDATA: Write Data. HRDATA: Read Data.|
<font color="Red">Note: 傳輸階段有分兩個phase,address phase(only one cycle) and data phase(透過hready控制) </font>
||
|:---:|
|無需等待,Data Phase 僅一個週期。在HREADY通知為High時,代表transfer已完成,slave必須回應OKAY or ERROR...等|
||
|:---:|
|等待傳輸,可以發現效率很低|
||
|:---:|
|多重傳輸pipeline|
AHB 2.0 Signal
---
| Name | Source | Description |
| -------- | -------- | -------- |
| HCLK | Clock Source | Bus Clock(Positive Edge Trigger) |
|HRESETn|Reset Controller| Bus Reset(Active Low)|
|HADDR[31:0]|Master|32-bit address bus|
|HTRANS[1:0]|Master|表示目前傳輸的type,NONSEQUENTIAL(非連續傳輸), SEQUENTIAL(連續傳輸), IDLE or BUSY.|
|HWRITE|Master|表示目前傳輸方向,High表示slave接收資料|
|HSIZE[2:0]|Master|表示傳輸大小,最高支持1024 Bit|
|HBURST[2:0]|Master|AHB支援8種burst type,用來指示burst 長度(transfer個數,我們也稱作beat)與address之間的關係|
|HPROT[3:0]|Master|保護控制訊號,一般不用|
|HWDATA[31:0]|Master|write data|
|HRDATA[31:0]|Slave|read data|
|HREADY|Slave|控制HRDATA讀出的數據週期,High表示已完成|
|HRESP[1:0]|Slave|slave發給master的Bus 狀態,OKAY、ERROR、RETRY、SPLIT|
|HSELx|Decoder|slave選擇訊號|
- HTRANS[1:0]
- IDLE(2'b00): 指示slave忽略當前的transfer(Master沒有資料要傳送)
- BUSY(2'b01): 在burst transfer時,master可能因為某些原因導致無法及時傳送資料,則使用此transfer type通知slave
- NONSEQ(2'b10): 指示目前的transfer與上一筆transfer無關
- SEQ(2'b11): 指示address與上一筆transfer相關且control訊號與上一筆相同,通常用在burst transfer
- HBURST[2:0]: BURST傳輸分成兩種形式,incrementing的burst的每一筆transfer address必定是前一筆address + transfer size; wrapping burst則將memory切割成 transfer size x transfer beat 大小的一個個memory boundary,當address要跨過memory bond. 時,下一筆transfer address會繞回bond. 起點。例如起始address為0x34,transfer size 為WORD(4-byte),burst type為WRAP4,此時的memory bond.為16byte,因此依序傳輸的address為0x34, 0x38, 0x3C, 0x30
|HBURST[2:0]|Type|Description|
|--------|--------|--------|
|000|SINGLE| single transfer|
|001|INCR|不固定長的傳輸|
|010|WRAP4|4-beat WRAP|
|011|INCR4|4-beat INCR|
|100|WRAP8|8-beat WRAP|
|101|INCR8|8-beat INCR|
|110|WRAP16|16-beat WRAP|
|111|INCR16|16-beat INCR |
||
|:---:|
|4-beat WRAP|
- HSIZE[2:0]:
|HSIZE[2:0]|Size|Description|
|--------|--------|--------|
|000|8bits| Byte|
|001|16bits|Halfword|
|010|32bits|Word|
|011|64bits| |
|100|128bits|4-word lines|
|101|256bits|8-word lines |
|110|512bits| |
|111|1024bits| |
- HRESP[1:0]:
AHB protocol除了slave可以使用HREADY訊號去extend transfer cycle,在transfer結束時slave還可以使用HRESP告訴master結束時的狀態,共有以下四種狀態:
- OKAY: transfer成功完成
- ERROR: transfer失敗,可能造成的原因有企圖寫入read-only的memory, 錯誤的location ...等
- RETRY: 傳輸未完成,請求master device重新開始一個傳輸。不要求master device 釋放BUS控制權,arbiter會繼續延用優先級。通常在slave device繁忙的時候出現此回應。
- SPLIT: 與RETRY雷同,從設備暫時無法回應當前傳輸請求,但可以稍後完成,需要主設備釋放匯流排。通常用於更複雜的從設備,比如可能需要較長時間處理的設備(如存储器)。
||
|:---:|
|RETRY Response|
Arbiter signal:
|Name|Source|Description|
|--------|--------|--------|
|HBUSREQx|Master|Master發出BUS使用請求|
|HLOCKx|Master|當此訊號為High時,表示主機需要鎖定對匯流排的訪問,並且在該訊號為低電平之前,其他主機不應被授予匯流排存取權限。換句話說,如果有其他主機發送請求存取BUS,不允許任何一個device中斷當前處理|
|HGRANTx|Arbiter|此訊號表示匯流排Master x是目前優先順序最高的|
|HMASTER[3:0]|Aribiter|來自仲裁器的這些訊號指示哪個匯流排主機目前正在執行傳輸,並由支援 SPLIT 傳輸的從機用來決定哪個主機正在嘗試存取。|
|HMASTLOCK|Arbiter|表示當前的master正在執行lock操作|
|HSPLITx[15:0]|Slave|slave向仲裁器指示應該允許哪個master重新嘗試split傳輸。每一位對應一個master|
<font color = RED> x indicate each of master devices or slave devices </font>
||
|:---:|
|wait state on the bus handover|
APB 2.0 Signal
---
APB主要應用於外設periperial的設備上,如UART, RTC, ...等。由於其應用場景不需要複雜的處理,因此他相較AHB也簡單了許多。以下是APB Signal:
| Name | Source | Description |
| -------- | -------- | -------- |
| PCLK | Clock Source | Bus Clock |
| PRESETn | Reset Controller | Bus Reset |
| PADDR[31:0] | Master | Bus address |
| PSELx | Slave | Slave選擇訊號,每個slave對應一個PSEL訊號 |
| PENABLE | Master | APB transfer中的第二個cycle(後面補充) |
| PWRITE | Master | Transfer dircetion(High for access) |
| PRDATA[31:0] | Slave | Read data |
| PWDATA[31:0] | Master | Write data |
APB 2.0 操作流程
---
||
|:---:|
|APB Transfer FSM|
- 一開始為IDLE狀態,此時若有transfer要進行,PSELx訊號就被拉為High並進入SETUP階段。
- 僅於SETUP狀態停留一個cycle,進入ENABLE狀態
- PENABLE始能,此時資料傳輸完畢,若接下來無transfer則進入IDLE狀態
> ENABLE state 在新的APB protocol稱作ACCESS
|| 
|:---:|:---:|
|APB Write Transfer|APB Read Transfer|
- T1: IDLE狀態
- T2: Setup 狀態
- T3: Enable狀態
- T4: IDLE狀態
||
|:---:|
|Read Transfer with AHB(假設兩個BUS Clock相同)|
T1: AHB BUS傳送位置與傳輸方向訊息
T2: HADDR被APB採樣,APB開始進入SETUP階段,PSELx拉高
T3: APB ENABLE階段,讀取APB Data,並且將PENABLE拉高
T4: 傳輸結束,將資料送往AHB BUS
||
|:---:|
|Write Transfer with AHB(假設兩個BUS Clock 相同)|
T1: AHB BUS傳送位置與傳輸方向訊息
T2: AHUB BUS傳送DATA
T3: APB SETUP階段
T4: APB ENABLE階段
T5: 傳輸結束
||
|:---:|
|讀寫交叉傳輸|
AXI 3.0
---
AMBA Optimization
---
APB3:
- 新增了PREADY,slave用此訊號擴展傳輸
- 新增PSLVERR,用於表示此筆傳輸狀態(Source:slave)
APB4:
- 新增PPROT,保護訊號
- 新增PSTRB,write strobe的縮寫,允許通過 PSTRB 信號選擇性地寫入部分資料位元組,而不影響未選中的位元組。例如,在 32 位元匯流排上,你可以只寫入其中的某個位元組,而不修改其他位元組。(讀資料時,必須將此訊號tie 0)
APB5:
- 新增PWAKEUP,喚醒訊號
- 新增USER,自定義訊號(不常用)
- 新增Parity Protection,奇偶校驗保護
- 新增RME,領域管理擴展 Realm Management Extension,ARM的一種系統架構
AHB3(AHB Lite)&AHB5:
AHB3為AHB2的簡化版,主要應用於單個master多個slave的架構,因此沒有arbiter。此外也移除了RETRY與SPLIT功能。而AHB5相比AHB3沒什麼差異,新增了一些訊號。
|Page 1-2|
|:---:|
|AHB3 Architecture|
- 由Slave發送的HREADY更名為HREADY_OUT
- 原先AHB2的HREADY更改為多工器發送至slave與master。不管是AHB2還是AHB3/AHB5,Slave都需要返回HREADYOUT(AHB2是HREADY)。而到了AHB3/AHB5中,Slave除了向master發出HREADYOUT,slave還會接收到MUX返回的HREADYIN,如下所示
|Page 4-3|
|:---:|
|HREADYIN & HREADYOUT|
HREADYIN的設計主要是有利於Pipeline操作,例如Master先發出對Slave-1的讀操作,而Slave-1還沒準備好資料,於是將資料相位擴展,HREADYOUT_1為低。此時Master又發出對Slave-2的讀操作,而Slave-2本身是ready的狀態,HREADYOUT_2為高。由於Slave1的HREADYOUT_1為低,所以HREADY也為低,表示master對所有的slave訪問未完成。可是如果沒有HREADYIN設計,Slave2會誤以為自己這次訪問成功,造成誤操作。
- AHB3沒有HMASTER訊號
- AHB5新增HEXCL,exclusive傳輸時(詳見原論文),指明該傳輸是否為獨佔傳輸(exclusive transfer)
- AHB5新增HEXOKAY,exclusive傳輸時,指明獨佔訪問(exclusive transfer)成功or失敗
- AHB5新增user自定義訊號(不常用)
- AHB5新增HNONSEC訊號,若此訊號為0,代表當前傳輸為安全傳輸
- 新增AHB原子訪問Atomicity(看不動@@)
Reference
---
AMBA Spec.
https://www.arm.com/architecture/system-architectures/amba/amba-specifications
Blog
https://www.slideshare.net/slideshow/2002-5-1-introduction-to-amba-bus-system-presentation/555420#2
https://www.cnblogs.com/xianyuIC