1. AMBA總線概述
AMBA2.0 以上版本都是基於單沿時鍾、單向信號線的協議[1]。
現在市場上大部分的基於 AMBA 架構的 SoC 產品, 系統總線采用 AHB, 外部總線采用 APB。系統總線負責連接例如 ARM 嵌入式處理器、DMA 控制器、片上存儲器或其他需要高帶寬的元件。 外圍總線則是用以連接系統的外圍元件, 其協議相對來說較為簡單, 而兩種總線通過總線橋相連。 通過這種機制來減輕系統總線的負擔。
根據intergration手冊,Cortex-m0p和Cortex-m4均采用AMBA 3.0協議,Cortex-m0p只用了其中的AHB、AHB-Lite,對於GPIO自己定義了一個IO port(IOP),用戶例化時可自行選擇使用IOP還是AHB-Lite,Cortex-m4則分別支持AHB、AHB-Lite和APB協議。
2. AHB-Lite信號
AHB-Lite協議下的總線與設備間接口port定義:
input HCLK; input HRESETn; input [31:0] HADDR; //主發從收-地址總線 input [ 2:0] HBURST; input HMASTLOCK; input [ 3:0] HPROT; input [ 2:0] HSIZE; input [ 1:0] HTRANS; input [31:0] HWDATA; //主發從收-寫數據 input HWRITE; //主發從收-寫命令 input HSEL; //多路器發從設備收-從機選則 input HREADY; //多路器發主設備收-總線ready output [31:0] HRDATA; //從發主收-讀數據 output HREADYOUT; //從發主收或多路器收-從設備ready output HRESP; //從發主收:0-OKAY;1-ERROR
不管是m0+還是m4,訪問GPIO都是用的AMBA3.0 AHB Lite協議,使用的總線信號如下:
HSIZE[1] HSIZE[0] 單次傳輸的數據寬度
0 0 8bit
0 1 16bit
1 0 32bit
當HSIZE[1:0] ={ 00 }, 8bit訪問的情況:
HADDR[1] HADDR[0] 字節地址選擇 對應屏蔽碼
0 0 0 0001
0 1 1 0010
1 0 2 0100
1 1 3 1000
當HSIZE[1:0] ={ 01 }, 16bit訪問的情況:
HADDR[1] HADDR[0] 讀寫地址選擇 對應屏蔽碼
0 0 0 0011
0 1 X(0) 0011
1 0 2 1100
1 1 X(0) 1100
當HSIZE[1:0] ={ 11 }, 32bit訪問的情況:
HADDR[1] HADDR[0] 讀寫地址選擇 對應屏蔽碼
1 0 0 1111
0 1 X(0) 1111
1 0 X(0) 1111
1 1 X(0) 1111
HTRANS[1] HTRANS[0] 總線狀態 – 只有當HTRANS[1]=1時才是一次有效傳輸
0 0 空閑
0 1 忙
1 0 傳輸-非連續傳輸
1 1 傳輸-連續傳輸(為突發傳輸而設,地址自增,GPIO訪問不用)
HSEL: 設備選擇,為1表示選中此設備
HWRITE: 總線寫命令,為1表示寫數據,為0表示讀數據
HREADY: 總線准備好(表示總線給設備的命令、地址或數據都是穩定的狀態,設備可以取走了)
HWDATA: 總線給到設備的數據
HRDATA:總線從設備讀走的數據
3.AHB Lite時序
一次基本的總線傳輸需要兩個時鍾(cm4手冊表示LDR、STB指令可通過總線流水的方式一拍完成,cm0+沒這個注釋,但提供了一個用於一拍訪問外設的接口IOP),第一拍寫地址,第二拍讀(或寫)數據:
4. Examples
以Cortex-m0p的SRAM接口、GPIO接口為例(Cortex-m4里這兩個接口實現方式完全一樣):
接口信號:
PowerPoint畫了一張丑到不忍直視的接口示意:
【1】蔣周良.AMBA 總線新一代標准 AXI 分析和應用