前情提要:參考的是下面所說的原網頁,只是原作者用的是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
