AMBA總線概述
系統總線簡介:
系統晶片中,各個子產品之間需要有接口來連接配接,總線作為子系統之間共享的通信鍊路
其優點是低成本、友善易用,缺點是會造成性能瓶頸。
AMBA 2.0
AMBA全稱Advanced Microcontroller Bus Architecture進階微控制器總線架構
定義了三種總線:
AHB(Advanced High-performance Bus):高性能總線
ASB(Advanced System Bus):進階系統總線(這個用的相當少)
APB(Advanced Peripheral Bus):外圍裝置總線
一個典型的AMBA系統:
AHB
AHB是一種高性能的高速總線
兩級流水線操作(位址周期和資料周期)
可支援多個總線主裝置(Master),最多16個
支援burst傳輸(一次傳一批)
總線帶寬:8、16、32、64、128
上升沿觸發操作
AHB的四大組成部分:
AHB主裝置(Master)
AHB從裝置(Slave)
AHB仲裁器(Arbiter)
AHB譯碼器(Decoder)
Master:
發起讀寫
一時間隻允許一個裝置使用
CPU、DMA、DSP、LCD Controller等等可以做master
因為一時間隻允許一個裝置使用總線,那麼就需要一個仲裁器來決定誰來使用這個總線。
Arbiter:
master會發一個request信号給arbiter。arbiter允許了就傳回一個grant信号。
到底怎麼仲裁,可以自己設計。
Decoder:
根據位址解釋AHB找到的是哪一個slave
AHB總線互連(這是簡單的一部分示意圖):
由仲裁器通過MUX來決定資料總線和位址總線由誰發出。
基本AHB信号:
簡單說明:
Master發出的信号:
H打頭表示AHB。相應的,APB的信号都是用P打頭的。
HCLK:Clock
HRESETn:低電平複位信号
HADDR:Address
HTRANS[1:0]:Master用來訓示目前傳輸的資料狀态,包括四種:IDLE,BUSY,NONSEQ,SEQ
HWRITE:是否為寫資料 1:寫 0:讀
HSIZE[2:0]:選擇Bus的寬度 0:8bit 1:16bit 2:32bit大部分時間是不變的,等于2。這個玩意兒還能再往上設定(有64bit,128bit甚至最高有1024bit……哪會有這麼多線噢!),但是不會用到
HBURST[2:0]:burst傳輸,表示一串信号的傳輸,當slave裝置知道這是一連串的資料的時候就比較好準備,減少沒ready的情況。
HPROT:protect,這個不怎麼用,就不講了
HWDATA[31:0]:寫入的資料總線
Decoder發出的信号:
HSELx:Decoder在接收到位址以後,判斷這個位址屬于哪一個slave,然後把這個slave的選中信号HSELx拉高。
Slave發出的信号:
HRDATA[31:0]:讀出來的資料總線。
HREADY:Master發送了一個信号,要知道Slave能不能接受,這個信号很重要,Master要知道資料是不是寫進去了。
比如發送一個ADDR,檢查HREADY是否為高,高了之後再發下一拍的動作:下一個位址以及上一拍的資料。
如果HREADY沒有被拉高,那麼信号維持一拍再檢查READY。
HRESP[1:0]:Response信号。Slave裝置訓示Master動作的唯一方式。有四種情況:OK、ERROR、SPLIT和RETRY。
正常收到了就傳回一個OK,出錯了就報一個Error,或者沒法響應了,就發Retry或者Split。讓Master過段時間再來。Retry和Split的差別,後面會詳述。
一個單周期讀寫的簡單例子(無需等待狀态):
注意資料和位址分兩個總線傳輸(Pipeline形式),A位址的資料需要在下一拍到達。也就是A的下一個位址和A的資料同時到達。
問:讀和寫為什麼不使用三态總線?
答:三态總線在原則上是可以的,但是一般來說,做數字設計的内部信号不會有inout類型,不會使用三态器件。
流水線示意圖:
如果READY信号不一直為高電平,出現了低電平的話:
Master檢測到Slave的Ready信号為低電平,視為目前的資料和位址都沒有被接受,延長一拍再檢查Ready信号,如果還是沒有,那繼續等下一拍。
需要注意的是這個HREADY信号如果一直為低電平的話,等待的時間太長了,是會影響到總線的效率的,是以說不要大于16個時鐘周期。如果Slave裝置要做的事情很多,那就在Response信号中,發出Split或者Retry,仲裁信号會根據slave的訓示把Master的請求給關了,有時還會降低它的優先級。
BURST傳輸
如果要節省使用時間,可以使用Burst傳輸:
Burst Transfer模式由HBURST信号控制。
這個信号是三位的,有八種模式:
0、Single Transfer:(HBURST = 0)隻傳一次。
1、INCR:沒有一個固定的長度,一直傳下去。
2、INCR 4-beat:連續傳四拍,位址是累加的,這個累加的字長根據Master裝置的HSIZE信号訓示(一般取2,32bit,也就是四個位元組,是以每次的位址需要加4。如果是0或者1的話,就是一個位元組、兩個位元組)。
3、INCR 8-beat
4、INCR 16-beat
Wrapping Burst:
wrapping burst指的是回頭傳位址。要明白的是碰到哪根邊界退回。
比如傳8個beat的wrapping burst,每次傳32位也就是4byte,那麼一次burst需要的位址共為8*4=0x20。當碰到0x20的整數倍的時候,位址會回頭跳到上一個0x20的整數倍位址。
如位址序列0x34 0x38 0x3c 0x20(因為這時候如果不回頭就碰到0x40了,它是0x20的倍數) 0x24 0x28 …
跟INCR一樣也有三種長度
WRAP 4-beat
WRAP 8-beat
WRAP 16-beat
位址計算舉例:
大部分時間都是普通的single和INCR這種不定長的連續傳輸。
上圖可以看出來Wrapping 和 Incremental 的差別。
burst波形舉例:
INCR8 Burst:
WRAP8 Burst:
在要碰到0x80的時候回頭了
詳細一點的INCR4 Burst 且有Ready為低的情況:
與之對應的WRAP4 Burst的情況
注意這裡的控制信号,HWRITE,HSIZE和HPROT
特别注意——
Burst傳輸不能跨越1K邊界!即0x400。碰到它的時候需要用HTRANS需要變成nonseq狀态,因為這裡的位址不是連續的。(也沒别的要求了,設計Master的時候注意下就行了。)
關于用8bit、16bit的資料存放位置,AMBA協定沒有硬性規定。主裝置和從裝置應該采用相同的印第安序。不支援動态印第安序。
那麼什麼是印第安序。。。
小印第安序表示先進去的(低位址)是低位元組數,
大印第安序表示先進去的是高位元組數(這樣更符合人的習慣,因為人是從高位往低位讀的)。
這個印第安序和印第安人或者印度人沒有任何關系…
(emmm因吹絲亭。)
小印第安序:
大印第安序:
插入低電平的HREADY信号表示Slave沒有準備好,那如果是Master沒有準備好怎麼辦?
——通過插入一些IDLE和BUSY。
兩位信号HTRANS[1:0] 用來訓示目前傳輸的狀态,有四種狀态:
IDLE BUSY NONSEQ SEQ
IDLE:
表示主裝置占用了總線,但是沒有進行傳輸,兩次Burst傳輸中間主裝置發IDLE。也就是說,下一個信号IDLE之後的下一個信号一定是新一輪的Burst。
BUSY:
主裝置占用了總線,但是在Burst傳輸過程中還沒有準備好進行下一次傳輸(資料源可能有些問題),則在一次傳輸的中間主裝置發BUSY。即下一個信号還是此次的Burst傳輸的信号。
NONSEQ:表明一次單個資料的傳輸,此次位址與之前的不一定連續。在碰到了0x400的時候也要用NONSEQ。
SEQ:表明burst傳輸接下來的資料的位址和上一次傳輸的位址是相關的。
這裡busy之後還是SEQ,因為是同一個burst。
位址譯碼:
HSELx:選擇從裝置,指出由主裝置所選擇的從裝置。
由位址譯碼器來提供選擇信号(Decoder的位址信号由Arbiter通過MUX篩選出來)。
一個slave裝置因該至少占用1KB的位址空間。
需要一個額外的預設slave裝置來映射其他的存儲位址,否則會綜合出鎖存器。
站在slave的角度來說,當decoder發出的HSELx信号選中了這個slave的時候,必須響應,不管ready有沒有好,能不能接受。
Slave的響應信号有三個,HRDATA,HREADY和HRESP。
當OK且Ready的時候,說明資料可以被收發
從裝置響應可能傳回的響應:
1、 完成這次傳輸(OK)
2、 插入等待狀态(HREADY)
3、 發出錯誤信号表示這次傳輸失敗
4、 延遲此次傳輸,使得總線可用于其它傳輸(split,retry)
詳細一點:
HREADY:transfer done
HRESP[1:0]:transfer response
00:OKAY (單周期響應)成功了
01:ERROR (兩周期響應)失敗,出了問題
10:RETRY (兩周期響應)傳輸未完成,請求主裝置重新開始一個傳輸
11:SPLIT (兩周期響應)傳輸未完成,請求主裝置分離一次傳輸。
注意:Retry表示的是過段時間再來retry,而不是馬上retry。中間可能要等幾十上百個周期。
Split也同樣,但是它會降低目前master的優先級,意思就是Arbiter覺得你老浪費總線的資源,是以就隻在總線空閑的時候再給你用。
雙周期,比如說ERROR,這屬于異常情況,需要給master一個周期的時間去“思考”下個周期該輸出什麼。(總線的流水特性需要從裝置兩個周期的響應,可以使得主裝置有足夠的時間處理下一次傳輸。)
例:Retry響應:
A那個位址正在忙,slave傳回一個RETRY信号,master接收到retry和低電平的ready,知道從裝置暫時無法響應,然後空出一拍的時間,這一拍slave的HRESP必須還是retry,給master一個調整狀态的時間。然後接下來的可以再說了。
AHB仲裁:(Arbiter)
HBUSREQx:總線請求信号,每一個主裝置都有這麼一根總線請求連到仲裁器上。
HLOCKx:鎖定傳輸:
仲裁器必須確定在鎖定傳輸結束之前,不會授權其它主裝置。
在一個連續鎖定傳輸之後,仲裁器将總是為一個附加傳輸保持總線主裝置被授權總線,以確定鎖定序列的最後一個傳輸成功完成。并且,沒有接收到 SPLIT 或者 RETRY 響應。是以,建議但不規定,主裝置在任何鎖定連續傳輸之後插入一個空閑傳輸,以提供給仲裁器在準備另外一個猝發發傳輸之前改變總線授權的機會。
是以,建議但不規定,主裝置在任何鎖定連續傳輸之後插入一個空閑傳輸,以提供給仲裁器在準備另外一個猝發發傳輸之前改變總線授權的機會。
中間三個是arbiter的控制資訊的輸出或者狀态資訊的輸出。
HGRANTx:仲裁器根據優先級允許請求。
HMASTER:因為最多支援16個master,是以隻需要四位的HMASTER就夠了,這是一個狀态信号用來指出哪一個主裝置正在使用總線。注意HGRANTx信号拉高之後并不一定HMASTER就會變為相應的主裝置的代号,還跟Ready信号有關系。
HMASTLOCK:同意使用鎖定。該信号訓示每個從裝置目前傳輸是鎖定的,是以必須在更換主裝置授權之前被撤銷掉。
HSPLITx[15:0]:這裡的x表示哪一個slave,這16bit表示哪個Master(獨熱碼)。這個信号由各個Slave提供,訓示到底哪個Slave要把哪個Master的優先級做調整。
波形舉例:
沒有等待狀态的1:
仲裁信号舉例2:
注意,當GRANT被拉高的時候HMASTER沒有立即變動,而是等HREADY做完了,上一次的資料交換完全結束了,HMASTER才可以變動,這時候才把總線交給發送請求的Master裝置。
仲裁信号舉例3:
(用完了之後怎麼辦,怎麼移交出去)
當M2送出請求信号之後,過了一段時間,從裝置發出RESPONSE SPLIT或者RETRY信号,此時仲裁器取消M1的GRANT信号,同時拉高M2的GRANT信号,這時候,由于HREADY信号仍然為低電平,總線暫時還不能交到M2的手上,直到HREADY為高電平了,狀态信号HMASTER才會變成2,表示master2在控制總線。
一個需要注意的細節是:在M2取得總線的使用權的那一拍,M1仍然可以使用資料總線,這是因為使用的是流水線結構,M2拿到總線使用權之後這一拍不會用到資料總線。
總線主裝置Grant信号示意圖:
可以看到,在仲裁器修改了HMASTER之後,相應的位址選擇信号才被切換。
幾點說明:
1、 對于固定長度的burst傳輸,不必持續請求總線
2、 對于未定義長度的burst傳輸,主裝置應該持續送出HBUSREQ信号,直到最後一次傳輸
3、 如果沒有主裝置請求總線,則給預設裝置設grant信号,且HTRANS = IDLE
4、 建議主裝置在鎖定總線傳輸結束後插入IDLE傳輸,以重新仲裁優先級
SPLIT的産生與解除:
由主裝置開始傳輸
如果從裝置需要多個周期才能擷取資料,則從裝置給出一個SPLIT傳輸響應。從裝置記錄主裝置号HMASTER。接着仲裁器改變主裝置的優先級。
仲裁器grant其它的主裝置,總線主裝置移交。
當從裝置準備結束本次傳輸,将設定給仲裁器的HSPLITx信号(16位的bus)的相應位。
仲裁器恢複優先級。
仲裁器grant主裝置,這樣主裝置可以重新開始傳輸。
結束
DEADLOCK:
在使用SPLIT和RETRY時,注意預防總線deadlock
單個傳輸不會鎖定AHB,因為每個從裝置都被設計成能在預先确定的周期數内完成傳輸;
如果多個不同主裝置嘗試通路同一個從裝置,從裝置發出分割或者重試響應以表示從裝置不能處理,那麼就有可能發生死鎖。
從裝置可以發出分割傳輸響應,通過確定從裝置能夠承受系統中每個主裝置(最多 16 個) 的單個請求來預防死鎖。
從裝置并不需要存儲每個主裝置的位址和控制資訊,它隻需要簡單的記錄傳輸請求已經被處理和分割響應已經發出的事實即可。最後,所有主裝置将處在低優先級。
然後,從裝置可以有次序的來處理這些請求,訓示仲裁器正在服務于哪個請求,因而確定最終服務所有請求。
當從裝置有許多未完成的請求時,它可能以任何順序随機的來選擇處理這些請求。
盡管,從裝置需要注意,必須在任何其他傳輸繼續之前完成鎖定傳輸。
從裝置使用分割響應而不用鎖存位址和控制資訊顯得非常合适。從裝置僅需要記錄特定主裝置做出的傳輸嘗試,并且在稍後的時間段後,從裝置通過訓示自己已經準備好完成傳輸,就能擷取位址和控制資訊。
将授權主裝置使用總線并将重新廣播傳輸,以允許從裝置鎖存位址和控制資訊。并且,立刻應答資料或者發出另外一個分割響應(如果還需要額外的一些周期)。
理想情況下從裝置不應該有多于它能支援的未完成的傳輸,但是要求支援這種機制以防止總線死鎖。
(這些是SPEC上的,我看不懂…後面再說吧。)
具體接口設計如下
主機的輸入:
HGRANTx:Arbiter的允許信号
HREADY:Slave的準備信号
HRESP[1:0]:Slave的狀态響應信号
複位、時鐘
HRDATA[31:0]:讀進來的資料
主機輸出:
HBUSREQx:對仲裁器請求
HLOCKx:申請鎖定傳輸
HTRANS[1:0]:輸出目前傳輸狀态
HADDR[31:0]:輸出位址
HWRITE:是否為寫操作
HSIZE[2:0]:訓示此次傳輸的資料是多少位的
HBURST[2:0]:BURST傳輸的模式
HPROT[3:0]:保護模式
HWDATA[31:0]:寫資料總線
注意,這裡把主裝置的一些信号也包括進來了,比如HTRANS,HBURST。
之前講過在HBURST為指定的比如4beat incr的時候,即使主裝置取消了request,也還是占用着總線的。還有HTRANS的信号是sequence的還是nonsequence的。
從機輸入:
HSELx:來自Decoder将位址譯碼之後的選擇信号
HADDR[31:0]:來自經過Arbiter的HMASTER信号選擇MUX之後的主機發出的位址
HWRITE:來自主機的讀寫控制信号
HTRANS[1:0]:來自主機的輸出狀态
HSIZE[2:0]:來自主機,表示此次傳輸資料的位數
HBURST和 HWDATA:不講了
HMASTER[3:0]:用于SPLIT信号的産生,從機需要知道是哪一個主機對它在操作,這個SPLIT是針對哪一個主機的
HMASTLOCK:Arbiter知道這是一個鎖定信号,在改變狀态的時候,也告訴從機。
HREADY:準備信号
HRESP HRDATA:不講了
HSPLITx[15:0]:記錄是對哪一個主機信号發出SPLIT,同時用于SPLIT的撤銷
仲裁器輸入:
HBUSREQx(有很多根):來自各個master的請求信号
HLOCKx:來自各個master的鎖定傳輸請求信号
HADDR[31:0]:暫時不清楚這裡為什麼需要給仲裁器位址信号
HSPLITx[16:0]:接收各個從機的SPLIT訓示,以降低和恢複優先級
HTRANS:接收主機的狀态
HBURST:接收傳輸的BURST模式
HRESP:從機的狀态
HREADY:需要所有HREADY的與為高電平且HGRANTx為高電平才能使HMASTER改變,即總線完成授權
仲裁器輸出:
HGRANTx:GRANT信号
HMASTER:總線占用資訊
HMASTLOCK:告訴從機這是一個鎖定信号
譯碼器:
輸入為經過Arbiter控制的MUX選擇之後的位址總線,輸出為各個從機的選中信号。