原創(chuàng)聲明:
本原創(chuàng)教程由芯驛電子科技(上海)有限公司(ALINX)創(chuàng)作,版權(quán)歸本公司所有,如需轉(zhuǎn)載,需授權(quán)并注明出處。
適用于板卡型號(hào):
AXU2CGA/AXU2CGB/AXU3EG/AXU4EV-E/AXU4EV-P/AXU5EV-E/AXU5EV-P /AXU9EG/AXU15EG
實(shí)驗(yàn)Vivado工程目錄為“ps_axi_gpio /vivado”。
實(shí)驗(yàn)vitis工程目錄為“ps_axi_gpio /vitis”。
可能有些人就會(huì)問,怎么又在講GPIO,LED燈,覺得太繁瑣,但是GPIO是ZYNQ的基本操作,本教程力求把各種方法分享給大家,PS端的MIO,EMIO,PL端的axi gpio,包括輸入輸出兩個(gè)方向,以及PS與PL的基本操作,所以還是希望大家耐心學(xué)習(xí)。
前面講過如何用的是PS端的EMIO點(diǎn)亮PL端LED燈,但是并沒有與PL端產(chǎn)生交互。本章介紹另外一種控制方法,在ZYNQ當(dāng)中可以使用AXI GPIO,通過AXI總線控制PL端的LED燈。同時(shí)也介紹了PL端按鍵的使用。
使用zynq最大的疑問就是如何把PS和PL結(jié)合起來(lái)使用,在其他的SOC芯片中一般都會(huì)有GPIO,本實(shí)驗(yàn)使用一個(gè)AXI GPIO的IP核,讓PS端通過AXI總線控制PL端的LED燈,實(shí)驗(yàn)雖然簡(jiǎn)單,不過可以讓我們了解PL和PS是如何結(jié)合的。
1. 原理介紹
一個(gè)AXI GPIO模塊有兩個(gè)GPIO,分別是GPIO和GPIO2,也就是channel1和channel2,為雙向IO。
AXI GPIO結(jié)構(gòu)
FPGA工程師工作內(nèi)容
以下為FPGA工程師負(fù)責(zé)內(nèi)容。
2. Vivado工程建立
1)打開“ps_hello”另存為一個(gè)名為“ps_axi_gpio”Vivado工程,表示PS通過AXI總線控制gpio
“Create project subdirectory”勾選后會(huì)在目錄下創(chuàng)建子目錄,勾選“Include run results”會(huì)包含編譯后的結(jié)果
2)雙擊xx.bd打開block design
添加AXI GPIO
3) 添加一個(gè)AXI GPIO的IP 核
4)雙擊剛才添加的“axi_gpio_0”配置參數(shù)
5)選擇“All Outputs”,因?yàn)檫@里控制LED,只要輸出就可以了,“GPIO Width”填1,控制1顆LED,點(diǎn)擊OK。如果想使用channel2,需要把”Enable Dual Channel”打開,也就使能了GPIO2。
6)點(diǎn)擊“Run Connection Automation”,可以完成部分自動(dòng)連線
7)選擇要自動(dòng)連接的端口,這里全選,點(diǎn)擊OK
8)點(diǎn)擊“Optimize Routing”,可以優(yōu)化布局,同時(shí)可以看到多了兩個(gè)模塊,一個(gè)是Processor System Reset模塊,為同步復(fù)位模塊,提供同一時(shí)鐘域的復(fù)位信號(hào)。AXI Interconnect模塊為AXI總線互聯(lián)模塊,用于AXI模塊的交叉互聯(lián)。
在這個(gè)應(yīng)用中,我們可以看到用到了ZYNQ的HPM0_LPD口,此接口用于訪問PL端數(shù)據(jù),大部分應(yīng)用中是為了配置PL端模塊的寄存器。
復(fù)位信號(hào)由ZYNQ的復(fù)位輸出提供,最好是每個(gè)時(shí)鐘域都加一個(gè)復(fù)位模塊,可以根據(jù)模塊下面的名稱搜索添加。
9)修改GPIO端口的名稱
10)名稱修改為leds
11)再添加一個(gè)AXI GPIO,連接PL端按鍵,配置GPIO參數(shù),都為輸入,寬度為1,使能中斷
12)使用自動(dòng)連接
13)再把端口名稱改為keys
14)由于是PL端過來(lái)的中斷,在這里需要配置ZYNQ處理器的中斷,設(shè)置IRQ0[0-7]為1
15)連接ip2intc_irpt到pl_ps_irq
16)保存設(shè)計(jì),點(diǎn)擊xx.bd,右鍵Generate Output Products
17)在生成的Verilog文件中,可以看到有個(gè)“l(fā)eds_tri_o”和”keys_tri_i”的端口,要為他們分配管腳,在綁定引腳時(shí),以這個(gè)文件里的引腳名稱為準(zhǔn)。
3. XDC文件約束PL管腳
1)創(chuàng)建一個(gè)新的xdc約束文件
2)文件名稱為led
3)led.xdc添加一下內(nèi)容,端口名稱一定要和頂層文件端口一致
##################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)導(dǎo)出硬件FileExportExport Hardware
6)因?yàn)橐玫絇L,所以選擇“Include bitstream”,點(diǎn)擊“OK”
軟件工程師工作內(nèi)容
以下為軟件工程師負(fù)責(zé)內(nèi)容。
4. Vitis程序編寫
4.1 AXI GPIO點(diǎn)亮PL端LED燈
1)創(chuàng)建一個(gè)platform,創(chuàng)建過程參考“PS端RTC中斷實(shí)驗(yàn)”一章
2)面對(duì)一個(gè)不熟悉AXI GPIO,我們?nèi)绾慰刂颇??我們可以嘗試一下Vitis自帶的例程
3)雙擊“system.mss”,找到“axi_gpio_0”,這里可以點(diǎn)擊“Documentation”來(lái)看相關(guān)文檔,這里就不演示,點(diǎn)擊“Import Examples”
4)在彈出的對(duì)話框中有多個(gè)例程,從名稱中可以猜個(gè)大概,這里選第一個(gè)“xgpio_example”
5)可以看到例程比較簡(jiǎn)單,短短幾行代碼,完成了AXI GPIO的操作
里面用到很多GPIO相關(guān)的API函數(shù),通過文檔可以了解詳細(xì),也可以選中該函數(shù),按“F3”查看具體定義。如果有了這些信息你還不能理解如何使用AXI GPIO,說(shuō)明你需要補(bǔ)充C語(yǔ)言基礎(chǔ)。
其實(shí)這些函數(shù)都是在操作GPIO的寄存器,AXI GPIO的寄存器也不多,主要是兩個(gè)channel的數(shù)據(jù)寄存器GPIO_DATA和GPIO2_DATA,兩個(gè)channel的方向控制GPIO_TRI和GPIO2_TRI,以及全局中斷使能寄存器GIER,IP的中斷使能IP IER和中斷狀態(tài)寄存器ISR,具體的功能可以看AXI GPIO的文檔pg144。
比如進(jìn)入到設(shè)置GPIO方向的函數(shù)中,就可以看到是在向GPIO的GPIO_TRI寄存器寫數(shù)據(jù),從而控制方向。
其他的函數(shù)也可以按此法自行研究。
4.2 下載調(diào)試
首先編譯APP工程,編譯方法前面的例程已經(jīng)介紹過了。雖然Vitis可以提供一些例程,但有一部分例程是需要自己修改的,這個(gè)簡(jiǎn)單的LED例程就不修改了,嘗試運(yùn)行一下,發(fā)現(xiàn)不能達(dá)到預(yù)期效果,甚至提示一些錯(cuò)誤。下載后可以看到開發(fā)板LED1快速閃爍。
4.3 寄存器方式實(shí)現(xiàn)
如果覺得Xilinx提供的API函數(shù)比較繁瑣,效率低,也可以采取操作寄存器的方式實(shí)現(xiàn)LED的控制。
比如下面我們新建了axi_led的工程,修改helloworld.c如下。
其中定義的基地址GPIO_BASEADDR可以在xx.xsa中里找到
由于我們只啟用了channel1,因此定義了下面的寄存器地址
這樣直接操作寄存器的方式效率會(huì)比調(diào)用Xilinx API函數(shù)高,而且更直觀,對(duì)于理解程序如何運(yùn)行有很大幫助。但是對(duì)于大工程來(lái)講,這種方式使用起來(lái)就比較復(fù)雜,主要依據(jù)個(gè)人需求選擇。
4.4 AXI GPIO之PL端按鍵中斷
前面的定時(shí)器中斷實(shí)驗(yàn)的中斷屬于PS內(nèi)部的中斷,本實(shí)驗(yàn)中斷來(lái)自PL,PS最大可以接收16個(gè)來(lái)自PL的中斷信號(hào),都是上升沿或高電平觸發(fā)。
1)和前面的教程一樣,在不熟悉Vitis程序編寫的情況下,我們盡量使用Vitis自帶例程來(lái)修改,選擇“xgpio_intr_tapp_example”
2)需要修改部分代碼,按鍵的axi gpio模塊叫做axi_gpio_1,在xparameters.h中找到它的device id
3)然后可以修改GPIO和中斷號(hào)的宏定義如下
4)修改測(cè)試延時(shí)時(shí)間,讓我們有足夠的時(shí)間去按按鍵
4.5 下載調(diào)試
保存文件,編譯工程,打開串口終端,下載程序。如果一直不按按鍵,串口顯示“No button pressed.”,如果按下“KEY1”按鍵顯示“Successfully ran Gpio Interrupt Tapp Example”。
5. 實(shí)驗(yàn)總結(jié)
通過實(shí)驗(yàn)我們了解到PS可以通過AXI總線控制PL,但幾乎沒有體現(xiàn)出ZYNQ的優(yōu)勢(shì),因?yàn)閷?duì)于控制LED燈,無(wú)論是ARM還是FPGA,都可以輕松完成,但是如果把LED換成串口呢,控制100路串口通信,8路以太網(wǎng)等應(yīng)用,我想還沒有哪個(gè)SOC能完成這種功能,只有ZYNQ可以,這就是ZYNQ和普通SOC的不同之處。
PL端可以給PS發(fā)送中斷信號(hào),這提高了PL和PS數(shù)據(jù)交互的效率,在需要大數(shù)量、低延時(shí)的應(yīng)用中需要用到中斷處理。
到本章結(jié)束已經(jīng)把ZYNQ的PS端MIO、EMIO,PL端GPIO如何使用講完了,包括輸入和輸出以及中斷處理,這些都是最基礎(chǔ)的操作,大家還是要多多思考,理解清楚。
6. 知識(shí)點(diǎn)分享
1)在設(shè)計(jì)好后,可以看到Address Editor中,已經(jīng)為AXI外設(shè)分配好了地址空間,其中偏移地址和空間大小是可以修改的。
但是修改偏移地址是有限制的,詳情參考UG1085文檔System Address一章, AXI外設(shè)連接到了M_AXI_HPM0_LPD口,在8000_0000到9FFF_FFFF地址空間內(nèi)修改。
2)在使用一個(gè)模塊時(shí),需要配套的文檔輔助開發(fā),但是這些文檔該如何去找呢,例如XILINX的IP,打開模塊的配置,在左上角點(diǎn)擊Documentation,再點(diǎn)擊Product Guide,如果在安裝Vivado的時(shí)候安裝了DocNav,就會(huì)跳轉(zhuǎn)過去打開文檔。
此功能需要電腦聯(lián)網(wǎng),DocNav會(huì)從網(wǎng)站加載文檔??梢渣c(diǎn)擊下載按鈕下載到本地。
還有一種方法是在Xilinx官網(wǎng)根據(jù)模塊的名稱搜索資料下載(頁(yè)面可能會(huì)有所變化)
-
FPGA
+關(guān)注
關(guān)注
1629文章
21736瀏覽量
603421 -
Xilinx
+關(guān)注
關(guān)注
71文章
2167瀏覽量
121430 -
GPIO
+關(guān)注
關(guān)注
16文章
1204瀏覽量
52104 -
Zynq
+關(guān)注
關(guān)注
10文章
609瀏覽量
47182 -
MPSoC
+關(guān)注
關(guān)注
0文章
198瀏覽量
24283
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論