掌握 Xilinx Vivado:集成逻辑分析器 (ILA) 与虚拟输入/输出 (VIO) 调试
本教程将指导您使用 Xilinx Vivado 的 集成逻辑分析器 (ILA) 和 虚拟输入/输出 (VIO) 核对 VHDL 设计进行片上调试与监控。学完后,您将掌握如何插入探针、配置触发条件,并在无需外部设备的情况下精准捕获信号行为。
概述
文中将引用 Vivado 截图。点击图片可放大查看。 可使用侧边栏或移动端弹出导航快速跳转。
ILA 与 VIO
ILA IP 可让您实时探测 FPGA 内部信号,而 VIO IP 则允许从 Vivado 驱动内部信号。两者均免费、高度可配置,并能无缝集成到 Vivado 工作流中。
- Xilinx IP:集成逻辑分析器 (ILA)
- Xilinx IP:虚拟输入/输出 (VIO)
准备工作
- 一块 Xilinx FPGA 开发板
- Vivado Design Suite (2020.2 或更新版本)
- 基础 VHDL 知识
示例使用 Kintex‑7 KC705 评估套件,但步骤适用于任何现代 Xilinx FPGA。
下载示例工程
下载包含示例设计和 VHDL 文件的 ZIP 包。在 Vivado 中打开 ila_tutorial.xpr 即可查看设计,或继续阅读从头创建。
使用 Vivado 创建工程
启动 Vivado,在欢迎界面点击 Create Project。
按向导操作:工程命名为 ila_tutorial(不含空格),选择 RTL Project,添加源文件 counter.vhdl 和 counter_top.vhdl。勾选 Copy sources into project 并继续。
添加约束文件 top.xdc 并复制到工程中。根据您的开发板调整时钟和 LED 引脚,并设置正确的时钟周期。
从列表中选择您的开发板,点击 Finish 打开工程。
设计示例解析
示例由两个串联的 4 位计数器组成。counter.vhdl 实现一个计数器,在使能时递增,并在计数值 12 到 15 之间输出 1 位 trigger 信号。
实体声明:
---------------------------------------------------------------------------- -- ENTITY DECLARATION. ---------------------------------------------------------------------------- ENTITY counter IS PORT(clk : IN STD_LOGIC; -- 主时钟 reset : IN STD_LOGIC; -- 复位,高有效 enable : IN STD_LOGIC; -- 使能下一个计数器 trigger : OUT STD_LOGIC -- 触发下一个计数器 ); END ENTITY;
内部信号:
count– 4 位计数器值。trigger_o– 连接到trigger输出的中间信号。
属性用法(稍后解释):
ATTRIBUTE MARK_DEBUG : STRING; ATTRIBUTE MARK_DEBUG OF count : SIGNAL IS "true";
时序逻辑:
seq_proc: PROCESS (reset, clk) BEGIN -- for seq_proc IF (reset = '1') THEN count <= (OTHERS => '0'); trigger_o <= '0'; ELSIF rising_edge(clk) THEN IF (enable = '1') THEN count <= count + 1; IF (count > x"B" AND count <= x"F") THEN trigger_o <= '1'; ELSE trigger_o <= '0'; END IF; END IF; END IF; END PROCESS;
counter_top.vhdl 实例化两个计数器。counter_1_inst 始终使能,其 trigger 输出作为 counter_2_inst 的时钟。因此,counter_2_inst 每 16 个周期仅递增 4 次。
创建用于复位的 VIO 核
我们将生成一个驱动设计 reset 输入的 VIO,以便从 Vivado 手动切换复位。
打开 IP Catalog,搜索 VIO,双击 VIO (Virtual Input/Output),重命名为 vio_reset。将 Input Probe Count 设为 0,Output Probe Count 设为 1。
配置输出探针:宽度 = 1,初始值 = 0x1,点击 OK 和 Generate。
综合后,在 counter_top.vhdl 中声明组件并实例化。重新综合前别忘了将 flatten_hierarchy 设为 None。
COMPONENT vio_reset PORT( clk : IN STD_LOGIC; probe_out0 : OUT STD_LOGIC_VECTOR(0 DOWNTO 0) ); END COMPONENT;
插入调试探针
可通过三种方法探测信号:
- 从 VHDL 源码(通过
MARK_DEBUG属性)。 - 从网表或原理图(右键 Mark Debug)。
- 从 XDC/TCL 文件(本文不涉及)。
从 VHDL 文件插入
每个文件声明一次 MARK_DEBUG 属性,然后应用到目标信号:
ATTRIBUTE MARK_DEBUG : STRING; ATTRIBUTE MARK_DEBUG OF count : SIGNAL IS "true";
综合后,count 将出现在 Unassigned Debug Nets 下,带有虫子图标。
从网表插入
导航至 Netlist 或 Schematic,定位 trigger 网络,右键选择 Mark Debug,对两个计数器均操作一次。
创建 ILA 调试核
从 IP Catalog 打开 Set Up Debug。Vivado 会列出所有调试网络及其时钟域。本教程保留全部四个信号。
配置 ILA FIFO 深度(1024 足矣)并启用 Capture control。完成向导;Vivado 将生成 ILA 核和一个约束文件。
将约束另存为 ila_core.xdc。该文件应用调试属性、创建 ILA 核、配置各探针,并实例化一个连接核与 Vivado 的 dbg_hub。将 hub 的时钟频率更新为设计频率。
重新综合、实现并生成比特流。打开 Hardware Manager,自动连接,编程器件并加载 .ltx 探针文件。
配置 ILA 触发条件
编程完成后 ILA 仪表板出现。启用 VIO 选项卡并移除不需要的窗口。将 reset 探针添加到 VIO,以便捕获期间切换复位。
在 counter_1_inst/trigger 上设置上升沿触发,并设置 32 采样的前触发窗口。
单触发运行 ILA
武装触发(状态变为 waiting for trigger),将 reset 切换为 0。触发触发后,ILA 记录事件前 32 个采样,并持续直到 FIFO 满。
缩放波形可观察 counter_2_inst 的行为。
多触发运行 ILA
复杂场景可串联多个触发。例如:当 counter_1_inst/count == 9 且 counter_2_inst/count > 2 时触发,将 FIFO 分为四个窗口。
自动重触发模式
启用 Auto re‑trigger 可捕获偶发或高频事件。配置单触发、设置 FIFO 深度并武装核。
捕获模式
捕获模式仅记录满足全局条件的采样。例如:当 counter_1_inst/trigger == 1 且 counter_2_inst/trigger == 0 同时成立时捕获。
总结
ILA 和 VIO 是强大且免费的片上调试工具。善用探针、多触发和捕获模式,即可直接在 Vivado 中精准监控和控制复杂 FPGA 设计。
VHDL
- 树莓派与 Python 构建远程温度传感器:分步实战指南
- RightHand Robotics与Element Logic联手推出集成式机器人分拣系统
- 集成电路:数字逻辑门基础
- 拓展云疆界:新可用区、容器与多云策略
- C# 基础:输入输出核心技巧完全指南
- 掌握 C++ 输入输出:cin/cou 完整实战指南
- C 语言输入输出(I/O)精通:scanf() 与 printf() 详解
- C 语言输入输出完全掌握:标准 I/O 与格式化控制
- 精通VHDL与Verilog:编写整洁组合与时序逻辑
- 掌握 D 锁存器:设计、工作原理与关键差异
- 精通Python输入输出与模块导入:实战指南
- 精通 Java 输入输出:打印、读取与格式化数据