AHB總線筆記(二)
在AHB總線筆記(一)中介紹了:
AMBA簡介:AMBA2.0 包括AHB、ASB、APB
AHB的組成部分:AHB master、AHB slave、AHB arbiter、AHB decoder
APB的組成部分:AHB2APB bridge、APB slave
AHB信號(hào):HCLK、HRESETn、HADDR、HTRANS、HWRITE、HSIZE、HBURST、HWDATA、HSELx、HRDATA、HREADY、HRESP。
下面進(jìn)一步記錄其他的筆記。
????????AHB BURST操作,4beat、8beat、16beat、單字節(jié)傳輸、未定義長度傳輸。支持incrementing和wrapping(回環(huán))兩種burst傳輸。(注意這里是beat,不是bit,表示傳輸次數(shù))。
????????incrementing burst 地址是上一次的傳輸?shù)刂芳右弧?br>
????????Wrapping burst(回環(huán)):例如4beat的wrapping burst字傳輸(4byte)? ?
0x34 -> 0x38 -> 0x3c -> 0x30,這里什么時(shí)候地址回環(huán)很有講究,由burst和hsize共同決定,比如上面的例子是:4beat * 4byte = 16 byte =0x10,注意這里的0x10是地址的序號(hào),而一個(gè)地址可以存儲(chǔ)8bit數(shù)據(jù)也就是1byte數(shù)據(jù),所以這里16byte是地址0x10。每當(dāng)取數(shù)據(jù)遇到0x10的整數(shù)倍時(shí),就要返回回環(huán)。上面的例子就是要遇到0x40了,所以需要返回回環(huán)。那如果是8beat的4byte的傳輸呢?那就是8beat * 4byte = 32 byte = 0x20,每0x20的整數(shù)倍就要進(jìn)行回環(huán),比如0x34 -> 0x38 -> 0x3c -> 0x20 -> 0x24 -> 0x28 -> 0x2c -> 0x30? 這樣走回環(huán)。如果他的起始地址恰好是回環(huán)地址的倍數(shù),那Wrapping burst就和INCR沒區(qū)別,比如INCR[4]。

????????WRAP4的地址回環(huán)倍數(shù)是0x10,WRAP8的地址回環(huán)倍數(shù)是0x20,WRAP16的地址回環(huán)倍數(shù)是0x40。因?yàn)镠SIZE = 010,所以每一次地址的遞增都是4個(gè),也就是4byte。上面就是8種burst類型。? ? Type后面的數(shù)字表示傳輸?shù)臄?shù)據(jù)個(gè)數(shù),也就是beat。
????????下面的是INCR8的波形圖:

? ? ????? ?????下面的是WRAP8的波形圖:

上面是比較簡略的波形圖用來示意INCR和WRAP的區(qū)別,下面的INCR4和WRAP4的波形圖就正規(guī)些了。

看HBURST類型,上圖為INCR4,下圖為WRAP4。

????????好,看了那么多波形,對(duì)不同的burst傳輸應(yīng)該有比較深的認(rèn)識(shí)了。這里還要補(bǔ)充一些burst的特點(diǎn)。burst傳輸不能超過1K邊界。一個(gè)從設(shè)備最小的地址間隙是1KB。burst不能越過1KB的邊界,那遇到邊界該如何處理呢:
????????????NONSEQ -> SEQ -> 1KB Boundary -> NONSEQ -> SEQ?

如圖,傳輸?shù)?x400的倍數(shù)的時(shí)候就要再發(fā)起一個(gè)burst,不然就超過1K邊界了(4*16Byte^2=1024Byte = 1KB )

????? ?HSELx:由decoder輸出,選擇從設(shè)備,指出由主設(shè)備所選擇的從設(shè)備。由地址譯碼器來提供選擇信號(hào)。一個(gè)從設(shè)備應(yīng)該至少占用1KB的存儲(chǔ)空間(0x400地址的倍數(shù)就得NONSEQ )。需要一個(gè)額外的缺省從設(shè)備來映射其他的存儲(chǔ)地址(default:),可以表現(xiàn)為當(dāng)addr落在某個(gè)范圍的時(shí)候,HSELx等于多少,當(dāng)addr落在另一個(gè)范圍的時(shí)候HSELx又等于多少,其他情況下(else or default),HSELx等于多少(有點(diǎn)類似于組合邏輯不能綜合出latch,每一個(gè)分支都得被涉及的意思)。
????????第一個(gè)MUX由Arbiter仲裁,選擇HADDR為哪個(gè)master的地址,然后把HADDR輸入到Decoder中,選擇把哪個(gè)slave的HSEL拉高。

