本原創教程由芯驛電子科技(上海)有限公司(ALINX)創做,版權歸本公司全部,如需轉載,需受權並註明出處。git
AXU2CGA/AXU2CGB/AXU3EG/AXU4EV-E/AXU4EV-P/AXU5EV-E/AXU5EV-P /AXU9EG/AXU15EGgithub
實驗Vivado工程目錄爲「pl_read_write_ps_ddr/vivado」。ide
實驗vitis工程目錄爲「pl_read_write_ps_ddr /vitis」。工具
PL和PS的高效交互是zynq soc開發的重中之重,咱們經常須要將PL端的大量數據實時送到PS端處理,或者將PS端處理結果實時送到PL端處理,常規咱們會想到使用DMA的方式來進行,可是各類協議很是麻煩,靈活性也比較差,本節課程講解如何直接經過AXI總線來讀寫PS端ddr的數據,這裏面涉及到AXI4協議,vivado的FPGA調試等。測試
如下爲FPGA工程師負責內容。優化
zynq 7000 SOC的HP口是 High-Performance Ports的縮寫,以下圖所示,一共有4個HP口,HP口是AXI Slave設備,咱們能夠經過這4個HP接口實現高帶寬的數據交互。ui
1)基於「ps_hello」工程,在vivado的界面中HP的配置以下圖(HP0~HP3),這裏面有使能控制,數據位寬選擇,可選擇32bit、64bit或128bit的位寬。咱們的實驗啓用HP0配置爲64bit位寬,使用的時鐘是150Mhz,HP的帶寬是150Mhz * 64bit,對於視頻處理,ADC數據採集等應用都有足夠的帶寬。不須要AXI HPM0 LPD,取消選擇。spa
2)添加復位模塊,用於復位debug
3)在空白處右鍵選擇」Creat Port」設計
配置如圖
4)鏈接時鐘和復位
5)選中引腳,點擊Make External,將信號導出
並修改引腳名稱以下圖
並選擇總線同步時鐘爲axi_hp_clk
6)點開Address Editor,若是發現地址沒有分配,點擊自動分配地址按鈕
分配後的結果,能夠看到訪問DDR, QSPI, OCM的地址空間
保存設計,從新Generate Ouput Product
7)添加hdl文件
點擊Finish
HDL層級關係更新結果
AXI4相對複雜,但SOC開發者必須掌握,對於zynq的開發者,筆者建議可以在一些已有的模板代碼基礎上修改。AXI協議的具體內容可參考Xilinx UG761 AXI Reference Guide。在這裏咱們簡單瞭解一下。
AXI4所採用的是一種READY,VALID握手通訊機制,即主從模塊進行數據通訊前,先根據操做對各所用到的數據、地址通道進行握手。主要操做包括傳輸發送者A等到傳輸接受者B的READY信號後,A將數據與VALID信號同時發送給B,這是一種典型的握手機制。
AXI總線分爲五個通道:
其中ACLK爲axi總線時鐘,ARESETN是axi總線復位信號,低電平有效;讀寫數據與讀寫地址類信號寬度都爲32bit;READY與VALID是對應的通道握手信號;WSTRB信號爲1的bit對應WDATA有效數據字節,WSTRB寬度是32bit/8=4bit;BRESP與RRESP分別爲寫回應信號,讀迴應信號,寬度都爲2bit,‘h0表明成功,其餘爲錯誤。
讀操做順序爲主與從進行讀地址通道握手並傳輸地址內容,而後在讀數據通道握手並傳輸所讀內容以及讀取操做的迴應,時鐘上升沿有效。如圖所示:
寫操做順序爲主與從進行寫地址通道握手並傳輸地址內容,而後在寫數據通道握手並傳輸所讀內容,最後再寫回應通道握手,並傳輸寫回應數據,時鐘上升沿有效。如圖所示:
在咱們不擅長寫FPGA的一些代碼時咱們每每要借鑑別人的代碼或者使用IP core。在這裏筆者從github上找到一個AXI master的代碼,地址是https://github.com/aquaxis/IPCORE/tree/master/aq_axi_vdma。這個工程是一個本身寫的VDMA,裏面包含了大量可參考的代碼。筆者這裏主要使用了aq_axi_master.v這個代碼用於AXI master讀寫操做。借鑑別人代碼有時會節省不少時間,但若是不能理解的去借鑑,出現問題了很難解決。具體能夠參考aq_axi_master.v代碼,有部分修改。
有了AXI Master讀寫接口之後比較編寫了一個簡單的驗證模塊,這個驗證模塊是用來驗證ddr ip的,經過寫入數據,而後讀取出來比較。這裏要注意的是PS端DDR的起始地址和大小,還有地址的單位是byte仍是word,AXI總線的地址單位是byte,測試模塊的地址單位是word(這裏的word不必定是4byte)。文件名mem_test.v。
AXI讀寫驗證模塊只有一個error信號用於指示錯誤,若是有數據錯誤咱們但願能更精確的信息,altera的quartus II軟件中有signal tap工具,xilinx 的ISE中有chipscope工具,這些都是嵌入式邏輯分析儀,對咱們調試有很大幫助,在vivado軟件中調試更加方便。在插入調試信號時有些信息可能會被優化掉,或者信號名稱改變了就不容易識別,這個時候咱們能夠在程序代碼里加入*mark_debug="true"*這樣的屬性,以下圖的信號:
具體的添加方法在」PL的「Hello World」LED實驗」中已經講過,可參考。
並在XDC文件裏綁定error信號到PL端LED燈上。
以hello world爲模板新建vitis工程以下
經過vitis下載程序後,系統會復位而且下載FPGA的bit文件。而後回到vivado界面點擊Program and Debug欄自動鏈接目標以下圖所示:
自動鏈接硬件後可發現JTAG連上的設備,其中有一個hw_ila_1的設備,這個設備就是咱們debug設備,選中後可點擊上方黃色三角按鈕捕捉波形。若是有些信號沒有顯示完整,可點擊波形旁邊的「+」按鈕添加。
點擊捕獲波形之後以下圖所示,若是error一直爲低,而且讀寫狀態有變化,說明讀寫DDR數據正常,用戶在這裏能夠本身查看其它的信號來觀察寫入DDR的數據和從DDR讀出的數據。
zynq系統相對於單個FPGA或單個ARM要複雜很大,對開發者的基礎知識要求較高,本章內容涉及到AXI協議、zynq的互聯資源、vivado的和Vitis的調試技巧。這些都僅僅是基礎知識,筆者在這裏也僅僅是拋磚引玉,你們仍是要多多練習,在不斷練習中掌握技巧。