news 2026/4/23 8:18:27

Vivado 2020.1里,如何把PL的按键信号“借”给PS用?一个EMIO+XDC的实战配置

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Vivado 2020.1里,如何把PL的按键信号“借”给PS用?一个EMIO+XDC的实战配置

Vivado 2020.1实战:用PL按键扩展PS端GPIO的EMIO+XDC全流程解析

当你在Zynq平台上开发嵌入式系统时,可能会遇到一个典型困境:PS端的GPIO引脚已经用完,但板卡上仍有大量未使用的PL引脚。就像银行账户里的现金不足时,我们会考虑信用贷款一样,EMIO(Extended Multiplexed I/O)技术正是这种"信号借贷"的完美解决方案。本文将手把手带你完成从Vivado Block Design配置到Vitis代码实现的完整闭环,让PL端的物理按键能够直接控制PS端的LED。

1. 理解EMIO的信号借贷机制

EMIO本质上是一种PS与PL之间的引脚资源共享协议。在Zynq架构中,MIO(Multiplexed I/O)是直接连接到处理器的固定引脚,而EMIO则像一条可扩展的桥梁,允许PS通过PL端的可编程逻辑访问额外的IO资源。这种设计带来了几个关键优势:

  • 引脚资源倍增:PS可以突破物理MIO引脚数量的限制
  • 布线灵活性:PL端的引脚位置可以根据PCB布局自由调整
  • 性能平衡:关键信号走MIO保证时序,次要信号走EMIO优化布局

注意:EMIO信号在PS和PL之间的传输延迟会比纯MIO略高,不适合对时序要求极其严格的场景

典型的EMIO应用场景包括:

  1. PS端GPIO不足时的功能扩展
  2. 需要灵活调整引脚位置的调试接口
  3. 低速外设连接(按键、LED、传感器等)

2. Vivado环境搭建与EMIO配置

2.1 创建基础硬件工程

启动Vivado 2020.1,按照以下步骤建立工程框架:

# 创建工程 create_project emio_tutorial ./emio_tutorial -part xc7z020clg400-1 # 添加Zynq IP create_bd_design "zynq_design" startgroup create_bd_cell -type ip -vlnv xilinx.com:ip:zynq_ultra_ps_e zynq_ultra_ps_e_0 endgroup

在Block Design界面中,双击Zynq UltraScale+ IP核打开配置窗口。关键配置步骤如下:

  1. 在PS-PL Configuration选项卡中,展开GPIO EMIO设置
  2. 勾选"GPIO EMIO"并设置宽度为1(对应单个按键)
  3. 确认AXI接口已启用(用于PS-PL通信)

2.2 引脚外部化与约束文件生成

完成Zynq配置后,在Diagram视图可以看到新增的GPIO端口:

  1. 右键点击gpio_emio端口,选择"Make External"
  2. 在External Interface Properties中重命名为pl_key
  3. 使用Ctrl+S保存设计,生成顶层HDL文件

创建约束文件的正确姿势:

# 生成XDC约束文件示例 set_property PACKAGE_PIN AA12 [get_ports pl_key] set_property IOSTANDARD LVCMOS33 [get_ports pl_key] set_property PULLUP true [get_ports pl_key]

提示:引脚位置必须根据实际开发板原理图确定,上例中的AA12仅为示意

3. 硬件设计验证与导出

3.1 生成比特流文件

在生成最终配置前,建议进行以下验证步骤:

  1. 运行Validate Design(F6)检查连接完整性
  2. 执行综合后查看资源利用率报告
  3. 通过I/O Planning验证引脚分配合理性

生成比特流的关键命令序列:

# 综合设计 launch_runs synth_1 wait_on_run synth_1 # 实现设计 launch_runs impl_1 -to_step write_bitstream wait_on_run impl_1

3.2 导出硬件平台

成功生成bitstream后,需要导出硬件描述文件供Vitis使用:

  1. 在File菜单中选择Export → Export Hardware
  2. 勾选"Include bitstream"选项
  3. 指定输出路径并生成.xsa文件

硬件配置关键参数验证表:

参数项推荐值说明
EMIO宽度1单个按键信号
I/O标准LVCMOS333.3V电平
上拉电阻启用防止悬空状态
时钟域100MHzPS端参考时钟

4. Vitis软件开发与调试

4.1 创建应用工程

在Vitis 2020.1中新建Platform Project:

