【ZYNQ Ultrascale+ MPSOC FPGA教程】第二十八章 PS端EMIO的使用

原創聲明:

本原創教程由芯驛電子科技(上海)有限公司(ALINX)創做,版權歸本公司全部,如需轉載,需受權並註明出處。node

適用於板卡型號:

AXU2CGA/AXU2CGB/AXU3EG/AXU4EV-E/AXU4EV-P/AXU5EV-E/AXU5EV-P /AXU9EG/AXU15EG函數

 

實驗Vivado工程目錄爲「ps_emio/vivado」。學習

實驗vitis工程目錄爲「ps_emio/vitis」。測試

若是想用PS點亮PL的LED燈,該如何作呢?一是能夠經過EMIO控制PL端LED燈,二是經過AXI GPIO的IP實現控制。本章介紹如何使用EMIO控制PL端LED燈的亮滅。同時也介紹了,利用EMIO鏈接PL端按鍵控制PL端LED燈。ui

1. 原理介紹

先來了解GPIO的BANK分佈,從圖中可知BANK0~BANK2的MIO有78個。BANK3~BANK5的EMIO有96個,本章就是採用EMIO控制PL端LED。設計

FPGA工程師工做內容3d

如下爲FPGA工程師負責內容。orm

2. Vivado工程創建

1)以ps_hello工程爲基礎,另存爲一個名爲ps_emio的工程,打開ZYNQ配置,把GPIO EMIO勾選上。利用PL端的1個LED,1個按鍵,在MIO配置中選擇EMIO的位寬爲2位,配置結束,點擊OK。blog

2)點擊多出的GPIO_0端口右鍵選擇Make External,將端口信號導出教程

3)點擊引腳並修改引腳名稱爲emio,也能夠根據本身需求修更名稱。保存設計。

4)點擊xx.bd右鍵選擇Generate Output Products,從新生成輸出文件

5)結束後,頂層文件會更新出新的管腳,下面須要對其進行引腳綁定

3. XDC文件約束PL管腳

1)新建XDC文件,綁定PL端引腳

設置文件名稱爲emio

2)emio.xdc添加一下內容,端口名稱必定要和頂層文件端口一致

##################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)雖說沒有用到PL端的邏輯,可是用到了PL端的引腳,所以導出硬件要選擇「Include bitstream」

軟件工程師工做內容

如下爲軟件工程師負責內容。

4. Vitis程序編寫

4.1 EMIO點亮PL端LED燈

下圖爲GPIO的控制框圖,實驗中會用到輸出部分的寄存器,數據寄存器DATA,數據掩碼寄存器MASK_DATA_LSW,MASK_DATA_MSW,方向控制寄存器DIRM,輸出使能控制器OEN。

一開始編寫代碼可能會無從下手,咱們能夠導入Xilinx提供的example工程,在BSP裏找到psu_gpio_0,點擊Import Examples

 

在彈出窗口選擇「xgpiops_polled_example」,點擊OK

會出現一個新的APP工程

1)這個example工程是測試PS端MIO的輸入輸出的,因爲LED是EMIO引出來的,EMIO的MIO號是從78開始的,須要在文件中修改Output_pin爲78,測試LED燈。

因爲只測試LED燈,也就是輸出,咱們把輸入功能註釋掉。保存文件。

2)編譯工程

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

4)雖然用官方的例子比較方便,可是它的代碼看起來比較臃腫,咱們能夠經過學習它的方法,本身簡化寫一遍。咱們新建一個APP工程。能夠在空白處右鍵NewApplication Project。在ps_led_test的helloworld.c中修改。其實程序步驟很簡單,初始化GPIO設置方向輸出使能控制GPIO輸出值。

第一頁跳過

選擇硬件描述工程

填入工程名稱,並選擇相應的CPU

下一步

模板選擇Hellow World便可

5)能夠看到多了一個APP工程,仍然是基於名爲standalone on psu_cortexa53_0的BSP,也就是一個Domain,與前面的example工程共用一個BSP

6)能夠將例程的代碼複製到helloworld.c中,保存並Build Project

7)編譯並下載

便可看到LED1閃爍。

4.2 EMIO實現PL端按鍵中斷

前面介紹了EMIO做爲輸出控制LED燈,這裏講一下利用EMIO做爲按鍵輸入控制LED燈。

1)經過ug1085文檔看下GPIO的結構圖,中斷的寄存器:

INT_MASK:中斷掩碼

INT_DIS: 中斷關閉

INT_EN: 中斷使能

INT_TYPE: 中斷類型,設置電平敏感仍是邊沿敏感

INT_POLARITY: 中斷極性,設置低電平或降低沿仍是高電平或上升沿

INT_ANY: 邊沿觸發方式,須要INT_TYPE設置爲邊沿敏感才能使用

設置中斷產生方式時須要INT_TYPE、INT_POLARITY、INT_ANY配合使用。具體寄存器含義請參考ug1085部分。

2)本實驗設計爲按下按鍵LED燈亮,再按下LED滅。

主程序設計流程以下:

GPIO初始化設置按鍵和LED方向設置產生中斷方式設置中斷打開中斷控制器打開中斷異常打開GPIO中斷判斷KEY_FLAG值,是1,寫LED

中斷處理流程:

查詢中斷狀態寄存器判斷狀態清除中斷設置KEY_FLAG值

3)新建名爲emio_key的工程,模板爲hello world,拷貝例程的程序

4)定義PS按鍵編號爲79,PS LED爲78

5)在main函數中,設置LED和按鍵,將按鍵中斷類型設置爲上升沿產生中斷。在本實驗中,即按鍵信號的上升沿產生中斷。

6)中斷控制器設置函數IntrInitFuntions是參考PS定時器中斷實驗所作,而下面的語句是設置中斷優先級和觸發方式。即操做ICDIPR和ICDICFR寄存器。

7)在中斷服務程序GpioHandler中,判斷中斷狀態寄存器,清除中斷,並將按鍵標誌置1。

8)在main函數中,判斷按鍵標誌key_flag,向LED寫入數據。

9)編譯工程並下載程序,觀察實驗現象,按下KEY1,就能夠控制LED1燈亮滅。

5. 固化程序

前面介紹過沒有FPGA加載文件狀況下如何生成固化程序(詳情參考「體驗ARM,裸機輸出」Hello World」一章)。本章內容生成了FPGA的加載文件,在這裏演示一下如何生成固化程序。

與前面同樣,也是點擊system,右鍵Build Project便可

軟件會自動添加三個文件,第一個引導程序fsbl.elf,第二個爲FPGA的bitstream,第三個爲應用程序xx.elf,下載方法與前面同樣,再也不贅述。

6. 引腳綁定常見錯誤

1)在block design設計中,好比下圖,GPIO模塊的引腳名設置爲了leds和keys,不少人想固然的在XDC裏按照這樣的名稱綁定引腳。

若是打開頂層文件就會發現引腳名稱是不同的,必定要仔細檢查,以頂層文件裏的引腳名稱爲準。

不然就會出現如下引腳未綁定的錯誤

2)若是是手寫XDC文件,切記注意空格,這也是很是常見的錯誤

7. 本章小節

本章進一步學習了PS端的EMIO的使用,雖然將EMIO鏈接到了PL端的引腳上,但Vitis中的用法仍是同樣的,從這個例子咱們也能夠看出,一旦與PL端發生了聯繫,就須要生成bitstream,雖然幾乎沒有產生邏輯。

相關文章
相關標籤/搜索