軟件版本:vitis2020.2(vivado2020.2)
操作系統:WIN10 64bit
硬件平台:適用XILINX A7/K7/Z7/ZU/KU系列FPGA(米聯客(milianke)MZU07A-EG硬件開發平台)
登錄"米聯客"FPGA社區-www.uisrc.com視頻課程、答疑解惑!
12.1概述
本文在 AXI_DMA_LOOP 環路測試架構的基礎上,在 DATA FIFO 端加入 FPGA 代碼,對 FIFO 寫,實現將 PL 端數據 通過 DMA 發送給 PS 功能。
本文實驗目的:
1:掌握編程PL代碼,以AXI-Stream協議把數據通過DMA發送到PS DDR
2:通過VITIS-SDK編程實現數據的接收
3:通過VITIS-SDK觀察PS內存中接收到的數據是否正確。
12.2搭建SOC系統工程
新建一個名為為zu_prj的工程,之后創建一個BD文件,並命名為system,添加並且配置好ZYNQ Ultrascale+ MPSOC IP。讀者需要根據自己的硬件類型配置好輸入時鍾頻率、內存型號、串口,連接時鍾等。新手不清楚這些內容的,請參考"3-2-01_ex_soc_base_07a-eg .pdf" "01 HelloWold/DDR/網口測試"這篇文章。
12.2.1PS部分設置
1:PS復位設置
2:設置PS FPD接口和HP接口
3:設置PL到PS的中斷
Interurptsà勾選 Fabric Interrupt,勾選IRQ0[0:7]。
4:設置PL的時鍾
勾選PL0,設置為100,即PS的PLL提供本系統的時鍾100MHZ。
12.2.2添加IP
單擊添加IP按鈕"
",輸入如下模塊IP名字的關鍵詞,並雙擊添加。
12.2.3IP設置
設置Wideh of buffer length register :23。(寄存器設置最大為26,即2的26次方64M大小,這里設置23bit 就夠用了,長度越大,需要的資源也就越多)
這里也只要使用DMA寫通道,
Data FIFO設置TDATA Width為4。
12.2.4PL圖形編程
下圖中可以看到FIFO的S_AXIS接口引出到了外部的FPGA代碼中,所以后面我們需要編寫合適的AXI-Stream FPGA代碼來寫FIFO。
12.2.5地址空間分配
12.2.6編寫AXI-Stream寫代碼
如下圖中,system_dma_top.v代碼是可以實現對FPGA圖形設計代碼的調用。
現在我們看看system_dma_top.v中如何利用axi-stream協議完成對fifo的寫操作。
module system_wrapper();
reg [31:0]S_AXIS_tdata; wire S_AXIS_tlast; wire S_AXIS_tvalid = 1'b1; wire FCLK_CLK0; wire s_axis_aclk; wire s_axis_aresetn; wire [3:0]S_AXIS_tkeep; wire S_AXIS_tready; wire [0:0]gpio_rtl_tri_o; wire [0:0]peripheral_aresetn;
assign S_AXIS_tkeep = 4'b1111; assign s_axis_aclk = pl_clk0; assign s_axis_aresetn = peripheral_aresetn&&gpio_rtl_tri_o;
always@(posedge pl_clk0)begin if(s_axis_aresetn == 1'b0)begin S_AXIS_tdata <= 0; end else begin if(S_AXIS_tready&&S_AXIS_tdata<511) S_AXIS_tdata <= S_AXIS_tdata + 1'b1; else if(S_AXIS_tready) S_AXIS_tdata <= 0; end end
assign S_AXIS_tlast = (S_AXIS_tdata == 511)&&S_AXIS_tready&&S_AXIS_tvalid;
system system_i (.S_AXIS_tdata(S_AXIS_tdata), .S_AXIS_tkeep(S_AXIS_tkeep), .S_AXIS_tlast(S_AXIS_tlast), .S_AXIS_tready(S_AXIS_tready), .S_AXIS_tvalid(S_AXIS_tvalid), .gpio_rtl_tri_o(gpio_rtl_tri_o), .peripheral_aresetn(peripheral_aresetn), .pl_clk0(pl_clk0), .s_axis_aclk(s_axis_aclk), .s_axis_aresetn(s_axis_aresetn)); endmodule |
以上代碼非常簡潔,本身axi-stream協議就非常簡潔。
以上代碼中設置S_AXIS_tvalid = 1'b1始終為1代表,任何時候只要S_AXIS_tready有效,數據計數器S_AXIS_tdata就加1,每次發送512個32bit數據,也就是1024個字節數據。每發送1024個數據產生一個中斷。中斷的產生是靠axi-stream協議的S_AXIS_tlast信號決定。S_AXIS_tlast = (S_AXIS_tdata == 511)&&S_AXIS_tready&&S_AXIS_tvalid。
12.2.7編譯並導出平台文件
1:單擊Block文件à右鍵àGenerate the Output ProductsàGlobalàGenerate。
2:單擊Block文件à右鍵à Create a HDL wrapper(生成HDL頂層文件)àLet vivado manager wrapper and auto-update(自動更新)。
3:生成Bit文件。
4:導出到硬件: FileàExport HardwareàInclude bitstream
5:導出完成后,對應工程路徑的zu_hw路徑下有硬件平台文件:system_wrapper.xsa的文件。根據硬件平台文件system_wrapper.xsa來創建需要Platform平台。
12.3搭建Vitis-sdk工程
創建zu_base sdk platform和APP工程的過程不再重復,可以閱讀本章節01~05相關demo。以下給出創建好zu_base sdk platform的截圖和對應工程APP的截圖。
12.3.1創建SDK Platform工程
12.3.2創建axi_dma_pl2ps APP工程
12.4實驗結果
Debug程序,單程序停止main函數處,打開VIVADO,掃描芯片,這個時候會自動之前添加的在線邏輯分析儀IP核。如下紅框的按鍵先不要單擊。
具體步驟如下:
在VIVADO工程中點擊Open Target 然后點擊Auto Connect
連接成功后入下圖
下圖中,我們利用axi-tlast信號作為觸發信號
下圖中我們使用DMA產生的中斷信號作為觸發信號
單擊如下圖片,讓在線邏輯分析儀的2個窗口都處於等待觸發狀態
如下圖所示是等待觸發狀態
回到SDK,繼續設置,打開Memory:Window->Show View->Memory
點擊添加接收內存部分地址用於觀察內存中的數據 地址為 0x01300000
為了觀察一次收發數據:設置斷點,重新讓收發程序跑一次。雙擊以下程序處可以設置斷點。
設置完成后,單擊如下可以單擊如下紅框的按鍵
串口打印結果,通過設置TTC定時器,每間隔1S 打印一次計算的測速。實際上也就是計算單位時間內,DMA了多少次。可以通過增加數據位寬,以及增加PL時鍾的頻率,提高速度。讀者可以去嘗試下。
內存中觀察到的數據,可以看到地址0x01300000地址的開始並不是00而是AB和我們的預期有些差異,不過數據是非常有規律的,說明DMA是正常工作的,但是我們的用戶邏輯實際上沒有能夠確保發送數據的時候第一數據是00,這個大家可以思考下為什么,有什么辦法可以改進。我們后面lwip的demo就對此問題必須做改進。
在線邏輯分析儀
