ZYNQ使用AXI-Lite協(xié)議實現(xiàn)PS與PL簡單通信
????AXI-Lite是AXI(Advanced eXtensible Interface)總線協(xié)議的一個簡化版本,主要用于連接低復雜性、低帶寬要求的外設和處理器之間的通信。與完整的AXI協(xié)議相比,AXI-Lite協(xié)議具有更少的信號和簡化的操作流程。
????本文測試板子為正點原子領航者ZYNQ 7020,通過對Xilinx內(nèi)部自定義AXI-lite IP核進行簡單修改,實現(xiàn)PL讀取PS端的DDR數(shù)據(jù),對數(shù)據(jù)進行處理后再寫入PS端的DDR,然后PS端在SDK內(nèi)讀取PL端寫入DDR的數(shù)據(jù)。本文僅當一個簡單測試記錄
????首先點擊Tools創(chuàng)建一個AXI-Lite IP核

????選擇創(chuàng)建一個AXI4類型的IP核

????IP核存放位置可以去掉../,存放在當前文件夾內(nèi)

????接口類型Lite,位寬只能選擇32Bits,Number of Registers是選擇定義多少個寄存器來從存儲PS與PL通信的數(shù)據(jù),一個寄存器可以存儲32Bits,這里我選擇25個數(shù)據(jù),其中24個寄存PS向PL發(fā)送的數(shù)據(jù),1個寄存PL向PS發(fā)送的數(shù)據(jù)。

????上一步點擊next后,選擇Edit IP再點擊Finish開始對該自定義IP核進行編輯

? ??????Vivado自動彈出IP核編輯窗口,這里一共兩個文件,上面的是頂層例化文件,下面是實現(xiàn)PS與PL通信的文件,主要在下面文件進行修改。

????打開第二個文件,在Users to add ports here這里添加接口,第一個data_in是接收PS發(fā)過來的24個11Bits數(shù)據(jù),我這里把11位數(shù)據(jù)的最高位作為數(shù)據(jù)有效信號(后面SDK的C語言代碼可以看出),當然也可以單獨發(fā)送一個data_valid,第二個data_out是PL向PS發(fā)送的一個16位數(shù)據(jù)。

? ??????接下來實在最后面添加自定義的邏輯,這里把24個PS發(fā)送到PL的32Bits數(shù)據(jù)的前11位拼接起來賦值給data_in,然后把PL端要發(fā)送到PS端的一個16位數(shù)據(jù)拼接成32Bits。

????接著把讀寫狀態(tài)代碼的冗余部分進行注釋,因為前0~23個寄存器是用來讀的,所以把第24個寫寄存器注釋掉


????這里讀狀態(tài)機對第24個寄存器讀也要注釋掉

????注釋完冗余的讀狀態(tài)內(nèi)的寫寄存器,再把寫狀態(tài)內(nèi)的讀寄存器注釋掉,只保留第24個寄存器是PL向PS寫數(shù)據(jù)。

????最后在頂層添加接口


????保存后,一次點擊下面完成IP核的封裝,再打包IP核


????創(chuàng)建一個Block Design,添加ZYNQ IP與上面自定義的AXI-Lite IP核,打開ZYNQ的UART通信接口(具體操作可以看正點原子領航則SDK指導教程)再配置好DDR類型

????在自動彈出的Address Editor內(nèi)可以更改寄存器的起始地址,這里使用默認起始地址

????整體Block Design,這里的top_bpnet是我寫的一個bp網(wǎng)絡,可以接收PS端發(fā)送的24個11Bits的溫度數(shù)據(jù)進行預測,預測的結(jié)果是一個16位的數(shù)據(jù)再發(fā)回到PS端,這里可以用自己寫的數(shù)據(jù)處理模塊。

????為了查看AXI-Lite協(xié)議的傳輸方式,可以對一些信號debug,選中三個數(shù)據(jù)線,右鍵debug

????進行自動debug連線后保存設計,把block design設為頂層最后生成bitstream

????????打開SDK,創(chuàng)建一個main.c文件,代碼也很簡單,主要通過調(diào)用Xil_In32與Xil_Out32兩個函數(shù)實現(xiàn)對DDR內(nèi)存的讀寫。

????打開串口調(diào)試,隨便發(fā)送1~24,串口返回一個預測數(shù)值


????轉(zhuǎn)到Vivado界面,寫入bitstream文件及debug文件,先查看PL從PS第去24個32Bits數(shù)據(jù),ILA觸發(fā)條件為WVALID與WREADY同時為高,即兩個信號成功握手

????在SDK內(nèi)使用串口發(fā)送0~24進行觸發(fā),可以看見AXI-Lite在WVALID與WREADY握手后,向地址0x04(注意這里的地址要加上基地址才是真正的地址)寫入1040,這里是1040是因為我把1*16+1024,這里加上1024是相當于把第11位置1充當有效信號。第二數(shù)據(jù)是向0x08寫入1056,對應SDK里的2*16+1024

????再把觸發(fā)條件換成RREADY與RVALID握手

????可以看到PL端向0x64地址寫入的數(shù)據(jù)是361,這里是0x64轉(zhuǎn)成十進制是100,因為每個數(shù)據(jù)是4Byte即32Bits,PL向PS寫數(shù)據(jù)是保存在第25個寄存器,映射在DDR的地址是25*4=100,
這里的寫入DDR的數(shù)據(jù)361除以16就是串口打印的22.562
