AXI4-Stream協議的訊號以及Xilinx提供的從AXI到AXI-Stream轉換的IP核區別
AXI4-Stream協議是一種用來連線需要交換資料的兩個部件的標準介面,它可以用於連線一個產生資料的主機和一個接受資料的從機。當然它也可以用於連線多個主機和從機。該協議支援多種資料流使用相同共享匯流排集合,允許構建類似於路由、寬窄匯流排、窄寬匯流排等更為普遍的互聯。比較重要的訊號線有:
ACLK: 時鐘源,全域性時鐘訊號。所有訊號在ACLK訊號上升沿取樣。
ARESETn:復位源,全域性復位訊號。ARESETn低電平有效。
TVALID:主機資料同步線,為高表示主機準備好傳送資料,表示主裝置正在驅動一個有效的傳輸。
TREADY:從機資料同步線,為高表示從機準備好接收資料,表示從裝置在當前週期能夠接收一次傳輸。
TVALID和TREADY,兩根線完成了主機與從機的握手訊號.當TVALID和TREADY都置位時,發生一個傳輸。
TDATA[(8n-1):0]:資料線,用來提供跨越介面的資料。資料為整數個位元組,主機發送,從機接收。
TSTRB[(n-1):0]:位位元組修飾符,用來描述TDATA相關位元組內容作為一個數字位元組或者一個位置位元組被處理。
TKEEP[(n-1):0]:位元組修飾符,表明TDATA相關位元組的內容是否作為資料流的一部分被處理。為高代表對應的位元組為有效位元組,否則表示傳送的為空位元組。
TKEEP位元組修飾符未被確認的那些相關位元組是空位元組,可以從資料流中去除。
TLAST:
TID[(i-1):0]:TID是資料流的識別符號,用來表明不同的資料流。
TDEST[(d-1):0]:TDEST為據流提供路由資訊。
TUSER[(n-1):0]:TUSER是使用者定義的邊帶資訊,這它能伴隨資料流進行傳送。
其實Stream並不陌生,在我們學c++程式設計時,一定會包含<iostream>,這樣就可以完成控制終端對程式的輸入輸出了。如果還是不夠直觀,想象一下連續不斷的水流,永遠向著一個方向以固定的速度輸送的介面。以我們看視訊為例,視訊檔案本來是儲存在硬盤裡的,怎麼播放呢,不能一下子把整個檔案都顯示到螢幕上,而是以一定的速度,連續不斷地輸出到螢幕上(每秒30~60幀),這個過程就是流Stream介面完成的。
Xilinx提供的流式IP核有很多用途,可以實現音訊流、視訊流、資料流到記憶體或者相反方向的傳輸。有人問了,記憶體是PS控制的,怎麼才能把PS裡DDR2的內容以Stream形式發出去呢(例如以固定速度送往DA,完成訊號發生器的設計)?答案就是利用AXI匯流排做轉換。ZYNQ的PS部分是ARM Cortex A9系列,支援AXI4,AXI-Lite匯流排。PL部分也有相應AXI匯流排介面,這樣就能完成PS到PL的互聯。僅僅這樣還不夠,需要PL部分實現流式轉換,即AXI-Stream介面實現。Xilinx提供的從AXI到AXI-Stream轉換的IP核有:AXI-DMA,AXI-Datamover,AXI-FIFO-MM2S以及AXI-VDMA等。這些IP核可以在XPS的IP Catalog視窗中看到。
AXI-DMA:實現從PS記憶體到PL高速傳輸高速通道AXI-HP到AXI-Stream的轉換;
AXI-FIFO-MM2S:實現從PS記憶體到PL通用傳輸通道AXI-GP到AXI-Stream的轉換;
AXI-Datamover:實現從PS記憶體到PL高速傳輸高速通道AXI-HP到AXI-Stream的轉換,只不過這次是完全由PL控制的,PS是完全被動的;
AXI-VDMA:實現從PS記憶體到PL高速傳輸高速通道AXI-HP到AXI-Stream的轉換,只不過是專門針對視訊、影象等二維資料的。
除了上面的還有一個AXI-CDMAIP核,這個是由PL完成的將資料從記憶體的一個位置搬移到另一個位置,無需CPU來插手。這個和我們這裡用的Stream沒有關係,所以不表。
這裡要和大家說明白一點,就是AXI匯流排和介面的區別。匯流排是一種標準化介面,由資料線、地址線、控制線等構成,具有一定的強制性。介面是其物理實現,即在硬體上的分配。在ZYNQ中,支援AXI-Lite,AXI4和AXI-Stream三種匯流排,但PS與PL之間的介面卻只支援前兩種,AXI-Stream只能在PL中實現,不能直接和PS相連,必須通過AXI-Lite或AXI4轉接。PS與PL之間的物理介面有9個,包括4個AXI-GP介面和4個AXI-HP介面、1個AXI-ACP介面,均為記憶體對映型AXI介面。
上面的IP是完成匯流排協議轉換,如果需要做某些處理(如變換、迭代、訓練……),則需要生成一個自定義Stream型別IP,與上面的Stream介面連線起來,實現資料輸入輸出。使用者的功能在自定義Stream型別IP中實現。