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





