ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Zynq GPIO三大类型:MIO、EMIO与AXI GPIO核心区别与实战选型

2026/9/12 8:01:40 拓冰建站 浏览量
Zynq GPIO三大类型:MIO、EMIO与AXI GPIO核心区别与实战选型 1. 为什么Zynq的GPIO、MIO和EMIO必须掰开揉碎讲清楚在Zynq-7000系列SoC的实际项目里我见过太多人栽在GPIO配置上——明明硬件连的是PS端的Bank0代码却往PL端的EMIO地址写烧录完boot.bin后LED不亮查了一整天发现MIO引脚复用功能没关掉SPI控制器用PetaLinux生成设备树时把emio-gpio误配成mio-gpio结果Linux下/dev/gpiochip0根本不存在。这些不是玄学而是Zynq架构里最基础却最容易被忽略的“引脚路由”逻辑。核心关键词zynq、GPIO、MIO、EMIO、ug585其实指向一个本质问题Zynq不是“单片机FPGA”的简单拼接而是一个深度耦合的异构系统。它的GPIO不是传统意义上的“通用IO”而是分属三个物理层级、四种配置路径的信号通道。UG585手册第23章标题就叫《I/O Planning and Configuration》但很多人直接跳到第27章看寄存器定义结果连引脚从哪来都没搞清。具体来说Zynq的GPIO能力由三部分构成PS端原生GPIOMIO7个固定BankBank0-Bank6共54个引脚直连ARM处理器无需PL逻辑参与延迟最低1ns但数量固定且不可扩展PS通过PL扩展的GPIOEMIO通过AXI GPIO IP核或PL内部逻辑映射到PS端数量理论上无上限受限于PL资源但路径经过PL布线延迟增加典型值10~20ns且需额外配置中断路由PL独立GPIOAXI GPIO完全在PL侧实现通过AXI总线与PS通信适合高速并行接口或复杂时序控制但需编写驱动或使用Xilinx提供的driver。这三者在硬件设计、软件配置、时序约束、中断处理上全都不兼容。比如MIO的中断号是硬编码的IRQ_ID54对应MIO[0]而EMIO中断必须经PL的IRQ_F2P信号接入PS再在设备树里声明interrupt-parent。网上搜“zynq gpio 8种工作模式”实际只有MIO支持全部8种输入/输出/三态/上拉/下拉/保持/慢速/快速EMIO仅支持基本输入输出AXI GPIO则依赖IP核配置。适合谁看如果你正在做Zynq最小系统启动验证、用PetaLinux构建嵌入式Linux、调试摄像头MIPI接口电平匹配、或者给工业PLC加数字量IO模块——那你必须吃透这三者的边界。新手常以为“都是GPIO改个地址就行”结果在Vivado里勾选了EMIO却没在Block Design里连AXI GP接口在SDK里初始化FSBL时PS就卡死老手则会根据实时性要求做严格分区按键检测用MIO传感器数据流用EMIO电机PWM用PL AXI GPIO。我做过一个Zynq-7020的医疗设备项目要求按钮响应延迟5ms温湿度传感器每秒采样10次同时驱动4路步进电机。最终方案是3个物理按键走MIO保证亚毫秒响应BME280 I2C走EMIO复用PS的I2C控制器避免PL资源浪费电机驱动用PL侧AXI GPIOPWM IP核精确控制占空比。这个决策不是凭感觉而是基于UG585 Table 23-1的电气特性对比——MIO Bank0的VCCO1.8VEMIO走PL Bank34的VCCO3.3V而AXI GPIO可自由配置Bank电压。如果强行把电机使能信号接到MIO就得额外加电平转换芯片成本上升23%。2. MIO与EMIO的本质区别不只是“多几个引脚”那么简单2.1 物理层差异从晶圆级设计看引脚归属Zynq-7000的PSProcessing System模块在芯片内部是独立的硬核其I/O Pad直接连接到封装引脚。MIOMultiplexed I/O就是这些Pad的统称它们被固化分配到7个Bank中Bank引脚范围VCCO电压典型用途关键限制Bank0MIO[0:15]1.8VSDIO/USB/UART仅支持1.8V不可配置Bank1MIO[16:27]2.5V/3.3VQSPI/GPIO需在Vivado中设置I/O StandardBank2MIO[28:39]1.8VEthernet与GMII信号复用启用ETH则MIO[28:39]不可用Bank3MIO[40:53]3.3VCAN/I2C/SPII2C0专用引脚若启用I2C0则MIO[40:41]锁定而EMIOExtended MIO根本不是物理引脚它是PS通过专用AXI接口AXI_GPIO向PL申请的“虚拟GPIO”。在Vivado Block Design中你添加AXI GPIO IP核将其S_AXI接口连到PS的GP Master端口再将IP核的GPIO接口引出到PL顶层。此时PL综合布线工具会自动分配可用的PL I/O Bank如Bank34/Bank35给这些信号VCCO电压由你选择的Bank决定——这正是EMIO能支持3.3V/2.5V/1.8V的关键。提示UG585第23.2节明确指出“EMIO signals are routed through the PL fabric and do not connect directly to package pins”。这意味着EMIO的电气特性完全取决于PL Bank配置而非PS Bank。例如Zynq-7020的PL Bank34支持3.3V但若你错误地将EMIO连接到Bank13仅支持1.5VVivado综合会报错“IO standard LVCMOS15 is not supported for this bank”。2.2 配置机制差异寄存器访问 vs 地址映射MIO的配置通过PS端专用寄存器完成地址空间固定在0xF8000000起始的SFRSystem Level Control Registers区域。以MIO[0]为例其方向控制位在GPIO_DIRM寄存器0xF8000204的bit0输出电平在GPIO_OUTEN寄存器0xF8000208的bit0。这些寄存器在FSBLFirst Stage Boot Loader阶段就被初始化Linux内核启动前已生效。EMIO则完全不同。它没有专属寄存器所有操作都通过AXI总线访问AXI GPIO IP核的寄存器。假设你在Vivado中将AXI GPIO Base Address设为0x4120_0000则方向寄存器地址 0x4120_0000 0x0004输出数据寄存器地址 0x4120_0000 0x0000中断状态寄存器地址 0x4120_0000 0x001C这个地址由Vivado自动生成并写入system.hdfPetaLinux编译时会据此生成设备树节点。关键点在于EMIO的配置依赖PL逻辑是否成功加载。如果bitstream没烧写或AXI GPIO IP核未使能读取0x4120_0000会返回全0Linux驱动会报错“axi_gpio f8003000.axi_gpio: failed to get irq”。2.3 中断处理差异硬连线 vs 软路由MIO中断是PS硬核内置的每个MIO引脚对应唯一IRQ IDMIO[0] → IRQ_ID54MIO[1] → IRQ_ID55...MIO[15] → IRQ_ID69在Linux设备树中只需声明gpio0 { interrupts 0 54 4; // GIC SPI, IRQ_ID54, trigger type4 (rising edge) };EMIO中断则必须经过PL的中断控制器如AXI Interrupt Controller IP核路由。典型流程是EMIO信号 → AXI Interrupt Controller → IRQ_F2P[0] → PS端GIC。设备树需声明两级中断axi_intc_0 { interrupt-parent gic; interrupts 0 89 4; // GIC SPI, IRQ_ID89 for F2P[0] }; gpio_emio { interrupt-parent axi_intc_0; interrupts 0 0 4; // AXI INTC line 0, rising edge };我曾遇到一个案例客户用EMIO接红外接收头要求10us级脉宽识别。结果发现Linux中断延迟波动达200us查到最后是AXI Interrupt Controller的优先级设置过低被其他AXI DMA请求抢占。解决方案是修改IP核参数将EMIO中断优先级设为最高Priority7并在设备树中添加interrupts 0 0 1level-sensitive。2.4 时序约束差异静态时序分析的生死线MIO路径在PS内部Vivado综合时自动满足时序无需手动约束。但EMIO涉及跨时钟域PS的CPU_CLK与PL的AXI_CLK必须添加时序例外。UG585第23.5节强调“EMIO paths require timing constraints to ensure proper operation”。典型约束写法在XDC文件中# EMIO GPIO时钟约束 create_clock -name axi_clk -period 10.000 [get_ports {axi_aclk}] # 设置跨时钟域路径为false path因AXI协议本身有握手机制 set_false_path -from [get_clocks axi_clk] -to [get_clocks ps7_0_FCLK_CLK0] set_false_path -from [get_clocks ps7_0_FCLK_CLK0] -to [get_clocks axi_clk]若遗漏此约束Vivado实现阶段会报大量timing violation且板级测试出现间歇性读写错误——比如EMIO GPIO状态读取总是0xFF实测发现是AXI读响应信号在时钟边沿采样失败。3. 实操全流程从Vivado建模到Linux驱动验证3.1 Vivado工程搭建MIO与EMIO的配置陷阱以Zynq-7020为目标芯片创建最小化Block DesignStep 1PS配置关键在ZYNQ7 Processing System IP核双击打开配置界面Page 1: PS Configuration→ 勾选“Enable MIO”并确认MIO[0:15]用于SDIO默认若不用SDIO则取消勾选释放MIO[0:15]为纯GPIOPage 2: Clock Configuration→ 确保FCLK_CLK0频率设为100MHz后续AXI GPIO时钟基准Page 3: MIO Configuration→ 这里决定MIO引脚复用功能。例如MIO[10:11]默认为I2C0若要当GPIO需取消“I2C 0”勾选Page 4: Peripheral I/O Pins→ 找到“GPIO”栏将MIO[16:19]设为“GPIO”即MIO GPIO[0:3]这是后续Linux驱动识别的基础。注意UG585 Table 23-2明确列出MIO引脚复用规则。MIO[40:41]只能是I2C0或GPIO不能同时存在。若在Page 3启用了I2C0则Page 4的GPIO栏不会显示MIO[40:41]选项。Step 2添加EMIO逻辑从IP Catalog搜索“AXI GPIO”添加AXI GPIO IP核双击配置“Width of Slave GPIO Data Bus”设为32支持32位EMIO“Interrupt Type”勾选“Single Interrupt”简化中断处理将AXI GPIO的S_AXI接口拖到PS的S_AXI_GP0端口将AXI GPIO的GPIO接口右键→“Make External”命名为emio_gpio_0在Address Editor中确认AXI GPIO Base Address自动分配为0x4120_0000若冲突可手动调整。Step 3引脚约束XDC文件为EMIO分配物理引脚以Zynq-7020开发板为例# EMIO GPIO引脚约束Bank343.3V set_property PACKAGE_PIN T10 [get_ports {emio_gpio_0_tri_o[0]}] set_property IOSTANDARD LVCMOS33 [get_ports {emio_gpio_0_tri_o[0]}] set_property PACKAGE_PIN U12 [get_ports {emio_gpio_0_tri_o[1]}] set_property IOSTANDARD LVCMOS33 [get_ports {emio_gpio_0_tri_o[1]}] # 注意tri_o是三态输出信号tri_i是输入信号需分别约束Step 4生成比特流与导出硬件Run Synthesis → Run Implementation → Generate BitstreamTools → Export → Export Hardware勾选“Include bitstream”输出到PetaLinux工程目录。3.2 PetaLinux工程构建设备树与驱动适配Step 1创建PetaLinux工程petalinux-create -t project -n zynq-gpio-demo --template zynq cd zynq-gpio-demo petalinux-config --get-hw-description /path/to/vivado/project.sdk/Step 2修改设备树system-user.dtsi/* MIO GPIO配置 */ gpio0 { gpio-ranges pinctrl 0 0 54; // 54个MIO引脚 status okay; }; /* EMIO GPIO配置 */ axi_gpio_0 { compatible xlnx,xps-gpio-1.00.a; reg 0x41200000 0x10000; #gpio-cells 2; gpio-controller; xlnx,all-inputs 0x0; xlnx,all-outputs 0x1; xlnx,dout-default 0x0; xlnx,gpio-width 0x20; xlnx,interrupt-present 0x1; xlnx,tri-default 0xffffffff; interrupt-parent intc; interrupts 0 89 4; // F2P[0]对应IRQ_ID89 }; /* 添加EMIO GPIO别名便于应用层调用 */ amba_pl { emio_gpio: gpio41200000 { compatible xlnx,xps-gpio-1.00.a; reg 0x41200000 0x10000; #gpio-cells 2; gpio-controller; xlnx,gpio-width 0x20; }; };Step 3编译与烧写petalinux-build petalinux-package --boot --fsbl ./images/linux/zynq_fsbl.elf \ --fpga ./images/linux/system.bit \ --u-boot ./images/linux/u-boot.elf \ --force生成的BOOT.BIN包含FSBL、bitstream、U-BootSD卡启动后可通过cat /sys/class/gpio/gpiochip0/base确认MIO基地址通常为504cat /sys/class/gpio/gpiochip504/ngpio应显示54。3.3 Linux应用层验证三种GPIO的实操命令MIO GPIO操作无需驱动sysfs直通# 导出MIO[16]对应gpiochip0的第16号 echo 16 /sys/class/gpio/export # 设置为输出 echo out /sys/class/gpio/gpio16/direction # 输出高电平 echo 1 /sys/class/gpio/gpio16/value # 读取状态 cat /sys/class/gpio/gpio16/valueEMIO GPIO操作需先确认gpiochip编号# 查看所有gpiochip ls /sys/class/gpio/ # 通常EMIO对应gpiochip512因MIO占0-54EMIO从512开始 echo 0 /sys/class/gpio/gpio512/export # EMIO[0] echo out /sys/class/gpio/gpio512/direction echo 1 /sys/class/gpio/gpio512/valueAXI GPIO操作需加载驱动# 加载AXI GPIO驱动 modprobe gpio-xilinx # 查看设备节点 ls /sys/class/gpio/ # 操作方式同EMIO echo 0 /sys/class/gpio/gpio544/export实操心得我在调试时发现EMIO GPIO在Linux下首次export会失败报错“Device or resource busy”。原因是AXI GPIO IP核的中断未正确使能。解决方案是在设备树中添加xlnx,all-inputs 0x0强制设为输出模式或在应用层先写echo 0 /sys/class/gpio/gpio512/value再export。4. 常见问题与排查技巧实录那些手册里没写的坑4.1 MIO引脚“消失”问题复用功能冲突的隐性陷阱现象Vivado中MIO[20]在Block Design里显示为GPIO但烧写后Linux下ls /sys/class/gpio/看不到gpio20。根因分析MIO[20]在Zynq-7020中默认复用为SDIO_CLK即使你在Page 3取消了SDIO EnableVivado仍可能保留该复用。UG585 Table 23-3指出MIO[16:27]的复用优先级顺序为SDIO UART1 GPIO。若SDIO控制器在PS配置中处于“Enabled”状态即使未连接SD卡MIO[16:27]将被锁定。排查步骤在Vivado Block Design中双击ZYNQ7 IP核 → Page 3: MIO Configuration → 检查“SD 0”是否勾选若勾选取消后重新Validate Block Design在Address Editor中查看MIO[20]是否出现在GPIO地址空间生成bitstream后在SDK中运行FSBL观察串口打印是否有“MIO[20] configured as SDIO”字样。终极方案在FSBL源码中强制重置MIO[20]方向。修改ps7_init.c// 在Ps7_Init()函数末尾添加 Xil_Out32(0xF8000204, Xil_In32(0xF8000204) | (1 20)); // GPIO_DIRM bit201 (output) Xil_Out32(0xF8000208, Xil_In32(0xF8000208) | (1 20)); // GPIO_OUTEN bit201 (enable output)4.2 EMIO中断失效PL与PS时钟不同步的连锁反应现象EMIO GPIO能正常读写但中断始终不触发cat /proc/interrupts中对应IRQ计数为0。根因分析EMIO中断路径为“PL逻辑 → AXI Interrupt Controller → IRQ_F2P → PS GIC”。若PL侧时钟axi_aclk与PS侧FCLK_CLK0相位差过大会导致IRQ_F2P信号采样失败。UG585第23.6节警告“The F2P interrupt signals must be synchronized to the PS clock domain”。排查步骤用示波器测量IRQ_F2P[0]引脚确认有中断脉冲输出在PS端检查GIC寄存器# 读取GICD_ISPENDR中断挂起寄存器 devmem 0xF8F01100 32 # 应看到bit89置位 # 读取GICD_ISENABLER中断使能寄存器 devmem 0xF8F01120 32 # bit89应为1若GICD_ISPENDR无变化说明PL侧中断未送达若GICD_ISPENDR有变化但/proc/interrupts无计数说明GIC未转发。解决方案在Vivado中为AXI Interrupt Controller添加同步器IP核如“Synchronize” IP或修改XDC约束强制axi_aclk与FCLK_CLK0同频同相create_generated_clock -name axi_clk_sync -source [get_pins ps7_0/FCLK_CLK0] [get_pins axi_intc_0/s_axi_aclk]4.3 GPIO模式选择误区8种模式并非万能钥匙现象网上热议“gpio的8种工作模式”但实际项目中启用“上拉三态”模式后外部按键按下时读取值始终为1。真相解析Zynq MIO的8种模式UG585 Table 23-4是组合配置需同时设置多个寄存器位GPIO_TRI寄存器0xF8000240控制三态使能GPIO_PDR寄存器0xF8000244控制上拉使能GPIO_ODR寄存器0xF8000248控制下拉使能GPIO_MCTRL寄存器0xF800024C控制慢速/快速切换。例如“上拉输入”模式需GPIO_TRI[bit] 1三态使能即输入GPIO_PDR[bit] 1上拉使能GPIO_ODR[bit] 0下拉禁用而“上拉三态”模式本身矛盾——三态high-Z状态下上拉电阻无法建立电平必须配合输入使能。实操验证表模式名称GPIO_TRIGPIO_PDRGPIO_ODR实际效果适用场景浮空输入100电平不确定仅作参考上拉输入110默认高按键接地变低按键检测下拉输入101默认低按键接VCC变高电平检测推挽输出000直接驱动负载LED控制开漏输出010需外接上拉I2C总线注意EMIO不支持GPIO_PDR/GPIO_ODR寄存器其上下拉需在PL侧通过IBUF/IOBUF配置或外接物理电阻。4.4 Zynq烧写异常FSBL校验失败的硬件根源现象执行petalinux-package --boot生成BOOT.BIN后SD卡启动卡在“Starting application...”串口无任何输出。根因深挖FSBLFirst Stage Boot Loader在加载bitstream前会校验PS配置寄存器。若MIO引脚电压标准I/O Standard与硬件实际供电不符FSBL会拒绝启动。例如Zynq-7020开发板MIO Bank0供电为1.8V但Vivado中误设为LVCMOS25则FSBL检测到VCCO mismatch直接halt。快速诊断法用JTAG连接SDK加载FSBL.elf设置断点在ps7_init()函数单步执行至Xil_In32(0xF8000258)读取MIO Bank0 VCCO寄存器对照UG585 Table 23-5该寄存器值应为0x000000011.8V若读到0x000000022.5V则配置错误。修复流程在Vivado中打开ZYNQ7 IP核 → Page 4: Peripheral I/O Pins → 找到Bank0 → 点击“Edit I/O Ports” → 将I/O Standard改为LVCMOS18重新Run Implementation → Generate Bitstream重新导出Hardware → PetaLinux rebuild。4.5 Linux设备树常见错误emio-gpio与mio-gpio的混淆现象在设备树中将EMIO GPIO错误声明为gpio0导致Linux启动时kernel panic“Unable to handle kernel NULL pointer dereference”。错误代码示例gpio0 { // 错误gpio0仅代表MIO GPIO emio_gpio: gpio41200000 { compatible xlnx,xps-gpio-1.00.a; reg 0x41200000 0x10000; }; };正确写法amba_pl { // 必须在amba_pl节点下声明PL侧设备 emio_gpio: gpio41200000 { compatible xlnx,xps-gpio-1.00.a; reg 0x41200000 0x10000; #gpio-cells 2; gpio-controller; xlnx,gpio-width 0x20; }; };验证命令# 查看设备树编译后的二进制 dtc -I dtb -O dts -o system.dts ./images/linux/system.dtb # 搜索emio_gpio节点是否存在 grep -A 10 emio_gpio system.dts5. 进阶实战基于Zynq的Bootloader在线升级设计中的GPIO协同5.1 升级流程中的GPIO角色拆解在“基于zynq的bootloader 在线升级设计”中GPIO不仅是状态指示灯更是安全机制的核心执行单元。典型架构包含三个关键GPIO组GPIO组类型数量功能安全要求升级触发GPIOMIO1按键输入长按3秒进入DFU模式需防抖去抖必须用MIO保证实时性Flash保护GPIOEMIO2控制W#写保护和WP#写保护引脚需电平锁存EMIO可编程逻辑实现状态指示GPIOAXI GPIO4RGB LED显示升级进度红准备绿成功蓝失败需PWM调光PL侧实现最佳为什么必须分工升级触发需亚毫秒响应MIO从按键按下到中断服务程序执行仅需200nsFlash保护需在FSBL阶段就生效EMIO可通过PL逻辑在bitstream加载前锁定RGB LED需16级灰度AXI GPIO配合PWM IP核可实现精确占空比控制MIO仅支持开关。5.2 FSBL阶段的GPIO预配置绕过Linux的底层控制FSBLFirst Stage Boot Loader在Linux启动前运行是控制GPIO的最后防线。在ps7_init.c中添加以下代码// 初始化Flash保护EMIO假设EMIO[0]W#, EMIO[1]WP# // EMIO地址映射到0x41200000方向寄存器偏移0x0004 Xil_Out32(0x41200004, 0x00000003); // EMIO[0:1]设为输出 Xil_Out32(0x41200000, 0x00000003); // W#0, WP#0解除保护 // 升级触发MIO配置MIO[20] Xil_Out32(0xF8000204, Xil_In32(0xF8000204) | (1 20)); // 输出方向 Xil_Out32(0xF8000208, Xil_In32(0xF8000208) | (1 20)); // 使能输出 Xil_Out32(0xF8000200, Xil_In32(0xF8000200) | (1 20)); // 输出高电平默认不触发关键点FSBL中EMIO操作必须在Xil_In32(0xF8000000)PS Ready寄存器返回非0后执行否则AXI总线未就绪。5.3 PetaLinux升级脚本中的GPIO交互在升级脚本upgrade.sh中通过sysfs控制GPIO状态#!/bin/sh # 升级前点亮红色LED锁定Flash echo 512 /sys/class/gpio/export # EMIO[0] echo out /sys/class/gpio/gpio512/direction echo 0 /sys/class/gpio/gpio512/value # W#0允许写入 # 升级中蓝色LED呼吸效果需PL侧PWM echo 544 /sys/class/gpio/export # AXI GPIO[0] echo out /sys/class/gpio/gpio544/direction # 调用PL侧PWM驱动 echo 500 /sys/class/pwm/pwmchip0/pwm0/period echo 250 /sys/class/pwm/pwmchip0/pwm0/duty_cycle echo 1 /sys/class/pwm/pwmchip0/pwm0/enable # 升级后绿色LED常亮解锁Flash echo 1 /sys/class/gpio/gpio512/value # W#1写保护实操心得我在某电力终端项目中升级失败后需自动回滚。方案是用MIO[21]作为“回滚触发”在FSBL中检测该引脚电平若为低则加载备份bitstream。这要求MIO[21]在FSBL阶段就必须配置为输入且不能被Linux驱动占用——通过在设备树中移除gpio0的status okay即可实现。6. 工程经验总结Zynq GPIO选型的黄金法则做Zynq项目十年我总结出GPIO选型的三条铁律比UG585更直击要害第一律实时性优先选MIO灵活性优先选EMIO确定性优先选AXI GPIO按键、复位、电源监控等要求1ms响应的信号必须用MIO。曾有个客户用EMIO做看门狗喂狗因PL布线延迟导致偶尔超时重启需要动态增减数量的信号如扩展IO模块EMIO是唯一选择。我们给某机床厂做的远程IO模块通过EMIOAXI Lite总线支持热插拔8路DI/DO需要精确时序的信号如SPI从机、步进电机脉冲AXI GPIO配合PL侧状态机比PS软件模拟可靠100倍。第二律电压匹配比功能更重要Zynq-7020的MIO Bank0只能1.8VBank1可配2.5V/3.3VEMIO则完全取决于PL Bank。曾有个项目要把MIO[0]接到3.3V传感器结果烧毁PS端口。解决方案是改用EMIO走PL Bank343.3V虽然延迟增加15ns但系统稳定性提升100%。第三律中断路径越短越可靠MIO中断路径引脚→PS硬核→GIC全程硬件EMIO中断路径引脚→PL逻辑→AXI INT→F2P→GIC中间任一环节故障都会中断失效。因此关键报警信号如温度超限必须用MIO辅助状态信号如风扇转速可用EMIO。最后分享一个小技巧在Vivado中快速定位GPIO问题。按CtrlF搜索“MIO”或“EMIO”查看Message Log中的WARNING。例如“[Synth 8-6149] Cannot resolve non-existent port emio_gpio_0_tri_i”说明XDC约束的引脚