原創聲明:
本原創教程由芯驛電子科技(上海)有限公司(ALINX)創作,版權歸本公司所有,如需轉載,需授權并注明出處。
適用于板卡型號:
AXU2CGA/AXU2CGB/AXU3EG/AXU4EV-E/AXU4EV-P/AXU5EV-E/AXU5EV-P /AXU9EG/AXU15EG
實驗Vivado工程目錄為“ps_axi_gpio /vivado”。
實驗vitis工程目錄為“ps_axi_gpio /vitis”。
可能有些人就會問,怎么又在講GPIO,LED燈,覺得太繁瑣,但是GPIO是ZYNQ的基本操作,本教程力求把各種方法分享給大家,PS端的MIO,EMIO,PL端的axi gpio,包括輸入輸出兩個方向,以及PS與PL的基本操作,所以還是希望大家耐心學習。
前面講過如何用的是PS端的EMIO點亮PL端LED燈,但是并沒有與PL端產生交互。本章介紹另外一種控制方法,在ZYNQ當中可以使用AXI GPIO,通過AXI總線控制PL端的LED燈。同時也介紹了PL端按鍵的使用。
使用zynq最大的疑問就是如何把PS和PL結合起來使用,在其他的SOC芯片中一般都會有GPIO,本實驗使用一個AXI GPIO的IP核,讓PS端通過AXI總線控制PL端的LED燈,實驗雖然簡單,不過可以讓我們了解PL和PS是如何結合的。
1. 原理介紹
一個AXI GPIO模塊有兩個GPIO,分別是GPIO和GPIO2,也就是channel1和channel2,為雙向IO。

FPGA工程師工作內容
以下為FPGA工程師負責內容。
2. Vivado工程建立
1)打開“ps_hello”另存為一個名為“ps_axi_gpio”Vivado工程,表示PS通過AXI總線控制gpio

“Create project subdirectory”勾選后會在目錄下創建子目錄,勾選“Include run results”會包含編譯后的結果

2)雙擊xx.bd打開block design

添加AXI GPIO
3) 添加一個AXI GPIO的IP 核

4)雙擊剛才添加的“axi_gpio_0”配置參數

5)選擇“All Outputs”,因為這里控制LED,只要輸出就可以了,“GPIO Width”填1,控制1顆LED,點擊OK。如果想使用channel2,需要把”Enable Dual Channel”打開,也就使能了GPIO2。

6)點擊“Run Connection Automation”,可以完成部分自動連線

7)選擇要自動連接的端口,這里全選,點擊OK

8)點擊“Optimize Routing”,可以優化布局,同時可以看到多了兩個模塊,一個是Processor System Reset模塊,為同步復位模塊,提供同一時鐘域的復位信號。AXI Interconnect模塊為AXI總線互聯模塊,用于AXI模塊的交叉互聯。

在這個應用中,我們可以看到用到了ZYNQ的HPM0_LPD口,此接口用于訪問PL端數據,大部分應用中是為了配置PL端模塊的寄存器。

復位信號由ZYNQ的復位輸出提供,最好是每個時鐘域都加一個復位模塊,可以根據模塊下面的名稱搜索添加。

9)修改GPIO端口的名稱

10)名稱修改為leds

11)再添加一個AXI GPIO,連接PL端按鍵,配置GPIO參數,都為輸入,寬度為1,使能中斷

12)使用自動連接

13)再把端口名稱改為keys

14)由于是PL端過來的中斷,在這里需要配置ZYNQ處理器的中斷,設置IRQ0[0-7]為1

15)連接ip2intc_irpt到pl_ps_irq

16)保存設計,點擊xx.bd,右鍵Generate Output Products

17)在生成的Verilog文件中,可以看到有個“leds_tri_o”和”keys_tri_i”的端口,要為他們分配管腳,在綁定引腳時,以這個文件里的引腳名稱為準。

3. XDC文件約束PL管腳
1)創建一個新的xdc約束文件

2)文件名稱為led

3)led.xdc添加一下內容,端口名稱一定要和頂層文件端口一致
##################CompressBitstream############################set_propertyBITSTREAM.GENERAL.COMPRESSTRUE[current_design]set_propertyIOSTANDARDLVCMOS33[get_ports{leds_tri_o[0]}]set_propertyPACKAGE_PINAE12[get_ports{leds_tri_o[0]}]set_propertyIOSTANDARDLVCMOS33[get_ports{keys_tri_i[0]}]set_propertyPACKAGE_PINAF12[get_ports{keys_tri_i[0]}]
4)生成bit文件

5)導出硬件FileExportExport Hardware

6)因為要用到PL,所以選擇“Include bitstream”,點擊“OK”

軟件工程師工作內容
以下為軟件工程師負責內容。
4. Vitis程序編寫
4.1 AXI GPIO點亮PL端LED燈
1)創建一個platform,創建過程參考“PS端RTC中斷實驗”一章

2)面對一個不熟悉AXI GPIO,我們如何控制呢?我們可以嘗試一下Vitis自帶的例程
3)雙擊“system.mss”,找到“axi_gpio_0”,這里可以點擊“Documentation”來看相關文檔,這里就不演示,點擊“Import Examples”

4)在彈出的對話框中有多個例程,從名稱中可以猜個大概,這里選第一個“xgpio_example”

5)可以看到例程比較簡單,短短幾行代碼,完成了AXI GPIO的操作

