第七章 ZYNQ-MIZ701 GPIO使用之EMIO


7.0難度系數★☆☆☆☆☆☆

7.1硬件截圖

7.1.1 PCB上的位置

wps10B8.tmp

7.1.1 PCB上的位置

wps10B9.tmp

7.2電路分析

wps10CA.tmp

本次實驗用到的是LD_A0~LD_A3,管腳定義如下表所示。

LD_A0:F17

LD_A1:J15

LD_A2:G14

LD_A3:D18

7.3 EMIO 和MIO的對比介紹

上次講到MIO的使用,初步熟悉了EDK的使用,這次就來說說EMIO的使用。如你所見zynq的GPIO,分為兩種,MIO(multiuse I/O)和EMIO(extendable multiuse I/O)

wps10CB.tmp

MIO分配在bank0和bank1直接與PS部分相連,EMIO分配在bank2和接和PL部分相連。除了bank1是22-bit之外,其他的bank都是32-bit。所以MIO有53個引腳可供我們使用,而EMIO有64個引腳可供我們使用。

使用EMIO的好處就,當MIO不夠用時,PS可以通過驅動EMIO控制PL部分的引腳,接下來就來詳細介紹下EMIO的使用。

EMIO的使用和MIO的使用其實是非常相似的。區別在於,EMIO的使用相當於,是一個PS + PL的結合使用的例子。所以,EMIO需要分配引腳,以及編譯綜合生成bit文件。

7.4 ZYNQ核的添加及配置

Step1:新建一個名為為Miz701_sys的工程

wps10CC.tmp

Step2:選擇RTL Project 勾選Do not specify source at this time

wps10CD.tmp

Step3:選擇芯片型號xc7z010clg400-1

wps10DE.tmp

Step4:單擊Finish

wps10DF.tmp

7.5使用IP Integrator創建硬件系統

Step1:單擊Create Block Design

Step2:輸入system

wps10E0.tmp

Step3:單擊下圖中wps10E1.tmp添加IP按鈕

wps10E2.tmp

Step4:搜素單詞z選擇ZYNQ7 Processing System,然后雙擊

wps10F2.tmp

Step5:添加進來了ZYNQ CPU IP,雙擊ZYNQ CPU IP。

wps10F3.tmp

Step6: 修改時鍾輸入為50MHZ,可以看到ARM時鍾為650MHZ DDR為525MHZ(1050MHZ),並且修改FCLK_CLK0 為100MHZ

wps10F4.tmp

step7:修改內存型號為MT41K256M16RE-125 M,單擊OK。

wps10F5.tmp

Setp8:選擇MIO Configuration選項卡,再看到I/O Peripherals 中的GPIO一欄,勾選上其中的EMIO一欄,並選擇4位引腳輸出(最多可以選擇64位,但是這個使用只需要4位足夠了)。

wps1106.tmp

Setp10:按照上圖設置好了之后,點擊OK,仔細觀察發現的zynq核心多出一組引腳名為GPIO_0,這個正是我們剛剛設置的一組EMIO,我們右擊該引腳,選擇make external把GPIO_0引腳引出(或者單擊該引腳處,按快捷鍵Ctrl +t,也可以將引腳引出)。效果如下圖所示:

wps1107.tmp

step11::單擊Run Block Automation 進行自動連線,VIVADO軟件會根據信號的命名規則智能連線。

wps1108.tmp

Step12:在你點擊了OK后,你會發現DDR以及FICED_IO自動的延伸出來,然后把時鍾FCLK_CLK0和M_AXI_GPI0_ACLK連接,其實就是給M_AXI_GP0_ACLK提供一個時鍾。方法:當把鼠標靠近的時候會自動連接。

wps1109.tmp

7.6產生HDL和約束文件

Setp1:接下來依然是,右鍵單擊Block文件,文件選擇Generate the Output Products,是文件得到一定的約束

wps1119.tmp

Setp2:彈出如下對話框,直接點擊Generate

wps111A.tmp

Setp3:繼續右鍵單擊Block文件,選擇Create a HDL wrapper,根據Block文件內容產生一個HDL 的頂層文件:

wps111B.tmp

Setp4:並選擇讓vivado自動完成

wps111C.tmp

