在ZYBO板卡上實現PL-PS交互(通過AXI的方式)


 


 

前情提要:參考的是下面所說的原網頁,只是原作者用的是vivado 2014.4,我用vivado 2018.2跑的,圖是新的,內容大多“換湯不換葯”,但是我在做的時候存在一些問題,我記錄了下來並將解決方法加到了下面的文字中,因此在我的主機上是可以跑通的。不當之處多多包涵。如有侵權請聯系刪除。

目的:學會vivado PL-PS協同開發流程

平台:ZYBO開發板,zynq-7010 clg400芯片

工具:Vivado 2018.2

功能:實現PL-PS協同通信,PS通過AXI總線讀取PL部分的GPIO狀態(對應Zybo的四個開關輸入),然后根據讀取值,寫入GPIO(對應Zybo的四個LED輸出)

原網頁http://www.digilent.com.cn/community/4.html

 


1. 打開vivado,點擊create newproject:

 

2. 輸入工程名、工程路徑,如下圖。然后點擊next:

3. 在project type界面中,按如下圖方式勾選,點擊next:

 

4. 在search中輸入xc7z010clg400,然后選擇xc7z010clg400-1芯片(此芯片為zybo開發板采用的芯片)(*芯片一定要選對)。如下圖所示。點擊next:

5. 點擊finish,新建工程完成。

6. 工程界面如下圖。在vivado下建立工程,有以下幾種情況:1.如果沒有涉及到PS部分,可以采用基於v文件或者diagram的工程。基於v文件的工程是由一個個的verilog或vhdl或ip組成的;基於diagram的工程是先新建一個diagram,然后在diagram中添加一個個的ip。2.如果用到了PS,那只能采用基於diagram的工程。

7. 此工程用到了PS部分,因此需要先建一個diagram,然后在diagram中添加PS,以及各種IP。點擊工程左側的createblock design:

 

8. 在新彈出的窗口中保持默認,點擊ok,如下圖。這樣就創建了一個名為design_1的diagram:

 

9. 首先需要添加PS核。在diagram中右擊鼠標,選擇addip

 

10. 在search中輸入zynq,選擇zynq核,雙擊完成PS的添加

 

11 雙擊添加后的PS核,然后點擊上方的Import xps settings,導入zybo的板卡網表文件zybo_zynq_def.xml(在最下邊的連接里),然后點擊ok。如下圖紅框所示。

 

12. 此時在zynq block design中,有一些接口的后面已經打上了√,如下圖所示。點擊ok完成配置

 

13. 此PS核在diagram中如下圖所示:

 

14. 點擊run block automation,然后在彈出界面中直接點擊ok。

 

15. 此時,可以發現,ps的DDR和FIX Io已經連接到板卡上了:

 

16. 然后再添加一個axi總線的gpio  ip核。右擊空白處,選擇addip,然后搜索gpio,雙擊AXI GPIO完成IP的添加:

 

17. 雙擊GPIO IP,按如圖配置,包含4bit的輸入和4bit的輸出,然后點擊ok:

 

18. 此時diagram界面如下所示。我們需要建立IP與PS之間的通道。點擊Run connection automation,如下圖所示:

 

19. 勾選“all automation“,點擊ok:等待幾秒,diagram會自動連接,如圖所示:

 

 

20. 等待幾秒,diagram會自動連接,如圖所示:

 

  此處詳解:PS核與PL的IP之間通信方式只有一種,那就是通過AXI總線。AXI interconnect IP是一個功能強大的IP,它能管理多個AXI接口的IP。用戶如果用到多個AXI IP,那么只需PS將M_AXI_GP0引腳連接到AXI interconnect Ip的SO0_AXI引腳,再將AXI interconnect ip的輸出分別連接到每個AXI IP的S_AXI引腳即可,省去了多個AXI互聯的管理問題。Processor System Reset IP為其他IP提供復位信號。
連接完畢axi ip后,還需進行ip的地址分配,以便ps部分對IP的調用。在Address Editor一欄,直接點擊左側的auto assign address按鈕。如下圖所示:

 

 

21. 接下來將GPIO引腳重新命名。在diagram中點擊gpio_rtl引腳,在External Interface Properities窗口中的name欄,可以將引腳重命名,如下圖所示:(*GPIO連接的管腳改名為sw,GPIO 2連接的管腳改名為led)

 

22. 在上圖中name一欄將gpio_rtl改為sw,按回車鍵完成命名。同樣將gpio_rtl_0命名為led。

 

23. 生成diagram的頂層v文件。在source窗口中右擊,選擇Create HDL Wrapper。如下圖所示。在新對話框中直接點擊ok。

 

24. 接下來需要添加引腳約束文件。點擊工程界面左側的Add Source,然后在Add Source窗口中選擇第一個,如下圖所示,然后點擊next:

 

25. 點擊create file,然后輸入約束文件的名字為ps_pl_test。點擊ok,然后在add source界面中點擊finish,完成約束文件的創建。

 

26. 在source窗口的constrs_1下,雙擊xdc文件,輸入以下約束內容(引腳約束關系請參閱zybo的reference manual)(*(汗)原作者的set_property PACKAGE_PIN中間沒有空格,本人作為新手,傻fufu的直接復制,到值最后比特流始終產生不出來,找了好久。另外實際測驗,LVCMOS33改為LVCMOS18 ):

 1 #switchsignals  2 set_property PACKAGE_PIN G15 [get_ports {sw_tri_i[0]}]  3 set_property IOSTANDARD LVCMOS18 [get_ports {sw_tri_i[0]}]  4 set_property PACKAGE_PIN P15 [get_ports {sw_tri_i[1]}]  5 set_property IOSTANDARD LVCMOS18 [get_ports {sw_tri_i[1]}]  6 set_property PACKAGE_PIN W13 [get_ports {sw_tri_i[2]}]  7 set_property IOSTANDARD LVCMOS18 [get_ports {sw_tri_i[2]}]  8 set_property PACKAGE_PIN T16 [get_ports {sw_tri_i[3]}]  9 set_property IOSTANDARD LVCMOS18 [get_ports {sw_tri_i[3]}] 10   11 #ledsignals 12 set_propertyPACKAGE_PIN M14 [get_ports {led_tri_o[0]}] 13 set_propertyIOSTANDARD LVCMOS18 [get_ports {led_tri_o[0]}] 14 set_propertyPACKAGE_PIN M15 [get_ports {led_tri_o[1]}] 15 set_propertyIOSTANDARD LVCMOS18 [get_ports {led_tri_o[1]}] 16 set_propertyPACKAGE_PIN G14 [get_ports {led_tri_o[2]}] 17 set_propertyIOSTANDARD LVCMOS18 [get_ports {led_tri_o[2]}] 18 set_propertyPACKAGE_PIN D18 [get_ports {led_tri_o[3]}] 19 set_property IOSTANDARD LVCMOS18 [get_ports {led_tri_o[3]}]

 

 

27. 此時,直接點擊工程界面左側的generate bitstream。工程會自動綜合、實現、生成bitstream。

 

28. 生成bit流后,會彈出以下窗口。直接關閉即可。

 

29. 在工程頂部菜單欄,點擊file->export->export hardware,在彈出窗口中勾選includebitstream,點擊ok:

 

30. 然后點擊file->launch SDK,在新窗口中點擊ok,啟動SDK

 

31. 此時SDK界面如下所示:'

 

32. 點擊file->new->new application project,然后在Projectname中輸入hello,保持其他默認,點擊next:

 

33. 保持默認的helloworld工程模板,點擊finish:

 

34. 修改helloworld.c的代碼如下,然后ctrl+s保存。保存后sdk會自動build。

 1 #include <stdio.h>  2 #include "platform.h"  3 #include "xgpio.h"  4    5 XGpioSW_LED;  6 #define SW_CHANNEL 1  7 #define LED_CHANNEL 2  8 #define SW_IN XGpio_SetDataDirection(&SW_LED, SW_CHANNEL, 0x0f)  9 #define LED_OUT XGpio_SetDataDirection(&SW_LED, LED_CHANNEL, 0x00) 10 #define SW_VALUE XGpio_DiscreteRead(&SW_LED, SW_CHANNEL) 11   12 int init_gpio() 13 { 14  int Status; 15     /* 16     *Initialize the IIC GPIO 17     */ 18     Status= XGpio_Initialize(&SW_LED, XPAR_AXI_GPIO_0_DEVICE_ID); 19     if (Status != XST_SUCCESS){ 20     return XST_FAILURE; 21     } 22     SW_IN; 23     LED_OUT; 24     return XST_SUCCESS; 25 } 26 int main() 27 { 28    init_platform(); 29   30    print("Hello World "); 31    init_gpio(); 32    intvalue; 33    while(1) 34    { 35     value = SW_VALUE; 36     XGpio_DiscreteWrite(&SW_LED, LED_CHANNEL,value); 37    } 38   39    cleanup_platform(); 40    return0; 41 }

 

35. 連接好ZYBO板卡,上電,等待自動安裝完驅動。然后點擊programFPGA按鈕,如下圖:

 

 

  在彈出的Program FPGA 窗口中直接點擊program。等待板子上綠色燈亮起,下載bit完畢。(*在Bitstream框里可能什么都沒有,需要自己去找,路徑為..\..\PS_PL_Test\PS_PL_Test\PS_PL_Test.runs\impl_1

 

36. 下載bit完畢,接着就是運行PS了。在工程左側Procject Explorer欄,右擊hello->RunAs->Launch on Hardware,如下圖:

 

37. 稍等幾秒,就可以操作SW了。LED的狀態隨着SW的改變而改變。

 

zybo的板卡網表文件鏈接:
http://f.digilent.com.cn/image_20160727_vrtgajdbzljjs.zip?attname=Vivado%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6.zip

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM