# 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以上 |![](https://hackmd.io/_uploads/Hy8mCjXIke.jpg)| |:---:| |典型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拉高,表示數據傳輸完畢 |![](https://hackmd.io/_uploads/H15mz2Q81l.jpg =80%x)| |:---:| |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> |![](https://hackmd.io/_uploads/BJKQBamI1x.jpg =75%x)| |:---:| |無需等待,Data Phase 僅一個週期。在HREADY通知為High時,代表transfer已完成,slave必須回應OKAY or ERROR...等| |![](https://hackmd.io/_uploads/S17nSTmLJe.jpg)| |:---:| |等待傳輸,可以發現效率很低| |![](https://hackmd.io/_uploads/HJc7ITmIyl.jpg)| |:---:| |多重傳輸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 | |![](https://hackmd.io/_uploads/H17mMSq81e.jpg)| |:---:| |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雷同,從設備暫時無法回應當前傳輸請求,但可以稍後完成,需要主設備釋放匯流排。通常用於更複雜的從設備,比如可能需要較長時間處理的設備(如存储器)。 |![](https://hackmd.io/_uploads/r1lAfH981x.jpg)| |:---:| |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> |![](https://hackmd.io/_uploads/r1rVQS5Uyg.jpg)| |:---:| |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 操作流程 --- |![](https://hackmd.io/_uploads/BJw1EHAIJx.jpg =50%x)| |:---:| |APB Transfer FSM| - 一開始為IDLE狀態,此時若有transfer要進行,PSELx訊號就被拉為High並進入SETUP階段。 - 僅於SETUP狀態停留一個cycle,進入ENABLE狀態 - PENABLE始能,此時資料傳輸完畢,若接下來無transfer則進入IDLE狀態 > ENABLE state 在新的APB protocol稱作ACCESS |![](https://hackmd.io/_uploads/HJJm8LRIJe.jpg )| ![](https://hackmd.io/_uploads/SJpJvICU1e.jpg ) |:---:|:---:| |APB Write Transfer|APB Read Transfer| - T1: IDLE狀態 - T2: Setup 狀態 - T3: Enable狀態 - T4: IDLE狀態 |![](https://hackmd.io/_uploads/Sy9YvUAUyx.jpg =50%x)| |:---:| |Read Transfer with AHB(假設兩個BUS Clock相同)| T1: AHB BUS傳送位置與傳輸方向訊息 T2: HADDR被APB採樣,APB開始進入SETUP階段,PSELx拉高 T3: APB ENABLE階段,讀取APB Data,並且將PENABLE拉高 T4: 傳輸結束,將資料送往AHB BUS |![](https://hackmd.io/_uploads/rkBy0IRLyl.jpg =50%x)| |:---:| |Write Transfer with AHB(假設兩個BUS Clock 相同)| T1: AHB BUS傳送位置與傳輸方向訊息 T2: AHUB BUS傳送DATA T3: APB SETUP階段 T4: APB ENABLE階段 T5: 傳輸結束 |![](https://hackmd.io/_uploads/Hk2t08CUke.jpg)| |:---:| |讀寫交叉傳輸| 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