Setp5:這里我們看到,Vivado給我創建了這樣的頂層文件,其中的gpio_0_tri_io就是我們配置的EMIO

wps112D.tmp

7.7 EMIO的管腳約束修改

我們發現,之前引出的EMIO叫做GPIO_0,到了頂層他的名字gpio_0_tri_io,而不是GPIO_0。所以分配引腳的時候就要注意了名字別錯了,創建一個約束文件,分配引腳如下:

set_property PACKAGE_PIN  F17  [get_ports {gpio_0_tri_io[0]}]

set_property IOSTANDARD LVCMOS33 [get_ports {gpio_0_tri_io[0]}]

set_property PACKAGE_PIN  J15  [get_ports {gpio_0_tri_io[1]}]

set_property IOSTANDARD LVCMOS33 [get_ports {gpio_0_tri_io[1]}]

set_property PACKAGE_PIN  G14  [get_ports {gpio_0_tri_io[2]}]

set_property IOSTANDARD LVCMOS33 [get_ports {gpio_0_tri_io[2]}]

set_property PACKAGE_PIN  D18  [get_ports {gpio_0_tri_io[3]}]

set_property IOSTANDARD LVCMOS33 [get_ports {gpio_0_tri_io[3]}]

7.8 產生bit文件

此時可以,開始生成bit文件了:

wps112E.tmp

7.9 導出bit文件

編譯成功之后,依然是導出硬件:

wps112F.tmp

7.10加載到SDK

打開SDK,然后新建一個工程,以及添加一個main.C文件,具體過程參考前面章節。

添加程序如下:

#include <stdio.h>

#include "xgpiops.h"

#include "sleep.h"

int main()

{

static XGpioPs psGpioInstancePtr;

XGpioPs_Config* GpioConfigPtr;

int iPinNumber= 54; //想想為什么是54

u32 uPinDirection = 0x1; //1表示輸出,0表示輸入

int xStatus;

//--MIO的初始化

    GpioConfigPtr = XGpioPs_LookupConfig(XPAR_PS7_GPIO_0_DEVICE_ID);

if(GpioConfigPtr == NULL)

return XST_FAILURE;

xStatus = XGpioPs_CfgInitialize(&psGpioInstancePtr,GpioConfigPtr, GpioConfigPtr->BaseAddr);

if(XST_SUCCESS != xStatus)

print(" PS GPIO INIT FAILED \n\r");

//--MIO的輸入輸出操作

     XGpioPs_SetDirectionPin(&psGpioInstancePtr, iPinNumber,uPinDirection);//配置IO輸出方向

XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, iPinNumber,1);//配置IO的輸出

while(1)

{

XGpioPs_WritePin(&psGpioInstancePtr, iPinNumber, 1);//輸出1

sleep(1);//延時

XGpioPs_WritePin(&psGpioInstancePtr, iPinNumber, 0);//輸出0

sleep(1);//延時

}

    return 0;

}

我們發現,驅動EMIO和MIO基本是一模一樣的,唯一不同的地方就是iPinNumber此時的數字是54,上一節中是7。

再次看到這張圖:

wps1130.tmp

應為MIO和EMIO是同一編號的MIO共54個,從0~53。而從54開始就開始是EMIO了的范圍了。之前我們應出了8個引腳gpio_0_tri_io[0]~gpio_0_tri_io[7],他們其實就依次對應54~61這幾個序號,同時也對應了我們開發板上的8個LED(這是引腳約束的結果)。

你可以把iPinNumber的值從54換成55試試,看看實驗結果有什么不同。

Ctrl + B編譯通過后(軟件默認設置是自動編譯,即修改了源代碼保存后就自動編譯)

7.11 SDK環境下載bit文件

連接下載器,通過SDK先下載bit文件到開發板:

wps1141.tmp

wps1142.tmp

7.12 SDK下啟動調試

然后,直接調試,就能看到你的EMIO控制的LED開始閃爍了。

wps1143.tmp

7.13 實驗效果

可以看到LD0一閃一閃

wps1144.tmp

7.14 本章小結

通過本章的學習,我們掌握了在MIO不夠使用的情況下,通過PL部分擴展EMIO增加IO的使用量。並且通過一個簡單的例子演示了如果添加EMIO IP 並且啟動SDK 通過JTAG下載調試的方法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM