ZYNQ 7020 之所以强大,在于它把ARM Cortex-A9处理器系统(PS)和FPGA逻辑(PL)集成在一个芯片里。而连接PS与外部世界的,就是MIO 、EMIO、GPIO。很多初学者分不清它们的区别,今天这篇文章就用最直白的方式讲清楚。
1 概述
如下图所示,
MIO:PS直接自带的硬件引脚,不占用PL资源,固定54根。
EMIO:PS通过PL"延伸"出来的虚拟引脚,占用PL的IO资源,最多可以扩展64根。

表现在FPGA上,如下图所示,UART0,当我们选择MIO接口时,在PL端是看不到的,因为它直接走PS端;但是当我们选择EMIO时,我们就可以在ZYNQ7 Processing System ip核看到UART_0端口,提示我们需要将此连接到PL端的引脚上。


2 外设接口和选择
如下图所示,ZYNQ上有很多外设接口,有的外设是可以自主选择MIO还是EMIO的,但并非所有的外设接口都是可以选择的。

2.1 MIO:PS的原装外设接口
ZYNQ 7020的PS集成了一堆常用外设控制器:UART、I2C、SPI、CAN、SDIO、以太网MAC、USB等。这些控制器的物理引脚 通常可以路由到MIO上。MIO一共有54个,分成Bank0(32位)和Bank1(22位)。
优点:
-
不消耗任何PL逻辑资源(LUT、FF、BRAM等全都不用)。
-
布线固定,信号质量好,可靠性高。
-
不需要配置FPGA,仅靠ARM程序就能跑。
局限性:
-
只有54个,而且很多外设会占用多个MIO(比如以太网需要十几根)。
-
功能固定:只能作为PS外设的专用引脚,不能随意自定义。
实际用法:把常用的高速或标准接口(UART调试口、以太网、SD卡)优先挂在MIO上。
2.2 EMIO:PS的扩展外设接口
当MIO不够用,或者你想把PS的某个外设信号引到PL去加工一下再输出时,就要用EMIO。
EMIO是PS内部的一根"虚拟导线",一端连着PS的外设控制器(比如UART的TX/RX),另一端却不是直接到芯片引脚 ,而是连接到PL内部的逻辑。你可以:
-
在PL中把这些信号直接连到PL的IO引脚上(充当扩展IO)。
-
也可以在中间加反相器、滤波、边沿检测等逻辑,再输出。
配置步骤:
-
在Vivado的ZYNQ IP核配置界面中,勾选想要引出的外设(比如UART1)的"EMIO"选项。
-
将EMIO信号从ZYNQ IP核引出,连接到顶层模块的端口。
-
添加XDC约束,分配PL引脚位置。
-
生成bit文件,烧写到FPGA。
-
在Vitis中编写PS代码(操作UART时,仍然使用标准驱动)。
注意 :EMIO作为GPIO使用时,引脚编号从54开始,对应Bank2和Bank3(各32位)。编程方法与MIO完全一样(调用XGpioPs_WritePin等函数),但必须先烧写bit文件。
2.3 GPIO
除了MIO和EMIO,ZYNQ还有一种扩展IO的方式:在PL里例化AXI GPIO IP核,通过AXI总线与PS通信。
| 对比项 | MIO | EMIO | AXI GPIO |
|---|---|---|---|
| 资源占用 | 无 | 仅IOB | LUT+FF+IOB |
| 延迟 | 最低 | 较低 | 较高(总线访问延迟) |
| 灵活性 | 固定 | 可加工 | 完全自定义 |
| 适用场景 | 标准外设 | 扩展GPIO、信号调理 | 大量数据交互、自定义外设 |
建议:
-
能用MIO先用MIO。
-
MIO不够、且只是简单扩展IO或信号整形,用EMIO。
-
需要PS直接访问PL侧大量寄存器或自定义外设,用AXI GPIO。
3 总结
-
MIO是PS的原生引脚,固定、可靠、省资源,优先用它接标准外设。
-
EMIO是PS经过PL延伸出来的虚拟引脚,灵活、可加工、扩展数量多,适合在MIO不够或需要信号处理时使用。
-
AXI GPIO是PL实现的全逻辑GPIO,资源消耗最大,但最灵活,适合PS与PL深度交互的场景。
理解了这三者的区别,你就能在ZYNQ设计中做到既省资源又省调试。