AHB總線實現了簡單的基於burst的傳輸,數據總線帶寬可配置32-1024bit。可以實現簡單的fixed pipeline在address/control phase和
data phase之間。
典型的AHB的slave包括:internal memory device,external memory interfaces,high bandwidth peripheral。
AHB必須是對齊傳輸,word,addr[1:0]為0,half-word,addr[0]為0。包括wrap burst傳輸,也必須是對齊的。
AHB-Lite協議是整個AHB協議的子集,只支持一個總線主設備,不需要總線仲裁器及相應的總線請求/授權協議,
不支持Retry和Split響應。
AHB-Lite的典型應用結構是一個AHB-Lite master,一些AHB-Lite slaves。slave由APB總線實現,HSEL信號由一個
address decoder產生。從slave到master的rdata,response由一個slave-to-master multiplexor通過選址
送給master。
AHB中的transfer由兩部分組成,Address phase,Data phase。
slave可以通過信號HREADY來延長data phase,但是不能延長address phase。
在master比較繁忙時,可以通過busy transfer,表示burst還在繼續,相當於多延時一個address cycle。
AHB信號大致可以分為五類:
Global signals:HCLK,HRESETn;
Master signals:HADDR,32bit的地址線。
HBURST,3bitde burst長度和類型。支持長度為4/8/16的INCR/WRAP類型的burst。
未定義長度的INCR類型的burst。和Single burst兩種新類型。
HMASTLOCK,表示一個locked的transfer,主要用在一個存在多個master訪問的slave原語操
作中。因為AHB並不存在亂序操作,所以單一master時,並沒用。arm建議,lock transfer之后
加一個IDLE的transfer。
HPROT,4bit包含data/opcode,supervisor/user之外,還包含bufferable,cacheable兩位
AHB並沒有對secure world的支持。
HSIZE, 3bit表示transfer的帶寬,必須小於AHB配置的BUS width。
AHB中的byte lanes由address offset來決定,對於32bit的bus,0x1在小端格
式就只選擇最低的byte。
HTRANS,2bit,只有AHB的信號,表示前后兩個transfer之間的關系。
IDLE,表示無數據傳輸,在lock transfer之后以idle結束。slave必須返回OKAY response。
BUSY,允許master在一個transfer中加入idle cycle。並不實現數據的傳輸,address和control
signals反映在下一個transfer。
NONSEQUENTIAL,表示一個single transfer或者一個burst的第一個transfer。
這個transfer的address和control signal和前一個transfer沒關系。
SEQUENTIAL,表示INCR/WRAP類型的transfer。control signal和前一個transfer一樣。
address根據前一個transfer計算得到。
AHB的每個transfer的控制是分開的,其中包含burst信息,而AXI的transfer是打包在一個burst中
的。AHB是基於transfer的,AXI是基於burst的。
HWDATA,32bit。
HWRITE,1--write;0--read。
Slave signals:HRDATA,31bit數據,從slave送往Multiplexor。
HREADYOUT,從slave送往Multiplexor表示每個slave自己的READY信號,最終變為HREADY。
HRESP,從slave送往Multiplexor的response信號。
Decode signal:HSEL,從decoder送往slave的HSEL信號,由高位地址線組合邏輯生成。
Multiplexor signals:HRDATA,31bit,從Multiplexor送往master,讀數據。
HREADY,從Multiplexor送往master,transfer結束信號。
HRESP,從Multiplexor送往master,response信號。
AHB中的transfer:主要依靠address,data之間的overlapping來實現pipeline。
所以當slave在data phase通過HREADY延長一個 transfer時,下一個transfer的address phase不能被即時
采樣,也會被延長。建議slave插入的wait state不超過16個clk。
AHB沒有enable信號,所以不進行傳輸時,HTRANS信號有0,表示idle,無數據傳輸。
只有HTRANS為10,non_seq時,才會開始一個transfer。
AHB中的transfer是不能超過1KB的,不是AXI的4KB。
AHB中要實現一個SEQ的transfer也是NONSEQ起始,然后每次clock rising 采樣,其后增加SEQ或BUSY類型
的transfer,也是每個clock被采樣。祥見相冊。
固定長度的burst,只能自然結束,最后一個seq transfer后,結束。
undefined INCR burst,通過non_seq和idle transfer來進行結束。
不允許通過busy tansfer,來結束burst。
burst中的wrap操作:
AHB的wrap中要求兩種對齊:1)字對齊;2)wrap對齊;
Aligned_address = (INT(start_address/number_of_bytes) * number_of_bytes)
Wrap_Boundary = (INT(start_address/number_of_bytes*burst_length) *(number_of_bytes*burst_length))
Address_1 = start_address
Address_n = Aligned_address + (N-1) * number_of_bytes
wrap的邊界地址等於burst_length*size的對齊地址,在16byte的對齊,只有低四位變化,每次增加4。
當slave在一個transfer中插入wait state時,下一transfer的可以類型改變,但是會有限制。
1)前一transfer在IDLE類型,這一transfer可以是變為NONSEQ類型;
2)前一transfer在BUSY類型且length固定,這一transfer可以變為SEQ類型;
3)前一transfer在undefined burst length且在BUSY類型,這一transfer可以變為任意類型。
當slave在一個transfer中插入wait state時,在以下情況下可以改變address。
1)當前是一個IDLE類型transfer,address可以改變。
2)當slave返回一個error時,可以在HREADY為低時,改變地址。
AHB中一個transfer傳輸的結果:
1) Transfer pending------Hresp=0, Hready=0;
2) Transfer complete------Hresp=0, Hready=1;
3) error response first cycle-----Hresp=1, Hready=0;
4) error response second cycle----Hresp=1, Hready=1;
AHB中的error返回,必須持續兩個clock,提前一個cycle可以讓master在發出下一個transfer之前,意識到這個transfer的error。
在slave需要更長時間返回resp時,也最多只能有兩個cycle的error resp,通過ready進行extend。
一個seq的transfer一般不能超過1K,因為一般IP的地址空間都是以1K為單位的,如果一個transfer超過了IP邊界,因為address的值是不變的,所以會導致
第二個IP傳輸的數據出錯,這時應該用NONSEQ重新發起一個新的transfer。
盡管AHB中有wrap類型的傳輸,但是addr的計算還是master每一個cycle都計算一次的。