1. 程式人生 > >AHB匯流排學習彙總

AHB匯流排學習彙總

部落格不是寫書,基本的背景也不做什麼介紹了,瞭解的人是不會介意這些東西的。

 

一、AHB的基本介紹

AHB是ARM退出的AMBA匯流排系列中的其中一種,它是一種高效能的pipe系統匯流排。

1. AHB匯流排有一下特性:

n  Burst 傳輸

n  Split 事務處理

n  單週期master移交

n  單一時鐘沿操作

n  無三態

n  更寬的資料匯流排配置(64/128)

 

2. AHB匯流排系統的架構 

AHB匯流排的強大之處在於它可以將微控制器(CPU)、高頻寬的片上RAM、高頻寬的外部儲存器介面、DMA匯流排master、各種擁有AHB介面的控制器等等連線起來構成一個獨立的完整的SOC系統,不僅如此,還可以通過AHB-APB橋來連線APB匯流排系統。AHB可以成為一個完整獨立的SOC晶片的骨架。

下圖是一個典型的AHB系統匯流排的結構示意圖

AHB匯流排學習 - 01 - 基礎篇 - qixin_william - qixin_william的部落格

3.  AHB匯流排的組成

下圖清楚的顯示了AHB匯流排的各個組成部分:

AHB匯流排學習 - 01 - 基礎篇 - qixin_william - qixin_william的部落格

匯流排中,有多個master和slave,一個仲裁器(arbiter)和一個譯碼器(decoder)組成。

如果再將AHB匯流排細分,可以分為三組匯流排:寫資料匯流排(HWDATA),讀資料匯流排(HRDATA)和地址控制匯流排(HADDR)。從上面的結構圖中可以看出,這三組匯流排相互分離互不干擾。對於每一組匯流排來說,同時只能由一個master或者slave來獨佔,這時需要仲裁器來決定將匯流排的控制權交與哪個裝置,並控制多路選擇器來選擇已經獲得控制權的那個裝置來傳輸資料和地址資訊。譯碼器根據地址來選擇讓哪個slave的資料通過選擇器。

一般來講,我們稱主動發起操作的裝置為master,被動響應master的為slave。 

 

二、AHB匯流排的訊號

AHB匯流排的訊號都是以H開頭,以區別其他的AMBA匯流排訊號

 訊號名  訊號源  訊號功能
 HCLK
Bus clock
 clock source  匯流排時鐘訊號,都是上升沿有效
 HRESETn
Reset
 reset controller
 系統reset訊號,低有效
 HADDR[31:0]
address bus
master  32位系統地址匯流排 
 HTRANS[1:0]
transfer type
master  transfer型別,一共有四種類型:NONSEQUENTIAL, SEQUENTAL, IDLE 或者BUSY 
 HSIZE[2:0]
transfer size
master  每一個transfer傳輸的資料大小。以位元組為單位。最高支援1024位 
 HBURST[2:0]
burst type
master   transaction型別,一共有8種 
 HPROT[3:0]
protection control
master  保護控制訊號,一般不用 
 HWDATA[31:0]
write data bus
master  這是寫資料訊號
 HSELx
slave select
decoder  slave選擇訊號 
 HRDATA[31:0]
read data bus
slave  這是讀資料訊號 
 HREADY
transfer done
slave  當這個訊號為高時,表示當前transfer完成。slave也可以通過拉低這個訊號來延長一個transfer。注意:slave需要2個HREADY訊號,一個作為輸出,一個作為輸入 
 HRESP[1:0]
transfer response
slave    slave給master的響應訊號,一共有四種:OKAY,ERROR,RETRY和SPLIT
     下面是仲裁器的訊號
 HBUSREQx
bus request
master  這時master給仲裁器的請求獲得匯流排使用權的請求訊號,最多支援16個master 
 HLOCKx
locked transfers
master  如果一個master希望自己在傳輸期間不希望丟掉匯流排,則需要向仲裁器傳送這個鎖定訊號 
 HGRANTx
bus grant
arbiter  授權訊號,會傳送給每一個master。當HREADY和HGRANTx同時為高時,master獲取系統匯流排的權利 
 HMASTER[3:0]
master number
arbiter  這個是仲裁器為每一個master分配的ID,用來給多路選擇器提供選擇訊號和為SPLIT操作提供控制訊號。 
 HMASTLOCK
locked sequence
arbiter  表示當前的master正在執行Locked操作。這個訊號和HMASTER有這相同的時序 
 HSPLITx[15:0]
split completion request
slave(SPLIT-capable)  這個訊號是具有SPLIT操作的slave提供, 作為仲裁器仲裁的一項控制訊號
     

   

 

三、AHB的傳輸過程

 1. AHB的傳輸型別

AHB一共有8種類型的傳輸模式,由HBURST[2:0]來決定

 HBURST[2:0]  型別 說明 
 000 SINGLE  單一傳輸,一次只有一個地址和控制訊號,一組資料 
 001 INCR  次數不限的遞增burst傳輸。地址根據每拍資料的大小遞增,可以傳輸任意次數。唯一的限制是地址不能超過1K邊界 
 010 WRAP4  4拍的迴環burst傳輸。一共傳4拍,地址會在地址邊界迴環。地址邊界根據burst傳輸的次數和每次傳輸的資料大小來計算 
 011 INCR4  4拍的遞增burst傳輸。一共傳4拍,地址根據每一拍的資料大小遞增 
 100 WRAP8  8拍的迴環burst傳輸 
 101 INCR8  8拍的遞增burst傳輸 
 110 WRAP16  16拍的迴環burst傳輸 
 111 INCR16  16拍的遞增burst傳輸 

註釋:1. AHB的所有操作,都要求給出的地址是對齊的。

           2. 對於同一個burst來說,每次資料的寬度都是一樣的。

下面重點來解釋幾個術語

a). 對齊地址(aligned address)。所謂的對齊地址,其實是對儲存空間的一種劃分,在讀取或者儲存資料時,要以這種劃分為前提來進行。並且對於不同的情況,對齊地址是不一樣的。下面來說明怎麼來確定對齊地址。

對齊地址是由每拍傳輸的資料的寬度來決定的,如下表

傳輸資料的寬度 對齊地址(儲存空間的劃分) 
 1-byte (  8-bit) 0x00  0x01  0x02  0x03 ....  
 2-byte (16-bit) 0x00  0x02  0x04  0x06 .... 
 4-byte (32-bit) 0x00  0x04  0x08  0x0c ... 
 8-byte (64-bit) 0x00  0x08  0x10  0x18 ...
 ...  ...

從表中可以看出,對齊地址都是所傳輸資料寬度(以byte為單位)的整數倍  。在AHB總線上,master所給出的地址,必須是對齊地址。

b). 地址邊界(address boundary)。只有對於迴環操作才有地址邊界這一說法。地址邊界跟對齊地址和拍數有關。下面舉一個例子來說明邊界怎麼算。

AHB只支援3種類型的迴環,4拍,8拍,和16拍。其實地址邊界可以使用2張表來進行計算

第一張表就是對齊地址的那張表

第二張表更簡單

 拍數  地址邊界
 4拍  從0x00開始,每第4個對齊地址為一個邊界
 8拍  從0x00開始,每第8個對齊地址為一個邊界
 16拍  從0x00開始,每第16個對齊地址為一個邊界

 那麼怎麼來用這兩張表呢?

舉一個例子,比如是一個WRAP4 的burst,每一拍4-byte資料寬度。那麼邊界地址是

這個例子是一個4拍的迴環操作,所以每第4個對齊地址為一個邊界,因為每一拍是4-byte的資料寬度,所以它的對齊地址的序列為

        0x00    0x04   0x08   0x0c      

        0x10    0x14   0x18   0x1c

        0x20    0x24   0x28   0x2c

        0x30    0x34   0x38   0x3c

        0x40    0x44   0x48   0c4c

        .........................................

根據我上面說的,每第4個對齊地址為一個邊界,所以邊界地址為0x0c  0x1c  0x2c  0x3c  0x4c .....

c). 地址迴環。 上面知道了什麼是地址邊界,下面來介紹什麼是地址迴環。

在迴環操作中,每當地址超過了地址邊界,地址就會迴環到較小的地址上繼續進行。這裡的較小地址是迴環範圍中的較小的地址。還以b)中的那個例子為例,

        0x00    0x04   0x08   0x0c      

        0x10    0x14   0x18   0x1c

        0x20    0x24   0x28   0x2c

        0x30    0x34   0x38   0x3c

        0x40    0x44   0x48   0c4c

        .........................................

上面的每一行都是一個迴環的範圍,在一次迴環操作中,地址只會在一行裡發生變化,不會越行變化,並且每個地址都會用到並且只用到一次。比如,第一拍給出的地址是0x14, 那麼接下來3拍的地址依次為 0x18 -> -x1c ->0x10。由於第三拍地址到達了邊界,所以第四拍要返回到此次迴環範圍的最小的一個地址上。

通俗的講,地址是這麼來按照次序給出的

                                    AHB匯流排學習 - 01 - 基礎篇 - qixin_william - qixin_william的部落格

不管第一個地址怎麼給出,地址總是按照這個次序依次發往匯流排。

 

d). 遞增(incrementing)- 顧名思義,就是依次增加的意思。拿INCR4來說明地址如何遞增。INCR4 表示一個4拍的burst地址遞增操作。一共4拍,表示會有4個地址,且地址依次的加上一個常數,這個常數的大小是每一拍傳輸的位元組數。比如給出的第一個地址是0x40,每一拍傳輸資料的位元組數是2bytes,則後面3個地址依次為0x42、0x44和0x46。

2. AHB最基本的傳輸 

a) 沒有等待狀態的Signal transfer

Signal transfer是AHB匯流排最最基本的傳輸型別,下面以時序圖參考來解析它的傳輸過程

AHB匯流排學習 - 01 - 基礎篇 - qixin_william - qixin_william的部落格

 這個圖中只給出了一部分的訊號,但可以清楚的說明signal transfer的傳輸過程

1.       在第一個週期的上升沿過後,master將地址和控制訊號打入匯流排。

2.       在第二個週期的上升沿處,slave將總線上的地址和控制訊號接收下來,並且將HREADY訊號拉高。

3.       在接下來的第二個週期裡,分兩種情況:

A). 如果是寫操作,master會在第二個週期的上升沿過後將要寫的資料打入匯流排。

B). 如果是讀操作,slave會在HREADY訊號拉高過後將讀取的資料打入匯流排

4.       在第三個週期的上升沿處,分兩種情況:

A). 如果是寫操作,master獲取HREADY高訊號,表明slave已經成功接收資料,操作成功。

B). 如果是讀操作,master獲取HREADY高訊號,表面此時的讀資料有效並且接收下來,操作成功。

這裡要注意一點,HREADY訊號在資料有效期間必須為高,並且延續到第三個週期的上升沿之後,確保master的正確採集。

b). slave插入等待狀態的single transfer

上面的情況是slave可以及時處理master請求的情況。但也可能存在這種情況:slave太慢不能立即處理。這時需要讓master稍微等一等。這時需要slave來插入一些等待的狀態。

AHB匯流排學習 - 01 - 基礎篇 - qixin_william - qixin_william的部落格

 如上圖,HREADY訊號在第二第三個週期拉低,意在告訴master說slave不能立即處理,需要master等待2個週期。在這裡需要注意2點:

1.  如果是寫操作,master需要在等待期間保持寫資料不變,直到本次傳輸完成。

2.  如果是讀操作,slave不需要一開始就給出資料(如果一開始可以給出的話,就不需要等待了),僅當HREADY拉高之後才給出有效資料。

c). 多個single transfer的piplline操作

前面2個都是隻發單獨的一個transfer,那麼多個transfer連續傳送會怎麼樣呢:

AHB匯流排學習 - 01 - 基礎篇 - qixin_william - qixin_william的部落格

 1.  第一個週期的上升沿之後,master發起一個操作A,並將地址和控制訊號打入匯流排。

2.  在第二個週期的上升沿處,slave收到了來自匯流排的請求,master獲取HREADY訊號為高。

3.  在第二個週期的上升沿過後,slave由於空閒將HREADY訊號拉高,表示可以處理資料。

4.  在第二個週期的上升沿過後,發現有操作B需要執行,並且檢查到上一週期的HREADY為高,則發起第二個操作B。

5.  在第三個週期的上升沿處,master獲取HREADY訊號為高,表示操作A已經完成。

6.  在第三個週期的上升沿之後,master發現有操作C需要執行,並且檢查到上一週期的HREADY為高,則發起第三個操作C。

7.  在第三個週期的上升沿之後,slave由於繁忙而插入了一個等待狀態,將HREADY拉低。

8.  在第四個週期的上升沿處,master獲取HREADY的訊號為低,知道了slave希望他這一拍等待一下,此時,master在第四個週期內需要保持和上一拍一樣的訊號。

9.  在第三個週期期間,slave處理完了事務,所以在第四個週期的上升沿之後,slave將HREADY訊號拉高,表示已經可以繼續處理資料。

10.  在第五個週期的上升沿處,master獲取HREADY訊號為高,知道了slave已經可以處理B操作。

11.在第五個週期的上升沿之後,B操作完成。

12.在第六個週期的上升沿之後,C操作完成。

對於上面的過程需要注意幾點:

1.       HREADY在一定程度上表示了slave的pipeline能力,在AHB中,是2個pipe。也就是總線上最多存在2個未處理完的transfer。

2.       只有當總線上未完成的transfer少於2個時,master才能發起操作。

下面開始學習AHB的特色傳輸 - burst transfer

 

在介紹burst transfer之前,還是把AHB的控制訊號補全。

 

HWRITE - 這個訊號是讀寫控制訊號,也即transfer的方向控制訊號。 高電平表示寫操作,低電平表示讀操作。

 

HSIZE - 這個訊號是指明單次transfer的資料寬度。具體如下圖所示

AHB匯流排學習 - 02 - 基礎篇 - qixin_william - qixin_william的部落格

 

HPROT[3:0] - 為transfer提供額外的訪問保護和控制權限訊號。一般不用,在此不做介紹

 

HTRANS[1:0] - 進行一次傳輸時的傳輸型別,這個訊號由master根據自己要進行的傳輸型別生成的控制訊號。一共4種類型

00     – IDLE:

告知slave當前匯流排處於空閒狀態,沒有有效的transaction在進行,那麼此時就算slave被使能,也不會從總線上獲取任何的資料訊號。如果此時salve被選中,那麼每一個IDLE週期slave都要通過HRESP[1:0]返回一個OKAY響應(見HRESP)

      01 – BUSY:

如果slave收到了這個訊號,表面當前的master正在進行一個burst傳輸但是在當前週期不能立刻給出下一次要傳輸的資料,這時slave不會從總線上收取資料而是等待,並且通過HRESP[1:0]返回一個OKAY響應。需要注意的是,這個transfer需要給出下一拍的地址和控制訊號,儘管slave不會去取樣。

      10 – NONSEQ:

Salve收到這個訊號時,表示當前是一個single transfer(就是隻傳輸一次)或者是burst 傳輸的第一個transfer。此時總線上的地址訊號和控制訊號與之前的毫不相干。可以理解為一個新的transaction的開始。

       11 – SEQ:

這個訊號只有在burst傳輸中出現。當slave收到這個訊號時,表明當前的transfer是一個burst transaction中的某一拍。這時,總線上的控制訊號應當與之前的保持一致,地址視情況遞增或者回環。(這些訊號其實是由master決定的,slave不用考慮,只需要單方面接收即可)

那麼下面就繼續學習burst transfer的流程。

d) 遞增burst

AHB匯流排學習 - 02 - 基礎篇 - qixin_william - qixin_william的部落格

 1. T1時刻之後,master將第一拍地址和控制訊號打入匯流排,因為是一個新的burst的開始,所以transfer的型別是NONSEQ的。

2.  由於master不能在第二個週期裡處理第二拍,所以master使用BUSY transfer來為自己延長一個週期的時間。注意,雖然是延長了一個週期,但是master需要給出第二個transfer的地址和控制訊號。

3.  slave在T3時刻採集到了master發來的BUSY transfer,知道master需要等待一拍,所以,slave會忽略這個BUSY transfer。

4. 在等待了一個週期之後,master在第三個週期發起了第二個transfer,因為是同一個burst的第二個transfer,所以transfer的型別是SEQ。

5. 在第五個週期裡,slave將HREADY訊號拉低,告訴master需要等待一個週期。

6. 最後在T8時刻完成最後個transfer。

需要注意的 雖然slave會忽略掉BUSY transfer,但是master也需要給出下一拍的地址可控制訊號。

 

e). wrapping 4-beat burst

AHB匯流排學習 - 02 - 基礎篇 - qixin_william - qixin_william的部落格

 上圖為一個4拍的迴環burst傳輸。

跟之前唯一的區別在於地址的不同,在0x3C地址之後,根據迴環的地址邊界,第三拍的地址變為0x30。

一共四拍,一共4個地址,每個地址各不相同,這四個地址是一個迴環範圍。起始地址決定了迴環操作的迴環範圍。至於如何確定迴環地址和範圍,在之前的帖子裡說的非常清楚,在此不再贅述。

f). 4拍的遞增burst 

AHB匯流排學習 - 02 - 基礎篇 - qixin_william - qixin_william的部落格

 這個是地址遞增的4拍burst。

和上面的基本一直,只不過地址在0x30並不迴環,而是遞增。

g). 其他還有4種burst

     wrapping 8

     increasing 8

     wrapping 16

     increasing 16

基本和上面類似,這裡就不再一一說了。

本文轉自:http://blog.163.com/qixin_william/blog/static/240217035201491425318830/

http://blog.163.com/qixin_william/blog/static/240217035201491133626819/