學習內容
關于AXI總線協(xié)議的一些簡單知識,通過閱讀Xilinx的使用指導手冊(UG1037),結合正點原子的ZYNQ視頻進行梳理總結。
AXI
AXI(Advanced eXtensible Interface) 高級擴展接口是ARM AMBA的一部分。(AMBA(Advanced Microcontroller Bus Architecture) 高級微控制器總線架構)
AMBA:高級微控制器總線架構,是1996年首次引用的一組微控制器總線協(xié)議。開放的片內互聯(lián)的總線標準,能在多主機設計中實現(xiàn)多個控制器和外圍設備之間的連接和管理。在Xilinx公司的芯片也廣泛地使用AXI接口用于開發(fā)和設計。使用axi總線接口可以提高效率、開發(fā)的靈活性,以及可移植性。
AXI4 三種類型
AXI4(AXI4-Full)
AXI4(AXI4-Full):用于高性能的存儲器映射需求;(存儲器映射:主機在對從機進行讀寫操作時,指定一個目標地址,這個地址對應系統(tǒng)存儲空間的地址,表示對該空間進讀寫操作。)AXI4用于存儲器映射接口,允許高達256個數(shù)據的的高吞吐量突發(fā)傳輸,并且傳輸周期只需要一個地址。
AXI4-Lite
AXI4-Lite:簡化版的AXI4接口。用于低吞吐率存儲器映射的通信。AXI4-Lite是一個輕量級、單次傳輸存儲器映射接口。它使用了少量的邏輯器件進行實現(xiàn)總線功能,AXI4-Lite接口簡單,在設計開發(fā)中簡單易用。
AXI4-Stream
AXI4-Stream:用于高速的流數(shù)據通信。AXI4-Stream完全去除了對地址的需求,并允許無限制數(shù)據大小的數(shù)據突發(fā)的數(shù)據傳輸。AXI4-Stream接口在傳輸時沒有使用地址單元,所以不是存儲器映射。所以在對于那些只關心數(shù)據,對地址不關心或者沒有地址需求的接口,可以采用AXI4-Stream接口。
AXI的工作方式
AXI4和AXI4-Lite包含5個獨立的通道:
- 寫地址通道
- 讀地址通道
- 寫數(shù)據通道
- 讀數(shù)據通道
- 寫響應通道
數(shù)據可以同時在主機和從機之間雙向移動,并且數(shù)據傳輸大小可以不同。AXI4中的限制是一個突發(fā)傳輸最多可以傳輸256個數(shù)據。AXI4-Lite只允許單次傳輸一個數(shù)據。
讀取數(shù)據
下圖演示了AXI總線如何進行讀取數(shù)據的操作:
首先由主機通過讀取地址通道發(fā)送地址和讀操作的指令,在從機接收到讀操作,并正確讀取從主機發(fā)送的地址,通過讀取數(shù)據通道將數(shù)據由從機發(fā)送到主機。
寫入數(shù)據
下圖演示了AXI總線如何進行寫入數(shù)據的操作:
首先由主機通過寫入地址通道發(fā)送地址和寫操作的指令,在從機接收到寫操作,開始接收主機從讀取數(shù)據通道發(fā)送的數(shù)據信息并寫入從機,當完成寫入操作后,寫響應通道將回應寫響應。
存儲器映射協(xié)議
通過賦予每個任務不同的虛擬–物理地址轉換映射,支持不同任務之間的保護。地址轉換函數(shù)在每一個任務中定義,在一個任務中的虛擬地址空間映射到物理內存的一個部分,而另一個任務的虛擬地址空間映射到物理存儲器中的另外區(qū)域。就是把一個地址連接到另一個地址。
AXI4-Stream協(xié)議
AXI4-Stream協(xié)議用于通常用于以數(shù)據為主和數(shù)據流的應用實例中,其中不存在或不需要地址的概念。每個AXI4-Stream都充當一個單向通道,并帶有一個握手數(shù)據流。
連接存儲器映射和 AXI4-Stream
一種常見的方法是構建將AXI4-Stream和AXI內存映射IP結合在一起的系統(tǒng)。通常,DMA的IP可用于將數(shù)據流移入或移出內存。例如,處理器可以與DMA一起工作來解碼數(shù)據包,或者在流數(shù)據之上實現(xiàn)一個協(xié)議棧,從而構建更復雜的系統(tǒng),使數(shù)據在不同的應用程序空間或不同的IP之間移動。
使用HLS添加AXI接口
在HLS中支持函數(shù)自動綜合生成下面的AXI總線接口:• AXI4-Stream (axis) • AXI4-Lite slave (s_axilite) • AXI4 master (m_axi)
HLS AXI4-Stream Interface
你可以將AXI4-Stream接口(axis模式)應用于任何輸入參數(shù)和任何數(shù)組或指針輸出參數(shù)。因為axis 4- stream接口以順序流的方式傳輸數(shù)據,所以不能與既可讀又可寫的參數(shù)一起使用。在設計時候又分為帶side-channel和不帶side-channel。帶side-channel:使用帶有邊通道的axis4 - stream接口提供了額外的功能,允許作為組件的一部分的可選side-channel AXI4-Stream標準,可直接用于C代碼。(這里我的理解是使用axi接口做了拓展功能)不帶side-channel:使用AXI4-Stream 時候,數(shù)據類型不包含任何AXI4 side-channel的參數(shù)。(這里我的理解是僅僅使用數(shù)據流的交互) 下面給出一個HLS設計的實例:
綜合后對于A、B兩個端口,都被定義為了AXI4-Stream的接口。而多了VALID和READY用于檢測數(shù)據的是否有效和準備狀態(tài)。
HLS AXI4-Lite Interface
AXI4-Lite slave接口通常用于可以被微控制器和處理器控制的外設和設備接口。AXI4-Lite slave接口的Vivado HLS特性(s_axilite模式):
- 將多個端口分組到同一個AXI4-Lite從接口。
- 將設計導出到Vivado IP目錄時,輸出C函數(shù)和頭文件以與處理器上運行的代碼一起使用。下面給出一個多個不同端口分配到一個接口的實例:
void example(char *a, char *b, char *c)
{
#pragma HLS INTERFACE s_axilite port=return bundle=BUS_A
#pragma HLS INTERFACE s_axilite port=a bundle=BUS_A
#pragma HLS INTERFACE s_axilite port=b bundle=BUS_A
#pragma HLS INTERFACE s_axilite port=c bundle=BUS_A
*c += *a + *b;
}
綜合后的結果:
HLS AXI4 Master Interface
您可以在任何數(shù)組或指針/引用參數(shù)、實現(xiàn)HLS AXI4 Master接口(m_axi模式)。該接口使用兩種模式:一是單獨的數(shù)據傳輸,二是使用C memcpy功能的突發(fā)模式數(shù)據傳輸。單獨的數(shù)據傳輸模式:
在這兩個例子中,通過AXI4 Master接口進行的數(shù)據傳輸都是簡單的讀或寫操作:一次傳輸一個地址和一個數(shù)據值。突發(fā)模式傳輸: 突發(fā)模式使用一個單一的基址傳輸數(shù)據,該基址后面跟著多個連續(xù)的數(shù)據樣本,并且能夠實現(xiàn)更高的數(shù)據吞吐量。只有在使用C memcpy函數(shù)將數(shù)據讀入或讀出用于合成的頂級函數(shù)時,才可能使用突發(fā)模式。下面給出一個具體實例:
void example(volatile int *a){
#pragma HLS INTERFACE m_axi depth=50 port=a
#pragma HLS INTERFACE s_axilite port=return bundle=AXILiteS
//Port a is assigned to an AXI4-master interface
int i;
int buff[50];
// memcpy creates a burst access to memory
memcpy(buff,(constint*)a,50*sizeof(int));
for(i=0; i < 50; i++){
buff[i] = buff[i] + 100;
}
memcpy((int *)a,buff,50*sizeof(int));
}
當你用前面的例子合成一個設計時,它會產生如下圖所示的接口(AXI接口):
Reference
- Xilinx的使用指導手冊(UG1037)
- 正點原子ZYNQ視頻教程