AXI總線你需要知道的事兒
掃描二維碼
隨時隨地手機看文章
ZYNQ的FPGA系統(tǒng)呢,AXI總線是個繞不開的話題。
以AXI4為例。又有AXI FULL/LITE/STREAM之分。不同總線起到的效果是不一樣的。由于AXI的文檔三百多頁。。。對于沒有了解過AXI的人來說就是天書。所以這篇文章著重講一下AXI總線的一些基本概念和使用方法。高級的用法再去查文檔。
你可以理解為一種用于傳輸數(shù)據(jù)的模塊或者總線。用于兩個模塊或者多個模塊之間相互遞數(shù)據(jù)。反正它有一堆優(yōu)點。。被SOC廣泛采用了。
AXI FULL傳輸數(shù)據(jù)是全雙工的。也就是說。讀寫是同時進行的。
一條AXI總線上有5個通道。兩個用于讀。三個用于寫。
先說AXI怎么寫數(shù)據(jù)。。
首先,主通過寫地址channel給奴給了個地址...奴收到信號以后就可以瘋狂通過寫數(shù)據(jù)channel往里送數(shù)據(jù)。寫完以后通過寫回復channel給主一個結束信號。
寫回復通道其實2個BIT.能代表四種狀態(tài),傳成功了。以及幾種傳失敗了的狀態(tài)。
這就是一次AXI寫操作。
AXI讀操作如上...主給奴個地址,于是奴瘋狂的給主返回數(shù)據(jù)。
那為什么讀只需要兩個通道呢??因為完成信號可以用read data channel一并傳輸。
實際上的AXI還有各種奇奇葩葩的信號。你只需要了解上面幾個就行。其他的當你有需求的時候自然會看。
每個通道為了調(diào)節(jié)速度,保證傳輸。都采用了ready valid握手協(xié)議的辦法。主給出valid,奴給出ready, 只有當ready和valid都是高的時候,這次傳輸才算成功。
如上圖。valid和ready哪個先來不重要。同時來了以后information就被傳輸了。
那舉個栗子,讀數(shù)據(jù)的時候ready valid信號怎么給?
如上圖,主先給地址的valid名叫arvalid. 然后奴等自己洗好了以后給出地址的ready arready。然后說明地址傳輸好了。當主檢測到arvalid和arready同時為高是,就和以把讀數(shù)據(jù)通道rvalid置高,愉快的傳數(shù)據(jù)了。此時要是從設備準備接受數(shù)據(jù)了拉個rready. 數(shù)據(jù)就傳輸完成了。
寫也類似。如上圖。上面一行是主設備。下面一行是從設備。其中BVALID就是response通道的valid. 其他應該不難看懂。前面的差不多。就是多了個bvalid. 主設備只有檢測到wvalid, wready 同時為高,且數(shù)據(jù)傳輸完成了,就把bvalid給置高。
上面講完以后。。。似乎傳輸address這種單個數(shù)據(jù)的就清楚了。但是數(shù)據(jù)通道連續(xù)傳輸數(shù)據(jù)似乎比較模糊。這兒就開始講。
AXI是支持多個數(shù)據(jù)的。這種傳輸模式叫突發(fā)傳輸。至于為什么叫突發(fā)而不叫連續(xù),就有點兒不明覺厲了。
一個突發(fā)傳輸是靠幾個信號來描述的。這些信號同在AXI總線里。
Burst length: ARLEN[7:0]和AWLEN[7:0]表示的就是這個。表示的是連續(xù)傳輸?shù)闹芷跀?shù)。一個burst內(nèi)部是不可以被打斷的。。所以data valid一旦高起來就要把一個burst傳完再拉低,slave的ready信號可以中斷,但是最終還是要高起來傳完一個burst. 對于master來說,一旦開始傳數(shù),一個burst之間的valid應該是不會低的。
Burst size: 指的是一個burst里面有多少Byte. ARSIZE[2:0]和AWSIZE[2:0] 里就是這個。。為什么只有3bit呢?因為只有8種情況。1,2,4,8,16,32,64,128。這個里面其實有個非常小的問題。。一般來說。總線位寬和burst size一致的。。比如總線64bit, burst size是8Byte. 但是你要說我頭鐵非要給個不一樣的值。。那也沒問題。你總線是8BTYE, 你給了個2BYTE的Burst size, 那你就要指定,,每次傳輸這個2BYTE要放到8BYTE的哪幾個BTYE上去。。。所以沒事兒別折騰自己。
那你說我非要折騰自己呢?也行。這種傳輸叫narrow transfers。往哪個地方上寫,可以用WSTRB[N]這歌信號控制。數(shù)據(jù)會寫到WDATA[(8n)+7: (8n)]
比如上面這個例子。32bit的地址總線。burst size給了個8bit. 那就靠WSTRB這個信號確定往哪兒寫。比如上面。傳輸了5次??梢钥刂茢?shù)據(jù)往不同地方寫。
Burst type: 這個有三種。FIXED表示你一直往初始地址猛懟。INCR表示你從初始地址開始累加。WRAP表示加到某個值后返回初始地址。
另外要說的一點是。。AXI只支持非對齊傳輸?shù)摹?/span>
例如上面這種情況。。如果地址從7開始。傳輸5次。前三個BYTE是無效的,不會被傳輸。用WSTRB信號就可保證這一點。keep信號表示的是BTYE是否有效。
上面講了一堆。。AXI FULL怎么傳數(shù)據(jù)的基本上應該是清楚了。下面介紹一下它的閹割版。。
閹割的東西不少,但是你簡單理解一下的話。
AXI-LITE是Burst-length嚴格定于1, burst size嚴格定于總線位寬的AXI. 最明顯的閹割就是不支持burst length, 只能一個數(shù)據(jù)一個數(shù)據(jù)讀寫,讀寫的位寬和總線位寬一致的。其他閹割可以自己看文檔。
這個東西是干什么的。。。顧名思義,是stream。流的意思。視頻流,數(shù)據(jù)流什么的。AXI-STREAM和AXI之間的關系不像是相互閹割的關系。而是各有所長。當然,他們用的握手協(xié)議還是一樣的。
AXI-STREAM相比于AXI最顯著的特點是,總線上沒有數(shù)目。只用TLAST表示傳輸結束。
這樣導致AXI-STREAM的信號非常簡單。
TVALID\TREADY\TDATA 兄弟三不用多解釋,是個總線都有。
TLAST 由于總線上沒有傳輸數(shù)目。所以最后一個數(shù)據(jù)時TLAST會高起,表明傳輸完成了。
TKEEP 這是一個多比特的信號。比如總線8個Byte. 這個信號8bit. 沒一個bit對應的是總像是對應的BYTE是不是有效的。
TSTRB 這也是一個多比特信號。。也是說明總線上的數(shù)據(jù)是不是有效的。。
那這個地方你可能會問,TKEEP和TSTSTRB到底有啥區(qū)別?
區(qū)別是這樣的。。TKEEP要是為0。代表了這個數(shù)據(jù)完全沒用,可以被扔掉了。
在TKEEP為1的前提下,表示這個信號不能扔掉。那TSTRB就起作用了。TSTRB為1,表示對應的數(shù)據(jù)有效,是個好數(shù)據(jù)。TSTRB為0時,表示這個是個占位數(shù)據(jù),沒啥意義,但是不能丟掉。為什么需要占位數(shù)據(jù)呢?是因為有時候需要AXISTREAM傳輸?shù)臄?shù)據(jù)隊形不能亂。就像下圖對應的情況。。。
然后其他的東西就比較細節(jié)了。用的時候再查也不遲。
寫到這個,你對AXI應該已經(jīng)有個簡單的概念了。
AXI系列用處是用來傳輸數(shù)據(jù)的總線。
AXI-FULL作用是給定地址與傳輸數(shù)量,進行burst傳輸。
AXI-LITE作用是給定地址,單個數(shù)據(jù)的讀寫。
AXI-STREAM作用是不給地址,不給數(shù)量,像水管一樣靠last這個閥門傳輸數(shù)據(jù)。
具體用哪個,可以靈活選用。
但是據(jù)我自己的工程實踐,這種總線最好直接用ARM或者VIVADO提供的ip核。。雖然協(xié)議清楚,但是你不要頭鐵自己寫。否則BUG真實無窮無盡。





