作者:Allen Zhan [介紹] 根據 ARM 的說法, 今天 AMBA 已經成為了業界事實上的總線標準. 本文我們簡單對AMBA4 中的 APB v2.0(也稱為 APB4), 以及 AMBA3 AHB-Lite v1.0 進行簡單的了解. 我們的介紹集中在, 我們比較有興趣的地方. 盡管如此, 也可能幾乎覆蓋了協議中幾個最重要的部分. [AMBA APB] AMBA Advanced Microcontroller Bus Architecture, 由ARM定義的總線架構(標準), 由一個協議家族組成. ARM 聲稱這一標準已經稱為事實上的 uController 業界通用標準. APB The Advanced Peripheral Bus(APB) 是 AMBA 協議家族中一個組成部分. 它被定義為一個 low-cost 的接口, 為了最小能耗與減小接口的復雜性進行的優化設計. 被用于連接通用外圍, 比如 timers, inerrupt controllers, UART是, and IOs. 通過 system-to-peripheral bus bridge 與 main system bus 相連, 有助于降低能耗. APB 版本 當前(2013年9月), 最近的 APB協議版本是 AMBA APB Protocol Specification v2.0. 或者因為屬于 AMBA4 家族中的發布協議, 一般也被稱為 APB4. 而在第一個版本(APB2 )中, APB 的基本組元, APB bridge 與 APB slave 被定義. 而在 APB3 中, Ready signal 被引入, 這意味著增加了操作狀態中, 增加了 wait state. 另外增加了 PSLVERR, 用于錯誤報告的 signal. 最近的 APB4, 增加了 PPROT 與 PSTRB signal. APB bridge 與 APB slave 我們可以掛載各種"慢速"的外設在 APB 上, 比如 IO, 比如 UART, 比如 SPI, etc. 它們都作為 slave 的角色存在. 但是, 我們想想看, bridge 這個 role 就蠻有意思. 它實際上暗示我們, APB 不能"單獨存在". 我們這里所謂不能"單獨存在"的意思, 是說 APB 一定不能直接連接在 processor 上(或者說 arm core上). 而最可能的, 是通過 APB bridge 而連接在高速的 bus 上. 實際上, 在 AHB-Lite 協議中, 我們發現 APB bridge 被作為 AHB-Lite 的 slave 而被定義. Data buses APB 協議有兩個獨立的 data bus, 一個用來讀 data, 一個用來寫 data. 因為沒有獨立的握手信號, 所以在兩根bus上, 同一時刻數據傳輸不能同時發生. Write Transfers 我們簡單對 APB 的 trasfers 過程進行分析, 比如我們分析 write transfer with no wait states: [圖例1: Write transfer with no wait states] T0: Idle state T1: Setup state write address PADDR, write data PWDATA setup state 僅僅只保持 1pcs clock cycle, 而在下一個 PCLK 的上升沿, 一定進入 Access state. T2: Access state APB bridge 通過拉高 PENABLE, 通知slave 第二階段(也就是 access phase) 開始. 因為是 no wait states, 我們見到了 PREADY 在此被拉高, 表示 slave 通知 bridge, 在下一個 PCLK 的上升沿, 本次 transfer 的過程可以結束. T3: finish transfer, then enter Idle state again or the next setup. PREADY 拉低, 說明 slave 通知本次 transfer 結束. 在 PREADY unasserted 之前, PADDR, PWDATA, 以及其他的 signals 都應該保持有效. 從上述時序中, 我們了解到, write transfer 看來至少需要 3 cycles. setup - access - finish 而在一個 write transfer with wait states 時序中, [圖例2: Write transfer with wait states] 我們見到了, Slave 通過 unassert 的方式(拉低), 延遲了2pcs cycles(根據圖例的例子), 這樣在 T2 狀態上的拉高動作, 被延時到 T4 進行拉高. 也就是 Slave 通知在 T5 cycle 中結束本次 transfer. 這就是通過 PREADY 引入了 wait state 后現象, 我們注意到, 一般的術語被稱為"extend the transfer". Operating States Read Transfer 的情形與 Write Transfer 類似, 這樣, 我們就基本完備講述了 APB protocol, 附上 Operating States 進行理解: [圖例3: State Diagram] transfer cycles APB protocol 中, 明確指出: "每個 Transfer 至少消耗 2 cycles". 而我們檢查, 即使是 transfer with no wait state, 也最少消耗了 3 cycles. 這里我們理解, 在圖例1中, T3 狀態下, finish 本次 transfer后, 如果要連續操作下一個寫傳遞的過程, 那么則在 T3 狀態下保持 PSEL asserted, 配合 PREADY unasserted, 恰好又進入了如 T1 cycle 相同的 setup state, 這時需要 bridge 更新地址 PWRITE, 以及數據 PWDATA. 也就是在連續 transfer(針對同一個 slave)的操作中, transfer 最少只消耗 2 cycle. 我們沒有在 APB 協議中, 獲得上述猜測的詳解, 我們保留上述對 "2 cycles" 的理解猜測于此. 總結 我們通過對 APB protocol 的理解, 得知 APB 是 unpipeline 的 bus. 無論如何, setup state 將占據一個 cycle, 而 access state 將占據另一個. 這種 unpipeline 的設計, 很可能就是 APB 被作為連接外圍的, 而不是用于 processor 之間的 memory 連接的 BUS 的重要原因. 因其不要求外圍在一個 cycle 中對 address 進行取樣, 這也給外圍更多的時間反應, 至少比較而言, 使用 APB 的外圍可以具備更小的 bandwidth. [AMBA AHB-Lite] AHB-Lite AHB: Advanced High-performance Bus 用于高表現力高clock頻率的系統. 最經常的使用是連接 internal memeory device, external memory interface, 以及 high bandwidth 外圍. 其基本組元是: Master, Slave, Decoder, Multiplexor. 在 address/control phase 與 data phase 中, 存在 fixed pipeline. AHB: 僅僅支持 AMBA AXI protocol 的功能子集(subset). AHB-Lite: 如果除去在 master 與 slave IP 開發中不需要的部分, 則 AHB protocol 的這個 subset 則定義為 AHB-Lite. Operation 每一個 trasfer 都包括 Address phase 與 Data Phase. Address 不允許被 extend, 即便是來自 Slave 的請求, 因此我們可以想象, 全部的 Slaves 都必須在 Address phase(1 cycle) 完成 sampling address. 但是與 APB 一樣, Slave 也可以通過 HREADY signal 請求 extend data phase, 增加額外的時間去 sample data. HRESP signal 被用來說明 transfer 的成功與否. Address 總是可以在一個 single HCLK cycle 中完成, 除非是之前的 bus transfer 被 extend(我們理解, 這里應該是只有 data 才能做這個 extend). Data 可以占有數個 HCLK cycle, 這取決于 HREADY signal 是否 extend transfer. 因此, Address phase 可以與 Data phase 的 overlapping, 就是 pipeline 的基礎. [圖例4: 在不同地址上的3個transfer的例子] Transfer types Transfer types 包括: IDLE, BUSY, NONSEQ, SEQ 同猜想的一樣, 對于 Slave, 可以通過 HREADY 實現 extend transfer, 我們覺得, 這或者就是"較為慢速"的 Slave 實現 delay 的方式. 而 Master 如果在 HTRANS[1:0] 中使用 BUSY, 也可以在 burst transfer 的過程中, 插入idle cycles. 這讓人覺得, 這應算是 master 試圖做 delay 的方式. [圖例5: BUSY Transfer type] 值得注意的是, 該例子, 使用了 4-beat 的 burst operation. Locked transfers 通過 HMASTLOCK, master 可以要求完成"鎖定"的 transfer, 不能被打斷. 而這個用法, 往往在多個 master 的用法中存在. [圖例6: Locked transfers] Default slave 如果不存在的的 memory map 被 master 點中, AHB-Lite 協議給出了一個解決方案, 就是必須存在一個增加的 default slave 來進行回應. Slave transfer responses AHB-Lite 協議中指出, Master 一旦開始一個 transfer后, 將無法主動取消這個 transfer. 因此, 通過來自 Slave 的 HRESP signal 的狀態, 判斷 transfer 的成功與否將是重要的. HWDATA 與 HRDATA 同 APB 協議一樣, data bus 的 read 與 write 是分離的. 所以不需要"三態"的 drivers. 我們此時有點大腦短路, 不太理解這里的意思, 這應該是說, 如果我們在單一的, 而不是分離的 data bus 上實現 read data 以及 write data, 那么我們就需要"三態驅動器"? 這里的 tristate 為何意? --有知道的同行, 這里定能有教于我. [參考文獻] 1. AMBA3 AHB-Lite Protocol v1.0 Specification 2. AMBA APB protocol v2.0 Specification [結語] 讓我們引用 Sailing 的文章 "ARM與x86之4--EAGLE is Coming!" (From: http://blog.sina.com.cn/s/blog_6472c4cc0100mnza.html) 中的論述 AMBA 的片段作為結語: <剪切> "最令Intel尷尬的是,x86處理器并沒有一個與 AMBA 總線類似的 SoC 平臺總線,這是Intel 進軍嵌入式領域一個不小的障礙。Intel 或者定義一條全新的SoC平臺總線,或者集成AMBA總線。從加速推出產品的角度上,直接使用 AMBA 總線無疑是一條捷徑。而世上沒有捷徑,從更長遠的時間上看,借用AMBA總線,會使ARM陣營更加強大。最初的所謂捷徑不過是為他人做的嫁衣裳。" "面對ARM內核,Intel并不畏懼,面對AMBA總線陣營,Intel只剩下無奈。可以預計在相當長的一段時間里,Intel無法推出一條能和AMBA總線抗衡的SoC平臺總線。Intel只能暫時向AMBA總線示弱。" <剪切> Written by Allen Zhan |