原創(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_emio/vivado”。
實(shí)驗(yàn)vitis工程目錄為“ps_emio/vitis”。
如果想用PS點(diǎn)亮PL的LED燈,該如何做呢?一是可以通過(guò)EMIO控制PL端LED燈,二是通過(guò)AXI GPIO的IP實(shí)現(xiàn)控制。本章介紹如何使用EMIO控制PL端LED燈的亮滅。同時(shí)也介紹了,利用EMIO連接PL端按鍵控制PL端LED燈。
1. 原理介紹
先來(lái)了解GPIO的BANK分布,從圖中可知BANK0~BANK2的MIO有78個(gè)。BANK3~BANK5的EMIO有96個(gè),本章就是采用EMIO控制PL端LED。

以下為FPGA工程師負(fù)責(zé)內(nèi)容。
2. Vivado工程建立
1)以ps_hello工程為基礎(chǔ),另存為一個(gè)名為ps_emio的工程,打開(kāi)ZYNQ配置,把GPIO EMIO勾選上。利用PL端的1個(gè)LED,1個(gè)按鍵,在MIO配置中選擇EMIO的位寬為2位,配置結(jié)束,點(diǎn)擊OK。

2)點(diǎn)擊多出的GPIO_0端口右鍵選擇Make External,將端口信號(hào)導(dǎo)出

3)點(diǎn)擊引腳并修改引腳名稱(chēng)為emio,也可以根據(jù)自己需求修改名稱(chēng)。保存設(shè)計(jì)。

4)點(diǎn)擊xx.bd右鍵選擇Generate Output Products,重新生成輸出文件

5)結(jié)束后,頂層文件會(huì)更新出新的管腳,下面需要對(duì)其進(jìn)行引腳綁定

3. XDC文件約束PL管腳
1)新建XDC文件,綁定PL端引腳

設(shè)置文件名稱(chēng)為emio

2)emio.xdc添加一下內(nèi)容,端口名稱(chēng)一定要和頂層文件端口一致
| ##################Compress Bitstream############################set_property BITSTREAM.GENERAL.COMPRESS TRUE [current_design]set_property IOSTANDARD LVCMOS33 [get_ports {emio_tri_io[*]}]#pl ledset_property PACKAGE_PIN W13 [get_ports {emio_tri_io[0]}]#pl keyset_property PACKAGE_PIN AA13 [get_ports {emio_tri_io[1]}] |
3)生成bit文件

4)雖然說(shuō)沒(méi)有用到PL端的邏輯,但是用到了PL端的引腳,因此導(dǎo)出硬件要選擇“Include bitstream”

軟件工程師工作內(nèi)容
以下為軟件工程師負(fù)責(zé)內(nèi)容。
4. Vitis程序編寫(xiě)
4.1 EMIO點(diǎn)亮PL端LED燈
下圖為GPIO的控制框圖,實(shí)驗(yàn)中會(huì)用到輸出部分的寄存器,數(shù)據(jù)寄存器DATA,數(shù)據(jù)掩碼寄存器MASK_DATA_LSW,MASK_DATA_MSW,方向控制寄存器DIRM,輸出使能控制器OEN。

一開(kāi)始編寫(xiě)代碼可能會(huì)無(wú)從下手,我們可以導(dǎo)入Xilinx提供的example工程,在BSP里找到psu_gpio_0,點(diǎn)擊Import Examples

在彈出窗口選擇“xgpiops_polled_example”,點(diǎn)擊OK

會(huì)出現(xiàn)一個(gè)新的APP工程

1)這個(gè)example工程是測(cè)試PS端MIO的輸入輸出的,由于LED是EMIO引出來(lái)的,EMIO的MIO號(hào)是從78開(kāi)始的,需要在文件中修改Output_pin為78,測(cè)試LED燈。

由于只測(cè)試LED燈,也就是輸出,我們把輸入功能注釋掉。保存文件。

2)編譯工程

3)Run AsLaunch on Hardware(Single Application Debug),下載結(jié)束后,即可看到PS_LED快速閃爍16次

4)雖然用官方的例子比較方便,但是它的代碼看起來(lái)比較臃腫,我們可以通過(guò)學(xué)習(xí)它的方法,自己簡(jiǎn)化寫(xiě)一遍。我們新建一個(gè)APP工程??梢栽诳瞻滋幱益INewApplication Project。在ps_led_test的helloworld.c中修改。其實(shí)程序步驟很簡(jiǎn)單,初始化GPIO設(shè)置方向輸出使能控制GPIO輸出值。

第一頁(yè)跳過(guò)

選擇硬件描述工程

填入工程名稱(chēng),并選擇相應(yīng)的CPU

下一步

模板選擇Hellow World即可

5)可以看到多了一個(gè)APP工程,仍然是基于名為standalone on psu_cortexa53_0的BSP,也就是一個(gè)Domain,與前面的example工程共用一個(gè)BSP

6)可以將例程的代碼復(fù)制到helloworld.c中,保存并Build Project

7)編譯并下載

即可看到LED1閃爍。
4.2 EMIO實(shí)現(xiàn)PL端按鍵中斷
前面介紹了EMIO作為輸出控制LED燈,這里講一下利用EMIO作為按鍵輸入控制LED燈。
1)通過(guò)ug1085文檔看下GPIO的結(jié)構(gòu)圖,中斷的寄存器:
INT_MASK:中斷掩碼
INT_DIS: 中斷關(guān)閉
INT_EN: 中斷使能
INT_TYPE: 中斷類(lèi)型,設(shè)置電平敏感還是邊沿敏感
INT_POLARITY: 中斷極性,設(shè)置低電平或下降沿還是高電平或上升沿
INT_ANY: 邊沿觸發(fā)方式,需要INT_TYPE設(shè)置為邊沿敏感才能使用
設(shè)置中斷產(chǎn)生方式時(shí)需要INT_TYPE、INT_POLARITY、INT_ANY配合使用。具體寄存器含義請(qǐng)參考ug1085部分。

2)本實(shí)驗(yàn)設(shè)計(jì)為按下按鍵LED燈亮,再按下LED滅。
主程序設(shè)計(jì)流程如下:
GPIO初始化設(shè)置按鍵和LED方向設(shè)置產(chǎn)生中斷方式設(shè)置中斷打開(kāi)中斷控制器打開(kāi)中斷異常打開(kāi)GPIO中斷判斷KEY_FLAG值,是1,寫(xiě)LED
中斷處理流程:
查詢(xún)中斷狀態(tài)寄存器判斷狀態(tài)清除中斷設(shè)置KEY_FLAG值
3)新建名為emio_key的工程,模板為hello world,拷貝例程的程序

4)定義PS按鍵編號(hào)為79,PS LED為78

5)在main函數(shù)中,設(shè)置LED和按鍵,將按鍵中斷類(lèi)型設(shè)置為上升沿產(chǎn)生中斷。在本實(shí)驗(yàn)中,即按鍵信號(hào)的上升沿產(chǎn)生中斷。

6)中斷控制器設(shè)置函數(shù)IntrInitFuntions是參考PS定時(shí)器中斷實(shí)驗(yàn)所做,而下面的語(yǔ)句是設(shè)置中斷優(yōu)先級(jí)和觸發(fā)方式。即操作ICDIPR和ICDICFR寄存器。

7)在中斷服務(wù)程序GpioHandler中,判斷中斷狀態(tài)寄存器,清除中斷,并將按鍵標(biāo)志置1。

8)在main函數(shù)中,判斷按鍵標(biāo)志key_flag,向LED寫(xiě)入數(shù)據(jù)。

9)編譯工程并下載程序,觀察實(shí)驗(yàn)現(xiàn)象,按下KEY1,就可以控制LED1燈亮滅。
5. 固化程序
前面介紹過(guò)沒(méi)有FPGA加載文件情況下如何生成固化程序(詳情參考“體驗(yàn)ARM,裸機(jī)輸出”Hello World”一章)。本章內(nèi)容生成了FPGA的加載文件,在這里演示一下如何生成固化程序。
與前面一樣,也是點(diǎn)擊system,右鍵Build Project即可


軟件會(huì)自動(dòng)添加三個(gè)文件,第一個(gè)引導(dǎo)程序fsbl.elf,第二個(gè)為FPGA的bitstream,第三個(gè)為應(yīng)用程序xx.elf,下載方法與前面一樣,不再贅述。
6. 引腳綁定常見(jiàn)錯(cuò)誤
1)在block design設(shè)計(jì)中,比如下圖,GPIO模塊的引腳名設(shè)置為了leds和keys,很多人想當(dāng)然的在XDC里按照這樣的名稱(chēng)綁定引腳。

如果打開(kāi)頂層文件就會(huì)發(fā)現(xiàn)引腳名稱(chēng)是不一樣的,一定要仔細(xì)檢查,以頂層文件里的引腳名稱(chēng)為準(zhǔn)。

否則就會(huì)出現(xiàn)以下引腳未綁定的錯(cuò)誤

2)如果是手寫(xiě)XDC文件,切記注意空格,這也是非常常見(jiàn)的錯(cuò)誤

7. 本章小節(jié)
本章進(jìn)一步學(xué)習(xí)了PS端的EMIO的使用,雖然將EMIO連接到了PL端的引腳上,但Vitis中的用法還是一樣的,從這個(gè)例子我們也可以看出,一旦與PL端發(fā)生了聯(lián)系,就需要生成bitstream,雖然幾乎沒(méi)有產(chǎn)生邏輯。
-
FPGA
+關(guān)注
關(guān)注
1660文章
22416瀏覽量
636596 -
按鍵
+關(guān)注
關(guān)注
4文章
229瀏覽量
58501 -
GPIO
+關(guān)注
關(guān)注
16文章
1329瀏覽量
56241 -
Zynq
+關(guān)注
關(guān)注
10文章
630瀏覽量
49468 -
MPSoC
+關(guān)注
關(guān)注
0文章
203瀏覽量
25180
發(fā)布評(píng)論請(qǐng)先 登錄
如何調(diào)試Zynq UltraScale+ MPSoC VCU DDR控制器
如何調(diào)試Zynq UltraScale+ MPSoC VCU DDR控制器
閑話(huà)Zynq UltraScale+ MPSoC(連載1)
閑話(huà)Zynq UltraScale+ MPSoC(連載5)
Xilinx基于ARM的Zynq-7000和Zynq UltraScale+ MPSoC及RFSoC器件是否存在安全漏洞
Zynq UltraScale+ MPSoC的發(fā)售消息
米爾科技Zynq UltraScale+ MPSoC技術(shù)參考手冊(cè)介紹
如何調(diào)試 Zynq UltraScale+ MPSoC VCU DDR 控制器?
米爾電子zynq ultrascale+ mpsoc底板外設(shè)資源清單分享
ZYNQ Ultrascale+ MPSoC系列FPGA芯片設(shè)計(jì)
Zynq UltraScale+ MPSoC中的隔離方法
Zynq UltraScale+ MPSoC的隔離設(shè)計(jì)示例
Zynq UltraScale+ MPSoC驗(yàn)證數(shù)據(jù)手冊(cè)
【ZYNQ Ultrascale+ MPSOC FPGA教程】第二十八章PS端EMIO的使用
評(píng)論