4、ZYNQ PS外設(shè)GPIO之MIO/EMIO
1、ZYNQ PS外設(shè)簡介
ZYNQ PS 中包含一組豐富的外設(shè),如 USB 控制器、 UART 控制器、 I2C 控制器以及 GPIO 等等,他們提供了各種工業(yè)標(biāo)準(zhǔn)的接口, 用于和外部設(shè)備進(jìn)行通信。
ZYNQ 分為 PS 和 PL 兩部分,那么器件的引腳( Pin)資源同樣也分成了兩部分。 ZYNQ PS 中的外設(shè)可以通過 MIO( Multiuse I/O,多用輸入/輸出)模塊連接到 PS 端的引腳上,也可以通過 EMIO 連接到 PL端的引腳。
PS MIO 一般會(huì)分配到固定的外設(shè), 包括 FLASH、 EMMC、 TFCARD、 UART、 USB2.0、 ETH 以太網(wǎng)等,也可以單獨(dú)配置成普通的 GPIO。 如果 IO 不夠用也可以通過 EMIO 擴(kuò)展更多 IO,對(duì)于 ZYNQ 最多支持?jǐn)U展 64 個(gè)EMIO。
ZYNQ PS 部分的 IO 包括 PS-MIO 和 PS-EMIO,PS-MIO 的 IO 位置是固定好的, 功能也是預(yù)先定義好了, 而 PS-EMIO 是通過把芯片內(nèi)部 PS 的 PS-EMIO 引線接到了 PL 部分的 FPGA Pin 腳上。
MIO分配在bank0和bank1直接與PS部分相連, EMIO分配在bank2和bank3 和PL部分相連。除了bank1是22-bit之外,其他的 bank 都是 32-bit。所以 MIO 有 54 個(gè)引腳可供我們使用,而 EMIO 有 64 個(gè)引腳可供我們使用。使用 EMIO 的好處就是,當(dāng) MIO 不夠用時(shí), PS 可以通過驅(qū)動(dòng) EMIO 控制 PL 部分的引腳。
Zynq7000 系列芯片有 54 個(gè) MIO(multiuse I/O),個(gè)別芯片如 7z007s 只有 32 個(gè),它們分配在 GPIO 的 Bank0 和 Bank1 隸屬于 PS 部分,這些IO 與 PS 直接相連,不需要添加引腳約束。
MIO 信號(hào)對(duì) PL 部分是透明的,不可見,所以對(duì) MIO 的操作可以看作是純PS 的操作。
在實(shí)際的應(yīng)用中 PS-MIO 主要滿足必要常用的外設(shè) IO 需求, 比如串口、 SDIO、 以太網(wǎng)等, 而 PS-EMIO 按需配置, 用多少, 配置多少。
PS 的 54 個(gè) MIO 與 PS 直接相連。 不需要添加 FPGA 的引腳約束, 對(duì)于 EMIO 是通過 FPGA 的 IO 擴(kuò)展的, 除了需要對(duì) PS 的 ZYNQ IP 設(shè)置, 還需要綁定到 FPGA 的引腳, 所以需要對(duì) EMIO 做 IO 引腳約束。
2、ZYNQ PS外設(shè)GPIO
GPIO 是英文“general purpose I/O”的縮寫,即通用的輸入/輸出。它是 ZYNQ PS 中的一個(gè)外設(shè),用于觀測和控制器件引腳的狀態(tài)。
GPIO 外設(shè)一般用于控制一些簡單的外設(shè),如LED 和蜂鳴器,此時(shí) GPIO 用作輸出;也可以用于觀測一些簡單外設(shè)的狀態(tài),如按鍵,此時(shí) GPIO 用作輸入。
下圖是GPIO 的框圖,從中我們可以看到 GPIO 分為 4 個(gè) Bank,其中 Bank0和 Bank1 連接到 MIO;而 Bank2 和 Bank3 連接到 EMIO。

除 Bank1 之外的 Bank 都具有 32bit, Bank1 只具有 22bit 是因?yàn)榭偣仓挥?54 個(gè) MIO,其中 32bit 的 Bank0控制了 MIO[0~31],剩下的 MIO[31~53]就由 22bit 的 Bank1 控制。 Bank2 和 Bank3 用于控制擴(kuò)展的 MIO 即EMIO,也就是說總共可以有 32+32=64 個(gè) EMIO。
GPIO 的控制和狀態(tài)寄存器基地址為: 0xE000_A000, SDK 軟件底層操作是對(duì)于內(nèi)存地址空間的操作。
EMIO 的使用和 MIO 的使用其實(shí)是非常相似的。區(qū)別在于, EMIO 的使用相當(dāng)于 PS + PL 的結(jié)合使用。所以, EMIO 需要分配引腳,以及編譯綜合生成 bit 文件。
在大多數(shù)情況下, PS 端經(jīng)由 EMIO 引出的接口會(huì)直接連接到 PL 端的器件引腳上, 通過 IO 管腳約束來指定所連接 PL 引腳的位置。 通過這種方式, EMIO 可以為 PS 端實(shí)現(xiàn)額外的 64 個(gè)輸入引腳或 64 個(gè)帶有輸出使能的輸出引腳。 EMIO 還有一種使用方式,就是用于連接 PL 內(nèi)實(shí)現(xiàn)的功能模塊( IP 核) , 此時(shí) PL 端的 IP 作為 PS 端的一個(gè)外部設(shè)備。 如圖 3.1.2 所示:


PS-MIO:
Bank0:MIO[31:0] GPIO PIN 腳號(hào): MIO31~MIO0
Bank1:MIO[53:32] GPIO PIN 腳號(hào): MIO53~MIO32
PS-EMIO:
Bank2:EMIO[ 0:31] 可以分配到任意的 FPGA IO
Bank3:EMIO[32:63] 可以分配到任意的 FPGA IO
所以 PS-MIO 和 EMIO 最多 118 個(gè) IO 可用
Bank0:MIO [31:0] GPIO PIN 腳號(hào): 0~31
Bank1:MIO[32:53] GPIO PIN 腳號(hào): 32~53
Bank2:EMIO [31 : 0] GPIO PIN 腳號(hào): 54~85
Bank3:EMIO [63:32] GPIO PIN 腳號(hào): 86~ 117
PS 所有的外設(shè)都可以通過 MIO 訪問,這些外設(shè)也是與 MIO 進(jìn)行連接,每個(gè) MIO 雖然可以獨(dú)立控制,以及獨(dú)立驅(qū)動(dòng)單個(gè)引腳的外設(shè),但對(duì)于 QSPI、 USB、以太網(wǎng)等這些外設(shè),其于 MIO 的連接有著特殊的要求,如圖 2.1.2 所示,(圖中灰色框表示在 CLG225 封裝的芯片中不可用)對(duì)于以太網(wǎng)而言,其只能與 MIO16~27和 MIO28~39 引腳連接,而且以太網(wǎng)與 MIO28 連接的引腳只能作為以太網(wǎng)的 tx_clk 使用,可見當(dāng)其作為以太網(wǎng)的接口引腳時(shí),相應(yīng)的 MIO 的功能就已經(jīng)確定下來了。 MIO 還有一特點(diǎn),如 MIO28~39 引腳即可以與以太網(wǎng)進(jìn)行連接,也可以作為 USB 以及其它外設(shè)的接口引腳,所以當(dāng)我們?cè)O(shè)計(jì) PS 的外設(shè)時(shí)要合理分配 MIO。從圖 2.1.2 MIO 一覽表中我們可以看到 MIO 一但選定,引腳位置就已經(jīng)確定下來了,不需要添加引腳約束。

通過圖 2.1.2 我們了解到了 MIO 與外設(shè)的連接情況,例如當(dāng)我們想要兩個(gè) MIO 作為 UART 的接口時(shí),可以使用 MIO8、 9 或者 MIO10、 11 等引腳,如果選用 MIO8、 9 作為 UART 的接口, MIO8 就是 UART 的tx 引腳, MIO9 為 rx 引腳。那么 MIO 與 PS 是怎么連接的呢?
圖 2.1.3 展示了 MIO 與 PS 的連接。 MIO 的 PS 外設(shè)的大多數(shù) I/O 信號(hào)( USB 除外)可以通過 MIO 路由到 PS 引腳,或通過 EMIO 路由到 PL 引腳。除千兆以太網(wǎng)外,大多數(shù)外設(shè)還在 MIO 和 EMIO 之間保持相同的協(xié)議。千兆以太網(wǎng)為減少引腳數(shù),使用 4 位的 RGMII 接口以 250 MHz 數(shù)據(jù)速率( 125 MHz 時(shí)鐘,雙倍數(shù)據(jù)速率)通過 MIO。如果接到 EMIO,就使用一個(gè)以 125 MHz 數(shù)據(jù)速率運(yùn)行的 8 位 GMII 接口。需要注意的是 Quad-SPI、 USB 和 SMC 接口不適用于 PL 的 EMIO 接口。

這里我們重點(diǎn)介紹圖 2.1.3 I/O 外設(shè)系統(tǒng)圖中箭頭所指的部分。從該圖中我們可以看到 PS 通過 APB 總線對(duì)控制、狀態(tài)寄存器的讀寫實(shí)現(xiàn)對(duì) GPIO 的驅(qū)動(dòng),具體可以參見下圖。

圖左邊的一列是寄存器,上半部分是關(guān)于中斷的,這部分我們?cè)谏婕暗街袛嗟臅r(shí)候會(huì)講解,這里我們重點(diǎn)介紹下紅色框圈出的下半部分。
DATA_RO 是數(shù)據(jù)只讀寄存器,通過該寄存器能夠觀察器件引腳上的值。如果 GPIO 信號(hào)配置為輸出,則通常會(huì)反映輸出上驅(qū)動(dòng)的值,寫入此寄存器將被忽略。
DATA 是數(shù)據(jù)寄存器,該寄存器控制 GPIO 信號(hào)配置為輸出時(shí)要輸出的值。該寄存器的所有 32 位都是一次寫入的。讀取該寄存器返回寫入 DATA 或 MASK_DATA_ {LSW, MSW}的先前值,它不會(huì)返回器件引腳上的當(dāng)前值。
MASK_DATA_LSW 和 MASK_DATA_MSW 是數(shù)據(jù)掩碼寄存器,該寄存器使軟件能夠有選擇地一次更改所需的的輸出值??梢詫懭胱疃?16 位的任意組合, MASK_DATA_LSW 控制 Bank 的低 16 位,MASK_DATA_MSW 控制高 16 位。未寫入的那些位保持不變并保持其先前的值。讀取該寄存器返回寫入DATA 或 MASK_DATA_ {LSW, MSW}的先前值;它不會(huì)返回器件引腳上的當(dāng)前值。該寄存器避免了對(duì)未更改位的讀-修改-寫序列的需要。
DIRM 是方向模式寄存器,用于控制 I/O 引腳是用作輸入還是輸出。當(dāng) DIRM [x] == 0 時(shí),輸出驅(qū)動(dòng)器被禁用,該引腳作為輸入引腳使用。
OEN 是使能輸出寄存器。將 I/O 配置為輸出時(shí),該寄存器控制是否啟用輸出。禁用輸出時(shí),引腳為 3態(tài)。當(dāng) OEN [x] == 0 時(shí),輸出被禁用。
從這些寄存器中我們可以看到,如果配置引腳為輸出,不僅需要設(shè)置方向,還要使能輸出。關(guān)于這些寄存器的具體介紹,可參考 ug585 手冊(cè)的 Appx.B:Register Details 中的 General Purpose I/O (gpio)一節(jié)。需要說明的是我們?cè)诔绦蛑胁僮?MIO 時(shí)直接調(diào)用 Xilinx 官方提供的函數(shù)即可,無需直接操作這些寄存器。
另外需要說明的是 MIO 信號(hào)對(duì) PL 部分是透明的,所以對(duì) MIO 的操作是純 PS 的操作,且每個(gè) GPIO都可獨(dú)立動(dòng)態(tài)編程為輸入、輸出或中斷檢測,此處需要注意的是 MIO7 和 8 只能做為輸出 IO 使用。

浙公網(wǎng)安備 33010602011771號(hào)