????????如果slave被Decoder選中,即slave的HSEL被拉高,從設(shè)備必須響應(yīng)這次傳輸!
????????slave可能返回的響應(yīng):1.完成這次傳輸(OKAY)?2.插入等待狀態(tài)(HREADY)3.發(fā)出錯(cuò)誤信號(hào)表示這次傳輸失?。‥RROR) 4.延時(shí)傳輸,使得總線可用于其他傳輸(RETRY、SPLIT)
HRESP[1:0] :
00:OKAY? ? ? 單周期響應(yīng)
01:ERROR??兩周期響應(yīng)
10:RETRY? ?兩周期響應(yīng)
11:SPLIT? ? ?兩周期響應(yīng)
????????總線的流水特性,需要從設(shè)備兩個(gè)周期的響應(yīng)??梢允沟弥髟O(shè)備有足夠的時(shí)間處理下一次傳輸。
????????SPLIT和RETRY的區(qū)別在于使用SPLIT拒絕請(qǐng)求后,會(huì)降低master在Arbiter的優(yōu)先級(jí)。具體Arbiter用什么優(yōu)先級(jí)策略可以自己定制。
????????總線主設(shè)備應(yīng)該用同樣的方式處理RETRY響應(yīng)和SPLIT響應(yīng)。
RETRY響應(yīng):

????????RETRY要保持兩個(gè)cycle。如果錯(cuò)誤的話,即返回HRESP不是OKAY,那master的HTRANS就要進(jìn)入IDLE狀態(tài),所以需要額外一個(gè)周期來進(jìn)入NONSEQ狀態(tài)。
????????數(shù)據(jù)總線不是三態(tài)總線,讀總線和寫總線是分開的。什么是三態(tài)呢?只有在PAD部分,有三個(gè)端口INPUT、OUTPUT、INOUT,在這些輸出端口上會(huì)有三態(tài)狀態(tài),在總線內(nèi)部是沒有三態(tài)的。
????????印第安序,印第安序用來表示總線有效的位數(shù)。主設(shè)備和從設(shè)備應(yīng)該采用同樣的印第安序,不支持動(dòng)態(tài)的印第安序,在AMBA協(xié)議中沒有定義。

????????

AHB仲裁信號(hào):

????????因?yàn)樽疃嘀С?6個(gè)master,所以HMASTER只需要四個(gè)bit就夠了。HBUSREQ?總線請(qǐng)求,master發(fā)送總線請(qǐng)求,然后Arbiter允許的話就返回GRANT信號(hào)。HLOCKx 高電平:主設(shè)備請(qǐng)求鎖定總線,因?yàn)椴幌M鹠aster原本要傳輸一百個(gè)數(shù)據(jù)的,結(jié)果中途被打斷了,所以需要把總線lock住。HGRANTx 指出主設(shè)備x 可訪問總線,主設(shè)備x 控制總線條件:HGRANTx = 1 且 HREADY = 1。HMASTER[3:0] 指出哪個(gè)主設(shè)備正在進(jìn)行傳輸。HMASTLOCK 指出主設(shè)備正在進(jìn)行一次鎖定傳輸。 HSPLITx[15:0] 從設(shè)備用這個(gè)信號(hào)告訴仲裁器哪個(gè)主設(shè)備允許重新嘗試一次split傳輸,16bit每一位對(duì)應(yīng)一個(gè)主設(shè)備。,這里既有x又有16bit,其中x代表哪一個(gè)slave,16bit從來選master,因?yàn)榻?jīng)過arbiter后,slave很清楚是哪一個(gè)master在請(qǐng)求他,所以如果要拒絕哪一個(gè)master的請(qǐng)求,由slave發(fā)出會(huì)比較準(zhǔn)確。
仲裁舉例:

????????上圖為沒有等待狀態(tài)的HGRANT拉高波形圖,HGRANT信號(hào)一拉高,數(shù)據(jù)就開始傳輸(沒有等待是因?yàn)镠READY一直為高),所以HGRANT一拉高,滿足HREADY = 1 且 HGRANTx = 1 那么總線就會(huì)把控制權(quán)交給HMASTER。但很多時(shí)候,HGRANT拉高的時(shí)候,HREADY并不是1,所以下面的波形圖更具普適性。