// 初始化GPIO驱动的基本框架 #include "xparameters.h" #include "xgpiops.h" #include "xstatus.h" #define GPIO_DEVICE_ID XPAR_XGPIOPS_0_DEVICE_ID #define PS_LED1 40 // PS端LED引脚 #define PL_KEY 78 // EMIO起始引脚号 XGpioPs gpio_inst; // GPIO驱动实例 int main() { XGpioPs_Config *config; int status; // 硬件初始化 config = XGpioPs_LookupConfig(GPIO_DEVICE_ID); status = XGpioPs_CfgInitialize(&gpio_inst, config, config->BaseAddr); if (status != XST_SUCCESS) return XST_FAILURE; // 引脚方向配置 XGpioPs_SetDirectionPin(&gpio_inst, PS_LED1, 1); // LED输出 XGpioPs_SetOutputEnablePin(&gpio_inst, PS_LED1, 1); XGpioPs_SetDirectionPin(&gpio_inst, PL_KEY, 0); // 按键输入 // 主控制循环 while(1) { if (!XGpioPs_ReadPin(&gpio_inst, PL_KEY)) { usleep(10000); // 10ms消抖 XGpioPs_WritePin(&gpio_inst, PS_LED1, 1); } else { XGpioPs_WritePin(&gpio_inst, PS_LED1, 0); } } return XST_SUCCESS; }

4.2 调试技巧与性能优化

在实际部署时,有几个关键点需要特别注意:

  1. 信号稳定性

    • 添加软件消抖(如示例中的10ms延迟)
    • 在XDC中启用内部上拉/下拉电阻
    • 必要时在PL端添加同步寄存器
  2. 性能考量

    • EMIO读取延迟通常在10-20个时钟周期
    • 对于高频信号,考虑使用AXI GPIO IP替代
  3. 资源扩展

    • 多个EMIO信号可以捆绑成总线形式
    • 通过concat IP合并离散信号
// 多EMIO信号处理示例 #define EMIO_WIDTH 4 uint32_t emio_group = 0; // 读取一组EMIO状态 emio_group = XGpioPs_Read(&gpio_inst, EMIO_BASE); // 按位处理每个信号 for(int i=0; i<EMIO_WIDTH; i++) { if(emio_group & (1<<i)) { // 处理第i个EMIO信号 } }

5. 进阶应用与故障排查

当系统复杂度增加时,EMIO配置可能会出现各种异常情况。以下是几个常见问题的解决方案:

症状1:EMIO信号读取值始终为0

  • 检查XDC文件中的引脚编号是否正确
  • 验证PS端是否已正确启用EMIO功能
  • 测量物理引脚电平是否实际变化

症状2:系统运行时EMIO信号不稳定

  • 在PL端添加输入同步寄存器
  • 调整IOSTANDARD电压与硬件匹配
  • 检查PCB布局是否存在信号完整性问题

症状3:多个EMIO信号互相干扰

  • 为每个信号添加独立约束
  • 考虑使用差分信号传输
  • 在PL端增加信号隔离逻辑

实际项目中,我曾遇到一个典型的EMIO时钟域交叉问题:PS端以100MHz采样PL端的50MHz信号,导致随机采集到亚稳态。最终的解决方案是在PL端添加双缓冲寄存器,同时将PS端的采样时钟同步到PL时钟域。这种细节往往需要结合具体硬件设计进行调整。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 8:13:48

如何告别抢票焦虑:大麦网Python自动化抢票脚本终极指南

如何告别抢票焦虑&#xff1a;大麦网Python自动化抢票脚本终极指南 【免费下载链接】DamaiHelper 大麦网演唱会演出抢票脚本。 项目地址: https://gitcode.com/gh_mirrors/dama/DamaiHelper 还在为心仪演唱会门票秒光而烦恼吗&#xff1f;还在为黄牛高价票而心痛吗&…

作者头像 李华
网站建设 2026/4/23 8:11:24

Python自然语言处理实战:从文本清洗到情感分析

1. 从零开始&#xff1a;Python自然语言处理实战指南第一次接触自然语言处理(NLP)时&#xff0c;我被那些能自动分析文本、理解语义的算法深深吸引。作为Python开发者&#xff0c;我们很幸运拥有NLTK、spaCy这些强大的工具库。但真正要入门NLP&#xff0c;光安装几个库是远远不…

作者头像 李华
网站建设 2026/4/23 8:06:15

突破性小红书数据洞察引擎:从技术难题到商业价值的创新实践

突破性小红书数据洞察引擎&#xff1a;从技术难题到商业价值的创新实践 【免费下载链接】xhs 基于小红书 Web 端进行的请求封装。https://reajason.github.io/xhs/ 项目地址: https://gitcode.com/gh_mirrors/xh/xhs 在当今数据驱动的商业环境中&#xff0c;小红书平台已…

作者头像 李华
网站建设 2026/4/23 8:03:38

NHSE终极指南:免费开源动森存档编辑器,轻松打造完美岛屿

NHSE终极指南&#xff1a;免费开源动森存档编辑器&#xff0c;轻松打造完美岛屿 【免费下载链接】NHSE Animal Crossing: New Horizons save editor 项目地址: https://gitcode.com/gh_mirrors/nh/NHSE 你是否曾为《集合啦&#xff01;动物森友会》中难以获得的稀有物品…

作者头像 李华