前面一節(jié)我們學(xué)會(huì)了創(chuàng)建基于AXI總線的IP,但是對(duì)于AXI協(xié)議各信號(hào)的時(shí)序還不太了解。這個(gè)實(shí)驗(yàn)就是通過SDK和Vivado聯(lián)合調(diào)試觀察AXI總線的信號(hào)。由于我們創(chuàng)建的接口是基于AXI_Lite協(xié)議的,所以我們實(shí)際觀察到是AXI_Lite協(xié)議的信號(hào)時(shí)序。
具體做法是創(chuàng)建一個(gè)基于AXI總線的加法器模塊,在Vivado里將AXI總線添加到debug信號(hào)里,實(shí)際上是用邏輯分析儀探測(cè)信號(hào),在SDK端通過debug方式依次寫入兩個(gè)加數(shù),由PL計(jì)算出和,我們讀出這個(gè)和打印到串口,這樣AXI總線的讀和寫就都能觀察到了。
板子使用的是zc702。
在觀察信號(hào)之前我們有必要簡(jiǎn)單了解AXI是個(gè)什么:
AXI總線是一種高性能、高帶寬、低延遲的片內(nèi)總線,AXI協(xié)議描述了主從設(shè)備數(shù)據(jù)傳輸?shù)姆绞健V髟O(shè)備和從設(shè)備通過握手信號(hào)建立連接,握手信號(hào)包括主機(jī)發(fā)送的VALID信號(hào),表示數(shù)據(jù)有效,從機(jī)發(fā)送的READY信號(hào),表示從機(jī)準(zhǔn)備好了接收數(shù)據(jù)。當(dāng)VALID和READY都有效的時(shí)候傳輸開始。
Zynq使用的是AXI協(xié)議的4.0版本,由AMBA3.0協(xié)議發(fā)展而來:
AXI的三種總線各有各的用途:
AXI4支持突發(fā)數(shù)據(jù)傳輸,主要用于CPU訪問存儲(chǔ)等需要高速數(shù)據(jù)交互的場(chǎng)合,相當(dāng)于原來的AHB協(xié)議;
AXI_Lite一次傳輸單個(gè)數(shù)據(jù),主要用于訪問一些低速外設(shè),相當(dāng)于原來的APB;
AXI_Stream數(shù)據(jù)傳輸不需要地址,主設(shè)備直接連續(xù)讀寫數(shù)據(jù),主要用于高速流數(shù)據(jù)的傳輸,使用起來類似FIFO。
AXI4總線和AXI4-Lite總線具有相同的組成部分:
(1) 讀地址通道, 包含ARVALID, ARADDR, ARREADY信號(hào);
(2) 讀數(shù)據(jù)通道, 包含RVALID, RDATA, RREADY, RRESP信號(hào);
(3) 寫地址通道, 包含AWVALID, AWADDR, AWREADY信號(hào);
(4) 寫數(shù)據(jù)通道, 包含WVALID, WDATA, WSTRB, WREADY信號(hào);
(5) 寫應(yīng)答通道, 包含BVALID, BRESP, BREADY信號(hào);
(6) 系統(tǒng)通道, 包含: ACLK, ARESETN信號(hào)。
幫助記憶:
讀地址信號(hào)都是以AR開頭(A: address; R: read)
寫地址信號(hào)都是以AW開頭(A: address; W: write)
讀數(shù)據(jù)信號(hào)都是以R開頭(R: read)
寫數(shù)據(jù)信號(hào)都是以W開頭(W: write)
應(yīng)答信號(hào)都是以B開頭(B: back(answer back))
讀時(shí)序:
寫時(shí)序:
5個(gè)通道都有自己獨(dú)立的握手機(jī)制,同時(shí)又相互協(xié)作,地址線分離后,讀/寫可以并行交互數(shù)據(jù)。而且AXI支持地址pipeline、錯(cuò)位傳輸?shù)饶J?,大大提高了?shù)據(jù)通路的利用率。
關(guān)于AXI Interconnect模塊:
AXI協(xié)議可以描述為主/從設(shè)備之間的點(diǎn)對(duì)點(diǎn)傳輸,可以有多個(gè)主機(jī),也可以有多個(gè)從機(jī),這是進(jìn)行數(shù)據(jù)交互時(shí),需要一個(gè)管理中心確保信號(hào)發(fā)到對(duì)應(yīng)的設(shè)備,AXI Interconnect模塊就是這樣一個(gè)管理中心,也叫做AXI互聯(lián)矩陣。它類似于一個(gè)交換機(jī),保證每個(gè)外設(shè)獨(dú)享帶寬,完成數(shù)據(jù)傳輸。Xilinx公司為我們提供了AXI Interconnect的IP核。
介紹到此,理論部分已經(jīng)掌握i一二了,下面就開始實(shí)際觀察AXI的信號(hào)。
創(chuàng)建一個(gè)基于AXI_Lite總線的加法器IP
新建Vivado工程,依然,選擇這個(gè):
修改名字和地址,我命名為AXI_Add,地址最好選擇工程路徑下新建一個(gè)文件夾,這樣就會(huì)自動(dòng)把你創(chuàng)建的IP更新到IP庫(kù)里,其他默認(rèn),最后選擇Edit IP,在Vivado給出的代碼里添加上我們的加法器功能:
注意這些代碼就是定義AXI協(xié)議的工作方式的,里面有注釋,可以去研究一下!
添加用戶端口:
這里我們沒有要輸出的信號(hào)
封裝好后回到我們之前建的工程,
然后在工程里添加zynq核,添加剛才創(chuàng)建的IP,點(diǎn)擊自動(dòng)連接,然后選中AXI總線,右擊選擇Make Debug,出現(xiàn)兩個(gè)綠色的小瓢蟲,將總線加入Debug模式下。
如果你沒有把剛才新建的IP放在該工程目錄下,先要把IP添加進(jìn)庫(kù)里,選擇 Project Settings-->IP。點(diǎn)擊綠色的加號(hào),選擇到你的用戶IP地址 :
整個(gè)系統(tǒng)搭建完成是這樣的:
下面就是例行操作,自動(dòng)排版,檢查,保存,復(fù)位,generate,產(chǎn)生頂層文件。然后先綜合(Synthesis)一下,綜合好后,打開Synthesis Design下的Set Up Debug,將顯示為紅色的無用信號(hào)刪除(選中,點(diǎn)擊紅色的減號(hào)),
設(shè)置采樣深度為1024,
其他默認(rèn),然后生成比特流文件。
軟件端的設(shè)計(jì)
Lanch到SDK,新建一個(gè)空的applicaton工程,添加一個(gè)c源文件,我們?cè)趚parameters.h文件中找到我們添加的加法器AXI_ADD的寄存器首地址,待會(huì)我們就是要通過地址對(duì)寄存器進(jìn)行讀、寫:
這個(gè)案例里我們計(jì)算16進(jìn)制下的24+12=36,為了方便SDK端的斷點(diǎn)調(diào)試,加了while循環(huán),注釋我寫在后面了:
#include
#include "xparameters.h"
#include "xil_io.h"
#include "xil_types.h"
#define AXI_ADD_REG0 0 //寄存器0的偏移地址為0
#define AXI_ADD_REG1 4 //寄存器1的偏移地址為4
#define AXI_ADD_REG2 8 //寄存器2的偏移地址為8
int main(){
while(1){
u8 value = 0;
Xil_Out32(XPAR_AXI_ADD_V1_0_0_BASEADDR+AXI_ADD_REG0,0x24); //向寄存器0寫入第一個(gè)加數(shù)
Xil_Out32(XPAR_AXI_ADD_V1_0_0_BASEADDR+AXI_ADD_REG1,0x12); //向寄存器1寫入第二個(gè)加數(shù)
value = Xil_In32(XPAR_AXI_ADD_V1_0_0_BASEADDR+AXI_ADD_REG2); //從寄存器3中讀出和
xil_printf("value = %x",value);
}
return 0;
}
軟硬件聯(lián)合調(diào)試
右鍵工程 Debug as-->Debug Configrations:
進(jìn)入Debug界面后,在AXI總線讀、寫的地方添加斷點(diǎn):
打開串口:
然后回到Vivado界面,連接到Device,就會(huì)自動(dòng)打開調(diào)試界面:
接下來是設(shè)置觸發(fā)位置,添加觸發(fā)條件:
我們的采樣深度是默認(rèn)的1024,在500的位置觸發(fā),
觸發(fā)條件設(shè)置成WVALID信號(hào)為高時(shí),AWVALID信號(hào)為高時(shí):
右鍵邏輯分析儀,選中Enable Auto Re-trigger,設(shè)置成自動(dòng)進(jìn)入下一次觸發(fā):
點(diǎn)擊運(yùn)行觸發(fā),點(diǎn)擊完之后ila進(jìn)入等待觸發(fā)狀態(tài):
在SDK點(diǎn)擊運(yùn)行:
首先寫入24:
有一點(diǎn)要注意,這里的寫地址VALID和READY信號(hào)是下一個(gè)地址的,這里就是對(duì)應(yīng)WDATA的4,而對(duì)應(yīng)地址0,也就是我們觀察的數(shù)據(jù)24地址的VALID和READY信號(hào)在前面已經(jīng)有效過了,我們?cè)O(shè)置寫數(shù)據(jù)有效時(shí)觸發(fā),而地址有效在前面就沒有捕捉到了。
然后寫入12:
然后串口打印出36:
等到第二輪寫入的時(shí)候,我們看到讀數(shù)據(jù)通道上出現(xiàn)36:
我們可以換一下觸發(fā)信號(hào),換成讀VALID,讀READY拉高時(shí)觸發(fā):
就可以看到,讀VALID和READY信號(hào)都高時(shí),讀出36,讀地址線上是8:
這里可以看到讀READY信號(hào)一直為高,讀VALID信號(hào)拉高時(shí)36讀入。但是由于ILA捕捉的是觸發(fā)時(shí)刻信號(hào),所以它將讀有效之前的讀數(shù)據(jù)都顯示為36了。
大家要注意,觸發(fā)設(shè)置里,添加的信號(hào)默認(rèn)是AND的,如果你一開始就把讀有效為高,寫有效為高都添加到觸發(fā)列表里,會(huì)觀察不到信號(hào),因?yàn)檫@兩個(gè)信號(hào)在本例子;里不會(huì)同時(shí)出現(xiàn):
SDK那邊一步步Debug,先是寫入24:
然后寫入12:
然后讀到36:
這里也是由于RREADY先于RVALID信號(hào)拉高,ILA捕捉不到READY是什么高的,就把之前都顯示為高。
如果沒有按你設(shè)置的運(yùn)行,可以在SDK重新Debug as或者在Vivado重新連接一下Target,或者多點(diǎn)幾次Run Trigger,這軟件有時(shí)候不靈敏,比如說你雖然設(shè)置了自動(dòng)進(jìn)入下一次觸發(fā),但是它不一定就進(jìn)入,這是手動(dòng)點(diǎn)一下觸發(fā),進(jìn)入等待模式,再點(diǎn)擊下一次Debug。
小結(jié)
到這里,AXI信號(hào)讀寫時(shí)序就全部觀察完了,這時(shí)候可以再去看一看AXI協(xié)議的理論部分,把封裝基于AX總線的IP時(shí)生成的例化代碼捋一遍,就能更好的理解AXI總線的工作原理了。提一句,我們目前觀察的都是簡(jiǎn)化版的AXI_Lite協(xié)議的時(shí)序。
編輯:hfy
-
加法器
+關(guān)注
關(guān)注
6文章
183瀏覽量
30036 -
AXI
+關(guān)注
關(guān)注
1文章
127瀏覽量
16556 -
Vivado
+關(guān)注
關(guān)注
19文章
799瀏覽量
66128
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論