????????Arbiter在接收到master發(fā)送的HBUSREQx指令后,經(jīng)過兩個(gè)周期給出GRANTx指令,然后在T4時(shí)刻,發(fā)現(xiàn)呢HREADY并不為高,所以masterx不能獲得總線控制權(quán),在T5時(shí)刻,HGRANT和HREADY都為1,masterx獲得總線控制權(quán),可以傳輸數(shù)據(jù),但在T6時(shí)候HREADY又不為高,所以HADDR保持不變直到HREADY為高后,繼續(xù)下一個(gè)數(shù)據(jù)的傳輸。在master用完總線后,需要把總線控制權(quán)還回去:

????????對(duì)于M1來說,市區(qū)GRANT之后,還能再發(fā)一個(gè)地址和數(shù)據(jù)。 對(duì)于M2master來說,在T7時(shí)刻拿到數(shù)據(jù)總線控制權(quán)后,就可以開始傳輸所以在T7時(shí)刻后面的HADDR為一個(gè)數(shù)、HTRAN為NONSEQ,但是即使這樣傳輸?shù)臄?shù)據(jù)也得到下一個(gè)周期才到HWDATA,所以M1這個(gè)操作可以把HWDATA總線完全利用起來,因?yàn)?strong>本來M2獲得控制權(quán)后的第一個(gè)周期,數(shù)據(jù)也到不了HWDATA上,會(huì)浪費(fèi)一個(gè)送數(shù)據(jù)的周期。

????????Arbiter選擇Master,對(duì)master來說,master是知道自己有沒有被GRANT,但是他不知道HADDR輸出去后會(huì)被發(fā)給哪個(gè)slave。Arbiter選擇哪個(gè)HMASTER的HADDR送出去,送到哪里呢?送到Decoder解碼,選中哪個(gè)slave。
????????補(bǔ)充:對(duì)于固定長度的burst傳輸,不必持續(xù)請(qǐng)求總線。對(duì)于未定義長度的burst傳輸,主設(shè)備應(yīng)持續(xù)送出HBUSREQ信號(hào),直到開始最后一次傳輸。
????????如果沒有主設(shè)備請(qǐng)求總線,則給缺省主設(shè)備(即default master)GRANT信號(hào),且HTRANS = IDLE。建議主設(shè)備在鎖定總線傳輸結(jié)束之后插入IDLE傳輸,以重新仲裁優(yōu)先級(jí)、
split傳輸過程:
①?由主設(shè)備開始傳輸。
② 如果從設(shè)備需要多個(gè)周期才能獲取數(shù)據(jù),則從設(shè)備給出一個(gè)SPLIT傳輸響應(yīng),從設(shè)備記錄主設(shè)備號(hào):HMASTER。接著仲裁器改變主設(shè)備的優(yōu)先級(jí)。
③ 仲裁器GRANT其他的主設(shè)備,總線主設(shè)備移交。
④ 當(dāng)從設(shè)備準(zhǔn)備結(jié)束本次傳輸,將設(shè)置給仲裁器的HSPLITx信號(hào)的相應(yīng)位。
⑤ 仲裁器恢復(fù)優(yōu)先級(jí),恢復(fù)到發(fā)送spilt信號(hào)之前。
⑥ 仲裁器GRANT主設(shè)備,這樣主設(shè)備可以重新開始傳輸。
⑦ 結(jié)束。
????????當(dāng)多個(gè)不同的主設(shè)備訪問同一個(gè)從設(shè)備,這個(gè)從設(shè)備發(fā)出了SPLIT或RETRY信號(hào),這時(shí)可能發(fā)生deadlock死鎖。從設(shè)備最多可以接收系統(tǒng)中16個(gè)主設(shè)備的請(qǐng)求。只需要記錄主設(shè)備號(hào)(忽略地址和控制信號(hào))。給出RETRY響應(yīng)的從設(shè)備在某一時(shí)刻只能由一個(gè)主設(shè)備訪問防止死鎖。
下圖為AHB總線的主設(shè)備接口:

AHB從設(shè)備接口:

AHB Arbiter接口:

AHB Decoder接口:

學(xué)習(xí)AHB總線,需要學(xué)會(huì)繪制AHB總線上四個(gè)組成部分的接口框圖,并描述信號(hào)作用。