里面用到很多GPIO相關的API函數,通過文檔可以了解詳細,也可以選中該函數,按“F3”查看具體定義。如果有了這些信息你還不能理解如何使用AXI GPIO,說明你需要補充C語言基礎。
其實這些函數都是在操作GPIO的寄存器,AXI GPIO的寄存器也不多,主要是兩個channel的數據寄存器GPIO_DATA和GPIO2_DATA,兩個channel的方向控制GPIO_TRI和GPIO2_TRI,以及全局中斷使能寄存器GIER,IP的中斷使能IP IER和中斷狀態寄存器ISR,具體的功能可以看AXI GPIO的文檔pg144。

比如進入到設置GPIO方向的函數中,就可以看到是在向GPIO的GPIO_TRI寄存器寫數據,從而控制方向。

其他的函數也可以按此法自行研究。
4.2 下載調試
首先編譯APP工程,編譯方法前面的例程已經介紹過了。雖然Vitis可以提供一些例程,但有一部分例程是需要自己修改的,這個簡單的LED例程就不修改了,嘗試運行一下,發現不能達到預期效果,甚至提示一些錯誤。下載后可以看到開發板LED1快速閃爍。

4.3 寄存器方式實現
如果覺得Xilinx提供的API函數比較繁瑣,效率低,也可以采取操作寄存器的方式實現LED的控制。
比如下面我們新建了axi_led的工程,修改helloworld.c如下。


其中定義的基地址GPIO_BASEADDR可以在xx.xsa中里找到

由于我們只啟用了channel1,因此定義了下面的寄存器地址

這樣直接操作寄存器的方式效率會比調用Xilinx API函數高,而且更直觀,對于理解程序如何運行有很大幫助。但是對于大工程來講,這種方式使用起來就比較復雜,主要依據個人需求選擇。
4.4 AXI GPIO之PL端按鍵中斷
前面的定時器中斷實驗的中斷屬于PS內部的中斷,本實驗中斷來自PL,PS最大可以接收16個來自PL的中斷信號,都是上升沿或高電平觸發。
1)和前面的教程一樣,在不熟悉Vitis程序編寫的情況下,我們盡量使用Vitis自帶例程來修改,選擇“xgpio_intr_tapp_example”

2)需要修改部分代碼,按鍵的axi gpio模塊叫做axi_gpio_1,在xparameters.h中找到它的device id


3)然后可以修改GPIO和中斷號的宏定義如下

4)修改測試延時時間,讓我們有足夠的時間去按按鍵

4.5 下載調試
保存文件,編譯工程,打開串口終端,下載程序。如果一直不按按鍵,串口顯示“No button pressed.”,如果按下“KEY1”按鍵顯示“Successfully ran Gpio Interrupt Tapp Example”。

5. 實驗總結
通過實驗我們了解到PS可以通過AXI總線控制PL,但幾乎沒有體現出ZYNQ的優勢,因為對于控制LED燈,無論是ARM還是FPGA,都可以輕松完成,但是如果把LED換成串口呢,控制100路串口通信,8路以太網等應用,我想還沒有哪個SOC能完成這種功能,只有ZYNQ可以,這就是ZYNQ和普通SOC的不同之處。
PL端可以給PS發送中斷信號,這提高了PL和PS數據交互的效率,在需要大數量、低延時的應用中需要用到中斷處理。
到本章結束已經把ZYNQ的PS端MIO、EMIO,PL端GPIO如何使用講完了,包括輸入和輸出以及中斷處理,這些都是最基礎的操作,大家還是要多多思考,理解清楚。
6. 知識點分享
1)在設計好后,可以看到Address Editor中,已經為AXI外設分配好了地址空間,其中偏移地址和空間大小是可以修改的。

但是修改偏移地址是有限制的,詳情參考UG1085文檔System Address一章, AXI外設連接到了M_AXI_HPM0_LPD口,在8000_0000到9FFF_FFFF地址空間內修改。

2)在使用一個模塊時,需要配套的文檔輔助開發,但是這些文檔該如何去找呢,例如XILINX的IP,打開模塊的配置,在左上角點擊Documentation,再點擊Product Guide,如果在安裝Vivado的時候安裝了DocNav,就會跳轉過去打開文檔。


此功能需要電腦聯網,DocNav會從網站加載文檔。可以點擊下載按鈕下載到本地。
還有一種方法是在Xilinx官網根據模塊的名稱搜索資料下載(頁面可能會有所變化)

-
FPGA
+關注
關注
1643文章
21985瀏覽量
615077 -
Xilinx
+關注
關注
73文章
2184瀏覽量
124555 -
GPIO
+關注
關注
16文章
1277瀏覽量
53684 -
Zynq
+關注
關注
10文章
614瀏覽量
48078 -
MPSoC
+關注
關注
0文章
200瀏覽量
24646
發布評論請先 登錄
AMD Spartan UltraScale+ FPGA 開始量產出貨

蔡司亮相第二十九屆中國國際口腔設備材料展覽會,邀您共探口腔行業未來

Xilinx Ultrascale系列FPGA的時鐘資源與架構解析

ZYNQ基礎---AXI DMA使用

《DNESP32S3使用指南-IDF版_V1.6》第二十九章 DS18B20實驗
AMD/Xilinx Zynq? UltraScale+ ? MPSoC ZCU102 評估套件

在米爾電子MPSOC實現12G SDI視頻采集H.265壓縮SGMII萬兆以太網推流
12G-SDI高清視頻開發案例,讓4K視頻采集更便捷!基于Xilinx MPSoC高性能平臺
《DNK210使用指南 -CanMV版 V1.0》第二十九章 音頻錄制實驗
在米爾電子MPSOC實現12G SDI視頻采集H.265壓縮SGMII萬兆以太網推流
使用TPS65086x PMIC為Xilinx Zynq UltraScale MPSoC供電

評論