天天看點

Xilinx-ZYNQ7000系列-學習筆記(10):AXI總線

Xilinx-ZYNQ7000系列-學習筆記(10):AXI總線

1、AXI總線概述

在ZYNQ中有支援三種AXI總線,擁有三種AXI接口,當然用的都是AXI協定。其中三種AXI總線分别為:

AXI4:(For high-performance memory-mapped requirements.)主要面向高性能位址映射通信的需求,是面向位址映射的接口,允許最大256輪的資料突發傳輸;

AXI4-Lite:(For simple, low-throughput memory-mapped communication )是一個輕量級的位址映射單次傳輸接口,占用很少的邏輯單元。

AXI4-Stream:(For high-speed streaming data.)面向高速流資料傳輸;去掉了位址項,允許無限制的資料突發傳輸規模。

1.1 AXI4總線和AXI4-Lite總線具有相同的組成部分:
  • 讀位址通道,包含ARVALID, ARADDR, ARREADY信号;
  • 讀資料通道,包含RVALID, RDATA, RREADY, RRESP信号;
  • 寫位址通道,包含AWVALID,AWADDR, AWREADY信号;
  • 寫資料通道,包含WVALID, WDATA,WSTRB, WREADY信号;
  • 寫應答通道,包含BVALID, BRESP, BREADY信号;
  • 系統通道,包含:ACLK,ARESETN信号。
1.2 AXI4總線和AXI4-Lite總線的信号也有他的命名特點:

讀位址信号都是以AR開頭(A:address;R:read)

寫位址信号都是以AW開頭(A:address;W:write)

讀資料信号都是以R開頭(R:read)

寫資料信号都是以W開頭(W:write)

應答型号都是以B開頭(B:back(answer back))

1.3 AXI4-Stream總線的組成有:
  • ACLK信号:總線時鐘,上升沿有效;
  • ARESETN信号:總線複位,低電平有效
  • TREADY信号:從機告訴主機做好傳輸準備;
  • TDATA信号:資料,可選寬度32,64,128,256bit
  • TSTRB信号:每一bit對應TDATA的一個有效位元組,寬度為TDATA/8
  • TLAST信号:主機告訴從機該次傳輸為突發傳輸的結尾;
  • TVALID信号:主機告訴從機資料本次傳輸有效;
  • TUSER信号:使用者定義信号,寬度為128bit。

對于AXI4-Stream總線命名而言,除了總線時鐘和總線複位,其他的信号線都是以T字母開頭,後面跟上一個有意義的單詞,看清這一點後,能幫助讀者記憶每個信号線的意義。如TVALID = T+單詞Valid(有效),那麼讀者就應該立刻反應該信号的作用。

2、AXI接口介紹

三種AXI接口分别是:

AXI-GP接口(4個):是通用的AXI接口,包括兩個32位主裝置接口和兩個32位從裝置接口,用該接口可以通路PS中的片内外設。

AXI-HP接口(4個):是高性能/帶寬的标準的接口,PL子產品作為主裝置連接配接。主要用于PL通路PS上的存儲器(DDR和On-Chip RAM)。

AXI-ACP接口(1個):是ARM多核架構下定義的一種接口,中文翻譯為加速器一緻性端口,用來管理DMA之類的不帶緩存的AXI外設,PS端是Slave接口。

Xilinx-ZYNQ7000系列-學習筆記(10):AXI總線

3、AXI協定

總的來說,AXI總線協定的兩端可以分為分為主(master)、從(slave)兩端,他們之間一般需要通過一個AXI Interconnect相連接配接,作用是提供将一個或多個AXI主裝置連接配接到一個或多個AXI從裝置的一種交換機制。當我們添加了zynq以及帶AXI的IP後再進行自動連線時vivado會自動幫我們添加上這個IP。

AXI Interconnect的主要作用是,當存在多個主機以及從機器時,AXIInterconnect負責将它們聯系并管理起來。由于AXI支援亂序發送,亂序發送需要主機的ID信号支撐,而不同的主機發送的ID可能相同,而AXI Interconnect解決了這一問題,他會對不同主機的ID信号進行處理讓ID變得唯一。

AXI協定将讀位址通道,讀資料通道,寫位址通道,寫資料通道,寫響應通道分開,各自通道都有自己的握手協定。每個通道互不幹擾卻又彼此依賴。這也是AXI高效的原因之一。

3.1 握手協定

AXI4 所采用的是一種READY,VALID 握手通信機制,簡單來說主從雙方進行資料通信前,有一個握手的過程。傳輸源産生VLAID 信号來指明何時資料或控制資訊有效。而目地源産生READY 信号來指明已經準備好接受資料或控制資訊。傳輸發生在VALID和READY 信号同時為高的時候。VALID 和READY 信号的出現有三種關系。

(1) VALID 先變高READY 後變高。

Xilinx-ZYNQ7000系列-學習筆記(10):AXI總線

(2) READY 先變高VALID 後變高。

Xilinx-ZYNQ7000系列-學習筆記(10):AXI總線

(3) VALID 和READY 信号同時變高。

Xilinx-ZYNQ7000系列-學習筆記(10):AXI總線
3.2 突發式讀寫

讀時序:

Xilinx-ZYNQ7000系列-學習筆記(10):AXI總線

當位址出現在位址總線後,傳輸的資料将出現在讀資料通道上。裝置保持VALID 為低直到讀資料有效。為了表明一次突發式讀寫的完成,裝置用RLAST 信号來表示最後一個被傳輸的資料。

寫時序:

Xilinx-ZYNQ7000系列-學習筆記(10):AXI總線

這一過程的開始時,主機發送位址和控制資訊到寫位址通道中,然後主機發送每一個寫資料到寫資料通道中。當主機發送最後一個資料時,WLAST 信号就變為高。當裝置接收完所有資料之後他将一個寫響應發送回主機來表明寫事務完成。

4、AXI-Lite詳解

Xilinx-ZYNQ7000系列-學習筆記(10):AXI總線
Xilinx-ZYNQ7000系列-學習筆記(10):AXI總線
Xilinx-ZYNQ7000系列-學習筆記(10):AXI總線

當PS那邊向AXI4-Lite總線寫資料時,PS這邊負責将資料接收到寄存器slv_reg。而slv_reg寄存器有0~3共4個。至于指派給哪一個由axi_awaddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB]決定,根據宏定義其實就是由axi_awaddr[3:2] (寫位址中不僅包含位址,而且包含了控制位,這裡的[3:2]就是控制位)決定指派給哪個slv_reg。

PS調用寫函數時,如果不做位址偏移的話,axi_awaddr[3:2]的值預設是為0的,舉個例子,如果我們自定義的IP的位址被映射為0x43C00000,那麼我們Xil_Out32(0x43C00000,Value)寫的就是slv_reg0的值。如果位址偏移4位,如Xil_Out32(0x43C00000 + 4,Value) 寫的就是slv_reg1的值,依次類推。

Xilinx-ZYNQ7000系列-學習筆記(10):AXI總線

其中,C_S_AXI_DATA_WIDTH的宏定義的值為32,也就是資料位寬,S_AXI_WSTRB就是寫選通信号,S_AXI_WDATA就是寫資料信号。

存在于for循環中的最關鍵的一句:

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

當byte_index = 0的時候這句話就等價于:

slv_reg0[7:0] <= S_AXI_WDATA[7:0];

當byte_index = 1的時候這句話就等價于:

slv_reg0[15:8] <= S_AXI_WDATA[15:8];

當byte_index = 2的時候這句話就等價于:

slv_reg0[23:16] <= S_AXI_WDATA[23:16];

當byte_index = 3的時候這句話就等價于:

slv_reg0[31:24] <= S_AXI_WDATA[31:24];

也就是說,隻有當寫選通信号為1時,它所對應S_AXI_WDATA的位元組才會被讀取。

Xilinx-ZYNQ7000系列-學習筆記(10):AXI總線

和前面分析的一樣此時通過判斷axi_awaddr[3:2]的值來判斷将那個值給reg_data_out上,同樣當PS調用讀取函數時,這裡axi_awaddr[3:2]預設是0,是以我們隻需要把slv_reg0替換成我們自己資料,就可以讓PS通過總線讀到我們提供的資料。

當我們想讀AXI4_Lite總線上的資料時,隻需關注slv_reg的資料,我們可自行添加一段代碼:

Xilinx-ZYNQ7000系列-學習筆記(10):AXI總線

如果我們想對AXI4_Lite信号寫資料時,我們隻需修改對reg_data_out的指派

Xilinx-ZYNQ7000系列-學習筆記(10):AXI總線

PL這邊的AXI-Stream的接口是不能直接與PS對接的,需要經過AXI4或者AXI4-Lite的轉換。

繼續閱讀