天天看點

AXI外設IP的AXI-lite代碼閱讀記錄

AXI lite 總線源碼時碰見未見過的運算符,是以搜尋記錄下,此運算符在for語句用得多。

https://zhuanlan.zhihu.com/p/77528158

https://zhuanlan.zhihu.com/p/145936888

以上連結為AXI lite的代碼分析

“+:”、"-:"文法

運算符,運用在多位的變量中,如下:

slv_reg0[(byte_index8) +: 8] <= S_AXI_WDATA[(byte_index8) +: 8];

"+:"

變量[起始位址 +: 資料位寬]

等價于

變量[(起始位址+資料位寬-1):起始位址]

data[0 +: 8]  //等價于--> data[7:0]
data[15 +: 2] //等價于--> data[16:15]
           

"-:"

變量[結束位址 -: 資料位寬]

等價于

變量[結束位址:(結束位址-資料位寬+1)]

data[7 -: 8]  //等價于--> data[7:0]
data[15 -: 2] //等價于--> data[15:14]
           

//

由FDMA代碼裡的AWSIZE引出是基本概念

參考:

https://zhuanlan.zhihu.com/p/96804919

AXI FULL、AXI Lite、AXI Stream

AXI FULL傳輸資料是全雙工的。也就是說。讀寫是同時進行的。

一條AXI總線上有5個通道。兩個用于讀。三個用于寫。

AXI是支援多個資料的。這種傳輸模式叫突發傳輸。至于為什麼叫突發而不叫連續,自己品。

一個突發傳輸是靠幾個信号來描述的。這些信号同在AXI總線裡。

Burst length: ARLEN[7:0]和AWLEN[7:0]表示的就是這個。。。表示的是連續傳輸的周期數。一個burst内部是不可以被打斷的。。是以data valid一旦高起來就要把一個burst傳完再拉低,slave的ready信号可以中斷,但是最終還是要高起來傳完一個burst. 對于master來說,一旦開始傳數,一個burst之間的valid應該是不會低的。

Burst size:

指的是 每一拍含有的 Byte數,而不是bit數,是以總線32位,每次隻能傳輸32bit burst size = 32,也就是AWSIZE[2:0] = b101,那麼每一拍含有 32 x8 bits

指的是一個burst裡面有多少Byte. ARSIZE[2:0]和AWSIZE[2:0] 裡就是這個。**為什麼隻有3bit呢?因為隻有8種情況。1,2,4,8,16,32,64,128。(對應arsize/awsize的0,1,2,3,4,5,6,7)**這個裡面其實有個非常小的問題。。一般來說。總線位寬和burst size一緻的。。比如總線64bit, burst size是8Byte. 但是你要說我頭鐵非要給個不一樣的值。。那也沒問題。你總線是8BTYE, 你給了個2BYTE的Burst size, 那你就要指定,每次傳輸這個2BYTE要放到8BYTE的哪幾個BTYE上去。是以沒事兒别折騰自己。

那你說我非要折騰自己呢?也行。這種傳輸叫narrow transfers。往哪個地方上寫,可以用WSTRB[N]這歌信号控制。資料會寫到WDATA[(8n)+7: (8n)]

AXI外設IP的AXI-lite代碼閱讀記錄

比如上面這個例子,32bit的位址總線。burst size給了個8bit. 那就靠WSTRB這個信号确定往哪兒寫。比如上面。傳輸了5次。可以控制資料往不同地方寫。

Burst type: 這個有三種。FIXED表示你一直往初始位址猛怼。INCR表示你從初始位址開始累加。WRAP表示加到某個值後傳回初始位址。

另外要說的一點是。AXI是支援非對齊傳輸的。

AXI外設IP的AXI-lite代碼閱讀記錄

例如上面這種情況。如果位址從7開始。傳輸5次。前三個BYTE是無效的,不會被傳輸。用WSTRB信号就可保證這一點。keep信号表示的是BTYE是否有效。

AXI外設IP的AXI-lite代碼閱讀記錄

AXI-Lite:

AXI-LITE是Burst-length嚴格定于1, burst size嚴格定于總線位寬的AXI.

最明顯的閹割就是不支援burst length, 隻能一個資料一個資料讀寫,讀寫的位寬和總線位寬一緻的。其他閹割可以自己看文檔。

AXI-STREAM:

顧名思義,是stream。流的意思。視訊流,資料流什麼的。AXI-STREAM和AXI之間的關系不像是互相閹割的關系。而是各有所長。當然,他們用的握手協定還是一樣的。

AXI-STREAM相比于AXI最顯著的特點是,總線上沒有數目。隻用TLAST表示傳輸結束。這樣導緻AXI-STREAM的信号非常簡單。

TLAST 由于總線上沒有傳輸數目。是以最後一個資料時TLAST會高起,表明傳輸完成了。

TKEEP 這是一個多比特的信号。比如總線8個Byte. 這個信号8bit. 每一個bit對應的是總線上對應的BYTE是不是有效的。

TSTRB 這也是一個多比特信号。也是說明總線上的資料是不是有效的。

那這個地方你可能會問,TKEEP和TSTSTRB到底有啥差別?

差別是這樣的。TKEEP要是為0。代表了這個資料完全沒用,可以被扔掉了。

在TKEEP為1的前提下,表示這個信号不能扔掉。那TSTRB就起作用了。TSTRB為1,表示對應的資料有效,是個好資料。TSTRB為0時,表示這個是個占位資料,沒啥意義,但是不能丢掉。為什麼需要占位資料呢?是因為有時候需要AXISTREAM傳輸的資料隊形不能亂。就像下圖對應的情況。

AXI外設IP的AXI-lite代碼閱讀記錄

其他細節處查手冊

總結

AXI-FULL作用是給定位址與傳輸數量,進行burst傳輸。

AXI-LITE作用是給定位址,單個資料的讀寫。

AXI-STREAM作用是不給位址,不給數量,像水管一樣靠last這個閥門傳輸資料。